teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプル追記

2020/12/08 03:01

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -13,4 +13,135 @@
13
13
 
14
14
  EEPROMには書き換えの寿命があります。ESP32のフラッシュについてはぱっと見つけられませんでしたが、普通は10万回~100万回くらい。多いと思いますか? 1秒に一回書き換えていたら、100000/3600=27.8時間、です。もちろん、同じ場所を毎回書き換えるわけじゃないでしょうけれど、フラッシュでは大きな単位で消去/書き込みを行うのでその辺も考えないといけません。書き込み場所をどの様に管理しているかはライブラリの中を調べないとわかりません。(フラッシュメモリを使っていても、SDカードやSSDなんかは内部のコントローラがこの辺をよろしくやってくれているので簡単にはへこたれないのですが)
15
15
  これが多いか少ないかはどういう使い方をするかによるでしょう。
16
- 十分検討してください。
16
+ 十分検討してください。
17
+
18
+ ---
19
+ なんかもう、よくわからないまま適当にいじくってエラーと格闘するのに付き合わされるのも...
20
+ フラッシュメモリの寿命についても何度も言ったので、特に考慮されないということは問題ないのですね。
21
+
22
+ 以下、M5Stackでの試作ですので、BtnAとかは適当に置き換えて参考にして下さい。ファイル関連は質問者提示の関数をほぼそのまま使っています。
23
+ 短押しで読み出し、長押しで書き込み。
24
+
25
+ ```Arduino
26
+ #include <M5Stack.h>
27
+
28
+ #include <FS.h>
29
+ #include <SPIFFS.h>
30
+ #define FORMAT_SPIFFS_IF_FAILED true
31
+
32
+ String Buffer ;
33
+ bool isWriteMode;
34
+
35
+ //==================SPIFFS=================================---
36
+ void writeFile(fs::FS &fs, const char * path, const char * message) {
37
+ Serial.printf("Writing file: %s\r\n", path);
38
+
39
+ File file = fs.open(path, FILE_WRITE);
40
+ if (!file) {
41
+ Serial.println("- failed to open file for writing");
42
+ return;
43
+ }
44
+ if (file.print(message)) {
45
+ Serial.println("- file written");
46
+ } else {
47
+ Serial.println("- write failed");
48
+ }
49
+ file.close();
50
+ }
51
+
52
+ void appendFile(fs::FS &fs, const char * path, const char * message) {
53
+ //Serial.printf("Appending to file: %s\r\n", path);
54
+
55
+ File file = fs.open(path, FILE_APPEND);
56
+ if (!file) {
57
+ Serial.println("- failed to open file for appending");
58
+ return;
59
+ }
60
+ if (file.print(message)) {
61
+ //Serial.println("- message appended");
62
+ } else {
63
+ Serial.println("- append failed");
64
+ }
65
+ file.close();
66
+ }
67
+ void readFile(fs::FS &fs, const char * path) {
68
+ Serial.printf("Reading file: %s\r\n", path);
69
+
70
+ File file = fs.open(path);
71
+ if (!file || file.isDirectory()) {
72
+ Serial.println("- failed to open file for reading");
73
+ return;
74
+ }
75
+
76
+ Serial.println("- read from file:");
77
+ while (file.available()) {
78
+ Serial.write(file.read());
79
+ }
80
+ file.close();
81
+ }
82
+ void deleteFile(fs::FS &fs, const char * path) {
83
+ Serial.printf("Deleting file: %s\r\n", path);
84
+ if (fs.remove(path)) {
85
+ Serial.println("- file deleted");
86
+ } else {
87
+ Serial.println("- delete failed");
88
+ }
89
+ }
90
+ //===========================================================================
91
+
92
+
93
+ void setup() {
94
+ Serial.begin(115200);
95
+ //====SPIFFS Init=============================
96
+ if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) {
97
+ Serial.println("SPIFFS Mount Failed");
98
+ while (1);
99
+ }
100
+ Serial.println("SPIFFS Ready.");
101
+ //=============================================
102
+ Serial.println("Waiting for push Button(A)");
103
+ do { //ボタンを押すまで待つ
104
+ M5.BtnA.read();
105
+ } while (M5.BtnA.isReleased());
106
+ delay(100);
107
+ isWriteMode = false; //とりあえず読み出しモードに設定
108
+ //ボタンがどれだけ押されたかによってモード切り替え
109
+ do {
110
+ M5.BtnA.read();
111
+ if (M5.BtnA.pressedFor(900)) {
112
+ isWriteMode = true; //1秒以上長押しなら書き込みモードに入れる
113
+ }
114
+ } while (M5.BtnA.isPressed());
115
+ if (isWriteMode) {
116
+ Serial.println("WRITE MODE");
117
+ //ファイル準備
118
+ writeFile(SPIFFS, "/hello.txt", "START\n");
119
+ } else {
120
+ Serial.println("READ MODE");
121
+ //読み出しモード
122
+ readFile(SPIFFS, "/hello.txt");
123
+ Serial.println("READ DONE.");
124
+ ESP.restart(); //再起動
125
+ }
126
+ }
127
+
128
+ void loop() {
129
+ int a = 1;
130
+ float b = 2.1;
131
+ String c = "Test";
132
+ M5.update();
133
+ Buffer = String(millis()) + ", " + String(a) + ", " + String(b) + ", " + c + '\n'; //データ生成
134
+ Serial.print("Writing : " + Buffer);
135
+ appendFile( SPIFFS, "/hello.txt", Buffer.c_str()); //書き込み
136
+ for ( int wait = 0; wait < 50; wait++) {
137
+ //書き込み中にいきなりリセットしたりするとFileSystemが壊れるかも。
138
+ //安全に止められる停止状態を作る
139
+ M5.BtnA.read();
140
+ if ( M5.BtnA.isPressed()) {
141
+ Serial.println("Stop...");
142
+ ESP.restart(); //再起動
143
+ }
144
+ delay(10);
145
+ }
146
+ }
147
+ ```