Forum: Mikrocontroller und Digitale Elektronik arduino display geht aus


von maik m. (chellux)


Lesenswert?

Hi Leute, ich besitze seid heute das Sainsmart Mega 2560 (baugleich
arduino mega 2560)

Problem ist das das montierte lcd keypad shield i-wann einfach aus geht
ohne mein zutun

und ich weiß einfach nicht woran es liegt, damit sollen später mal rund
288 Leds gesteuert werden und das Display ist halt zur Auswahl da usw
und muss definitiv an bleiben, selbst ein Knopfdruck bringts nicht 
wieder
zum leuchten

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hört sich nach einem Problem mit dem Fluxkompensator an.

Aber ohne weitere Informationen wird es schwierig die tatsächliche 
Ursache zu finden.

von maik m. (chellux)


Angehängte Dateien:

Lesenswert?

das ist die verkabelung, und der genutzte code ist
1
 #include <Adafruit_NeoPixel.h>
2
3
#include <sainsmartkeypad.h>
4
5
/*
6
  Digital Light Wand + SD + LCD + Arduino MEGA - V MRR-3.0 (WS2812 RGB LED Light Strip) 
7
  by Michael Ross 2014
8
  Based on original code by myself in 2010 then enhanced by Is0-Mick in 2012 
9
10
  The Digital Light Wand is for use in specialized Light Painting Photography
11
  Applications.
12
13
  This code is totally rewritten using code that IsO-Mick created made to specifically 
14
  support the WS2812 RGB LED strips running with an SD Card, an LCD Display, and the
15
  Arduino Mega 2560 Microprocessor board.
16
  
17
  The functionality that is included in this code is as follows:
18
  
19
  Menu System
20
  1 - File select
21
  2 - Brightness 
22
  3 - Initial Delay
23
  4 - Frame Delay
24
  5 - Repeat Times (The number of times to repeat the current file playback)
25
  6 - Repeat Delay (if you want a delay between repeated files)
26
 
27
  This code supports direct reading of a 24bit Windows BMP from the SD card.
28
  BMP images must be rotated 90 degrees clockwise and the width of the image should match the
29
  number of pixels you have on your LED strip.  The bottom of the tool will be the INPUT
30
  end of the strips where the Arduino is connected and will be the left side of the input
31
  BMP image.    
32
  
33
  Mick also added a Gamma Table from adafruit code which gives better conversion of 24 bit to 
34
  21 bit coloring. 
35
36
*/ 
37
38
// Library initialization
39
#include <Adafruit_NeoPixel.h>           // Library for the WS2812 Neopixel Strip
40
#include <SD.h>                          // Library for the SD Card
41
#include <LiquidCrystal.h>               // Library for the LCD Display
42
#include <SPI.h>                         // Library for the SPI Interface
43
44
// Pin assignments for the Arduino (Make changes to these if you use different Pins)
45
#define BACKLIGHT 10                      // Pin used for the LCD Backlight
46
#define SDssPin 53                        // SD card CS pin
47
int NPPin = 31;                           // Data Pin for the NeoPixel LED Strip
48
int AuxButton = 44;                       // Aux Select Button Pin
49
int AuxButtonGND = 45;                    // Aux Select Button Ground Pin
50
int g = 0;                                // Variable for the Green Value
51
int b = 0;                                // Variable for the Blue Value
52
int r = 0;                                // Variable for the Red Value
53
54
// Intial Variable declarations and assignments (Make changes to these if you want to change defaults)
55
#define STRIP_LENGTH 216                  // Set the number of LEDs the LED Strip
56
int frameDelay = 15;                      // default for the frame delay 
57
int menuItem = 1;                         // Variable for current main menu selection
58
int initDelay = 0;                        // Variable for delay between button press and start of light sequence
59
int repeat = 0;                           // Variable to select auto repeat (until select button is pressed again)
60
int repeatDelay = 0;                      // Variable for delay between repeats
61
int updateMode = 0;                       // Variable to keep track of update Modes
62
int repeatTimes = 1;                      // Variable to keep track of number of repeats
63
int brightness = 99;                      // Variable and default for the Brightness of the strip
64
65
66
// Other program variable declarations, assignments, and initializations
67
byte x;
68
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);      // Init the LCD
69
70
// Declaring the two LED Strips and pin assignments to each 
71
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LENGTH, NPPin, NEO_GRB + NEO_KHZ800);
72
73
// BacklightControl to save battery Life
74
boolean BackLightTimer = false;
75
int BackLightTimeout = 40;                // Adjust this to a larger number if you want a longer delay
76
int BackLightTemp =  BackLightTimeout;
77
78
// Variable assignments for the Keypad
79
int adc_key_val[5] ={ 30, 170, 390, 600, 800 };  
80
int NUM_KEYS = 5;
81
int adc_key_in;
82
int key=-1;
83
int oldkey=-1;
84
85
// SD Card Variables and assignments
86
File root;
87
File dataFile;
88
String m_CurrentFilename = "";
89
int m_FileIndex = 0;
90
int m_NumberOfFiles = 0;
91
String m_FileNames[200];                  
92
long buffer[STRIP_LENGTH];
93
     
94
95
// Setup loop to get everything ready.  This is only run once at power on or reset
96
void setup() {
97
  
98
  pinMode(AuxButton, INPUT);
99
  digitalWrite(AuxButton,HIGH);
100
  pinMode(AuxButtonGND, OUTPUT);
101
  digitalWrite(AuxButtonGND,LOW);
102
103
  setupLEDs();
104
  setupLCDdisplay();
105
  setupSDcard();
106
  BackLightOn();
107
108
}
109
110
     
111
// The Main Loop for the program starts here... 
112
// This will loop endlessly looking for a key press to perform a function
113
void loop() {
114
  switch (menuItem) {
115
    case 1:
116
      lcd.begin(16,2);
117
      lcd.print("1:File Select   ");
118
      lcd.setCursor(0, 1);
119
      lcd.print(m_CurrentFilename);
120
      break;    
121
    case 2:
122
      lcd.begin(16,2);
123
      lcd.print("2:Brightness    ");
124
      lcd.setCursor(0, 1);
125
      lcd.print(brightness);
126
      if (brightness == 100) {
127
        lcd.setCursor(3, 1);
128
      }
129
      else {
130
        lcd.setCursor(2, 1);
131
      }
132
      lcd.print("%");
133
      break;    
134
    case 3:
135
      lcd.begin(16,2);
136
      lcd.print("3:Init Delay    ");
137
      lcd.setCursor(0, 1);
138
      lcd.print(initDelay);    
139
      break;    
140
    case 4:
141
      lcd.begin(16,2);
142
      lcd.print("4:Frame Delay   ");
143
      lcd.setCursor(0, 1);
144
      lcd.print(frameDelay);    
145
      break;    
146
    case 5:
147
      lcd.begin(16,2);
148
      lcd.print("5:Repeat Times  ");
149
      lcd.setCursor(0, 1);
150
      lcd.print(repeatTimes);    
151
      break;    
152
    case 6:
153
      lcd.begin(16,2);
154
      lcd.print("6:Repeat Delay  ");
155
      lcd.setCursor(0, 1);
156
      lcd.print(repeatDelay);    
157
      break;    
158
159
  }
160
  
161
  int keypress = ReadKeypad();
162
  delay(50);
163
  
164
  if ((keypress == 4) ||(digitalRead(AuxButton) == LOW)) {    // The select key was pressed
165
    delay(initDelay);
166
    if (repeatTimes > 1) {
167
      for (int x = repeatTimes; x > 0; x--) {
168
        SendFile(m_CurrentFilename);
169
        delay(repeatDelay);
170
      }
171
    }
172
    else {
173
      SendFile(m_CurrentFilename);
174
    }
175
    ClearStrip(0);
176
  }
177
  if (keypress == 0) {                    // The Right Key was Pressed
178
    switch (menuItem) { 
179
      case 1:                             // Select the Next File
180
        BackLightOn();
181
        if (m_FileIndex < m_NumberOfFiles -1) {
182
          m_FileIndex++;
183
        }
184
        else {
185
          m_FileIndex = 0;                // On the last file so wrap round to the first file
186
        }
187
        DisplayCurrentFilename();
188
        break;
189
      case 2:                             // Adjust Brightness
190
        BackLightOn();
191
        if (brightness < 100) {
192
          brightness+=1;
193
        }
194
        break;
195
      case 3:                             // Adjust Initial Delay + 1 second
196
        BackLightOn();
197
        initDelay+=1000;
198
        break;
199
      case 4:                             // Adjust Frame Delay + 1 milliseconds 
200
        BackLightOn();
201
        frameDelay+=1;
202
        break;
203
      case 5:                             // Adjust Repeat Times + 1
204
        BackLightOn();
205
        repeatTimes+=1;
206
        break;
207
      case 6:                             // Adjust Repeat Delay + 100 milliseconds
208
        BackLightOn();
209
        repeatDelay+=100;
210
        break;
211
    }
212
  }
213
214
  if (keypress == 3) {                    // The Left Key was Pressed
215
    switch (menuItem) {                   // Select the Previous File
216
      case 1:
217
        BackLightOn();
218
        if (m_FileIndex > 0) {
219
          m_FileIndex--;
220
        }
221
        else {
222
          m_FileIndex = m_NumberOfFiles -1;    // On the last file so wrap round to the first file
223
        }
224
        DisplayCurrentFilename();
225
        delay(500);        
226
        break;
227
      case 2:                             // Adjust Brightness
228
        BackLightOn();
229
        if (brightness > 1) {
230
          brightness-=1;
231
        }
232
        break;
233
      case 3:                             // Adjust Initial Delay - 1 second
234
        BackLightOn();
235
        if (initDelay > 0) {
236
          initDelay-=1000;
237
        }
238
        break;
239
      case 4:                             // Adjust Frame Delay - 1 millisecond 
240
        BackLightOn();
241
        if (frameDelay > 0) {
242
          frameDelay-=1;
243
        }
244
        break;
245
      case 5:                             // Adjust Repeat Times - 1
246
        BackLightOn();
247
        if (repeatTimes > 1) {
248
          repeatTimes-=1;
249
        }
250
        break;
251
      case 6:                             // Adjust Repeat Delay - 100 milliseconds
252
        BackLightOn();
253
        if (repeatDelay > 0) {
254
          repeatDelay-=100;
255
        }
256
        break;
257
    }    
258
  }
259
260
261
  if (( keypress == 1)) {                 // The up key was pressed
262
    BackLightOn();
263
    if (menuItem == 1) {
264
      menuItem = 6;  
265
    }
266
    else {
267
      menuItem -= 1;
268
    }
269
  }
270
  if (( keypress == 2)) {                 // The down key was pressed
271
    BackLightOn();
272
    if (menuItem == 6) {
273
      menuItem = 1;  
274
    }
275
    else {
276
      menuItem += 1;
277
    }
278
  }
279
  if (BackLightTimer == true) BackLightTime();
280
}
281
282
283
284
void setupLEDs() {
285
  strip.begin();
286
  strip.show();
287
}
288
289
     
290
291
void setupLCDdisplay() {
292
  lcd.begin(16,2);
293
  lcd.print("*DLW MEGA  V3.0*");
294
  lcd.setCursor(0, 1);
295
  lcd.print("Initializing...");
296
  delay(2000);  
297
  lcd.clear();
298
}
299
300
     
301
302
void setupSDcard() {
303
  pinMode(SDssPin, OUTPUT);
304
 
305
  while (!SD.begin(SDssPin)) {
306
    BackLightOn();
307
    lcd.print("SD init failed! ");
308
    delay(1000);
309
    lcd.clear();
310
    delay(500);
311
  }
312
  lcd.clear();
313
  lcd.print("SD init done.   ");
314
  delay(1000);
315
  root = SD.open("/");
316
  lcd.clear();
317
  lcd.print("Scanning files  ");
318
  delay(500);
319
  GetFileNamesFromSD(root);
320
  isort(m_FileNames, m_NumberOfFiles);
321
  m_CurrentFilename = m_FileNames[0];
322
  DisplayCurrentFilename();
323
}
324
     
325
326
327
int ReadKeypad() {
328
  adc_key_in = analogRead(0);             // read the value from the sensor  
329
  digitalWrite(13, HIGH);  
330
  key = get_key(adc_key_in);              // convert into key press
331
     
332
  if (key != oldkey) {                    // if keypress is detected
333
    delay(50);                            // wait for debounce time
334
    adc_key_in = analogRead(0);           // read the value from the sensor  
335
    key = get_key(adc_key_in);            // convert into key press
336
    if (key != oldkey) {                  
337
      oldkey = key;
338
      if (key >=0){
339
        return key;
340
      }
341
    }
342
  }
343
  return key;
344
}
345
     
346
     
347
348
// Convert ADC value to key number
349
int get_key(unsigned int input) {
350
  int k;
351
  for (k = 0; k < NUM_KEYS; k++) {
352
    if (input < adc_key_val[k]) {        
353
      return k;
354
    }
355
  }
356
  if (k >= NUM_KEYS)
357
    k = -1;                               // No valid key pressed
358
  return k;
359
}
360
361
362
363
void BackLightOn() {
364
  analogWrite(BACKLIGHT,70);
365
  BackLightTimer = true;
366
  BackLightTemp =  BackLightTimeout;
367
}
368
     
369
370
371
void BackLightTime() {
372
  if ((BackLightTemp <= 255) && (BackLightTemp >= 0)) {
373
    analogWrite(BACKLIGHT,BackLightTemp);
374
    delay(1);
375
  }
376
     
377
  if (BackLightTemp <= 0) {
378
    BackLightTimer = false;
379
    BackLightTemp =  BackLightTimeout;
380
    analogWrite(BACKLIGHT,0);
381
  }
382
  else {
383
    BackLightTemp --;
384
    delay(1);
385
  }
386
}
387
     
388
389
390
void SendFile(String Filename) {
391
  char temp[14];
392
  Filename.toCharArray(temp,14);
393
     
394
  dataFile = SD.open(temp);
395
     
396
  // if the file is available send it to the LED's
397
  if (dataFile) {
398
    ReadTheFile();
399
    dataFile.close();
400
  }  
401
  else {
402
    lcd.clear();
403
    lcd.print("  Error reading ");
404
    lcd.setCursor(4, 1);
405
    lcd.print("file");
406
    BackLightOn();
407
    delay(1000);
408
    lcd.clear();
409
    setupSDcard();
410
    return;
411
    }
412
  }
