Forum: Mikrocontroller und Digitale Elektronik NodeMCU V2 - Domino Uhr


von Volker (Gast)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

Was an
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

hast Du nicht verstanden?

von Pasta (Gast)


Lesenswert?

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!

von Jens M. (schuchkleisser)


Lesenswert?

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)


Lesenswert?

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();

von Jens M. (schuchkleisser)


Lesenswert?

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)


Lesenswert?

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

von Jens M. (schuchkleisser)


Lesenswert?

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)


Lesenswert?

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.

von Jens M. (schuchkleisser)


Lesenswert?

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.

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

LOL für die -1 :D :D :D

von Volker (Gast)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.