05.01.2022, 11:16 PM
Guten Abend, alles Gute und Gesundheit zum neuen Jahr....
dieses Jahr habe ich etwas besonderes für meine bessere Hälfte zu Weihnachten gebaut. Ich habe ihr einen digitalen Bilderrahmen gebaut der 365 Tage lang jeden Tag ein neues Bild anzeigt. Eine Akkuladung sollte dazu gut ausreichen. Das Display ist ein 7 Farb aPaper Display von Waveshare:
Herstellerlink
ich habe 3 Displays von einem Freund bekommen. Kurzer Test am Arduino ergab das alle 3 noch funktionierten. Wobei sich ein Display anders verhaltet als die beiden anderen. Der Wechsel eines Bildes sieht komplett anders aus. Ebenso sind die Farben blasser. Scheint eine ältere Revision zu sein. Bilder sehen gedithered ganz brauchbar aus. Klar 600*448 ist nicht der Wahnsinn, aber hier ging es eher um die Erinnerungen.
Bauteile stammen aus der Grabbelkiste: Arduino Micro, Micro-SD-Card Modul, P-fet, LiPo Zelle aus einem Tablet und usb-LiPo lader. Zusammen in ein Bilderrahmen eingebaut sieht das so aus:
Gedruckte Rückplatte (die originale war nun zu dick):
Detail:
Und hier noch der Bildwechsel als Video:
Der Code ist recht einfach gehalten. Bild wird auf das Display geschoben und danach gelöscht. 24h Pause und dann geht es von vorne los. Nach einem Jahr ist kein Bild mehr da und er ist "leer".
Ich habe dann noch angefangen die Software für einen normalen Bilderrahmen zu schreiben der die Bilder "random" anzeigen soll. Dabei bin ich über ein paar Dinge gestolpert. Das random nicht random ist war mir klar, also den analogin als seed benutzt. Aber das man einen Atmel nur maximal 8 Sekunden über den Watchdog schlafen legen kann wußte ich nicht. Ebenso ist die SD Bibliothek recht eingeschränkt. Da gibt es nicht so viele Möglichkeiten. Problematisch ist das schlafen legen und wieder aufwachen, denn die SD Karte lässt sich dann nicht mehr initialisieren. Nachdem der WatchdogTimer abgelaufen ist (entsprechend mehrfach um auf die 24h zu kommen) setze ich den Arduino einfach zurück. Damit initialisiert er wieder sauber. Stromverbrauch 0,1mA. Beim wechsel zwischen 50 und 200mA. Für Verbesserungen bin ich da absolut offen. Arduino ist sehr "nebenbei" bei mir.
dieses Jahr habe ich etwas besonderes für meine bessere Hälfte zu Weihnachten gebaut. Ich habe ihr einen digitalen Bilderrahmen gebaut der 365 Tage lang jeden Tag ein neues Bild anzeigt. Eine Akkuladung sollte dazu gut ausreichen. Das Display ist ein 7 Farb aPaper Display von Waveshare:
Herstellerlink
ich habe 3 Displays von einem Freund bekommen. Kurzer Test am Arduino ergab das alle 3 noch funktionierten. Wobei sich ein Display anders verhaltet als die beiden anderen. Der Wechsel eines Bildes sieht komplett anders aus. Ebenso sind die Farben blasser. Scheint eine ältere Revision zu sein. Bilder sehen gedithered ganz brauchbar aus. Klar 600*448 ist nicht der Wahnsinn, aber hier ging es eher um die Erinnerungen.
Bauteile stammen aus der Grabbelkiste: Arduino Micro, Micro-SD-Card Modul, P-fet, LiPo Zelle aus einem Tablet und usb-LiPo lader. Zusammen in ein Bilderrahmen eingebaut sieht das so aus:
Gedruckte Rückplatte (die originale war nun zu dick):
Detail:
Und hier noch der Bildwechsel als Video:
Der Code ist recht einfach gehalten. Bild wird auf das Display geschoben und danach gelöscht. 24h Pause und dann geht es von vorne los. Nach einem Jahr ist kein Bild mehr da und er ist "leer".
Ich habe dann noch angefangen die Software für einen normalen Bilderrahmen zu schreiben der die Bilder "random" anzeigen soll. Dabei bin ich über ein paar Dinge gestolpert. Das random nicht random ist war mir klar, also den analogin als seed benutzt. Aber das man einen Atmel nur maximal 8 Sekunden über den Watchdog schlafen legen kann wußte ich nicht. Ebenso ist die SD Bibliothek recht eingeschränkt. Da gibt es nicht so viele Möglichkeiten. Problematisch ist das schlafen legen und wieder aufwachen, denn die SD Karte lässt sich dann nicht mehr initialisieren. Nachdem der WatchdogTimer abgelaufen ist (entsprechend mehrfach um auf die 24h zu kommen) setze ich den Arduino einfach zurück. Damit initialisiert er wieder sauber. Stromverbrauch 0,1mA. Beim wechsel zwischen 50 und 200mA. Für Verbesserungen bin ich da absolut offen. Arduino ist sehr "nebenbei" bei mir.
Code:
#include "bmp.h"
#include "epd5in65f.h"
#include <SD.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <stdio.h>
const int chipSelectSdCard = 10;
int timetochange = 1; //time to change picture in hours
int sddown = 4;
int zufall;
char FileName[8];
File file;
using SeedSize = unsigned long;
const byte analogin {A0};
int fileCountOnSD = 0; // for counting files
// random isn´t really random, so analog pin will be used for random seed
SeedSize zufallsgen(const byte aPin)
{
SeedSize random = 0;
SeedSize maske;
for (maske = 1; maske; maske <<= 1)
{
if (1 & analogRead(aPin)) random |= maske;
delay(2);
}
return random;
}
// deepsleep enable via watchdogtimer; max 8 seconds
void myWatchdogEnable(const byte interval)
{
MCUSR = 0; // reset various flags
WDTCSR |= 0b00011000; // see docs, set WDCE, WDE
WDTCSR = 0b01000000 | interval; // set WDIE, and appropriate delay
wdt_reset();
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_mode(); // now goes to Sleep and waits for the interrupt
}
ISR(WDT_vect)
{
wdt_disable(); // disable watchdog
}
// count files on sd
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
}
fileCountOnSD++;
entry.close();
}
}
void setup()
{
pinMode (sddown, OUTPUT); //setup output for sd power
digitalWrite (sddown, LOW); // power up sd card module
delay(50);
SD.begin(chipSelectSdCard); // init sd card
File root = SD.open("/"); // open root on sd
printDirectory(root, 0); //call function "printDirectory"; will be uesed for filecout to determine how many files are stored on sd card
Epd epd; //start epd
randomSeed(zufallsgen(analogin)); //call function "zufallsgen" with analog in; will be user for random picture
timetochange = timetochange * 450; // calculate time to sleep (hours * 60 * 60 / 8)
while (true)
{
epd.Init();
fileCountOnSD = fileCountOnSD -2;
zufall = random(fileCountOnSD); //read how many files are on sd card an set "zufall" to a number from filecount (-- for decrease one cause with windows format there will be an hidden filder)
sprintf( FileName, "%i.bmp", zufall); // build filename which will be send to the display FileName = zufall.bmp
file = SD.open(FileName); //open file
epd.Clear(EPD_5IN65F_WHITE); //clear display to avoid ghoasting
epd.EPD_5IN65F_Display(&Bmp(&file)); //send bmp to display
epd.Sleep(); //set display to sleep
file.close(); //close sd file
delay(6);
digitalWrite (sddown, HIGH); //shutdown sd module
ADCSRA = 0; //disable ADC
long i;
for (i = 0; i <= timetochange; i++) // define sleep time x8; 450 = 1h; 10800 = 24h
{
myWatchdogEnable (0b100001); // 8 seconds
}
wdt_enable(WDTO_15MS); // resets the MCU after 15 milliseconds
while (true);
}
}
void loop()
{
}