413
414
415
416
void DisplayCurrentFilename() {
417
  m_CurrentFilename = m_FileNames[m_FileIndex];
418
  lcd.setCursor(0, 1);
419
  lcd.print("                ");
420
  lcd.setCursor(0, 1);
421
  lcd.print(m_CurrentFilename);
422
}
423
424
425
     
426
void GetFileNamesFromSD(File dir) {
427
  int fileCount = 0;
428
  String CurrentFilename = "";
429
  while(1) {
430
    File entry =  dir.openNextFile();
431
    if (! entry) {
432
      // no more files
433
      m_NumberOfFiles = fileCount;
434
    entry.close();
435
      break;
436
    }
437
    else {
438
      if (entry.isDirectory()) {
439
        //GetNextFileName(root);
440
      }
441
      else {
442
        CurrentFilename = entry.name();
443
        if (CurrentFilename.endsWith(".bmp") || CurrentFilename.endsWith(".BMP") ) { //find files with our extension only
444
          m_FileNames[fileCount] = entry.name();
445
          fileCount++;
446
        }
447
      }
448
    }
449
    entry.close();
450
  }
451
}
452
     
453
     
454
455
void latchanddelay(int dur) {
456
  strip.show();
457
  delay(dur);
458
}
459
460
461
462
void ClearStrip(int duration) {
463
  int x;
464
  for(x=0;x<STRIP_LENGTH;x++) {
465
    strip.setPixelColor(x, 0);
466
  }
467
  strip.show();
468
}
469
470
471
uint32_t readLong() {
472
  uint32_t retValue;
473
  byte incomingbyte;
474
     
475
  incomingbyte=readByte();
476
  retValue=(uint32_t)((byte)incomingbyte);
477
     
478
  incomingbyte=readByte();
479
  retValue+=(uint32_t)((byte)incomingbyte)<<8;
480
     
481
  incomingbyte=readByte();
482
  retValue+=(uint32_t)((byte)incomingbyte)<<16;
483
     
484
  incomingbyte=readByte();
485
  retValue+=(uint32_t)((byte)incomingbyte)<<24;
486
     
487
  return retValue;
488
}
489
490
491
492
uint16_t readInt() {
493
  byte incomingbyte;
494
  uint16_t retValue;
495
     
496
  incomingbyte=readByte();
497
  retValue+=(uint16_t)((byte)incomingbyte);
498
     
499
  incomingbyte=readByte();
500
  retValue+=(uint16_t)((byte)incomingbyte)<<8;
501
     
502
  return retValue;
503
}
504
505
506
507
int readByte() {
508
  int retbyte=-1;
509
  while(retbyte<0) retbyte= dataFile.read();
510
  return retbyte;
511
}
512
513
514
void getRGBwithGamma() {
515
  g=gamma(readByte())/(101-brightness);
516
  b=gamma(readByte())/(101-brightness);
517
  r=gamma(readByte())/(101-brightness);
518
}
519
520
521
522
void ReadTheFile() {
523
  #define MYBMP_BF_TYPE           0x4D42
524
  #define MYBMP_BF_OFF_BITS       54
525
  #define MYBMP_BI_SIZE           40
526
  #define MYBMP_BI_RGB            0L
527
  #define MYBMP_BI_RLE8           1L
528
  #define MYBMP_BI_RLE4           2L
529
  #define MYBMP_BI_BITFIELDS      3L
530
531
  uint16_t bmpType = readInt();
532
  uint32_t bmpSize = readLong();
533
  uint16_t bmpReserved1 = readInt();
534
  uint16_t bmpReserved2 = readInt();
535
  uint32_t bmpOffBits = readLong();
536
  bmpOffBits = 54;
537
     
538
  /* Check file header */
539
  if (bmpType != MYBMP_BF_TYPE || bmpOffBits != MYBMP_BF_OFF_BITS) {
540
    lcd.setCursor(0, 0);
541
    lcd.print("not a bitmap");
542
    delay(1000);
543
    return;
544
  }
545
    
546
  /* Read info header */
547
  uint32_t imgSize = readLong();
548
  uint32_t imgWidth = readLong();
549
  uint32_t imgHeight = readLong();
550
  uint16_t imgPlanes = readInt();
551
  uint16_t imgBitCount = readInt();
552
  uint32_t imgCompression = readLong();
553
  uint32_t imgSizeImage = readLong();
554
  uint32_t imgXPelsPerMeter = readLong();
555
  uint32_t imgYPelsPerMeter = readLong();
556
  uint32_t imgClrUsed = readLong();
557
  uint32_t imgClrImportant = readLong();
558
   
559
  /* Check info header */
560
  if( imgSize != MYBMP_BI_SIZE || imgWidth <= 0 ||
561
    imgHeight <= 0 || imgPlanes != 1 ||
562
    imgBitCount != 24 || imgCompression != MYBMP_BI_RGB ||
563
    imgSizeImage == 0 )
564
    {
565
    lcd.setCursor(0, 0);
566
    lcd.print("Unsupported");
567
    lcd.setCursor(0, 1);
568
    lcd.print("Bitmap Use 24bpp");
569
    delay(1000);
570
    return;
571
  }
572
     
573
  int displayWidth = imgWidth;
574
  if (imgWidth > STRIP_LENGTH) {
575
    displayWidth = STRIP_LENGTH;           //only display the number of led's we have
576
  }
577
     
578
     
579
  /* compute the line length */
580
  uint32_t lineLength = imgWidth * 3;
581
  if ((lineLength % 4) != 0)
582
    lineLength = (lineLength / 4 + 1) * 4;
583
    
584
585
586
    // Note:  
587
    // The x,r,b,g sequence below might need to be changed if your strip is displaying
588
    // incorrect colors.  Some strips use an x,r,b,g sequence and some use x,r,g,b
589
    // Change the order if needed to make the colors correct.
590
    
591
    for(int y=imgHeight; y > 0; y--) {
592
      int bufpos=0;    
593
      for(int x=0; x < displayWidth; x++) {
594
        uint32_t offset = (MYBMP_BF_OFF_BITS + (((y-1)* lineLength) + (x*3))) ;
595
        dataFile.seek(offset);
596
        
597
        getRGBwithGamma();
598
599
        strip.setPixelColor(x,r,b,g);
600
        
601
      }
602
    latchanddelay(frameDelay);
603
    }
604
  }
605
606
607
608
// Sort the filenames in alphabetical order
609
void isort(String *filenames, int n) {
610
  for (int i = 1; i < n; ++i) {
611
    String j = filenames[i];
612
    int k;
613
    for (k = i - 1; (k >= 0) && (j < filenames[k]); k--) {
614
      filenames[k + 1] = filenames[k];
615
    }
616
    filenames[k + 1] = j;
617
  }
618
}
619
     
620
621
   
622
PROGMEM prog_uchar gammaTable[]  = {
623
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
624
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
625
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,
626
  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,
627
  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  7,  7,
628
  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11,
629
  11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16,
630
  16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22,
631
  23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
632
  30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39,
633
  40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 50,
634
  50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 62,
635
  62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75,
636
  76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
637
  92, 93, 94, 95, 96, 97, 98, 99,100,101,102,104,105,106,107,108,
638
  109,110,111,113,114,115,116,117,118,120,121,122,123,125,126,127
639
};
640
 
641
 
642
inline byte gamma(byte x) {
643
  return pgm_read_byte(&gammaTable[x]);
644
}

von Oooch (Gast)


Lesenswert?

maik m. schrieb:
> Hi Leute, ich besitze seid heute das Sainsmart Mega 2560 (baugleich
> arduino mega 2560)
>
> Problem ist das das montierte lcd keypad shield i-wann einfach aus geht
> ohne mein zutun
>
> und ich weiß einfach nicht woran es liegt, damit sollen später mal rund
> 288 Leds gesteuert werden und das Display ist halt zur Auswahl da usw
> und muss definitiv an bleiben, selbst ein Knopfdruck bringts nicht
> wieder
> zum leuchten

Verstehe ich das richtig:
Du hast das Sainsmart Mega 2560 mit montiertem lcd keypad shield.
Da ist das lcd i-wie und i-wann ausgegangen. d.h. es war an und du hast 
nichts gemacht. Weder eingeschaltet noch ausgeschaltet, weder ist ein 
Programm auf dem Mega 2560 noch hast du da eins draufgeflashed, weder 
... noch ... Echt tragisch. Wenn es jetzt nicht mehr an geht, ist es 
kaputt.

von Chefentwickler (Gast)


Lesenswert?

Programmier es besser in echtem C!

von maik m. (chellux)


Lesenswert?

Oooch schrieb:
> Weder eingeschaltet noch ausgeschaltet, weder ist ein
> Programm auf dem Mega 2560 noch hast du da eins draufgeflashed, weder
> ... noch ... Echt tragisch. Wenn es jetzt nicht mehr an geht, ist es
> kaputt.



wenn man schon klugscheißen muss, sollte man auch alles lesen ;)

von maik m. (chellux)


Lesenswert?

Chefentwickler schrieb:
> Programmier es besser in echtem C!

ICH habs ja garnicht Programmiert, es sollte so 1:1 laufen.. nur das 
Display geht halt aus als würde die Spannung zb zusammenbrechen :(

wenn ich aber den SD Reader ab lasse, dann bleibts an (evtl weil er so 
auch nicht fertig läd da es nen Fehler gibt)

von Karl H. (kbuchegg)


Lesenswert?

Was muss man sich unter 'es geht aus' vorstellen?

geht die Hintergrundbeleuchtung aus oder zeigt das LCD nur mehr die 
normale Hintergrundfarbe ohne Zeichen drauf?

von maik m. (chellux)


Lesenswert?

Karl Heinz schrieb:
> Was muss man sich unter 'es geht aus' vorstellen?
>
> geht die Hintergrundbeleuchtung aus oder zeigt das LCD nur mehr die
> normale Hintergrundfarbe ohne Zeichen drauf?

man kann sagen das es immer dunkler wird bis es aus geht, als würde man 
den saft abdrehen, bis zur initialisierung des sd Readers gehts und ab 
dann gehts langsam aus, buchstaben werden schwächer und dann is ende

von Klaus (Gast)


Lesenswert?

maik m. schrieb:
> Karl Heinz schrieb:
>> Was muss man sich unter 'es geht aus' vorstellen?
>>
>> geht die Hintergrundbeleuchtung aus oder zeigt das LCD nur mehr die
>> normale Hintergrundfarbe ohne Zeichen drauf?
>
> man kann sagen das es immer dunkler wird bis es aus geht, als würde man
> den saft abdrehen, bis zur initialisierung des sd Readers gehts und ab
> dann gehts langsam aus, buchstaben werden schwächer und dann is ende

Warum gibst du dir keine Mühe mit der Rechtschreibung?

https://www.mikrocontroller.net/articles/Netiquette

von maik m. (chellux)


Lesenswert?

Klaus schrieb:

> Warum gibst du dir keine Mühe mit der Rechtschreibung?
>
> https://www.mikrocontroller.net/articles/Netiquette

warum bist du als GAST nur zum Meckern da?

von Max D. (max_d)


Lesenswert?

maik m. schrieb:
> buchstaben werden schwächer und dann is ende

Das LCD ist ja beleuchtet (Vermutung).
Ist das jetzt so, dass die Beleuchtung (also das GANZE Display) 
abdunkelt oder verblassen NUR die Buchstaben auf dem sonst unverändert 
beleuchteten Display ?

von Ulrich F. (Gast)


Lesenswert?

Manche LCD Shields haben das Problem dass der Strom auf D10 aus dem 
Ruder läuft.
Bei diesen Boards sollte man D10 auf input steht lassen und auf die 
Beleuchtungskontrolle verzichten.

von maik m. (chellux)


Lesenswert?

Max D. schrieb:
> maik m. schrieb:
>> buchstaben werden schwächer und dann is ende
>
> Das LCD ist ja beleuchtet (Vermutung).
> Ist das jetzt so, dass die Beleuchtung (also das GANZE Display)
> abdunkelt oder verblassen NUR die Buchstaben auf dem sonst unverändert
> beleuchteten Display ?

alles komplett, Buchstaben werden blasser und Hintergrundbeleuchtung 
geht aus

als würde zb die Spannung langsam zusammenbrechen, was ich aber 
ausschließe.

sofort nach der initialisierung wirds Display langsam dunkler, vom 
starten bis Dunkel sinds ca 10sek

Ulrich F. schrieb:
> Manche LCD Shields haben das Problem dass der Strom auf D10 aus
> dem
> Ruder läuft.
> Bei diesen Boards sollte man D10 auf input steht lassen und auf die
> Beleuchtungskontrolle verzichten.

 hab den "backlighttimer"
1
 void BackLightOn() {
2
  analogWrite(BACKLIGHT,70);
3
  BackLightTimer = false;
4
  BackLightTemp =  BackLightTimeout;
5
}

mal von true auf false gemacht, jetz ist nurnoch das die Schrift nen 
ekliges flackern beinhaltet und noch leicht abdunkelt woran kann das 
liegen?

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> jetz ist nurnoch das die Schrift nen
> ekliges flackern beinhaltet und noch leicht abdunkelt woran kann das
> liegen?

um Hardwarefehler auszuschliessen bestelle ich immer alles doppelt und 
prüfe mit anderer Hardware gegen.

woher soll man ohne Kaffeesatz lesen das hier feststellen ?

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:

>  hab den "backlighttimer"
>
>
1
 void BackLightOn() {
2
>   analogWrite(BACKLIGHT,70);
3
>   BackLightTimer = false;
4
>   BackLightTemp =  BackLightTimeout;
5
> }
>
> mal von true auf false gemacht, jetz ist nurnoch

Also wars doch die Hintergrundbeleuchtung.#

> das die Schrift nen
> ekliges flackern beinhaltet und noch leicht abdunkelt woran kann das
> liegen?

Du wirst es nicht gerne hören. Aber es liegt daran, dass der 
Programmierer nicht viel Sachverstand an den Tag legt. Das sieht man zb 
an der IMplementierung des Backlights, aber auch daran, dass er am 
Anfang in loop() bei der UNetrscheidung was anzuzeigen ist, er dauernd 
ein lcd.begin aufruft, welches jedesmal das LCD wieder neu initialisiert 
und dabei dann auch löscht. Was dann eben flackert wie Sau.
Man sieht es auch daran, wie er die ganzen Zeitsteuerungen im Programm 
macht. Das ist alles, wie sag ichs freundlich, ohne Sachverstand 
gemacht.

: Bearbeitet durch User
von Daniel H. (Firma: keine) (commander)


Lesenswert?

Karl Heinz schrieb:
> Das ist alles, wie sag ichs freundlich, ohne Sachverstand
> gemacht.

Arduino halt.

Und das ist nicht gegen die Hardware-Plattform gerichtet.

von Ulrich F. (Gast)


Lesenswert?

Falls das auf dein Board zutrifft.
Und das kannst du aus dem Schaltplan des Boards ersehen....
Und im Zweifen nachmessen.

>analogWrite(BACKLIGHT,70);
Weiterhin steht der Outputpin noch ab und zu auf 1, True, oder was auch 
immer...
In der Zeit wird der Pin gnadenlos überlastet.
Das hat schon einige Arduinos gegrillt.

Nimm doch mal das gesamte BACKLIGHT Gedöns raus.
Oder löte eine Diode ein. Leiterbahn aufkratzen und Diode rein. z.B. 
eine 1n4148, oder irgendeine andere kleine Diode.
Aber den Pin zu überlasten ist sinnfrei. Völlig Sinn befreit.

von maik m. (chellux)


Lesenswert?

das Backlight Problem hat sich ja im mom gelöst. trotzdem hab ich alles 
was "backlight" im Wort hatte ma rausgeworfen.

problem ist weiterhin dieses ekelhafte Flackern, das bereitet einem 
Kopfschmerzen, und gut lesbar ist es auch nicht...

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Wie Karl Heinz schon schrieb:

Karl Heinz schrieb:
> Das sieht man zb
> an der IMplementierung des Backlights, aber auch daran, dass er am
> Anfang in loop() bei der UNetrscheidung was anzuzeigen ist, er dauernd
> ein lcd.begin aufruft, welches jedesmal das LCD wieder neu initialisiert
> und dabei dann auch löscht. Was dann eben flackert wie Sau.

Ersetze das
1
lcd.begin(16,2);

in loop() durch

1
lcd.clear();

Damit sollte das Flackern aufhören, da nun nur noch der Inhalt gelöscht 
und der Cursor jeweils an den Anfang zurückgesetzt wird ohne das ganze 
Display nue zu initialisieren.

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

Alle lcd.begin(16,2); bis auf einen im Setup rausgeworfen?

Auch macht es keinen Sinn das LCD mit neuen Daten zu versorgen, wenn es 
schon das richtige anzeigt.

von Jürgen S. (jurs)


Lesenswert?

Laut Deinem Programm willst Du 216 RGB-Leds ansteuern, die jede bis zu 
3*20 mA Strom ziehen kann. Das wäre ein Gesamtstrom bei voller 
Ansteuerung aller LEDs von 216*3*20 mA = 12960 mA = ca. 13 Ampere.

Von Deiner Schaltung her, bei der Du den Strom für diese LEDs aus dem 5V 
Spannungsregler des Arduino-Boards ziehen möchtest, ist das etwas zu 
optimistisch.

Informiere Dich, wie viele mA Du aus dem 5V-Pin des Boards ziehen 
darfst!

Und dann besorge Dir ein FETTES 5V-Netzteil für Deine 216 RGB-LEDs, das 
als MINIMUM 13 Ampere @5V liefern kann, sonst wird das nichts mit Deinen 
216 WS2812 LEDs!

von maik m. (chellux)


Lesenswert?

die leds bekommen ne eigene versorgung ;)

