回答編集履歴

1

サンプル追記

2020/12/08 03:01

投稿

thkana
thkana

スコア7639

test CHANGED
@@ -29,3 +29,265 @@
29
29
  これが多いか少ないかはどういう使い方をするかによるでしょう。
30
30
 
31
31
  十分検討してください。
32
+
33
+
34
+
35
+ ---
36
+
37
+ なんかもう、よくわからないまま適当にいじくってエラーと格闘するのに付き合わされるのも...
38
+
39
+ フラッシュメモリの寿命についても何度も言ったので、特に考慮されないということは問題ないのですね。
40
+
41
+
42
+
43
+ 以下、M5Stackでの試作ですので、BtnAとかは適当に置き換えて参考にして下さい。ファイル関連は質問者提示の関数をほぼそのまま使っています。
44
+
45
+ 短押しで読み出し、長押しで書き込み。
46
+
47
+
48
+
49
+ ```Arduino
50
+
51
+ #include <M5Stack.h>
52
+
53
+
54
+
55
+ #include <FS.h>
56
+
57
+ #include <SPIFFS.h>
58
+
59
+ #define FORMAT_SPIFFS_IF_FAILED true
60
+
61
+
62
+
63
+ String Buffer ;
64
+
65
+ bool isWriteMode;
66
+
67
+
68
+
69
+ //==================SPIFFS=================================---
70
+
71
+ void writeFile(fs::FS &fs, const char * path, const char * message) {
72
+
73
+ Serial.printf("Writing file: %s\r\n", path);
74
+
75
+
76
+
77
+ File file = fs.open(path, FILE_WRITE);
78
+
79
+ if (!file) {
80
+
81
+ Serial.println("- failed to open file for writing");
82
+
83
+ return;
84
+
85
+ }
86
+
87
+ if (file.print(message)) {
88
+
89
+ Serial.println("- file written");
90
+
91
+ } else {
92
+
93
+ Serial.println("- write failed");
94
+
95
+ }
96
+
97
+ file.close();
98
+
99
+ }
100
+
101
+
102
+
103
+ void appendFile(fs::FS &fs, const char * path, const char * message) {
104
+
105
+ //Serial.printf("Appending to file: %s\r\n", path);
106
+
107
+
108
+
109
+ File file = fs.open(path, FILE_APPEND);
110
+
111
+ if (!file) {
112
+
113
+ Serial.println("- failed to open file for appending");
114
+
115
+ return;
116
+
117
+ }
118
+
119
+ if (file.print(message)) {
120
+
121
+ //Serial.println("- message appended");
122
+
123
+ } else {
124
+
125
+ Serial.println("- append failed");
126
+
127
+ }
128
+
129
+ file.close();
130
+
131
+ }
132
+
133
+ void readFile(fs::FS &fs, const char * path) {
134
+
135
+ Serial.printf("Reading file: %s\r\n", path);
136
+
137
+
138
+
139
+ File file = fs.open(path);
140
+
141
+ if (!file || file.isDirectory()) {
142
+
143
+ Serial.println("- failed to open file for reading");
144
+
145
+ return;
146
+
147
+ }
148
+
149
+
150
+
151
+ Serial.println("- read from file:");
152
+
153
+ while (file.available()) {
154
+
155
+ Serial.write(file.read());
156
+
157
+ }
158
+
159
+ file.close();
160
+
161
+ }
162
+
163
+ void deleteFile(fs::FS &fs, const char * path) {
164
+
165
+ Serial.printf("Deleting file: %s\r\n", path);
166
+
167
+ if (fs.remove(path)) {
168
+
169
+ Serial.println("- file deleted");
170
+
171
+ } else {
172
+
173
+ Serial.println("- delete failed");
174
+
175
+ }
176
+
177
+ }
178
+
179
+ //===========================================================================
180
+
181
+
182
+
183
+
184
+
185
+ void setup() {
186
+
187
+ Serial.begin(115200);
188
+
189
+ //====SPIFFS Init=============================
190
+
191
+ if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) {
192
+
193
+ Serial.println("SPIFFS Mount Failed");
194
+
195
+ while (1);
196
+
197
+ }
198
+
199
+ Serial.println("SPIFFS Ready.");
200
+
201
+ //=============================================
202
+
203
+ Serial.println("Waiting for push Button(A)");
204
+
205
+ do { //ボタンを押すまで待つ
206
+
207
+ M5.BtnA.read();
208
+
209
+ } while (M5.BtnA.isReleased());
210
+
211
+ delay(100);
212
+
213
+ isWriteMode = false; //とりあえず読み出しモードに設定
214
+
215
+ //ボタンがどれだけ押されたかによってモード切り替え
216
+
217
+ do {
218
+
219
+ M5.BtnA.read();
220
+
221
+ if (M5.BtnA.pressedFor(900)) {
222
+
223
+ isWriteMode = true; //1秒以上長押しなら書き込みモードに入れる
224
+
225
+ }
226
+
227
+ } while (M5.BtnA.isPressed());
228
+
229
+ if (isWriteMode) {
230
+
231
+ Serial.println("WRITE MODE");
232
+
233
+ //ファイル準備
234
+
235
+ writeFile(SPIFFS, "/hello.txt", "START\n");
236
+
237
+ } else {
238
+
239
+ Serial.println("READ MODE");
240
+
241
+ //読み出しモード
242
+
243
+ readFile(SPIFFS, "/hello.txt");
244
+
245
+ Serial.println("READ DONE.");
246
+
247
+ ESP.restart(); //再起動
248
+
249
+ }
250
+
251
+ }
252
+
253
+
254
+
255
+ void loop() {
256
+
257
+ int a = 1;
258
+
259
+ float b = 2.1;
260
+
261
+ String c = "Test";
262
+
263
+ M5.update();
264
+
265
+ Buffer = String(millis()) + ", " + String(a) + ", " + String(b) + ", " + c + '\n'; //データ生成
266
+
267
+ Serial.print("Writing : " + Buffer);
268
+
269
+ appendFile( SPIFFS, "/hello.txt", Buffer.c_str()); //書き込み
270
+
271
+ for ( int wait = 0; wait < 50; wait++) {
272
+
273
+ //書き込み中にいきなりリセットしたりするとFileSystemが壊れるかも。
274
+
275
+ //安全に止められる停止状態を作る
276
+
277
+ M5.BtnA.read();
278
+
279
+ if ( M5.BtnA.isPressed()) {
280
+
281
+ Serial.println("Stop...");
282
+
283
+ ESP.restart(); //再起動
284
+
285
+ }
286
+
287
+ delay(10);
288
+
289
+ }
290
+
291
+ }
292
+
293
+ ```