von
Volker (Gast)
02.01.2021 22:19
Hallo erstmal,
ich bin geraade dabei mir eine Domino Uhr zu bauen.
Es sind genau drei steine aus meinem 3D Drucker.
Der erste Stein zeigt die Stunden und die anderen beiden die Minuten.
Benutze dafür einen NODEMCU V2 einen RGB LED Stripe und Arduino IDE.
Meinen Code habe Ich gut zusammen gewürfelt, ist meiner meinung aber
ganz
gut geworden.
Die ganze Uhr läuft über WLAN / Webserver.
Der HTML Code und CSS im SPIFFS.
Auf den Webserver kann mann die gewünschte Farbe einstellen.
Was mir jetzt noch fehlt.
Sobalt die Uhr eingeschallten wird, soll die Farbe leuchten die vorher
eingestellt worden ist.
Meine frage: Wie und wo muss Ich EEPROM Read / Write einsetzen.
Habe schon einige versuche gemach aber bekomme es einfach nicht hin.
Vieleicht könnt Ihr mir ja helfen.
Beispiele wie man RGB wete speichert und wider übergeben tut würden mir
vieleicht schon weiterhelfen.
Meine Programmierkenntnisse sind nicht gut!
MFG - Volker
und Hier mein Code, 1 #include <ESP8266WiFi.h>
2 #include <ESPAsyncTCP.h>
3 #include <ESPAsyncWebServer.h>
4
5 #include <NTPClient.h>
6 #include <WiFiUdp.h>
7 #ifdef __AVR__
8 #include <avr/power.h>
9 #endif
10 #include <Adafruit_NeoPixel.h>
11 int RH = 0;
12 int GH = 0;
13 int BH = 250;
14
15 #define PIN 5
16 #define NUMPIXELS 62
17 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
18
19
20 const char* ssid = "VCHUMCH";
21 const char* password = "6869111007nefHD51";
22
23 const long utcOffsetInSeconds = 3600;
24 char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
25 WiFiUDP ntpUDP;
26 NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
27
28
29 const int ledPin = 2;
30
31 String ledState;
32
33 AsyncWebServer server(80);
34
35 String processor(const String& var)
36 {
37 return "Bla";
38 }
39
40 void setup() {
41
42 Serial.begin(115200);
43
44 pixels.begin();
45
46 if (!SPIFFS.begin()) {
47 Serial.println("An Error has occurred while mounting SPIFFS");
48 return;
49 }
50
51 WiFi.begin(ssid, password);
52 while (WiFi.status() != WL_CONNECTED) {
53 delay(1000);
54 Serial.println("Connecting to WiFi..");
55 }
56 Serial.println(WiFi.localIP());
57
58 server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
59 request->send(SPIFFS, "/index.html", String(), false, processor);
60 RH = 0; GH = 200; BH = 0;
61 });
62
63 // Route to load style.css file
64 server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest * request) {
65 request->send(SPIFFS, "/style.css", "text/css");
66 });
67
68 // Route to set GPIO to HIGH
69 server.on("/on", HTTP_GET, [](AsyncWebServerRequest * request) {
70 RH = 0; GH = 200; BH = 0;
71 pixels.show() ;
72 request->send(SPIFFS, "/index.html", String(), false, processor);
73 });
74 server.on("/off", HTTP_GET, [](AsyncWebServerRequest * request) {
75 RH = 0; GH = 0; BH = 0;
76 pixels.show() ;
77 request->send(SPIFFS, "/index.html", String(), false, processor);
78 });
79 server.on("/red", HTTP_GET, [](AsyncWebServerRequest * request) {
80 RH = 200; GH = 0; BH = 0;
81 pixels.show() ;
82 request->send(SPIFFS, "/index.html", String(), false, processor);
83 });
84 server.on("/green", HTTP_GET, [](AsyncWebServerRequest * request) {
85 RH = 0; GH = 200; BH = 0;
86 pixels.show() ;
87 request->send(SPIFFS, "/index.html", String(), false, processor);
88 });
89 server.on("/blue", HTTP_GET, [](AsyncWebServerRequest * request) {
90 RH = 0; GH = 0; BH = 200;
91 pixels.show() ;
92 request->send(SPIFFS, "/index.html", String(), false, processor);
93 });
94 server.on("/white", HTTP_GET, [](AsyncWebServerRequest * request) {
95 RH = 200; GH = 200; BH = 200;
96 pixels.show() ;
97 request->send(SPIFFS, "/index.html", String(), false, processor);
98 });
99 server.on("/red1", HTTP_GET, [](AsyncWebServerRequest * request) {
100 RH = 255 , GH = 60, BH = 0;
101 pixels.show() ;
102 request->send(SPIFFS, "/index.html", String(), false, processor);
103 });
104 server.on("/green1", HTTP_GET, [](AsyncWebServerRequest * request) {
105 RH = 0 , GH = 255, BH = 38;
106 pixels.show() ;
107 request->send(SPIFFS, "/index.html", String(), false, processor);
108 });
109 server.on("/blue1", HTTP_GET, [](AsyncWebServerRequest * request) {
110 RH = 124, GH = 0, BH = 250;
111 pixels.show() ;
112 request->send(SPIFFS, "/index.html", String(), false, processor);
113 });
114 server.on("/red2", HTTP_GET, [](AsyncWebServerRequest * request) {
115 RH = 188 , GH = 49, BH = 38;
116 pixels.show() ;
117 request->send(SPIFFS, "/index.html", String(), false, processor);
118 });
119 server.on("/green2", HTTP_GET, [](AsyncWebServerRequest * request) {
120 RH = 71 , GH = 227, BH = 198;
121 pixels.show() ;
122 request->send(SPIFFS, "/index.html", String(), false, processor);
123 });
124 server.on("/blue2", HTTP_GET, [](AsyncWebServerRequest * request) {
125 RH = 100 , GH = 13, BH = 155;
126 pixels.show() ;
127 request->send(SPIFFS, "/index.html", String(), false, processor);
128 });
129 server.on("/red3", HTTP_GET, [](AsyncWebServerRequest * request) {
130 RH = 240 , GH = 128, BH = 80;
131 pixels.show() ;
132 request->send(SPIFFS, "/index.html", String(), false, processor);
133 });
134 server.on("/green3", HTTP_GET, [](AsyncWebServerRequest * request) {
135 RH = 46 , GH = 184, BH = 211;
136 pixels.show() ;
137 request->send(SPIFFS, "/index.html", String(), false, processor);
138 });
139 server.on("/blue3", HTTP_GET, [](AsyncWebServerRequest * request) {
140 RH = 118 , GH = 40, BH = 158;
141 pixels.show() ;
142 request->send(SPIFFS, "/index.html", String(), false, processor);
143 });
144 server.on("/red4", HTTP_GET, [](AsyncWebServerRequest * request) {
145 RH = 250 , GH = 250, BH = 0;
146 pixels.show() ;
147 request->send(SPIFFS, "/index.html", String(), false, processor);
148 });
149 server.on("/green4", HTTP_GET, [](AsyncWebServerRequest * request) {
150 RH = 46 , GH = 200, BH = 241;
151 pixels.show() ;
152 request->send(SPIFFS, "/index.html", String(), false, processor);
153 });
154 server.on("/blue4", HTTP_GET, [](AsyncWebServerRequest * request) {
155 RH = 91 , GH = 0, BH = 254;
156 pixels.show() ;
157 request->send(SPIFFS, "/index.html", String(), false, processor);
158 });
159 server.begin();
160 }
161
162 void loop() {
163 timeClient.update();
164
165 int Stunde;
166 int Stunden = timeClient.getHours();
167 int Zehner = (timeClient.getMinutes() / 10);
168 int Min = (timeClient.getMinutes() % 10);
169
170 //---------------------------------------------------------
171 // Uhrzeit Minuten Leds
172 //---------------------------------------------------------
173 switch (timeClient.getMinutes() % 10) {
174
175 case 0:
176 pixels.setPixelColor(41, pixels.Color(0, 0, 0));
177 pixels.setPixelColor(43, pixels.Color(0, 0, 0));
178 pixels.setPixelColor(45, pixels.Color(0, 0, 0));
179 pixels.setPixelColor(47, pixels.Color(0, 0, 0));
180 pixels.setPixelColor(49, pixels.Color(0, 0, 0));
181 pixels.setPixelColor(55, pixels.Color(0, 0, 0));
182 pixels.setPixelColor(57, pixels.Color(0, 0, 0));
183 pixels.setPixelColor(59, pixels.Color(0, 0, 0));
184 pixels.setPixelColor(61, pixels.Color(0, 0, 0));
185 pixels.show();
186 break;
187
188 case 1:
189 pixels.setPixelColor(49, pixels.Color(RH, GH, BH));
190 pixels.show();
191 break;
192
193 case 2:
194 pixels.setPixelColor(49, pixels.Color(0, 0, 0));
195 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
196 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
197 pixels.show();
198 break;
199
200 case 3:
201 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
202 pixels.setPixelColor(49, pixels.Color(RH, GH, BH));
203 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
204 pixels.show();
205 break;
206
207 case 4:
208 pixels.setPixelColor(49, pixels.Color(0, 0, 0));
209 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
210 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
211 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
212 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
213 pixels.show();
214 break;
215
216 case 5:
217 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
218 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
219 pixels.setPixelColor(49, pixels.Color(RH, GH, BH));
220 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
221 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
222 pixels.show();
223 break;
224
225 case 6:
226 pixels.setPixelColor(49, pixels.Color(0, 0, 0));
227 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
228 pixels.setPixelColor(46, pixels.Color(RH, GH, BH));
229 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
230 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
231 pixels.setPixelColor(60, pixels.Color(RH, GH, BH));
232 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
233 pixels.show();
234 break;
235
236 case 7:
237 pixels.setPixelColor(46, pixels.Color(0, 0, 0));
238 pixels.setPixelColor(60, pixels.Color(0, 0, 0));
239 pixels.setPixelColor(41, pixels.Color(RH, GH, BH));
240 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
241 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
242 pixels.setPixelColor(49, pixels.Color(RH, GH, BH));
243 pixels.setPixelColor(57, pixels.Color(RH, GH, BH));
244 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
245 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
246 pixels.show();
247 break;
248
249 case 8:
250 pixels.setPixelColor(49, pixels.Color(0, 0, 0));
251 pixels.setPixelColor(41, pixels.Color(RH, GH, BH));
252 pixels.setPixelColor(43, pixels.Color(RH, GH, BH));
253 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
254 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
255 pixels.setPixelColor(55, pixels.Color(RH, GH, BH));
256 pixels.setPixelColor(57, pixels.Color(RH, GH, BH));
257 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
258 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
259 pixels.show();
260 break;
261
262 case 9:
263 pixels.setPixelColor(41, pixels.Color(RH, GH, BH));
264 pixels.setPixelColor(43, pixels.Color(RH, GH, BH));
265 pixels.setPixelColor(45, pixels.Color(RH, GH, BH));
266 pixels.setPixelColor(47, pixels.Color(RH, GH, BH));
267 pixels.setPixelColor(49, pixels.Color(RH, GH, BH));
268 pixels.setPixelColor(55, pixels.Color(RH, GH, BH));
269 pixels.setPixelColor(57, pixels.Color(RH, GH, BH));
270 pixels.setPixelColor(59, pixels.Color(RH, GH, BH));
271 pixels.setPixelColor(61, pixels.Color(RH, GH, BH));
272 pixels.show();
273 break;
274 }
275
276 //---------------------------------------------------------
277 // Uhrzeit 10er Minuten
278 //---------------------------------------------------------
279 switch (timeClient.getMinutes() / 10) {
280
281 case 0:
282 pixels.setPixelColor(21, pixels.Color(0, 0, 0));
283 pixels.setPixelColor(23, pixels.Color(0, 0, 0));
284 pixels.setPixelColor(33, pixels.Color(0, 0, 0));
285 pixels.setPixelColor(35, pixels.Color(0, 0, 0));
286 pixels.setPixelColor(37, pixels.Color(0, 0, 0));
287 pixels.show();
288 break;
289
290 case 1:
291 pixels.setPixelColor(21, pixels.Color(0, 0, 0));
292 pixels.setPixelColor(23, pixels.Color(0, 0, 0));
293 pixels.setPixelColor(35, pixels.Color(0, 0, 0));
294 pixels.setPixelColor(37, pixels.Color(0, 0, 0));
295 pixels.setPixelColor(33, pixels.Color(RH, GH, BH));
296 pixels.show();
297 break;
298
299 case 2:
300 pixels.setPixelColor(33, pixels.Color(0, 0, 0));
301 pixels.setPixelColor(21, pixels.Color(RH, GH, BH));
302 pixels.setPixelColor(37, pixels.Color(RH, GH, BH));
303 pixels.show();
304 break;
305
306 case 3:
307 pixels.setPixelColor(21, pixels.Color(RH, GH, BH));
308 pixels.setPixelColor(33, pixels.Color(RH, GH, BH));
309 pixels.setPixelColor(37, pixels.Color(RH, GH, BH));
310 pixels.show();
311 break;
312
313 case 4:
314 pixels.setPixelColor(33, pixels.Color(0, 0, 0));
315 pixels.setPixelColor(21, pixels.Color(RH, GH, BH));
316 pixels.setPixelColor(23, pixels.Color(RH, GH, BH));
317 pixels.setPixelColor(35, pixels.Color(RH, GH, BH));
318 pixels.setPixelColor(37, pixels.Color(RH, GH, BH));
319 pixels.show();
320 break;
321
322 case 5:
323 pixels.setPixelColor(21, pixels.Color(RH, GH, BH));
324 pixels.setPixelColor(23, pixels.Color(RH, GH, BH));
325 pixels.setPixelColor(33, pixels.Color(RH, GH, BH));
326 pixels.setPixelColor(35, pixels.Color(RH, GH, BH));
327 pixels.setPixelColor(37, pixels.Color(RH, GH, BH));
328 pixels.show();
329 break;
330 }
331 //---------------------------------------------------------
332 // Uhrzeit Stunden
333 //---------------------------------------------------------
334 if (timeClient.getHours() == 13 || timeClient.getHours() == 1) {
335 Stunde = 1;
336 }
337 if (timeClient.getHours() == 14 || timeClient.getHours() == 2) {
338 Stunde = 2;
339 }
340 if (timeClient.getHours() == 15 || timeClient.getHours() == 3) {
341 Stunde = 3;
342 }
343 if (timeClient.getHours() == 16 || timeClient.getHours() == 4) {
344 Stunde = 4;
345 }
346 if (timeClient.getHours() == 17 || timeClient.getHours() == 5) {
347 Stunde = 5;
348 }
349 if (timeClient.getHours() == 18 || timeClient.getHours() == 6) {
350 Stunde = 6;
351 }
352 if (timeClient.getHours() == 19 || timeClient.getHours() == 7) {
353 Stunde = 7;
354 }
355 if (timeClient.getHours() == 20 || timeClient.getHours() == 8) {
356 Stunde = 8;
357 }
358 if (timeClient.getHours() == 21 || timeClient.getHours() == 9) {
359 Stunde = 9;
360 }
361 if (timeClient.getHours() == 22 || timeClient.getHours() == 10) {
362 Stunde = 10;
363 }
364 if (timeClient.getHours() == 23 || timeClient.getHours() == 11) {
365 Stunde = 11;
366 }
367 if (timeClient.getHours() == 0 || timeClient.getHours() == 12) {
368 Stunde = 12;
369 }
370
371 //---------------------------------------------------------
372 // Uhrzeit Stunden LEDs
373 //---------------------------------------------------------
374 switch (Stunde) {
375
376 case 1:
377 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
378 pixels.show();
379 break;
380
381 case 2:
382 pixels.setPixelColor(8, pixels.Color(0, 0, 0));
383 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
384 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
385 pixels.show();
386 break;
387
388 case 3:
389 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
390 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
391 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
392 pixels.show();
393 break;
394
395 case 4:
396 pixels.setPixelColor(8, pixels.Color(0, 0, 0));
397 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
398 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
399 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
400 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
401 pixels.show();
402 break;
403
404 case 5:
405 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
406 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
407 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
408 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
409 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
410 pixels.show();
411 break;
412
413 case 6:
414 pixels.setPixelColor(8, pixels.Color(0, 0, 0));
415 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
416 pixels.setPixelColor(5, pixels.Color(RH, GH, BH));
417 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
418 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
419 pixels.setPixelColor(19, pixels.Color(RH, GH, BH));
420 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
421 pixels.show();
422 break;
423
424 case 7:
425 pixels.setPixelColor(5, pixels.Color(0, 0, 0));
426 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
427 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
428 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
429 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
430 pixels.setPixelColor(16, pixels.Color(RH, GH, BH));
431 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
432 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
433 pixels.show();
434 break;
435
436 case 8:
437 pixels.setPixelColor(8, pixels.Color(0, 0, 0));
438 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
439 pixels.setPixelColor(2, pixels.Color(RH, GH, BH));
440 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
441 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
442 pixels.setPixelColor(14, pixels.Color(RH, GH, BH));
443 pixels.setPixelColor(16, pixels.Color(RH, GH, BH));
444 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
445 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
446 pixels.show();
447 break;
448
449 case 9:
450 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
451 pixels.setPixelColor(2, pixels.Color(RH, GH, BH));
452 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
453 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
454 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
455 pixels.setPixelColor(14, pixels.Color(RH, GH, BH));
456 pixels.setPixelColor(16, pixels.Color(RH, GH, BH));
457 pixels.setPixelColor(18, pixels.Color(RH, GH, BH));
458 pixels.setPixelColor(20, pixels.Color(RH, GH, BH));
459 pixels.show();
460 break;
461
462 case 10:
463 pixels.setPixelColor(4, pixels.Color(0, 0, 0));
464 pixels.setPixelColor(16, pixels.Color(0, 0, 0));
465 pixels.setPixelColor(18, pixels.Color(0, 0, 0));
466 pixels.setPixelColor(20, pixels.Color(0, 0, 0));
467 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
468 pixels.setPixelColor(2, pixels.Color(RH, GH, BH));
469 pixels.setPixelColor(3, pixels.Color(RH, GH, BH));
470 pixels.setPixelColor(5, pixels.Color(RH, GH, BH));
471 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
472 pixels.setPixelColor(7, pixels.Color(RH, GH, BH));
473 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
474 pixels.setPixelColor(10, pixels.Color(RH, GH, BH));
475 pixels.setPixelColor(12, pixels.Color(RH, GH, BH));
476 pixels.setPixelColor(13, pixels.Color(RH, GH, BH));
477 pixels.show();
478 break;
479
480 case 11:
481 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
482 pixels.setPixelColor(1, pixels.Color(RH, GH, BH));
483 pixels.setPixelColor(3, pixels.Color(RH, GH, BH));
484 pixels.setPixelColor(5, pixels.Color(RH, GH, BH));
485 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
486 pixels.setPixelColor(7, pixels.Color(RH, GH, BH));
487 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
488 pixels.setPixelColor(9, pixels.Color(RH, GH, BH));
489 pixels.setPixelColor(11, pixels.Color(RH, GH, BH));
490 pixels.setPixelColor(12, pixels.Color(RH, GH, BH));
491 pixels.setPixelColor(13, pixels.Color(RH, GH, BH));
492 pixels.show();
493 break;
494
495 case 12:
496 pixels.setPixelColor(3, pixels.Color(0, 0, 0));
497 pixels.setPixelColor(0, pixels.Color(RH, GH, BH));
498 pixels.setPixelColor(1, pixels.Color(RH, GH, BH));
499 pixels.setPixelColor(2, pixels.Color(RH, GH, BH));
500 pixels.setPixelColor(4, pixels.Color(RH, GH, BH));
501 pixels.setPixelColor(5, pixels.Color(RH, GH, BH));
502 pixels.setPixelColor(6, pixels.Color(RH, GH, BH));
503 pixels.setPixelColor(7, pixels.Color(RH, GH, BH));
504 pixels.setPixelColor(8, pixels.Color(RH, GH, BH));
505 pixels.setPixelColor(9, pixels.Color(RH, GH, BH));
506 pixels.setPixelColor(11, pixels.Color(RH, GH, BH));
507 pixels.setPixelColor(12, pixels.Color(RH, GH, BH));
508 pixels.setPixelColor(13, pixels.Color(RH, GH, BH));
509 pixels.show();
510 break;
511 }
512 }
von
Stefan F. (Gast)
03.01.2021 09:08
Die NodeMCU Board haben gar kein EEPROM.
Die entsprechende Arduino Klasse wird auf den Flash Speicher umgelenkt,
der aber im Verhältnis zum EEPROM nur sehr wenige Schreibzyklen zulässt.
Du müsstest durch eine Elektronik erkennen, dass der Strom ausfällt. Und
dann ganz schnell den aktuellen Stand abspeichern, bevor der Strom ganz
weg ist. Allerdings besteht ein hohes Risiko, dass der Inhalt des Flash
Speichers zerstört wird, wenn gleichzeitig die Stromversorgung instabil
wird. Erschwerend kommt hinzu, dass die WLAN Schnittstelle zu von dir
nicht kontrollierbaren Zeitpunkten aktiv wird, was die Stromaufnahme
zeitweise um Faktor 8 erhöht.
Dem Verschleiß des Speichers kann man mit einem "Wear-Leveling"
Algorithmus entgegen treten. Im Prinzip geht es darum, dass man die
Daten über mehrere Speicherplätze verteilt und dafür sorgt, dass die
gleichmäßig verschleißen. Dazu muss man aber ziemlich genau wissen, wie
die Speicherblöcke organisiert und angesprochen werden. Das Arduino
Framework verbirgt diese Details.
Ich würde dir empfehlen, einen FRAM Chip mit I²C Interface an den ESP zu
hängen. Damit hast du all diese Probleme nicht. FRAM kannst du so oft
beschreiben, wie du willst.
https://www.mouser.de/datasheet/2/100/002-10180_CY15B004J_4-KBIT_512_x_8_SERIAL_I2C_AUTO-1102482.pdf
von
John Doe (Gast)
03.01.2021 09:32
Was an
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"
hast Du nicht verstanden?
von
Pasta (Gast)
03.01.2021 09:53
John Doe schrieb:
> Was an
> "Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"
>
> hast Du nicht verstanden?
Der Spagetticode hat nicht in den Anhang gepasst!
Was ein Gesülze. Anstatt eine produktive Lösung vorzuschlagen. :(
Speicher eine Variable im Spiffs, die den Wert darstellt.
Da du den ja nur ab und an änderst passt das schon wenn du immer nach
jeder Änderung speicherst.
Dazu braucht es keinen zusätzlichen Baustein am I2C, keine
Stromausfallerkennung und auch kein Wear Leveling.
So ein SPI-Flash kann schon viel ab, und das SPIFFS kümmert sich ums
Wear leveling ganz alleine ohne das man das merkt.
Wenn man mal ganz dumm rechnet verträgt der Speicher mindestens 10000
Schreibzyklen.
Wenn du jede Minute einen Wert ablegst, in immer der gleichen
Speicherzelle, hält die also mindestens eine Woche.
Da SPIFFS aber durch den ganzen Speicher wandert und nur löscht wenn es
keinen freien Block mehr hat multipliziert sich das mit den freien Pages
mal den Blocks, von denen du also einige tausend hast.
Als Augenmaß kannst du 1 kleine Datei (kleiner 1 Page) mindestens ein
Jahr lang jede Sekunde updaten bevor es zu Problemen kommen könnte.
Und da die Zyklenzahl als Minumum unter worst case gilt, ist da noch
deutlich Luft nach oben, da du z.B. bei Raumtemperatur arbeitest, nicht
bei 70 oder mehr °C.
von
Volker (Gast)
03.01.2021 11:09
Danke Jens M
Ich habe es auch schon hin bekommen aber wenn er nach jeden Farbwechsel
speichert werde ich ja nicht lange freude haben.
Lesen habe ich so gemacht 1 int addr = 1;
2 int rgb[4];
3 void setup()
4 { pixels.begin();
5 EEPROM.begin(512); //Initialize EEPROM
6 Serial.begin(9600);
7 Serial.println("Lesen");
8 addr++;
9 Serial.print(char(EEPROM.read(addr)));
10 addr++;
11 Serial.println(char(EEPROM.read(addr)));
12 rgb[1] = EEPROM.read(1);
13 rgb[2] = EEPROM.read(2);
14 rgb[3] = EEPROM.read(3);
und zum speichern so 1 EEPROM.begin(512);
2 EEPROM.write(1, 'RH');
3 EEPROM.write(2, 'GH');
4 EEPROM.write(3, 'BH');
5
6 EEPROM.write(1,RH);
7 EEPROM.write(2,GH);
8 EEPROM.write(3,BH);
9
10 EEPROM.commit();
Das ist schräg.
Warum zweimal addr++ und ein Read, und dann doch 3 reads mit fester
Adresse.
Gleiches beim Schreiben: Wozu 3 Strings a zwei Zeichen mit einem Byte
Abstand schreiben und dann 3 Bytes auf den gleichen Adressen nochmal
schreiben?
Und nicht vergessen: der ESP hat kein EEPROM. So ein commit schreibt
dann ins Flash, aber ohne Wear leveling.
Wenn der Farbwechsel (der nicht erwähnt war) automatisch öfter passiert
und ohne wear leveling im Flash landet, könnte es bald knallen.
von
Volker (Gast)
03.01.2021 11:48
Ist mein erster versuch und habe alles geändert.
wie gesagt habe noch ganz wenig anung vom Programieren.
Ich bin stolz das alles so weit funktioniert.
Bitte um verbesserung, und wie speicher ich nur einmal
und nicht nach jedem Farbwächsel.
Ein kleiner Code wäre nicht schlecht.
Danke
Volker schrieb:
> Bitte um verbesserung, und wie speicher ich nur einmal
> und nicht nach jedem Farbwächsel.
Wann wechselt es denn?
So wie ich oben sehe wenn du im Webinterface wo drauf klickst.
Dann legst du die Farben fest und wenn keiner klickt ändert sich nix.
Genau da ist jeweils die Stelle wo du speichern solltest.
von
Volker (Gast)
03.01.2021 13:18
Genau so habe ich es gemacht.
Sollt ich jetzt alles so lassen ?
Wegen der haltbakeit wurde geschrieben ich sollte wohl lieber
immer die Adresse ändern.
Das kommt alleine darauf an wie oft gespeichert wird.
Du kannst 10000mal in die gleiche Adresse schreiben.
Wenn das immer nur dann passiert wenn du auf der Webseite eine andere
Farbe anklickst, wird das in frühestens zwei Jahren zum Problem, wenn du
das jeden Tag jede wache Stunde einmal machst. immer. jeden Tag. 16h
täglich. keine Ausnahme, kein Urlaub, kein "oh das ist schön das lass
ich so".
Verpasst du Tage, zieht sich das nach hinten.
03.01.2021 13:49 :
Bearbeitet durch User
von
Volker (Gast)
03.01.2021 19:03
Na gut !
Ich werde es so lassen.
Die Uhr lauft ja auch und bin Super zufrieden.
Trotzdem vielen Dank.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.