aber flackern tuts trotz Änderungen noch
1
#include <sainsmartkeypad.h>
2
3
#include <Adafruit_NeoPixel.h>
4
5
/*
6
  Digital Light Wand + SD + LCD + Arduino MEGA - V MRR-3.0 (WS2812 RGB LED Light Strip) 
7
  by Michael Ross 2014
8
  Based on original code by myself in 2010 then enhanced by Is0-Mick in 2012 
9
10
  The Digital Light Wand is for use in specialized Light Painting Photography
11
  Applications.
12
13
  This code is totally rewritten using code that IsO-Mick created made to specifically 
14
  support the WS2812 RGB LED strips running with an SD Card, an LCD Display, and the
15
  Arduino Mega 2560 Microprocessor board.
16
  
17
  The functionality that is included in this code is as follows:
18
  
19
  Menu System
20
  1 - File select
21
  2 - Brightness 
22
  3 - Initial Delay
23
  4 - Frame Delay
24
  5 - Repeat Times (The number of times to repeat the current file playback)
25
  6 - Repeat Delay (if you want a delay between repeated files)
26
 
27
  This code supports direct reading of a 24bit Windows BMP from the SD card.
28
  BMP images must be rotated 90 degrees clockwise and the width of the image should match the
29
  number of pixels you have on your LED strip.  The bottom of the tool will be the INPUT
30
  end of the strips where the Arduino is connected and will be the left side of the input
31
  BMP image.    
32
  
33
  Mick also added a Gamma Table from adafruit code which gives better conversion of 24 bit to 
34
  21 bit coloring. 
35
36
*/ 
37
38
// Library initialization
39
#include <Adafruit_NeoPixel.h>           // Library for the WS2812 Neopixel Strip
40
#include <SD.h>                          // Library for the SD Card
41
#include <LiquidCrystal.h>               // Library for the LCD Display
42
#include <SPI.h>                         // Library for the SPI Interface
43
44
// Pin assignments for the Arduino (Make changes to these if you use different Pins)
45
#define BACKLIGHT 10                      // Pin used for the LCD Backlight
46
#define SDssPin 53                        // SD card CS pin
47
int NPPin = 31;                           // Data Pin for the NeoPixel LED Strip
48
int AuxButton = 44;                       // Aux Select Button Pin
49
int AuxButtonGND = 45;                    // Aux Select Button Ground Pin
50
int g = 0;                                // Variable for the Green Value
51
int b = 0;                                // Variable for the Blue Value
52
int r = 0;                                // Variable for the Red Value
53
54
// Intial Variable declarations and assignments (Make changes to these if you want to change defaults)
55
#define STRIP_LENGTH 216                  // Set the number of LEDs the LED Strip
56
int frameDelay = 15;                      // default for the frame delay 
57
int menuItem = 1;                         // Variable for current main menu selection
58
int initDelay = 0;                        // Variable for delay between button press and start of light sequence
59
int repeat = 0;                           // Variable to select auto repeat (until select button is pressed again)
60
int repeatDelay = 0;                      // Variable for delay between repeats
61
int updateMode = 0;                       // Variable to keep track of update Modes
62
int repeatTimes = 1;                      // Variable to keep track of number of repeats
63
int brightness = 99;                      // Variable and default for the Brightness of the strip
64
65
66
// Other program variable declarations, assignments, and initializations
67
byte x;
68
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);      // Init the LCD
69
70
// Declaring the two LED Strips and pin assignments to each 
71
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LENGTH, NPPin, NEO_GRB + NEO_KHZ800);
72
73
// BacklightControl to save battery Life
74
boolean BackLightTimer = false;
75
int BackLightTimeout = 40;                // Adjust this to a larger number if you want a longer delay
76
int BackLightTemp =  BackLightTimeout;
77
78
// Variable assignments for the Keypad
79
int adc_key_val[5] ={ 30, 170, 390, 600, 800 };  
80
int NUM_KEYS = 5;
81
int adc_key_in;
82
int key=-1;
83
int oldkey=-1;
84
85
// SD Card Variables and assignments
86
File root;
87
File dataFile;
88
String m_CurrentFilename = "";
89
int m_FileIndex = 0;
90
int m_NumberOfFiles = 0;
91
String m_FileNames[200];                  
92
long buffer[STRIP_LENGTH];
93
     
94
95
// Setup loop to get everything ready.  This is only run once at power on or reset
96
void setup() {
97
  
98
  pinMode(AuxButton, INPUT);
99
  digitalWrite(AuxButton,HIGH);
100
  pinMode(AuxButtonGND, OUTPUT);
101
  digitalWrite(AuxButtonGND,LOW);
102
103
  setupLEDs();
104
  setupLCDdisplay();
105
  setupSDcard();
106
107
108
}
109
110
     
111
// The Main Loop for the program starts here... 
112
// This will loop endlessly looking for a key press to perform a function
113
void loop() {
114
  switch (menuItem) {
115
    case 1:
116
      lcd.begin (16,2);
117
      lcd.print("1:File Select   ");
118
      lcd.setCursor(0, 1);
119
      lcd.print(m_CurrentFilename);
120
      break;    
121
    case 2:
122
      lcd.clear ();
123
      lcd.print("2:Brightness    ");
124
      lcd.setCursor(0, 1);
125
      lcd.print(brightness);
126
      if (brightness == 100) {
127
        lcd.setCursor(3, 1);
128
      }
129
      else {
130
        lcd.setCursor(2, 1);
131
      }
132
      lcd.print("%");
133
      break;    
134
    case 3:
135
      lcd.clear ();
136
      lcd.print("3:Init Delay    ");
137
      lcd.setCursor(0, 1);
138
      lcd.print(initDelay);    
139
      break;    
140
    case 4:
141
      lcd.clear ();
142
      lcd.print("4:Frame Delay   ");
143
      lcd.setCursor(0, 1);
144
      lcd.print(frameDelay);    
145
      break;    
146
    case 5:
147
      lcd.clear ();
148
      lcd.print("5:Repeat Times  ");
149
      lcd.setCursor(0, 1);
150
      lcd.print(repeatTimes);    
151
      break;    
152
    case 6:
153
      lcd.clear ();
154
      lcd.print("6:Repeat Delay  ");
155
      lcd.setCursor(0, 1);
156
      lcd.print(repeatDelay);    
157
      break;    
158
159
  }
160
  
161
  int keypress = ReadKeypad();
162
  delay(50);
163
  
164
  if ((keypress == 4) ||(digitalRead(AuxButton) == LOW)) {    // The select key was pressed
165
    delay(initDelay);
166
    if (repeatTimes > 1) {
167
      for (int x = repeatTimes; x > 0; x--) {
168
        SendFile(m_CurrentFilename);
169
        delay(repeatDelay);
170
      }
171
    }
172
    else {
173
      SendFile(m_CurrentFilename);
174
    }
175
    ClearStrip(0);
176
  }
177
  if (keypress == 0) {                    // The Right Key was Pressed
178
    switch (menuItem) { 
179
      case 1:                             // Select the Next File
180
181
        if (m_FileIndex < m_NumberOfFiles -1) {
182
          m_FileIndex++;
183
        }
184
        else {
185
          m_FileIndex = 0;                // On the last file so wrap round to the first file
186
        }
187
        DisplayCurrentFilename();
188
        break;
189
      case 2:                             // Adjust Brightness
190
191
        if (brightness < 100) {
192
          brightness+=1;
193
        }
194
        break;
195
      case 3:                             // Adjust Initial Delay + 1 second
196
197
        initDelay+=1000;
198
        break;
199
      case 4:                             // Adjust Frame Delay + 1 milliseconds 
200
201
        frameDelay+=1;
202
        break;
203
      case 5:                             // Adjust Repeat Times + 1
204
205
        repeatTimes+=1;
206
        break;
207
      case 6:                             // Adjust Repeat Delay + 100 milliseconds
208
209
        repeatDelay+=100;
210
        break;
211
    }
212
  }
213
214
  if (keypress == 3) {                    // The Left Key was Pressed
215
    switch (menuItem) {                   // Select the Previous File
216
      case 1:
217
218
        if (m_FileIndex > 0) {
219
          m_FileIndex--;
220
        }
221
        else {
222
          m_FileIndex = m_NumberOfFiles -1;    // On the last file so wrap round to the first file
223
        }
224
        DisplayCurrentFilename();
225
        delay(500);        
226
        break;
227
      case 2:                             // Adjust Brightness
228
229
        if (brightness > 1) {
230
          brightness-=1;
231
        }
232
        break;
233
      case 3:                             // Adjust Initial Delay - 1 second
234
235
        if (initDelay > 0) {
236
          initDelay-=1000;
237
        }
238
        break;
239
      case 4:                             // Adjust Frame Delay - 1 millisecond 
240
241
        if (frameDelay > 0) {
242
          frameDelay-=1;
243
        }
244
        break;
245
      case 5:                             // Adjust Repeat Times - 1
246
247
        if (repeatTimes > 1) {
248
          repeatTimes-=1;
249
        }
250
        break;
251
      case 6:                             // Adjust Repeat Delay - 100 milliseconds
252
253
        if (repeatDelay > 0) {
254
          repeatDelay-=100;
255
        }
256
        break;
257
    }    
258
  }
259
260
261
  if (( keypress == 1)) {                 // The up key was pressed
262
263
    if (menuItem == 1) {
264
      menuItem = 6;  
265
    }
266
    else {
267
      menuItem -= 1;
268
    }
269
  }
270
  if (( keypress == 2)) {                 // The down key was pressed
271
272
    if (menuItem == 6) {
273
      menuItem = 1;  
274
    }
275
    else {
276
      menuItem += 1;
277
    }
278
  }
279
280
}
281
282
283
284
void setupLEDs() {
285
  strip.begin();
286
  strip.show();
287
}
288
289
     
290
291
void setupLCDdisplay() {
292
  lcd.clear();
293
  lcd.print("*DLW MEGA  V3.0*");
294
  lcd.setCursor(0, 1);
295
  lcd.print("Initializing...");
296
  delay(2000);  
297
  lcd.clear();
298
}
299
300
     
301
302
void setupSDcard() {
303
  pinMode(SDssPin, OUTPUT);
304
 
305
  while (!SD.begin(SDssPin)) {
306
307
    lcd.print("SD init failed! ");
308
    delay(1000);
309
    lcd.clear();
310
    delay(500);
311
  }
312
  lcd.clear();
313
  lcd.print("SD init done.   ");
314
  delay(1000);
315
  root = SD.open("/");
316
  lcd.clear();
317
  lcd.print("Scanning files  ");
318
  delay(500);
319
  GetFileNamesFromSD(root);
320
  isort(m_FileNames, m_NumberOfFiles);
321
  m_CurrentFilename = m_FileNames[0];
322
  DisplayCurrentFilename();
323
}
324
     
325
326
327
int ReadKeypad() {
328
  adc_key_in = analogRead(0);             // read the value from the sensor  
329
  digitalWrite(13, HIGH);  
330
  key = get_key(adc_key_in);              // convert into key press
331
     
332
  if (key != oldkey) {                    // if keypress is detected
333
    delay(50);                            // wait for debounce time
334
    adc_key_in = analogRead(0);           // read the value from the sensor  
335
    key = get_key(adc_key_in);            // convert into key press
336
    if (key != oldkey) {                  
337
      oldkey = key;
338
      if (key >=0){
339
        return key;
340
      }
341
    }
342
  }
343
  return key;
344
}
345
     
346
     
