• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


Bilderrahmen im Jahr 2021(22)
#1
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. 

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()
{
}
 
Reply
#2
Witziges Display :Big Grin Ich wusste garnicht, dass es ePaper auch farbig gibt.

Zu deinem Code habe ich leider keine Vorschläge (wenn es so funktioniert würde ich es auch so lassen).
Ansonsten fällt mir ein:
  • Irgendwo habe ich mal aufgeschnappt, das man mit den gängigen RTC-Uhr-Modulen auch zu programmierbaren Zeiten Interrupts erzeugen kann. Du könntest den Rechner ganz abschalten und dann über dass RTC-Modul täglich aufwecken. Nachteil - zusätzliches Bauteil....
  • Wenns ein anderer Rechner sein darf: Der ESP32 hat einen "Deep Sleep" Mode, aus dem er über einen internen Timer wieder aufgeweckt werden kann. Laut Datasheet ist der Stromverbrauch im Deep Sleep was um die 100-10uA, je nach dem, ob man den Ultra-Low-Power-Prozessor noch nebenher laufen lässt. Hauptprozessoren und Ram sind in dem Modus natürlich komplett aus und starten beim Aufwachen von 0, aber es gibt einen kleinen Speicher von 16kB der erhalten bleibt und in dem man Zustände (wie z.B. eine Liste von bereits gezeigten Bildern) speichern kann. Wir haben damit in der Hochschule einen kleinen Sensorknoten gebaut, der regelmäßig aufwacht, Vibrationen aufzeichnet, ne FFT macht und wieder schlafen geht - hat ganz gut funktioniert.
    Nachteil - ganz anderer Prozessor als das was du da bereits hast.
 
Reply
#3
Moin,

mit einem RTC wäre es wohl auch gegangen, hatte ich leider nicht hier. ESP32 wäre auch noch eine Idee, hätte ich sogar hier. Mal schauen wann ich mal wieder Zeit für sowas habe, dann teste ich das mal. Ein Display ist ja noch übrig.
 
Reply