347
348
// Convert ADC value to key number
349
int get_key(unsigned int input) {
350
  int k;
351
  for (k = 0; k < NUM_KEYS; k++) {
352
    if (input < adc_key_val[k]) {        
353
      return k;
354
    }
355
  }
356
  if (k >= NUM_KEYS)
357
    k = -1;                               // No valid key pressed
358
  return k;
359
}
360
  
361
362
363
void SendFile(String Filename) {
364
  char temp[14];
365
  Filename.toCharArray(temp,14);
366
     
367
  dataFile = SD.open(temp);
368
     
369
  // if the file is available send it to the LED's
370
  if (dataFile) {
371
    ReadTheFile();
372
    dataFile.close();
373
  }  
374
  else {
375
    lcd.clear();
376
    lcd.print("  Error reading ");
377
    lcd.setCursor(4, 1);
378
    lcd.print("file");
379
380
    delay(1000);
381
    lcd.clear();
382
    setupSDcard();
383
    return;
384
    }
385
  }
386
387
388
389
void DisplayCurrentFilename() {
390
  m_CurrentFilename = m_FileNames[m_FileIndex];
391
  lcd.setCursor(0, 1);
392
  lcd.print("                ");
393
  lcd.setCursor(0, 1);
394
  lcd.print(m_CurrentFilename);
395
}
396
397
398
     
399
void GetFileNamesFromSD(File dir) {
400
  int fileCount = 0;
401
  String CurrentFilename = "";
402
  while(1) {
403
    File entry =  dir.openNextFile();
404
    if (! entry) {
405
      // no more files
406
      m_NumberOfFiles = fileCount;
407
    entry.close();
408
      break;
409
    }
410
    else {
411
      if (entry.isDirectory()) {
412
        //GetNextFileName(root);
413
      }
414
      else {
415
        CurrentFilename = entry.name();
416
        if (CurrentFilename.endsWith(".bmp") || CurrentFilename.endsWith(".BMP") ) { //find files with our extension only
417
          m_FileNames[fileCount] = entry.name();
418
          fileCount++;
419
        }
420
      }
421
    }
422
    entry.close();
423
  }
424
}
425
     
426
     
427
428
void latchanddelay(int dur) {
429
  strip.show();
430
  delay(dur);
431
}
432
433
434
435
void ClearStrip(int duration) {
436
  int x;
437
  for(x=0;x<STRIP_LENGTH;x++) {
438
    strip.setPixelColor(x, 0);
439
  }
440
  strip.show();
441
}
442
443
444
uint32_t readLong() {
445
  uint32_t retValue;
446
  byte incomingbyte;
447
     
448
  incomingbyte=readByte();
449
  retValue=(uint32_t)((byte)incomingbyte);
450
     
451
  incomingbyte=readByte();
452
  retValue+=(uint32_t)((byte)incomingbyte)<<8;
453
     
454
  incomingbyte=readByte();
455
  retValue+=(uint32_t)((byte)incomingbyte)<<16;
456
     
457
  incomingbyte=readByte();
458
  retValue+=(uint32_t)((byte)incomingbyte)<<24;
459
     
460
  return retValue;
461
}
462
463
464
465
uint16_t readInt() {
466
  byte incomingbyte;
467
  uint16_t retValue;
468
     
469
  incomingbyte=readByte();
470
  retValue+=(uint16_t)((byte)incomingbyte);
471
     
472
  incomingbyte=readByte();
473
  retValue+=(uint16_t)((byte)incomingbyte)<<8;
474
     
475
  return retValue;
476
}
477
478
479
480
int readByte() {
481
  int retbyte=-1;
482
  while(retbyte<0) retbyte= dataFile.read();
483
  return retbyte;
484
}
485
486
487
void getRGBwithGamma() {
488
  g=gamma(readByte())/(101-brightness);
489
  b=gamma(readByte())/(101-brightness);
490
  r=gamma(readByte())/(101-brightness);
491
}
492
493
494
495
void ReadTheFile() {
496
  #define MYBMP_BF_TYPE           0x4D42
497
  #define MYBMP_BF_OFF_BITS       54
498
  #define MYBMP_BI_SIZE           40
499
  #define MYBMP_BI_RGB            0L
500
  #define MYBMP_BI_RLE8           1L
501
  #define MYBMP_BI_RLE4           2L
502
  #define MYBMP_BI_BITFIELDS      3L
503
504
  uint16_t bmpType = readInt();
505
  uint32_t bmpSize = readLong();
506
  uint16_t bmpReserved1 = readInt();
507
  uint16_t bmpReserved2 = readInt();
508
  uint32_t bmpOffBits = readLong();
509
  bmpOffBits = 54;
510
     
511
  /* Check file header */
512
  if (bmpType != MYBMP_BF_TYPE || bmpOffBits != MYBMP_BF_OFF_BITS) {
513
    lcd.setCursor(0, 0);
514
    lcd.print("not a bitmap");
515
    delay(1000);
516
    return;
517
  }
518
    
519
  /* Read info header */
520
  uint32_t imgSize = readLong();
521
  uint32_t imgWidth = readLong();
522
  uint32_t imgHeight = readLong();
523
  uint16_t imgPlanes = readInt();
524
  uint16_t imgBitCount = readInt();
525
  uint32_t imgCompression = readLong();
526
  uint32_t imgSizeImage = readLong();
527
  uint32_t imgXPelsPerMeter = readLong();
528
  uint32_t imgYPelsPerMeter = readLong();
529
  uint32_t imgClrUsed = readLong();
530
  uint32_t imgClrImportant = readLong();
531
   
532
  /* Check info header */
533
  if( imgSize != MYBMP_BI_SIZE || imgWidth <= 0 ||
534
    imgHeight <= 0 || imgPlanes != 1 ||
535
    imgBitCount != 24 || imgCompression != MYBMP_BI_RGB ||
536
    imgSizeImage == 0 )
537
    {
538
    lcd.setCursor(0, 0);
539
    lcd.print("Unsupported");
540
    lcd.setCursor(0, 1);
541
    lcd.print("Bitmap Use 24bpp");
542
    delay(1000);
543
    return;
544
  }
545
     
546
  int displayWidth = imgWidth;
547
  if (imgWidth > STRIP_LENGTH) {
548
    displayWidth = STRIP_LENGTH;           //only display the number of led's we have
549
  }
550
     
551
     
552
  /* compute the line length */
553
  uint32_t lineLength = imgWidth * 3;
554
  if ((lineLength % 4) != 0)
555
    lineLength = (lineLength / 4 + 1) * 4;
556
    
557
558
559
    // Note:  
560
    // The x,r,b,g sequence below might need to be changed if your strip is displaying
561
    // incorrect colors.  Some strips use an x,r,b,g sequence and some use x,r,g,b
562
    // Change the order if needed to make the colors correct.
563
    
564
    for(int y=imgHeight; y > 0; y--) {
565
      int bufpos=0;    
566
      for(int x=0; x < displayWidth; x++) {
567
        uint32_t offset = (MYBMP_BF_OFF_BITS + (((y-1)* lineLength) + (x*3))) ;
568
        dataFile.seek(offset);
569
        
570
        getRGBwithGamma();
571
572
        strip.setPixelColor(x,r,b,g);
573
        
574
      }
575
    latchanddelay(frameDelay);
576
    }
577
  }
578
579
580
581
// Sort the filenames in alphabetical order
582
void isort(String *filenames, int n) {
583
  for (int i = 1; i < n; ++i) {
584
    String j = filenames[i];
585
    int k;
586
    for (k = i - 1; (k >= 0) && (j < filenames[k]); k--) {
587
      filenames[k + 1] = filenames[k];
588
    }
589
    filenames[k + 1] = j;
590
  }
591
}
592
     
593
594
   
595
PROGMEM prog_uchar gammaTable[]  = {
596
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
597
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
598
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,
599
  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,
600
  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  7,  7,
601
  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11,
602
  11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16,
603
  16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22,
604
  23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
605
  30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39,
606
  40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 50,
607
  50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 62,
608
  62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75,
609
  76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
610
  92, 93, 94, 95, 96, 97, 98, 99,100,101,102,104,105,106,107,108,
611
  109,110,111,113,114,115,116,117,118,120,121,122,123,125,126,127
612
};
613
 
614
 
615
inline byte gamma(byte x) {
616
  return pgm_read_byte(&gammaTable[x]);
617
}

von Jürgen S. (jurs)


Lesenswert?

maik m. schrieb:
> die leds bekommen ne eigene versorgung ;)

Wozu postest Du eigentlich ein Schaltbild, wenn das Schaltbild FALSCH 
ist?

Anyway.

Dein LCD-Backlight schaltest Du auf Kurzschluss:
1
void BackLightOn() {
2
  analogWrite(BACKLIGHT,70);
3
  BackLightTimer = true;
4
  BackLightTemp =  BackLightTimeout;
5
}

Schau ggf. ins Schaltbild Deines LCD-Keypad-Shields oder glaube es mir: 
Bei diesem Shield darfst Du NIEMALS den Backlight-Pin 10 auf Output 
schalten!

Weder per pinMode noch mit analogWrite darf der Pin als Ausgang genutzt 
werden, der Backlight-Pin MUSS AUF INPUT bleiben und Du kannst nur mit 
"digitalWrite(BACKLIGHT, HIGH)" und "digitalWrite(BACKLIGHT, LOW)" die 
Hintergrundbeleuchtung ein- oder ausschalten.

Sobald Du den Pin-10 auf OUTPUT setzt ==> Kurzschluss in Deiner 
Schaltung.

von Karl H. (kbuchegg)


Lesenswert?

Daniel H. schrieb:
> Wie Karl Heinz schon schrieb:
>
> Karl Heinz schrieb:
>> Das sieht man zb
>> an der IMplementierung des Backlights, aber auch daran, dass er am
>> Anfang in loop() bei der UNetrscheidung was anzuzeigen ist, er dauernd
>> ein lcd.begin aufruft, welches jedesmal das LCD wieder neu initialisiert
>> und dabei dann auch löscht. Was dann eben flackert wie Sau.
>
> Ersetze das
>
>
1
> lcd.begin(16,2);
2
>
>
> in loop() durch
>
>
>
1
> lcd.clear();
2
>
>

Nein.
Auch das Clear sollte da raus.
Der ganze Ansatz ist zweifelhaft und unsinnig, da jedesmal bei einem 
Aufruf von loop das LCD neu bemalen zu wollen. Aber wenn man das schon 
macht, dann so, dass man das LCD NICHT löscht, sondern nur 
überschreibt. Gelöscht wird es nur, wenn sich die anzuzeigende 
Information grundlegend ändert, also auch alle Fixtexte neu hingemalt 
werden müssen.

Sonst flackert es eben wie Sau.

: Bearbeitet durch User
von maik m. (chellux)


Lesenswert?

warum auf output? habs doch lediglich den timer ausgemacht?!

ja in der Schaltzeichnung fehlt die Spannungsversorgung, die 5v am 
arduino sind input ;)

ich bin hobbyfotograf und keiner der sich schwer mit dem Thema 
beschäftigt, es soll ja lediglich funktionieren..

daher bringts mir auch nichts wenn ihr mit Fachbegriffen o.ä um euch 
werft

wüsst ich wies geht, dann würd ich nicht hier fragen ;)

daher wär ich dem jenigen der mir den code so ändert das es geht, sehr 
dankbar.. für euch ist es sicher eine sache von Paar minuten, aber ich 
hock hier schon paar stunden..

evtl würde ja jemand seine zeit grad opfern

mfg

von Karl H. (kbuchegg)


Lesenswert?

Das ganze Programm sieht aus, wie ein Haufen zusammenkopierter Code. Die 
Einzelteile sind ja nicht so schlecht, aber der Zusammenbau zu einem 
Komplettprogramm offenbart, dass das alles dem Verfasser weit über den 
Kopf wächst. Da ist keine vernünftige Struktur drinnen, da sind keine 
Konzepte erkennbar. Das ist zusammkopiert ohne Ahnung davon zu haben, 
wie man Programme aufbaut.

von maik m. (chellux)


Lesenswert?

und bei mir wars nur copy/paste  inkl der hier genannten änderungen die 
aber nur teilweise was gebracht haben, aber trotz display.clear 
entfernen ist das flackern weiterhin da

achja, hier der Ersteller

http://mrossphoto.com/wordpress32/neopixel-ws2812-dlw/

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:

> dankbar.. für euch ist es sicher eine sache von Paar minuten

Nope.
Das ist keine Sache von ein paar Minuten.
Die loop() muss man im Grunde wegwerfen und neu machen. Allerdings indem 
man sich vorher erst mal ein Konzeot zurecht legt, wie der 
Programmaufbau eigentlich sein soll.

> aber ich
> hock hier schon paar stunden..

Ja, ich würde da auch ein paar Stunden hocken.
Nur weil ich für viele kleinere Programm was aus dem Ärmel schütteln 
kann, bedeutet das nicht, dass ich für gröbere Sachen ohne Überlegung an 
die Sache rangehen kann.

von Jürgen S. (jurs)


Lesenswert?

maik m. schrieb:
> daher bringts mir auch nichts wenn ihr mit Fachbegriffen o.ä um euch
> werft

Was genau an dem Fachbegriff "Kurzschluss" hast Du denn nicht 
verstanden, den ich in meinem letzten Posting verwendet habe?

> daher wär ich dem jenigen der mir den code so ändert das es geht,
> sehr dankbar..

Auf jeden Fall muß das "analogWrite" aus dem Programm heraus, mit dem Du 
versuchst das Backlight per PWM anzusteuern, aber tatsächlich nur einen 
Kurzschluß an dem Transistor verursachst, der das Backlight schaltet.
1
void BackLightOn() {
2
  analogWrite(BACKLIGHT,70);  // ==> diese Zeile löschen, verursacht Kurzschluss
3
  BackLightTimer = true;
4
  BackLightTemp =  BackLightTimeout;
5
}

Wenn Du am Backlight irgendwas machen möchtest, dann darfst Du es bei 
diesem Schield nur ein- oder ausschalten. Mit den Befehlen
1
  digitalWrite(BACKLIGHT,HIGH); 
2
  oder
3
  digitalWrite(BACKLIGHT,LOW);

Das eine schaltet das Backlight ein, das andere aus. Welches was macht, 
bin ich jetzt auch überfragt und müßte es erstmal raussuchen.

Auch die Zeilen
1
analogWrite(BACKLIGHT,BackLightTemp);
2
analogWrite(BACKLIGHT,0);
dürfen in Deinem Programm NICHT vorkommen!

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Jürgen S. schrieb:

> Auf jeden Fall muß das "analogWrite" aus dem Programm heraus, mit dem Du
> versuchst das Backlight per PWM anzusteuern, aber tatsächlich nur einen
> Kurzschluß an dem Transistor verursachst, der das Backlight schaltet.

Hört sich komisch an.
Kann man die Schaltung dazu mal sehen?

Wenn das Backlight per Transistor ein/aus geschaltet werden kann, dann 
kann man das auch mit PWM dimmen.

von maik m. (chellux)


Lesenswert?

Jürgen S. schrieb:

> void BackLightOn() {
>   analogWrite(BACKLIGHT,70);  // ==> diese Zeile löschen, verursacht
> Kurzschluss
>   BackLightTimer = true;
>   BackLightTemp =  BackLightTimeout;
> }
>
ist raus


> Wenn Du am Backlight irgendwas machen möchtest, dann darfst Du es bei
> diesem Schield nur ein- oder ausschalten. Mit den Befehlen
> digitalWrite(BACKLIGHT,HIGH);
>   oder
>   digitalWrite(BACKLIGHT,LOW);
mit High gings
>
> Das eine schaltet das Backlight ein, das andere aus. Welches was macht,
> bin ich jetzt auch überfragt und müßte es erstmal raussuchen.
>
> Auch die ZeilenanalogWrite(BACKLIGHT,BackLightTemp);
> analogWrite(BACKLIGHT,0);
> dürfen in Deinem Programm NICHT vorkommen!

auch draußen

bleibt nurnoch das scheiß flackern, ist jetz nich so "strobo like" aber 
es flackert halt erkennbar

1
#include <Adafruit_NeoPixel.h>
2
3
#include <sainsmartkeypad.h>
4
5
/*
6
  Digital Light Wand + SD + LCD + Arduino MEGA - V MRR-3.0 (WS2812 RGB LED Light Strip) 
7
  by Michael Ross 2014
8
  Based on original code by myself in 2010 then enhanced by Is0-Mick in 2012 
9
10
  The Digital Light Wand is for use in specialized Light Painting Photography
11
  Applications.
12
13
  This code is totally rewritten using code that IsO-Mick created made to specifically 
14
  support the WS2812 RGB LED strips running with an SD Card, an LCD Display, and the
15
  Arduino Mega 2560 Microprocessor board.
16
  
17
  The functionality that is included in this code is as follows:
18
  
19
  Menu System
20
  1 - File select
21
  2 - Brightness 
22
  3 - Initial Delay
23
  4 - Frame Delay
24
  5 - Repeat Times (The number of times to repeat the current file playback)
25
  6 - Repeat Delay (if you want a delay between repeated files)
26
 
27
  This code supports direct reading of a 24bit Windows BMP from the SD card.
28
  BMP images must be rotated 90 degrees clockwise and the width of the image should match the
29
  number of pixels you have on your LED strip.  The bottom of the tool will be the INPUT
30
  end of the strips where the Arduino is connected and will be the left side of the input
31
  BMP image.    
32
  
33
  Mick also added a Gamma Table from adafruit code which gives better conversion of 24 bit to 
34
  21 bit coloring. 
35
36
*/ 
37
38
// Library initialization
39
#include <Adafruit_NeoPixel.h>           // Library for the WS2812 Neopixel Strip
40
#include <SD.h>                          // Library for the SD Card
41
#include <LiquidCrystal.h>               // Library for the LCD Display
42
#include <SPI.h>                         // Library for the SPI Interface
43
44
// Pin assignments for the Arduino (Make changes to these if you use different Pins)
45
#define BACKLIGHT 10                      // Pin used for the LCD Backlight
46
#define SDssPin 53                        // SD card CS pin
47
int NPPin = 31;                           // Data Pin for the NeoPixel LED Strip
48
int AuxButton = 44;                       // Aux Select Button Pin
49
int AuxButtonGND = 45;                    // Aux Select Button Ground Pin
50
int g = 0;                                // Variable for the Green Value
51
int b = 0;                                // Variable for the Blue Value
52
int r = 0;                                // Variable for the Red Value
53
54
// Intial Variable declarations and assignments (Make changes to these if you want to change defaults)
55
#define STRIP_LENGTH 216                  // Set the number of LEDs the LED Strip
56
int frameDelay = 15;                      // default for the frame delay 
57
int menuItem = 1;                         // Variable for current main menu selection
58
int initDelay = 0;                        // Variable for delay between button press and start of light sequence
59
int repeat = 0;                           // Variable to select auto repeat (until select button is pressed again)
60
int repeatDelay = 0;                      // Variable for delay between repeats
61
int updateMode = 0;                       // Variable to keep track of update Modes
62
int repeatTimes = 1;                      // Variable to keep track of number of repeats
63
int brightness = 99;                      // Variable and default for the Brightness of the strip
64
65
66
// Other program variable declarations, assignments, and initializations
67
byte x;
68
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);      // Init the LCD
69
70
// Declaring the two LED Strips and pin assignments to each 
71
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LENGTH, NPPin, NEO_GRB + NEO_KHZ800);
72
73
// BacklightControl to save battery Life
74
boolean BackLightTimer = false;
75
int BackLightTimeout = 40;                // Adjust this to a larger number if you want a longer delay
76
int BackLightTemp =  BackLightTimeout;
77
78
// Variable assignments for the Keypad
79
int adc_key_val[5] ={ 30, 170, 390, 600, 800 };  
80
int NUM_KEYS = 5;
81
int adc_key_in;
82
int key=-1;
83
int oldkey=-1;
84
85
// SD Card Variables and assignments
86
File root;
87
File dataFile;
88
String m_CurrentFilename = "";
89
int m_FileIndex = 0;
90
int m_NumberOfFiles = 0;
91
String m_FileNames[200];                  
92
long buffer[STRIP_LENGTH];
93
     
94
95
// Setup loop to get everything ready.  This is only run once at power on or reset
96
void setup() {
97
  
98
  pinMode(AuxButton, INPUT);
99
  digitalWrite(AuxButton,HIGH);
100
  pinMode(AuxButtonGND, OUTPUT);
101
  digitalWrite(AuxButtonGND,LOW);
102
103
  setupLEDs();
104
  setupLCDdisplay();
105
  setupSDcard();
106
  BackLightOn();
107
108
}
109
110
     
111
// The Main Loop for the program starts here... 
112
// This will loop endlessly looking for a key press to perform a function
113
void loop() {
114
  switch (menuItem) {
115
    case 1:
116
      lcd.begin(16,2);
117
      lcd.print("1:File Select   ");
118
      lcd.setCursor(0, 1);
119
      lcd.print(m_CurrentFilename);
120
      break;    
121
    case 2:
122
      lcd.print("2:Brightness    ");
123
      lcd.setCursor(0, 1);
124
      lcd.print(brightness);
125
      if (brightness == 100) {
126
        lcd.setCursor(3, 1);
127
      }
128
      else {
129
        lcd.setCursor(2, 1);
130
      }
131
      lcd.print("%");
132
      break;    
133
    case 3:
134
      lcd.print("3:Init Delay    ");
135
      lcd.setCursor(0, 1);
136
      lcd.print(initDelay);    
137
      break;    
138
    case 4:
139
      lcd.print("4:Frame Delay   ");
140
      lcd.setCursor(0, 1);
141
      lcd.print(frameDelay);    
142
      break;    
143
    case 5:
144
      lcd.print("5:Repeat Times  ");
145
      lcd.setCursor(0, 1);
146
      lcd.print(repeatTimes);    
147
      break;    
148
    case 6:
149
      lcd.print("6:Repeat Delay  ");
150
      lcd.setCursor(0, 1);
151
      lcd.print(repeatDelay);    
152
      break;    
153
154
  }
155
  
156
  int keypress = ReadKeypad();
157
  delay(150);
158
  
159
  if ((keypress == 4) ||(digitalRead(AuxButton) == LOW)) {    // The select key was pressed
160
    delay(initDelay);
161
    if (repeatTimes > 1) {
162
      for (int x = repeatTimes; x > 0; x--) {
163
        SendFile(m_CurrentFilename);
164
        delay(repeatDelay);
165
      }
166
    }
167
    else {
168
      SendFile(m_CurrentFilename);
169
    }
170
    ClearStrip(0);
171
  }
172
  if (keypress == 0) {                    // The Right Key was Pressed
173
    switch (menuItem) { 
174
      case 1:                             // Select the Next File
175
        BackLightOn();
176
        if (m_FileIndex < m_NumberOfFiles -1) {
177
          m_FileIndex++;
178
        }
179
        else {
180
          m_FileIndex = 0;                // On the last file so wrap round to the first file
181
        }
182
        DisplayCurrentFilename();
183
        break;
184
      case 2:                             // Adjust Brightness
185
        BackLightOn();
186
        if (brightness < 100) {
187
          brightness+=1;
188
        }
189
        break;
190
      case 3:                             // Adjust Initial Delay + 1 second
191
        BackLightOn();
192
        initDelay+=1000;
193
        break;
194
      case 4:                             // Adjust Frame Delay + 1 milliseconds 
195
        BackLightOn();
196
        frameDelay+=1;
197
        break;
198
      case 5:                             // Adjust Repeat Times + 1
199
        BackLightOn();
200
        repeatTimes+=1;
201
        break;
202
      case 6:                             // Adjust Repeat Delay + 100 milliseconds
203
        BackLightOn();
204
        repeatDelay+=100;
205
        break;
206
    }
207
  }
208
209
  if (keypress == 3) {                    // The Left Key was Pressed
210
    switch (menuItem) {                   // Select the Previous File
211
      case 1:
212
        BackLightOn();
213
        if (m_FileIndex > 0) {
214
          m_FileIndex--;
215
        }
216
        else {
217
          m_FileIndex = m_NumberOfFiles -1;    // On the last file so wrap round to the first file
218
        }
219
        DisplayCurrentFilename();
220
        delay(500);        
221
        break;
222
      case 2:                             // Adjust Brightness
223
        BackLightOn();
224
        if (brightness > 1) {
225
          brightness-=1;
226
        }
227
        break;
228
      case 3:                             // Adjust Initial Delay - 1 second
229
        BackLightOn();
230
        if (initDelay > 0) {
231
          initDelay-=1000;
232
        }
233
        break;
234
      case 4:                             // Adjust Frame Delay - 1 millisecond 
235
        BackLightOn();
236
        if (frameDelay > 0) {
237
          frameDelay-=1;
238
        }
239
        break;
240
      case 5:                             // Adjust Repeat Times - 1
241
        BackLightOn();
242
        if (repeatTimes > 1) {
243
          repeatTimes-=1;
244
        }
245
        break;
246
      case 6:                             // Adjust Repeat Delay - 100 milliseconds
247
        BackLightOn();
248
        if (repeatDelay > 0) {
249
          repeatDelay-=100;
250
        }
251
        break;
252
    }    
253
  }
254
255
256
  if (( keypress == 1)) {                 // The up key was pressed
257
    BackLightOn();
258
    if (menuItem == 1) {
259
      menuItem = 6;  
260
    }
261
    else {
262
      menuItem -= 1;
263
    }
264
  }
265
  if (( keypress == 2)) {                 // The down key was pressed
266
    BackLightOn();
267
    if (menuItem == 6) {
268
      menuItem = 1;  
269
    }
270
    else {
271
      menuItem += 1;
272
    }
273
  }
274
  if (BackLightTimer == true) BackLightTime();
275
}
276
277
278
279
void setupLEDs() {
280
  strip.begin();
281
  strip.show();
282
}
283
284
     
285
286
void setupLCDdisplay() {
287
  lcd.begin(16,2);
288
  lcd.print("*DLW MEGA  V3.0*");
289
  lcd.setCursor(0, 1);
290
  lcd.print("Initializing...");
291
  delay(2000);  
292
  lcd.clear();
293
}
294
295
     
296
297
void setupSDcard() {
298
  pinMode(SDssPin, OUTPUT);
299
 
300
  while (!SD.begin(SDssPin)) {
301
    BackLightOn();
302
    lcd.print("SD init failed! ");
303
    delay(1000);
304
    lcd.clear();
305
    delay(500);
306
  }
307
  lcd.clear();
308
  lcd.print("SD init done.   ");
309
  delay(1000);
310
  root = SD.open("/");
311
  lcd.clear();
312
  lcd.print("Scanning files  ");
313
  delay(500);
314
  GetFileNamesFromSD(root);
315
  isort(m_FileNames, m_NumberOfFiles);
316
  m_CurrentFilename = m_FileNames[0];
317
  DisplayCurrentFilename();
318
}
319
     
320
321
322
int ReadKeypad() {
323
  adc_key_in = analogRead(0);             // read the value from the sensor  
324
  digitalWrite(13, HIGH);  
325
  key = get_key(adc_key_in);              // convert into key press
326
     
327
  if (key != oldkey) {                    // if keypress is detected
328
    delay(50);                            // wait for debounce time
329
    adc_key_in = analogRead(0);           // read the value from the sensor  
330
    key = get_key(adc_key_in);            // convert into key press
331
    if (key != oldkey) {                  
332
      oldkey = key;
333
      if (key >=0){
334
        return key;
335
      }
336
    }
337
  }
338
  return key;
339
}
340
     
341
     
342
343
// Convert ADC value to key number
344
int get_key(unsigned int input) {
345
  int k;
346
  for (k = 0; k < NUM_KEYS; k++) {
347
    if (input < adc_key_val[k]) {        
348
      return k;
349
    }
350
  }
351
  if (k >= NUM_KEYS)
352
    k = -1;                               // No valid key pressed
353
  return k;
354
}
355
356
357
358
void BackLightOn() {
359
  digitalWrite(BACKLIGHT,HIGH); 
360
  BackLightTimer = true;
361
  BackLightTemp =  BackLightTimeout;
362
}
363
     
364
365
366
void BackLightTime() {
367
  if ((BackLightTemp <= 255) && (BackLightTemp >= 0)) {
368
        delay(1);
369
  }
370
     
371
  if (BackLightTemp <= 0) {
372
    BackLightTimer = false;
373
    BackLightTemp =  BackLightTimeout;
374
  }
375
  else {
376
    BackLightTemp --;
377
    delay(1);
378
  }
379
}
380
     
381
382
383
void SendFile(String Filename) {
384
  char temp[14];
385
  Filename.toCharArray(temp,14);
386
     
387
  dataFile = SD.open(temp);
388
     
389
  // if the file is available send it to the LED's
390
  if (dataFile) {
391
    ReadTheFile();
392
    dataFile.close();
393
  }  
394
  else {
395
    lcd.clear();
396
    lcd.print("  Error reading ");
397
    lcd.setCursor(4, 1);
398
    lcd.print("file");
399
    BackLightOn();
400
    delay(1000);
401
    lcd.clear();
402
    setupSDcard();
403
    return;
404
    }
405
  }
406
407
408
409
void DisplayCurrentFilename() {
410
  m_CurrentFilename = m_FileNames[m_FileIndex];
411
  lcd.setCursor(0, 1);
412
  lcd.print("                ");
413
  lcd.setCursor(0, 1);
414
  lcd.print(m_CurrentFilename);
415
}
416
417
418
     
419
void GetFileNamesFromSD(File dir) {
420
  int fileCount = 0;
421
  String CurrentFilename = "";
422
  while(1) {
423
    File entry =  dir.openNextFile();
424
    if (! entry) {
425
      // no more files
426
      m_NumberOfFiles = fileCount;
427
    entry.close();
428
      break;
429
    }
430
    else {
431
      if (entry.isDirectory()) {
432
        //GetNextFileName(root);
433
      }
434
      else {
435
        CurrentFilename = entry.name();
436
        if (CurrentFilename.endsWith(".bmp") || CurrentFilename.endsWith(".BMP") ) { //find files with our extension only
437
          m_FileNames[fileCount] = entry.name();
438
          fileCount++;
439
        }
440
      }
441
    }
442
    entry.close();
443
  }
444
}
445
     
446
     
447
448
void latchanddelay(int dur) {
449
  strip.show();
450
  delay(dur);
451
}
452
453
454
455
void ClearStrip(int duration) {
456
  int x;
457
  for(x=0;x<STRIP_LENGTH;x++) {
458
    strip.setPixelColor(x, 0);
459
  }
460
  strip.show();
461
}
462
463
464
uint32_t readLong() {
465
  uint32_t retValue;
466
  byte incomingbyte;
467
     
468
  incomingbyte=readByte();
469
  retValue=(uint32_t)((byte)incomingbyte);
470
     
471
  incomingbyte=readByte();
472
  retValue+=(uint32_t)((byte)incomingbyte)<<8;
473
     
474
  incomingbyte=readByte();
475
  retValue+=(uint32_t)((byte)incomingbyte)<<16;
476
     
477
  incomingbyte=readByte();
478
  retValue+=(uint32_t)((byte)incomingbyte)<<24;
479
     
480
  return retValue;
481
}
482
483
484
485
uint16_t readInt() {
486
  byte incomingbyte;
487
  uint16_t retValue;
488
     
489
  incomingbyte=readByte();
490
  retValue+=(uint16_t)((byte)incomingbyte);
491
     
492
  incomingbyte=readByte();
493
  retValue+=(uint16_t)((byte)incomingbyte)<<8;
494
     
495
  return retValue;
496
}
497
498
499
500
int readByte() {
501
  int retbyte=-1;
502
  while(retbyte<0) retbyte= dataFile.read();
503
  return retbyte;
504
}
505
506
507
void getRGBwithGamma() {
508
  g=gamma(readByte())/(101-brightness);
509
  b=gamma(readByte())/(101-brightness);
510
  r=gamma(readByte())/(101-brightness);
511
}
512
513
514
515
void ReadTheFile() {
516
  #define MYBMP_BF_TYPE           0x4D42
517
  #define MYBMP_BF_OFF_BITS       54
518
  #define MYBMP_BI_SIZE           40
519
  #define MYBMP_BI_RGB            0L
520
  #define MYBMP_BI_RLE8           1L
521
  #define MYBMP_BI_RLE4           2L
522
  #define MYBMP_BI_BITFIELDS      3L
523
524
  uint16_t bmpType = readInt();
525
  uint32_t bmpSize = readLong();
526
  uint16_t bmpReserved1 = readInt();
527
  uint16_t bmpReserved2 = readInt();
528
  uint32_t bmpOffBits = readLong();
529
  bmpOffBits = 54;
530
     
531
  /* Check file header */
532
  if (bmpType != MYBMP_BF_TYPE || bmpOffBits != MYBMP_BF_OFF_BITS) {
533
    lcd.setCursor(0, 0);
534
    lcd.print("not a bitmap");
535
    delay(1000);
536
    return;
537
  }
538
    
539
  /* Read info header */
540
  uint32_t imgSize = readLong();
541
  uint32_t imgWidth = readLong();
542
  uint32_t imgHeight = readLong();
543
  uint16_t imgPlanes = readInt();
544
  uint16_t imgBitCount = readInt();
545
  uint32_t imgCompression = readLong();
546
  uint32_t imgSizeImage = readLong();
547
  uint32_t imgXPelsPerMeter = readLong();
548
  uint32_t imgYPelsPerMeter = readLong();
549
  uint32_t imgClrUsed = readLong();
550
  uint32_t imgClrImportant = readLong();
551
   
552
  /* Check info header */
553
  if( imgSize != MYBMP_BI_SIZE || imgWidth <= 0 ||
554
    imgHeight <= 0 || imgPlanes != 1 ||
555
    imgBitCount != 24 || imgCompression != MYBMP_BI_RGB ||
556
    imgSizeImage == 0 )
557
    {
558
    lcd.setCursor(0, 0);
559
    lcd.print("Unsupported");
560
    lcd.setCursor(0, 1);
561
    lcd.print("Bitmap Use 24bpp");
562
    delay(1000);
563
    return;
564
  }
565
     
566
  int displayWidth = imgWidth;
567
  if (imgWidth > STRIP_LENGTH) {
568
    displayWidth = STRIP_LENGTH;           //only display the number of led's we have
569
  }
570
     
571
     
572
  /* compute the line length */
573
  uint32_t lineLength = imgWidth * 3;
574
  if ((lineLength % 4) != 0)
575
    lineLength = (lineLength / 4 + 1) * 4;
576
    
577
578
579
    // Note:  
580
    // The x,r,b,g sequence below might need to be changed if your strip is displaying
581
    // incorrect colors.  Some strips use an x,r,b,g sequence and some use x,r,g,b
582
    // Change the order if needed to make the colors correct.
583
    
584
    for(int y=imgHeight; y > 0; y--) {
585
      int bufpos=0;    
586
      for(int x=0; x < displayWidth; x++) {
587
        uint32_t offset = (MYBMP_BF_OFF_BITS + (((y-1)* lineLength) + (x*3))) ;
588
        dataFile.seek(offset);
589
        
590
        getRGBwithGamma();
591
592
        strip.setPixelColor(x,r,b,g);
593
        
594
      }
595
    latchanddelay(frameDelay);
596
    }
597
  }
598
599
600
601
// Sort the filenames in alphabetical order
602
void isort(String *filenames, int n) {
603
  for (int i = 1; i < n; ++i) {
604
    String j = filenames[i];
605
    int k;
606
    for (k = i - 1; (k >= 0) && (j < filenames[k]); k--) {
607
      filenames[k + 1] = filenames[k];
608
    }
609
    filenames[k + 1] = j;
610
  }
611
}
612
     
613
614
   
615
PROGMEM prog_uchar gammaTable[]  = {
616
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
617
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
618
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,
619
  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,
620
  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  7,  7,
621
  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11,
622
  11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16,
623
  16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22,
624
  23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
625
  30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39,
626
  40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 50,
627
  50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 62,
628
  62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75,
629
  76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
630
  92, 93, 94, 95, 96, 97, 98, 99,100,101,102,104,105,106,107,108,
631
  109,110,111,113,114,115,116,117,118,120,121,122,123,125,126,127
632
};
633
 
634
 
635
inline byte gamma(byte x) {
636
  return pgm_read_byte(&gammaTable[x]);
637
}


das ist auch keine lösung da das display "1. File Select" durchgehend 
anzeigt. und das flackern würd durch entfernen von lcd.clear bzw 
lcd.begin nicht besser

von Jürgen S. (jurs)


Lesenswert?

Karl Heinz schrieb:
> Hört sich komisch an.
> Kann man die Schaltung dazu mal sehen?

Ja, klar.
Ist ja "Open Hardware":
http://www.sainsmart.com/media/wysiwyg/Schematic.jpg

> Wenn das Backlight per Transistor ein/aus geschaltet werden kann, dann
> kann man das auch mit PWM dimmen.

In diesem Fall nicht, schaue auf den Transistor und wo der digitale 
D10-Pin angeschlossen ist.

Mit "Input/HIGH" und "Input/Low" wird das Backlight ein- und 
ausgeschaltet.

Auf "Output/LOW" kann man D10 auch noch schalten.

Und sobald D10 auf "Output/HIGH" steht gibt es einen fetten Kurzschluss 
am Transistor.

von maik m. (chellux)


Lesenswert?

Karl Heinz schrieb:
> Jürgen S. schrieb:
>
>> Auf jeden Fall muß das "analogWrite" aus dem Programm heraus, mit dem Du
>> versuchst das Backlight per PWM anzusteuern, aber tatsächlich nur einen
>> Kurzschluß an dem Transistor verursachst, der das Backlight schaltet.
>
> Hört sich komisch an.
> Kann man die Schaltung dazu mal sehen?
>
> Wenn das Backlight per Transistor ein/aus geschaltet werden kann, dann
> kann man das auch mit PWM dimmen.

verwirrt mich doch nicht so >.<

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:

> bleibt nurnoch das scheiß flackern, ist jetz nich so "strobo like" aber
> es flackert halt erkennbar

Ich hab hier noch zu tun, aber wenn ich am Abend Zeit hab, dann bau ich 
dir das mal um. Ich bins in Gedanken durchgegangen, es geht da mit 
vertretbarem Aufwand halbwegs Struktur in die Sache reinzubringen. Da 
hat der Autor in seiner Naivität noch mal Glück gehabt.


Und häng bitte deinen Code als C-File im Anhang an. Es macht wenig Sinn 
da jedesmal seitenweise Text zu posten.

von maik m. (chellux)


Lesenswert?

Karl Heinz schrieb:

> Und häng bitte deinen Code als C-File im Anhang an. Es macht wenig Sinn
> da jedesmal seitenweise Text zu posten.

code hab ich immer mit "
1
" und "
 angehangen, aber die original datei gibts auch hier zum ansehn

http://mrossphoto.com/DigitalLightWand/V3/Digital_Light_Wand_-_NeoPixel_WS2812_V30.ino

von Karl H. (kbuchegg)


Lesenswert?

Jürgen S. schrieb:

> In diesem Fall nicht, schaue auf den Transistor und wo der digitale
> D10-Pin angeschlossen ist.

Das versuch ich gerade in der Schaltung nachzuvollziehen.
Ich seh aber nur eine Leitung, die an die Basis des Transistors geht, 
die mit D10 beschriftet ist.

Gehen die direkt vom D10 Pin ohne Basiswiderstand an den NPN?

> Und sobald D10 auf "Output/HIGH" steht gibt es einen fetten Kurzschluss
> am Transistor.

Das seh ich jetzt ehrlich gesagt noch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Das seh ich jetzt ehrlich gesagt noch nicht.

Ich denke, ich weiss was du meinst.
Da gehts um den fehlenden Basiswiderstand.

Yep. Der ist in der Tat ein Problem. Sowas sollte man dem Entwickler um 
die Ohren schmeissen.

von Ulrich F. (Gast)


Lesenswert?

>Das seh ich jetzt ehrlich gesagt noch nicht.

D10 ist die Stromquelle
Die Basis-Emitterstrecke ist die Stromsenke.

Da die Senke die anliegende Spannung auf 0,7V begrenzt, die Quelle aber 
auf 5V hoch drücken möchte, geht der Strom gegen unendlich.
OK, unendlich geht nicht, aber da es das versucht kann es rauchen.

Es soll nicht rauchen.

von Karl H. (kbuchegg)


Lesenswert?

Ulrich F. schrieb:
>>Das seh ich jetzt ehrlich gesagt noch nicht.
>
> D10 ist die Stromquelle
> Die Basis-Emitterstrecke ist die Stromsenke.

Habs schon gesehen.
Wer macht denn auch sowas, dass er einen NPN in normaler 
Emitterschaltung ohne Basiswiderstand betreibt. Konnte ich erst gar 
nicht glauben.
Sachen gibts.

von maik m. (chellux)


Angehängte Dateien:

Lesenswert?

hier auch nochmal der komplette verdrahtungskram ;)

aber beim durchrechnen und auf die 13A kommend frag ich mich wie das 
original das ganze dann macht??

mit seinen glaub 4x 1,5V batterien
http://www.thepixelstick.com/

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Die arbeiten in der Nacht.
Da braucht man keine 20mA um was zu sehen.
Bei Nacht und 20mA brennst du dir die Netzhaut runter. Es soll schon 
Leute gegeben haben, die mit sowas Flugzeuge vom Himmel geholt haben :-)

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> void loop() {
>   switch (menuItem) {
>     case 1:

if(lcd_update)
{
>       lcd.begin(16,2);
>       lcd.print("1:File Select   ");
>       lcd.setCursor(0, 1);
>       lcd.print(m_CurrentFilename);

lcd_update=FALSE;
}
>       break;

warum schreibst du in der Loop jedesmal neu auch wenn sich nix neues zum 
Schreiben ergibt?

setze ein Flag das geschrieben wurde und nur wenn sich was Neues ergibt 
lösche das Flag und schreibe.

von maik m. (chellux)


Lesenswert?

Karl Heinz schrieb:
> Die arbeiten in der Nacht.
> Da braucht man keine 20mA um was zu sehen.
> Bei Nacht und 20mA brennst du dir die Netzhaut runter. Es soll schon
> Leute gegeben haben, die mit sowas Flugzeuge vom Himmel geholt haben :-)

ja ICH arbeite damit auch in der nacht, is ja nich umsonst nen nachbau 
davon :P

ja ICH hab da garnix geschrieben, hab den code so übernommen und gehofft 
das es geht ;)

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> ja ICH hab da garnix geschrieben, hab den code so übernommen und gehofft
> das es geht ;)

hoffen und harren macht manchem zum Narren.....

von maik m. (chellux)


Lesenswert?

und ich tipp ma das der das Display so oft Aktualisiert ist weil bei 
Jedem druck aufn Knopf ändert sich halt der angezeigte Text

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:
> und ich tipp ma das der das Display so oft Aktualisiert ist weil bei
> Jedem druck aufn Knopf ändert sich halt der angezeigte Text


So wärs ja auch richtig.
Nur wird die Funktion loop pro Sekunde ein paar mal aufgerufen. Der 
Programmierer hat zwar sein bestes getan, den µC so gut es geht sinnlos 
auszubremsen. Aber unter eine gewisse Rate kann er nun mal nicht gehen. 
Das ganze soll ja auch noch bedienbar bleiben.

Und so wird halt pro Sekunde ein paar zig-mal das LCD gelöscht und der 
(praktisch gesehen) immer gleiche Text erneut hingemalt. Das Problem: 
Das Löschen dauert seine Zeit. AUch wenn es nur ein paar Millisekunden 
sind, du registrierst das das LCD dauernd zwischen 'leer' und 'Text da' 
wechselt. Nur nennt man das dann eben 'Flackern wie Sau'.

Hätte der die Menüausgabe in eine Funktion gesteckt, die am Ende vom 
Setup() aufgerufen und an der Stelle aufgerufen, an der er mit den 
Up/Down Tasten den aktuellen Menüpunkt wechselt, sowie an den Stellen, 
an denen er bei der Bildausgabe eine Fehlermeldung ausgibt, wäre alles 
gut gewesen. Aber so hat er die denkbar dämlichste Variante gewählt. 
Nämlich: Wir scheissen uns nichts.

: Bearbeitet durch User
von maik m. (chellux)


Lesenswert?

dann hoff ich mal das du das hinbekommst, und natürlich is deine arbeit 
dann nicht umsonst

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:
> dann hoff ich mal das du das hinbekommst, und natürlich is deine arbeit
> dann nicht umsonst

Ne, ist nicht so schlimm.
Aber wenn man da schon drann sitzt, dann kann man den restlichen Code 
auch noch aufräumen. Da drinn siehts ja zum Teil aus, wie bei Hempels 
unter Sofa.

von maik m. (chellux)


Lesenswert?

trotzdem, bevor ich da stunden dran hock, lass ich das wen machen der 
den Durchblick hat, wo ich danach auch sicher bin das es Funktioniert

und das soll der jenige ja nicht umsonst machen

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> trotzdem, bevor ich da stunden dran hock,

ich habe den Weg doch schion gezeigt....

dir fehlt nur noch

old_menuItem wenn sich was ändert
1
  if (( keypress == 1)) {                 // The up key was pressed
2
    BackLightOn();
3
    if (menuItem == 1) {
4
5
old_menuItem=menuItem;
6
7
      menuItem = 6;  
8
    }
9
    else {
10
old_menuItem=menuItem;
11
      menuItem -= 1;
12
    }
13
  }
14
  if (( keypress == 2)) {                 // The down key was pressed
15
    BackLightOn();
16
    if (menuItem == 6) {
17
old_menuItem=menuItem;
18
      menuItem = 1;  
19
    }
20
    else {
21
old_menuItem=menuItem;
22
      menuItem += 1;
23
    }
24
  }


Joachim B. schrieb:
> maik m. schrieb:
>> void loop() {
>>   switch (menuItem) {
>>     case 1:
>
> if(old_menuItem!=menuItem)
> {
>>       lcd.begin(16,2);
>>       lcd.print("1:File Select   ");
>>       lcd.setCursor(0, 1);
>>       lcd.print(m_CurrentFilename);
>
> old_menuItem=menuItem;
> }
>>       break;

usw. statt lcd_update, der Möglichkeiten gibt es viele

von Jürgen S. (jurs)


Lesenswert?

maik m. schrieb:
> ja ICH hab da garnix geschrieben, hab den code so übernommen und gehofft
> das es geht ;)

Aber nicht, wenn Du andere Hardware verbastelst als der Programmierer 
des Codes verwendet hat.

Offenbar hat der Programmierer Deines Programms ein anderes LCD-Shield 
in Verwendung als das von Dir verwendete LCD-Keypad-Shield.

Mit Deinem LCD-Keypad-Shield solltest Du definitiv nicht versuchen, das 
Backlight in der Helligkeit per analogWrite an Pin D10 regeln zu wollen. 
Aus- und Einschalten OK, Helligkeitsregelung ==> geht nicht ohne 
Kurzschluss ab.

Allerdings habe ich oben den Arduino-Code für das Aus- und Einschalten 
des LCD-Displays etwas falsch dargestellt.

Zum EINschalten ersetzt Du in Deinem Code und mit Deinem Keypad-Shield:
1
  analogWrite(BACKLIGHT,70);
durch
1
  pinMode(BACKLIGHT,INPUT); // LCD Backlight EIN

Und zum AUSschalten ersetzt Du
1
  analogWrite(BACKLIGHT,0);
durch
1
  pinMode(BACKLIGHT,OUTPUT); // LCD Backlight AUS

Dann sollte es ohne Kurzschluss funktionieren und ohne dass Dir am 
Controller die Spannung zusammenbricht.

Und dort wo das Originalprogramm die Helligkeit hoch- oder runterdimmt
1
analogWrite(BACKLIGHT,BackLightTemp);
nimmst Du dann das eine oder das andere. Ohne Hardwareumbau am Shield 
kannst Du mit Deinen KeypadShield nichts an der Hintergrundbeleuchtung 
dimmen.

von maik m. (chellux)


Lesenswert?

das dimmen MUSS ich nicht sein, An und Aus reicht.

klar hier hat JEDER etwas gesagt, aber wiederum teilweise 
unterschiedliche meinungen o.ä

daher hätte ich gerne das Jemand den kompletten Code mal überarbeitet 
sodass ich nicht anfangen muss das alles zusammen zu basteln

so wie es aktuell ist gehts bis auf das flackern ja

daher bin ich dankbar, das Karl Heinz da mal drüber guckt und es 
"ordnet" sodass es eig. nur copy&paste für mich ist

von Ulrich F. (Gast)


Lesenswert?

maik m. schrieb:
> klar hier hat JEDER etwas gesagt, aber wiederum teilweise
> unterschiedliche meinungen o.ä
Befrage mal 3 Imker zu einem Bienenproblem.
Du bekommst 5 Meinungen zu hören.
Und das wundersame: Alle haben recht.


Einigkeit wurde erzielt in:
Das Shield hat einen Fehler.


Und:
Das Programm muss renoviert werden.

von Joachim B. (jar)


Lesenswert?

Ulrich F. schrieb:
> Befrage mal 3 Imker zu einem Bienenproblem.

oder 3 HNO Ärzte, von darf nicht tauchen wegen Löcher im Trommelfell zu 
keine vorhanden bis Riss im Trommelfell

von maik m. (Gast)


Lesenswert?

Achja fals es keine Umstände macht hätt Ich gerne das sobald ich die 
bildauswahl bestätige, das das display aus geht bis ich wieder ne taste 
drücke

von maik m. (Gast)


Lesenswert?

Achja. Hat evtl hier jemand nen 3d Drucker und würde mir evtl für 
kleines Geld nen Gehäuse für das ganze machen?

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Sorry. Bin gestern nicht mehr dazu gekommen.

Brenn das mal rein.
Bedenke bitte, das ich das hier nicht testen kann, weil ich die Hardware 
nicht habe. D.h. da können noch logische Fehler drinn sein.
Die Teile, die die Bitmap vom File einlesen hab ich nicht angerührt.
Aber beim Rest hab ich ein wenig umgerührt.

: Bearbeitet durch User
von maik m. (Gast)


Lesenswert?

Schonmal vielen dank. Inkl Displaybeleuchtung aus beim File lesen?

sprich beim bestätigen der Datei. .

Werd gleich ma gucken obs mim flackern besser ist. Bin noch unterwegs. 
Zu 100% kann ichs auch nicht testen da die leds noch nicht da sind

von Björn P. (bjrn_g)


Lesenswert?

maik m. schrieb:
> daher hätte ich gerne das Jemand den kompletten Code mal überarbeitet
> sodass ich nicht anfangen muss das alles zusammen zu basteln

maik m. schrieb:
> Achja fals es keine Umstände macht hätt Ich gerne das sobald ich die
> bildauswahl bestätige, das das display aus geht bis ich wieder ne taste
> drücke

maik m. schrieb:
> Achja. Hat evtl hier jemand nen 3d Drucker und würde mir evtl für
> kleines Geld nen Gehäuse für das ganze machen?

Gegenfrage: würdest du mir als Hobbyfotograf ein Generationenbild (Bild 
in Bild) so "Nebenbei" oder maximal für kleines Geld anfertigen? 
(Beispiel: http://www.pix4kids.ch/images/_bild%20fertig.jpg)
-> da ich das erst kürzlich gemacht habe, kenne ich die ungefähren 
Kosten und die lagen noch einiges unter dem durchschnittlichen Tagessatz 
eines Softwareentwicklers.

Du unterschätzt den Aufwand gewaltig. Und ohne die Hardware zu besitzen, 
werden wohl nur die wenigsten Softwareentwickler überhaupt daran denken 
das Programm neu-/umzuschreiben.

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:
> Schonmal vielen dank. Inkl Displaybeleuchtung aus beim File lesen?

Ja, klar.
Ist doch logisch, dass dann die Beleuchtung aus sein sollte.


Inklusive einiger vergessener zu behandelnder Fehlersituationen.
Inklusive technisch korrekter Ansteuerung der Beleuchtung.
und, und, und.

> Zu 100% kann ichs auch nicht testen da die leds noch nicht da sind

OK. Aber sieh die Menübehandlung durch. Ich war hier zu faul, mir da ein 
Testsystem zusammenzustecken :-)

von maik m. (Gast)


Lesenswert?

Björn G. schrieb:
> maik m. schrieb:
> daher hätte ich gerne das Jemand den kompletten Code mal überarbeitet
> sodass ich nicht anfangen muss das alles zusammen zu basteln
>
> maik m. schrieb:
> Achja fals es keine Umstände macht hätt Ich gerne das sobald ich die
> bildauswahl bestätige, das das display aus geht bis ich wieder ne taste
> drücke
>
> maik m. schrieb:
> Achja. Hat evtl hier jemand nen 3d Drucker und würde mir evtl für
> kleines Geld nen Gehäuse für das ganze machen?
>
> Gegenfrage: würdest du mir als Hobbyfotograf ein Generationenbild (Bild
> in Bild) so "Nebenbei" oder maximal für kleines Geld anfertigen?


> (Beispiel: http://www.pix4kids.ch/images/_bild%20fertig.jpg)
> -> da ich das erst kürzlich gemacht habe, kenne ich die ungefähren
> Kosten und die lagen noch einiges unter dem durchschnittlichen Tagessatz
> eines Softwareentwicklers.
>
> Du unterschätzt den Aufwand gewaltig. Und ohne die Hardware zu besitzen,
> werden wohl nur die wenigsten Softwareentwickler überhaupt daran denken
> das Programm neu-/umzuschreiben.

Sry mit bild Bearbeitung hab ich in der Form nix am hut.(sollte mal was 
bearbeitet werden müssen, macht das wer anders :D) Aber wenn du jeweils 
Bilder einer Person mit Bilderrahmen hast. Dann kannst du diese mit 
Photoshop innerhalb paar Minuten zusammensetzen

von maik m. (chellux)



Lesenswert?

so, getestet und scheint vom optischen schonmal komplett zu laufen, 
einzige was ist das bei jedem Enter drücken das Display ausgeht, kann 
natürlich sein das er dann auch das Bild "malt" aber ohne Leds schwer zu 
testen ;)

evtl sogar möglich das das Display so lange aus bleibt bis nen Knopf 
gedrückt wird? denn wenn die Belichtung länger dauert als die anzeige 
dann hab ich das licht vom Display mit drin:/

Display ist schön klar und geht nach einiger zeit sogar aus um Akku zu 
sparen.

jetz nurnoch hoffen das ich die grob 200 Leds auch mit ner "powerbank" 
betreiben kann (das original nutzt ja auch nur 8 AA Batterien)

werde berichten sobald ich die leds erhalten habe (express aus China 
dauert halt was)

sollte ich dir irgendwas gutes tun können (zb Aufkleber plotten) lass es 
mich wissen, stehst in meiner schuld!

edit:

Datenpin von 31 auf 24 umgelegt sodass der Reader dazwischen passt. wenn 
Stripe da ist und alles geht, dann Leitungen kürzen und Case Basteln

edit2:

ihr seht am Shield die 2 Kabel, kann ich iwas zerstören wenn ich die 5V 
darüber einspeise? denn der input soll über ne Buchse o.ä dann einmal 
ins Shield und 1 ma zur led leiste, oder soll ich fürn arduino lieber 
die usb bzw DC Buchse nutzen?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:
> so, getestet und scheint vom optischen schonmal komplett zu laufen,
> einzige was ist das bei jedem Enter drücken das Display ausgeht, kann
> natürlich sein das er dann auch das Bild "malt" aber ohne Leds schwer zu
> testen ;)

Ja. Das sollte auch so sein.
Das hier läuft ab, wenn die Enter drückst
1
  if ( (keypress == SELECT_KEY) || (digitalRead( AUX_BUTTON ) == LOW) ) {
2
3
    if( m_NumberOfFiles > 0 && m_FileIndex < m_NumberOfFiles) {
4
      lcd.clear();
5
      lcd.print( m_FileNames[m_FileIndex] );
6
      lcd.setCursor(0, 1);
7
8
      if( initDelay ) {
9
        lcd.print( "Standby ..." );
10
        delay( initDelay );
11
      }
12
      lcd.clear();
13
      BackLightOff();
14
      
15
      for (int i = 0; i < repeatTimes; i++) {
16
        lcd.setCursor( 0, 1 );
17
        lcd.print( i );
18
        lcd.print( " / " );
19
        lcd.print( repeatTimes );
20
        
21
        SendFile( m_FileNames[m_FileIndex] );
22
        
23
        if (i != repeatTimes - 1 )
24
          delay( repeatDelay );
25
      }
26
    }
27
28
    ClearStrip();
29
    ShowMenuTitle();
30
    ShowMenuValue();
31
  }

Das LCD wird gelöscht, der Name des auszugebenden Files hingemalt. Ist 
eine Wartezeit eingestellt, dann gibts eine kleine Meldung und es wird 
gewartet.
Dann wird die Hintergrundbeleuchtung auf jeden Fall abgeschaltet und die 
Ausgaben laufen auf die LED raus.

Danach: LED abschalten und am LCD wieder die Menüanzeige reaktivieren. 
Die Hintergrundbeleuchtung wird aber nicht eingeschaltet. Erst der 
nächste Tastendruck aktiviert die wieder.

> evtl sogar möglich das das Display so lange aus bleibt bis nen Knopf
> gedrückt wird?

Zumindest sollte das so sein.
Wenn nicht, dann hab ich irgendeinen Nebeneffekt übersehen.

> Display ist schön klar und geht nach einiger zeit sogar aus um Akku zu
> sparen.

Ja.
Da hab ich allerdings was übersehen.

Am Anfang von loop steht
1
void loop()
2
{
3
  int keypress = ReadKeypad();
4
  delay(150);
5
...

nimm den delay da raus.
Am Ende der loop() hab ich einen
1
  delay( 10 );
2
}
eingefügt. Das ist sonst etwas doppelt gemoppelt.
Die Absicht wäre gewesen, die Durchlaufzeit durch loop auf ca 10ms zu 
bringen (wobei die exakte Zeit nicht so kritisch ist).
Der springende Punkt ist, dass ich die Auto-Abschaltzeit
1
#define BACKLIGHT_TIMEOUT 400               // Adjust this to a larger number if you want a longer delay

auf diese 10ms bezogen habe und die 150ms aus dem ersten Delay nicht 
berücksichtigt habe (den delay hatte ich schon wieder vergessen). 400 * 
10ms sind ca. 4 Sekunden. Mit dem zusätzlichen 150ms Delay wäre das dann 
um einen Faktor 150 größer, also ca 600 Sekunden oder rund 10 Minuten. 
Das ist dann etwas arg lang.


Übrigens ist mir gerade aufgefallen, dass die Pinmanipulationen in 
BackLightOff umgedreht gehören. Also so
1
void BackLightOff()
2
{
3
  digitalWrite( BACKLIGHT, LOW ); 
4
  pinMode( BACKLIGHT, OUTPUT );
5
  BackLightTimer = false;
6
  BackLightTemp =  BACKLIGHT_TIMEOUT;
7
}
Sonst hat man wieder einen Kurzschluss, wenn auch nur ein paar 
Nanosekundenbruchteile lang.

: Bearbeitet durch User
von maik m. (chellux)


Lesenswert?

delay ist inkl "delay (150) KOMPLETT rausgeflogen und backlight wurde 
von
1
void BackLightOff()
2
{
3
  pinMode( BACKLIGHT, OUTPUT ); 
4
  digitalWrite( BACKLIGHT, LOW );
5
  BackLightTimer = false;
6
  BackLightTemp =  BACKLIGHT_TIMEOUT;

auf
1
void BackLightOff()
2
{
3
  digitalWrite( BACKLIGHT, LOW );
4
  pinMode( BACKLIGHT, OUTPUT ); 
5
  BackLightTimer = false;
6
  BackLightTemp =  BACKLIGHT_TIMEOUT;

geändert

Display geht nach 5sec ca aus, wenn Enter drück steht 0/1 im Display 
(unbeleuchtet) aber das display geht direkt an sobald das Bild fertig 
dargestellt wurde

und das ist kontraproduktiv

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:

> Display geht nach 5sec ca aus, wenn Enter drück steht 0/1 im Display
> (unbeleuchtet)

Ist etwas unschön. Gedacht war da eigentlich die Nummer der aktuellen 
Wiederholung auszugeben, damit man bei 83 Wiederholungen am LCD sehen 
kann, wie lange es noch dauern wird

Nur ist natürlich "Bild Nummer 0 von 1" nicht wirklich intuitiv.

Mach da mal ein
1
      for (int i = 0; i < repeatTimes; i++) {
2
        lcd.setCursor( 0, 1 );
3
        lcd.print( i + 1 );            // <---- Hier
4
        lcd.print( " / " );
5
        lcd.print( repeatTimes );
6
     ...
draus. Dann steht da "1 / 1". Also "Bild 1 von 1"
Dann sieht das ein wenig intuitiver aus.
Wenn du diese Information nicht willst, kannst du auch die ganzen 
Ausgaben einfach rauswerfen.

> aber das display geht direkt an sobald das Bild fertig
> dargestellt wurde


> Zumindest sollte das so sein.
> Wenn nicht, dann hab ich irgendeinen Nebeneffekt übersehen.

Ah!
Hier liegt der Grund.

Das hier
1
...
2
    ClearStrip();
3
    ShowMenuTitle();
4
    ShowMenuValue();
5
  }
6
  
7
  HandleKeys( keypress );
8
  ...

muss so lauten
1
    ClearStrip();
2
    ShowMenuTitle();
3
    ShowMenuValue();
4
  }
5
  
6
  else
7
    HandleKeys( keypress );
8
...

Logisch, der SELECT_KEY ist ja schon behandelt worden, darf also nicht 
mehr durch HandleKeys geschleust werden. Denn HandleKeys schaltet die 
Beleuchtung ein, wenn eine Taste gedrückt wurde. Und zu diesem Zeitpunkt 
ist ja die SELECT_TASTE tatsächlich noch als gedrückt gewertet, auch 
wenn HandleKeys sie nicht berücksichtigt.

Ich hätte doch das Abspielen der LED-Sequenz auch über HandleKeys 
auslösen lassen sollen. Wäre programmiertaktisch besser gewesen.

von maik m. (chellux)


Lesenswert?

jetzt ist es denk ich mal so wie es sein sollte, inkl 1/1  wobei das 
egal sein sollte, da ich es ohne Beleuchtung eh nicht sehen kann :D

von Karl H. (kbuchegg)


Lesenswert?

maik m. schrieb:
> jetzt ist es denk ich mal so wie es sein sollte, inkl 1/1  wobei das
> egal sein sollte, da ich es ohne Beleuchtung eh nicht sehen kann :D

Wer weiß, wozu man das in der Zukunft mal brauchen kann :-)
Dem µC ist es wurscht ob er was hinmalt oder nicht.
Und sei es nur, damit du zu Hause im Zimmer testen kannst, wie lange das 
Abspielen der LED-Sequenz dauern wird.

von maik m. (chellux)


Lesenswert?

geplant sind eh nur einzelne Bilder, jetzt noch gucken wie ich den SD 
Reader fest bekomme und aus was ich nen kleines schönes Gehäuse basteln 
kann

aber die frage mit der Stromversorgung hat noch niemand beantwortet :P

von maik m. (chellux)


Angehängte Dateien:

Lesenswert?

soo, liebe Leute, leds kamen grad an und der Postbote wollt direkt ma 
knapp 40€ zoll >.<

naja aber letzte frage (hoffentlich)  warum ist laut Zeichnung nen 
470ohm Wiederstand an der Datenleitung? hat das nen sinn? (läuft auch 
ohne)  muss es unbedingt 470 sein?  denn nen 508er hätt ich noch da


aber zum Thema 13A

grad nachgemessen. zieht bei 100% (laut einstellung)  nur max 1,2A

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

1,2A bei 5V macht 6W.

40 Euronen Zoll für 6W LED Leistung?
Nee, da stimmt was nicht.
Oder sind die LEDs in Gold eingefasst?


Der 470R dient zum Schutz des Atmegas.
500R, oder 510R sollten da kein Problem machen.

Man könnte auch ganz darauf verzichten.....
Aber das widerspricht der Empfehlung des Herstellers.

von maik m. (chellux)


Lesenswert?

die werden ja bei totaler Dunkelheit genutzt und laufen vom Programm her 
auch sicher niemals auf 100% da es einfach sinnlos ist :D

ja die haben beim Zoll wieder geschlampt und falsche Daten geholt 
deshalb soviel

von Jürgen S. (jurs)


Lesenswert?

maik m. schrieb:
> naja aber letzte frage (hoffentlich)  warum ist laut Zeichnung nen
> 470ohm Wiederstand an der Datenleitung? hat das nen sinn? (läuft auch
> ohne)  muss es unbedingt 470 sein?  denn nen 508er hätt ich noch da

Das muss nicht unbedingt 470 Ohm sein, 300 oder Deiner 508er gehen 
sicherlich auch. Das hängt im Endeffekt von der Länge Deiner Zuleitung, 
der Dicke des Drahtes und der Leitungskapazität ab. Wenn die Zuleitung 
zwischen uC und LEDs sehr kurz ist und die VCC von uC und LEDs bis auf 
wenige hundertestel Volt identisch ist, kann der Widerstand ggf. auch 
weggelassen werden.

Der Widerstand dient als Schutzmaßnahme für den Dateneingang der ersten 
LED. Im Arduino-Forum gibt es reihenweise User, denen bei 
WS2812-Basteleien immer wieder die erste LED am WS2812-Strang defekt 
wird. Nach 5 Minuten, nach einer Stunde oder nach 10 bis 100 Stunden 
Betriebsdauer.

Ein Problem der WS2812 ist nämlich: Die verkraften nahezu keine 
Überspannung am Dateneingang, die über der angelegten Betriebsspannung 
liegt. Gerade diese Überspannung am Dateneingang der ersten LED bekommst 
Du aber bei langen Zuleitungen aufgrund von zwei Effekten:
- Spannungsabfall auf der VCC-Zuleitung wg. ohmschem Widerstand
- Spannungsüberhöhung beim Schalten wg. Leitungskapazität ("induktive 
Last")

Also besser Du hältst Dich an die empfohlene Schaltung als nicht.
Denn im Zweifelsfall ist ein einzelnder Widerstand billiger als alle 
paar Betriebsstunden die erste LED im LED-Strang zu ersetzen.

> aber zum Thema 13A
>
> grad nachgemessen. zieht bei 100% (laut einstellung)  nur max 1,2A

Welche LEDs genau (gibt ja unterschiedliche wie WS2812 oder WS2812B)?
Bei wie vielen LEDs insgesamt?
Bei welcher Stromversorgung für die LEDs?
Bei wieviel Betriebsspannung gemessen an der ersten WS2812 LED?
Und alle wieviele LEDs speist Du die Spannung im Strang neu ein?

von maik m. (chellux)


Lesenswert?

ob B oder nicht weiß ich grad garnicht, jedenfals 285 LEDs ca, bei 5V 
(powerbank) gemessen direkt am ausgang der Powerbank, also inkl arduino


aber hat evtl jemand ne idee was ich als verbinder nehmen könnte? also 
was leicht nutzbares auf kleinem raum, was die 2 leisten verbindet wenn 
sie zusammen schiebe

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

maik m. schrieb:
> ob B oder nicht weiß ich grad garnicht, jedenfals 285 LEDs ca, bei 5V
> (powerbank) gemessen direkt am ausgang der Powerbank, also inkl arduino

Also ich lese im Datenblatt der WS2812 etwas von 18,5 mA @4.5...5.5V.
Ich beziehe das auf "per channel" also pro Farbe, so dass jede LED 
3*18,5mA bei voller Ansteuerung braucht.

Wenn sich die Angabe nicht auf "per channel" sondern "per LED" bezieht, 
wäre der Verbrauch allerdings nicht 3*18,5mA, sondern nur 18,5 mA pro 
LED.

von maik m. (chellux)


Lesenswert?

ja der verbrauch ist ja erstmal egal, die leds werden nie mit voller 
leistung laufen da es unnütz ist, sie sollen so leuchten das man die 
noch "ablichten" kann ohne einfach nur nen hellen fleck zu sehen :D

von Joachim B. (jar)


Lesenswert?

Jürgen S. schrieb:
> Also ich lese im Datenblatt der WS2812 etwas von 18,5 mA @4.5...5.5V.
> Ich beziehe das auf "per channel" also pro Farbe, so dass jede LED
> 3*18,5mA bei voller Ansteuerung braucht.

pro Farbe bis 20mA macht maximal 60mA pro LED obwohl meine 117 LEDs auch 
ohne sichtbare Funktionsbeeintächtigung am 5V/4A Netzteil laufen, sollte 
eigentlich 7A brauchen, es fliesst aber nur 4A und ich sehe nicht das 
die dunkler werden.

von maik m. (chellux)


Lesenswert?

die frage bleibt aber wie ich die leisten am besten "steckbar" mach, 
weil eine 2m leiste zu Transportieren ist nicht grad einfach :D

die ist bei 1m geteilt und ich suche jetz noch ne Idee wie ich diese 
verbinde sodass sie auch zerlegen kann

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> die frage bleibt aber wie ich die leisten am besten "steckbar" mach,
> weil eine 2m leiste zu Transportieren ist nicht grad einfach :D
>
> die ist bei 1m geteilt und ich suche jetz noch ne Idee wie ich diese
> verbinde sodass sie auch zerlegen kann

also meine 5m Stripes kamen aufgerollt, die sind an der Schnittkannte 
doch schön im 2,54mm Raster so das man Stift Buchsenleisen anbauen kann.

Bild hier:
http://www.mikrocontroller.net/attachment/236089/testaufbau.jpg
Beitrag "Minutengenaue 24 Stunden-Wortuhr - wer will mitbauen?"

: Bearbeitet durch User
von maik m. (chellux)


Lesenswert?

kann mir denken was du meinst, aber nein :D ich hab "lose enden" ohne 
Kabel usw, würde auch vom Abstand nicht hinhauen da der Übergang so 
klein wie möglich sein soll..

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> kann mir denken was du meinst, aber nein :D ich hab "lose enden"
> ohne
> Kabel usw, würde auch vom Abstand nicht hinhauen da der Übergang so
> klein wie möglich sein soll..

schafft man ohne Abstand mit 3- IC Pins und Stifte.

man kann auch diese mit kurze Kabel zurücksetzen, jedenfalls bei dem 
Stripe mit 1,6cm Abstand 60/m , aber ich weiss es gibt auch welche mit 
144/m nur gelesen, da wirds eng

von maik m. (chellux)


Lesenswert?

ich überlege gerade was wäre wenn ich die obere leiste einfach "von 
hinten" ansteuer? geht das?

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> ich überlege gerade was wäre wenn ich die obere leiste einfach
> "von
> hinten" ansteuer? geht das?

wenn du umdrehst?

es ist bei der Datenleitung immer die Einspeiserichtung zu beachten, der 
+- 5V ist es egal

von maik m. (chellux)


Lesenswert?

ja dann fällts aus weil die Datenleitung ja auch von hinten eingespeist 
werde würde... ma gucken ob iwo 2 Stiftleisten und 3 Jumper oder so 
aufgetrieben bekomm, mehr fällt mir grad nich ein

sieht halt im mom so aus


----o o---
----o o---
----o o---

könnte es vom Abstand her so Zusammenlöten

aber bringt ja nix weil dann nichmehr mit zerlegen hinhaut

von Joachim B. (jar)


Lesenswert?

maik m. schrieb:
> ja dann fällts aus weil die Datenleitung ja auch von hinten eingespeist

und die Leiste umdrehen geht nicht?

von hinten ist ja relativ

oder meinst du auf der Klebeseite? das geht natürlich.

Manno deutsche Sprache, mach ein Bild!

: Bearbeitet durch User
von maik m. (chellux)


Lesenswert?

ok anders gesagt, aktuell speise ich es von UNTEN ein, aber um die nicht 
verbinden zu müssen dachte ich das ich sie evtl von UNTEN UND OBEN 
einspeisen kann, aber geht ja wegen der Datenleitung nicht

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.