Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Discutii despre placile de dezvoltare compatibile Arduino
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 15 Sep 2021 20:25

Un alt montaj pentru incepatori.

Un ceas digital, afisat pe ecran dot matrix Max 7219, cu senzor de temperatura si umiditate, DHT11 in acest caz, si DS1307real time clock module.

Legatirule electrice le puteti vedea aici:
Image

Iar codul care a fost incarcat in Arduino este acesta:

Code: Select all

#include <MD_Parola.h>
#include "RTClib.h"
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

RTC_DS1307 RTC;
DateTime now;

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

int i = 9;

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

char daysOfTheWeek[7][12] = {"Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"};
char monthOfTheYear[12][12] = {"Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"};

// Sprite Definitions
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
static const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] =  // gobbling pacman animation
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};

const uint8_t F_PMAN2 = 6;
const uint8_t W_PMAN2 = 18;
static const uint8_t PROGMEM pacman2[F_PMAN2 * W_PMAN2] =  // ghost pursued by a pacman
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
};


void setup()
{
  //Serial.begin(9600);

  P.begin();
  P.setInvert(false);
  P.setIntensity(1);
  dht.begin();
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
      {
        //Serial.println("RTC is NOT running!");
        RTC.adjust(DateTime(__DATE__, __TIME__));
      }
#if ENA_SPRITE
  P.setSpriteData(pacman1, W_PMAN1, F_PMAN1, pacman2, W_PMAN2, F_PMAN2);
#endif
        P.displayText("Digital clock   Andrei & Levente Daradici" , PA_CENTER, 25, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
         while (!P.displayAnimate());
}

const char *ZiuaCurenta = " ";

String Hour;
String TIMP=" ";
String ORA=" ";
String MINUT=" ";
String SECUNDA=" ";
String DATA="";

String Day;
String Month;
String Year;
String HumSTR;
String CelSTR;
String FarSTR;

void loop()
{
  now = RTC.now();

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
 
  if (isnan(h) || isnan(t) || isnan(f)) {
    //Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  float z = (float)h/1.0;
  HumSTR = String(z,1);
  HumSTR = HumSTR + " %";
  const char *HumC = HumSTR.c_str();

  float q = (float)t/1.0;
  CelSTR = String(q,1);
  CelSTR = CelSTR + " C";
  const char *CelC = CelSTR.c_str();

  float w = (float)f/1.0;
  FarSTR = String(w,1);
  FarSTR = FarSTR + " F";
  const char *FarC = FarSTR.c_str();

  String DayOfWeek = daysOfTheWeek[now.dayOfTheWeek()];
  String MonthOfYear = monthOfTheYear[now.month() - 1];
  const char *DayOfWeekC = DayOfWeek.c_str();
  const char *MonthOfYearC = MonthOfYear.c_str();

  ORA = (now.hour());
  if (ORA.length() < 2)
         {
           ORA = "0"+ ORA;
         }
 
  MINUT = (now.minute());
  if (MINUT.length() < 2)
         {
           MINUT = "0"+ MINUT;
         }

  TIMP = ORA + ":" + MINUT;

  const char *Timp = TIMP.c_str();

  Day = now.day();
  Month = now.month();
  Year = now.year();

  const char *Ziua = Day.c_str();
  const char *Luna = Month.c_str();
  const char *Anul = Year.c_str();

  String Date = Day + "/" + Month + "/" + Year;
  const char *Data = Date.c_str();

    if (i = 1)
    {
        P.displayText(DayOfWeekC, PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
         while (!P.displayAnimate());
    }
    if (i = 2)
    {
        P.displayText(Ziua, PA_CENTER, 100, 1000, PA_SCROLL_DOWN_RIGHT, PA_SCROLL_DOWN_RIGHT);
         while (!P.displayAnimate());
    }
    if (i = 3)
    {
        P.displayText(MonthOfYearC, PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
         while (!P.displayAnimate());
    }
    if (i = 4)
    {
        P.displayText(Anul, PA_CENTER, 10, 3000, PA_SLICE, PA_SLICE);
         while (!P.displayAnimate());
    }
   // if (i = 5)
   // {
   //     P.displayText(Data, PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
   //      while (!P.displayAnimate());
    //}
    if (i = 6)
    {
        P.displayText(Timp, PA_CENTER, 50, 3000, PA_SPRITE, PA_SPRITE);
         while (!P.displayAnimate());
    }
    if (i = 7)
    {
        String Celsius = String(t) + "°C";

        P.displayText(CelC, PA_CENTER, 100, 3000, PA_MESH, PA_MESH);
         while (!P.displayAnimate());
    }
    if (i = 8)
    {
        P.displayText(FarC, PA_CENTER, 150, 3000, PA_BLINDS, PA_BLINDS);
         while (!P.displayAnimate());
    }
    if (i = 9)
    {
        P.displayText(HumC, PA_CENTER, 25, 3000, PA_RANDOM, PA_RANDOM);
         while (!P.displayAnimate());
    }
       i= i+1;
       if (i > 9)
       {
         i=0;
       };

}



I-l puteti gasi si in pastebin.

Un mic video cu functionarea montajului


Codul sursa foloseste libraria MD_Parola, si este inspirata din exemplul din Arduino IDE de la aceasta librarie.
Numele exemplului din IDE se numeste PAROLA ANIMATION CATALOG
Image
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 26 Sep 2021 17:26

Am modificat putin codul, in asa fel incat acum animatiile sa fie complet aleatorii.

Code: Select all

#include <MD_Parola.h>
#include "RTClib.h"
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

RTC_DS1307 RTC;
DateTime now;

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

int i = 9;
int Animation;
String RandAn;

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

char daysOfTheWeek[7][12] = {"Dum", "Luni", "Marti", "Mierc", "Joi", "Vineri", "Sambat"};
char monthOfTheYear[12][12] = {"Ian", "Feb", "Mart", "April", "Mai", "Iun", "Iul", "Aug", "Sept", "Oct", "Noi", "Dec"};

struct sCatalog
{
  textEffect_t  effect;   
  const char *  psz;     
  uint16_t      speed;   
  uint16_t      pause;   
};

sCatalog catalog[] =
{
  { PA_PRINT,"",80,3000 },
  { PA_SCROLL_UP,"",80,3000 },
  { PA_SCROLL_DOWN,"",80,3000 },
  { PA_SCROLL_LEFT,"",80,3000 },
  { PA_SCROLL_RIGHT,"",80,3000 },
  { PA_SPRITE,"",80,3000  },
  { PA_SLICE,"",15,3000  },
  { PA_MESH,"",150,3000  },
  { PA_FADE,"",250,3000  },
  { PA_DISSOLVE,"",500,3000  },
  { PA_BLINDS,"",120,3000  },
  { PA_RANDOM,"",50,3000  },
  { PA_WIPE,"",80,3000  },
  { PA_WIPE_CURSOR,"",80,3000  },
  { PA_SCAN_HORIZ,"",80,3000  },
  { PA_SCAN_HORIZX,"",80,3000  },
  { PA_SCAN_VERT,"",80,3000  },
  { PA_SCAN_VERTX,"",80,3000  },
  { PA_OPENING,"",80,3000  },
  { PA_OPENING_CURSOR,"",80,3000  },
  { PA_CLOSING,"",80,3000  },
  { PA_CLOSING_CURSOR,"",80,3000  },
  { PA_SCROLL_UP_LEFT,"",80,3000  },
  { PA_SCROLL_UP_RIGHT,"",80,3000   },
  { PA_SCROLL_DOWN_LEFT,"",80,3000  },
  { PA_SCROLL_DOWN_RIGHT,"",80,3000  },
  { PA_GROW_UP,"",80,3000  },
  { PA_GROW_DOWN,"",80,3000  },
};


// Sprite Definitions
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
static const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] =  // gobbling pacman animation
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};

const uint8_t F_PMAN2 = 6;
const uint8_t W_PMAN2 = 18;
static const uint8_t PROGMEM pacman2[F_PMAN2 * W_PMAN2] =  // ghost pursued by a pacman
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
};


void setup()
{
  //Serial.begin(9600);
  P.begin();
  P.setInvert(false);
  P.setIntensity(0);
  dht.begin();
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
      {
        //Serial.println("RTC is NOT running!");
        RTC.adjust(DateTime(__DATE__, __TIME__));
      }
#if ENA_SPRITE
  P.setSpriteData(pacman1, W_PMAN1, F_PMAN1, pacman2, W_PMAN2, F_PMAN2);
#endif
}

const char *ZiuaCurenta = " ";

String Hour;
String TIMP=" ";
String ORA=" ";
String MINUT=" ";
String SECUNDA=" ";
String DATA="";

String Day;
String Month;
String Year;
String HumSTR;
String CelSTR;
String FarSTR;

void loop()
{
  now = RTC.now();
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
 
  if (isnan(h) || isnan(t) || isnan(f)) {
    //Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  float z = (float)h/1.0;
  HumSTR = String(z,1);
  HumSTR = HumSTR + " %";
  const char *HumC = HumSTR.c_str();

  float q = (float)t/1.0;
  CelSTR = String(q,1);
  CelSTR = CelSTR + " C";
  const char *CelC = CelSTR.c_str();

  float w = (float)f/1.0;
  FarSTR = String(w,1);
  FarSTR = FarSTR + " F";
  const char *FarC = FarSTR.c_str();

  String DayOfWeek = daysOfTheWeek[now.dayOfTheWeek()];
  String MonthOfYear = monthOfTheYear[now.month() - 1];
  const char *DayOfWeekC = DayOfWeek.c_str();
  const char *MonthOfYearC = MonthOfYear.c_str();

  ORA = (now.hour());
  if (ORA.length() < 2)
         {
           ORA = "0"+ ORA;
         }
 
  MINUT = (now.minute());
  if (MINUT.length() < 2)
         {
           MINUT = "0"+ MINUT;
         }

  TIMP = ORA + ":" + MINUT;

  const char *Timp = TIMP.c_str();

  Day = now.day();
  Month = now.month();
  Year = now.year();

  const char *Ziua = Day.c_str();
  const char *Luna = Month.c_str();
  const char *Anul = Year.c_str();

  String Date = Day + "/" + Month + "/" + Year;
  const char *Data = Date.c_str();

 
   if (i == 1)
    {
        Animation = random(1, 29);
        P.displayText(DayOfWeekC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
  if (i == 2)
    {
        Animation = random(1, 29);
        P.displayText(Ziua, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 3)
    {
        Animation = random(1, 29);
        P.displayText(MonthOfYearC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 4)
    {
        Animation = random(1, 29);
        P.displayText(Anul, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
 
    if (i == 5)
    {
        Animation = random(1, 29);
        P.displayText(Timp, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 6)
    {
        String Celsius = String(t) + "°C";
        Animation = random(1, 29);
        P.displayText(CelC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 7)
    {
        Animation = random(1, 29);
        P.displayText(FarC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i ==8)
    {
        Animation = random(1, 29);
        P.displayText(HumC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    //Serial.println(Animation);
       i= i+1;
       if (i > 8)
       {
         i=1;
       };

}




Singura problema in acest caz este ca exista posibilitatea ca doua animatii consecutive sa fie identice.
Si acesta se poate corecta, dar deocamdata nu in aceasta varianta.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 13 Oct 2021 15:07

Un user din vietnam, m-a intrebat cum am reglat ora si data pentru ca la el nu se regleaza.
Am facut un scurt clip cum se poate regla modulul RTC, daca a mai fost reglat inainte si s-a dereglat.
Clipul este si cu animatiile care vin complet aleator.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 30 Jan 2022 10:01

Am primit reclamatii, ca nu incape codul pe un Arduino Nano, si intr-adevar au dreptate, chiar acum am testat si eu din Arduino IDE, fara sa incerc sa incarc in nano, si propunerea sa scot partea cu senzorul DHT, pentru a-l putea folosi si cei care nu reusesc sa-l incarce din cauza lungimii librariilor, am scos din ultimul cod, partea cu senzorul de temperatura si umiditate.
Nu le-am testat, doar verificat in IDE sa nu dea erori, si sa nu dea mesajul ca nu incape pe borad. Boardul ales fiind bineinteles un nano cu procesor Atmega 328P. Deci nu dati cu pietre daca pe ecran va apar OZN-uri :haha: :haha:

Codul astfel modificat poate fi descarcat de pe pastebin, sau cei care nu au acces la pastebin (Nu inteleg de ce nu au unii acces!! Am asemenea feedbackuri !) pot sa ia codul de aici:

Code: Select all


#include <MD_Parola.h>
#include "RTClib.h"
 
RTC_DS1307 RTC;
DateTime now;
 
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10
 
int i = 9;
int Animation;
String RandAn;
 
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
 
char daysOfTheWeek[7][12] = {"Dum", "Luni", "Marti", "Mierc", "Joi", "Vineri", "Sambat"};
char monthOfTheYear[12][12] = {"Ian", "Feb", "Mart", "April", "Mai", "Iun", "Iul", "Aug", "Sept", "Oct", "Noi", "Dec"};
 
struct sCatalog
{
  textEffect_t  effect;   
  const char *  psz;     
  uint16_t      speed;   
  uint16_t      pause;   
};
 
sCatalog catalog[] =
{
  { PA_PRINT,"",80,3000 },
  { PA_SCROLL_UP,"",80,3000 },
  { PA_SCROLL_DOWN,"",80,3000 },
  { PA_SCROLL_LEFT,"",80,3000 },
  { PA_SCROLL_RIGHT,"",80,3000 },
  { PA_SPRITE,"",80,3000  },
  { PA_SLICE,"",15,3000  },
  { PA_MESH,"",150,3000  },
  { PA_FADE,"",250,3000  },
  { PA_DISSOLVE,"",500,3000  },
  { PA_BLINDS,"",120,3000  },
  { PA_RANDOM,"",50,3000  },
  { PA_WIPE,"",80,3000  },
  { PA_WIPE_CURSOR,"",80,3000  },
  { PA_SCAN_HORIZ,"",80,3000  },
  { PA_SCAN_HORIZX,"",80,3000  },
  { PA_SCAN_VERT,"",80,3000  },
  { PA_SCAN_VERTX,"",80,3000  },
  { PA_OPENING,"",80,3000  },
  { PA_OPENING_CURSOR,"",80,3000  },
  { PA_CLOSING,"",80,3000  },
  { PA_CLOSING_CURSOR,"",80,3000  },
  { PA_SCROLL_UP_LEFT,"",80,3000  },
  { PA_SCROLL_UP_RIGHT,"",80,3000   },
  { PA_SCROLL_DOWN_LEFT,"",80,3000  },
  { PA_SCROLL_DOWN_RIGHT,"",80,3000  },
  { PA_GROW_UP,"",80,3000  },
  { PA_GROW_DOWN,"",80,3000  },
};
 
 
// Sprite Definitions
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
static const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] =  // gobbling pacman animation
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};
 
const uint8_t F_PMAN2 = 6;
const uint8_t W_PMAN2 = 18;
static const uint8_t PROGMEM pacman2[F_PMAN2 * W_PMAN2] =  // ghost pursued by a pacman
{
  0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
  0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
  0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
};
 
 
void setup()
{
  //Serial.begin(9600);
  P.begin();
  P.setInvert(false);
  P.setIntensity(0);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
      {
        //Serial.println("RTC is NOT running!");
        RTC.adjust(DateTime(__DATE__, __TIME__));
      }
#if ENA_SPRITE
  P.setSpriteData(pacman1, W_PMAN1, F_PMAN1, pacman2, W_PMAN2, F_PMAN2);
#endif
        P.displayText("Digital clock ARDUINO - Andrei & Levente Daradici" , PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
         while (!P.displayAnimate());
}
 
const char *ZiuaCurenta = " ";
 
String Hour;
String TIMP=" ";
String ORA=" ";
String MINUT=" ";
String SECUNDA=" ";
String DATA="";
 
String Day;
String Month;
String Year;
String HumSTR;
String CelSTR;
String FarSTR;
 
void loop()
{
 
  String DayOfWeek = daysOfTheWeek[now.dayOfTheWeek()];
  String MonthOfYear = monthOfTheYear[now.month() - 1];
  const char *DayOfWeekC = DayOfWeek.c_str();
  const char *MonthOfYearC = MonthOfYear.c_str();
 
  ORA = (now.hour());
  if (ORA.length() < 2)
         {
           ORA = "0"+ ORA;
         }
 
  MINUT = (now.minute());
  if (MINUT.length() < 2)
         {
           MINUT = "0"+ MINUT;
         }
 
  TIMP = ORA + ":" + MINUT;
 
  const char *Timp = TIMP.c_str();
 
  Day = now.day();
  Month = now.month();
  Year = now.year();
 
  const char *Ziua = Day.c_str();
  const char *Luna = Month.c_str();
  const char *Anul = Year.c_str();
 
  String Date = Day + "/" + Month + "/" + Year;
  const char *Data = Date.c_str();
 
 
   if (i == 1)
    {
        Animation = random(1, 29);
        P.displayText(DayOfWeekC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
  if (i == 2)
    {
        Animation = random(1, 29);
        P.displayText(Ziua, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 3)
    {
        Animation = random(1, 29);
        P.displayText(MonthOfYearC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
    if (i == 4)
    {
        Animation = random(1, 29);
        P.displayText(Anul, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
 
    if (i == 5)
    {
        Animation = random(1, 29);
        P.displayText(Timp, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
         while (!P.displayAnimate());
    }
 
    //Serial.println(Animation);
       i= i+1;
       if (i > 5)
       {
         i=1;
       };
 
}



Spor la bricolat !
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 31 Aug 2023 21:09

Pe moment "lucrez" la o versiune NTP al acestui ceas. M-a imbarligat putin libraria MD_Parola, insa cred ca deja am ajuns in directia buna.
Aceasta varianta este construita pe un wemos D1 mini, acel microcontroler care are wifi la 11 RON cu transport cu tot :haha:

Image

si un display Max7219

Image

Pentru moment am rezolvat doua probleme.
- am adaugat wifi manager pentru ca sa nu fie nevoie sa incarcam credentialele WiFi odata cu incarcarea codului, astfel se poate conecta de oricine de reteaua wifi, fara a trebui sa modifice codul, si sa incarce codul modificat cu datele retelei lui wifi. Libraria WifiManager este disponibila pe github, si se poate descarca si dintre librariile puse la dispozitie de Arduino IDE.
- o a doua problema rezolvata, este cu codul care desi functiona corect pe un Arduino, restarta Wemos D1 mini, din cauza unei linii de cod care era neaparat necesar in mentinerea animatiei pana la finalizarea acestuia, si care dadea impresia wemosului ca are codul blocat (din cauza asteptarii mai mari decat de obicei) si restarta singur microcontrolerul.

Code: Select all

while (!P.displayAnimate());


in mod cu totul interesant aceasta linie functioneaa corect pe versiunea care ruleaza pe Arduino, dar nici cum nu a vrut pe acest microcontroler..

Am facut un scurt video, unde sunt prezentate doar animatiile:



din pacate l-am filmat destul de neispirat, mult prea aproape de acel mic display, iar rezultatul video a devenit de o calitate foarte slaba. Ideea era oricum sa vedeti cum se deruleaza animatiile care sunt cuprinse in libraria MD_Parola.

Referitor la acest proiect, mai incerc sa-i adaug o interfata web, astfel incat dupa ce se conecteaza la reteaua wifi si incepe sa functioneze, va crea un webserver unde vom putea modifica numele zilelor saptamanii si numele lunilor anului, asta daca vrem sa fie afisate intr-o alta limba decat cea cu care va veni default codul. Din aceeasi interfata web vom putea sa setam si decalajul fata de ora UTC, astfel incat oricine cu cateva clickuri sa poata seta ceasul astfel incat sa functioneze pe fusul lui orar. Ce mai vreau sa adaug, este posibilitatea de a seta ca termometrul adaugat la acest ceas, (deocamdata nu este adaugat si nici nu m-am hotarat ce modul sa folosesc!) sa poata afisa temperatura sesizata de senzorul de temperatura in Celsius sau in Fahrenheit. Toate astea dintr-o interfata web...

Momentan lucrez la interfata web, fara ceas, fara display, fara nimic, doar consola seriala si serverul web din browser, si am ajuns la momentul in care, daca nu gaseste fisierul (la prima punere in functiune!) de configurare a numelor zilelor saptamanii, numele lunilor anului etc... va aloca date care sunt codate in cod si care vor aparea in interfata web ca date default.

In acest moment, interfata web salveaza datele corect, (are un buton SAVE :haha: ) si poate si reporni microcontrolerul, pentru ca este inclus si un buton Reboot.

Sper sa reusesc sa combin cele doua coduri pe care le am in acest moment in lucru, partea cu ceasul si partea cu interfata web, si in curand sa va pot pune la dispozitie un ceas complet functional.

In acest moment interfata web arata in acest fel:

Image

Probabil pana la varianta finala vor mai fi mici modificari. (era sa scriu imbunatatiri :haha: :haha: dar nu prea e cazul :haha: )

Spor la bricolat ! :drink:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 04 Sep 2023 12:47

Pentru moment am ajuns la faza in care interfata web pare sa functioneze corect. :drink2:

Pe moment asa arata interfata web

Image

Si la pornirea Wemos D1 mini (pe acest MCU incerc sa fac acest mic proiect) citeste datele salvate intr-un fisier, aflat pe un sistem de fisiere creat in microcontroler, datele citite in fisier apar in interfata web dupa pornire si accesare interfata web.
Bineinteles se pot schimba numele in diferite limbi si salva in sistemul de fisiere la apasarea butonului SAVE.

La apasarea butonului REBOOT microcontrolerul se va restarta.

Fisierul binar se poate descarca pentru teste de aici.

Acesta se poate incarca pe Wemos D1 mini cu ajutorul Flash Download Tools.

La pornirea Flash Download Tool alegem astfel:

Image

Dupa care pentru a incarca fisierul binar in MCU vom proceda asa:
Image

Selectati portul COM corect, dupa care ideal ar fi sa dati un erase flash, iar dupa ce ati asteptat putin ca flash sa fie sters, apasati start pentru a incarca fisierul binar pe Wemos d1 mini.

Dupa ce s-a incarcat complet in microcontroler, veti da un restart la D1 mini din butonul de pe microcontroler, iar dupa cateva secunde cautati in router adresa la care s-a conectat. (in viitor aceasta adresa va fi afisata pe ecranul ceasului!)

Momentan inca nu este inclus nimic din rutinele ceasului si sper sa nu apara problema cand voi incerca sa impreunez cele doua coduri, astfel sa avem un ceas functional cat mai repede posibil, bineinteles in limita timpului meu liber.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 05 Sep 2023 19:26

Se pare ca deja o prima versiune functionala a ceasului NTP de data asta cu o interfata web inclusa! :drink2:

Dar sa vedem cum instalam codul pe microcontroler.

Pentru inceput avem nevoie de Flash Download Tools, pe care-l putem descarca de pe pagina ESPRESSIF.
Image

Si de firmwareul pe care-l vom incarca in Wemos D1 mini. Acesta-l puteti descarca de aici:.

Dupa ce avem ambele descarcate, pornim Flash Download Tool
Image

pe care-l setam pentru ESP8266 si Work mode Develop
Image

Adaugam calea catre binarul pe care-l vom incarca in microcontroler, setam adresa de memorie in care o incarcam si portul COM corect
Image

Dupa care apasam butonul ERASE, pentru a curata flash-ul microcontrolerului de ramasitele a eventuale coduri incarcate inainte
Image

Si asteptam pana apare ca stergerea a fost terminata
Image
Dupa cum vedeti apare FINISH in culoarea albastra.

Apasam butonul START pentru a incarca fisierul pe microcontroler
Image

Si asteptam pana apare mesajul ca avem codul incarcat. (Butonul Finish este afisat in culoarea albastra)
Image

In acest moment avem codul incarcat pe microcontroler, dar nu se va intampla nimic pana in momentul in care apasam butonul RESET de pe Wemos D1 mini, sau scoatem cablul USB din mufa microcontrolerului si-l introducem din nou.
In acest moment, microcontrolerul constata ca nu se poate conecta de reteaua WiFi, si cu ajutorul librariei WiFiManager creaza o retea WiFi proprie care are numele "Configurare WiFi"

Image

de care ne conectam cu laptopul

Image

Iar in momentul in care avem laptopul conectat de reteaua WiFi creata de WiFiManager, din browser accesam adresa IP locala: http://192.168.4.1
Image

Iar in acest moment avem posibilitatea sa conectam ceasul nostru de reteaua locala WiFi. Apasam CONFIGURE WIFI

Image

Selectam reteaua Wifi de care vrem sa conectam ceasul, introducem parola retelei Wifi, dupa care apasam butonul SAVE

In acest moment avem microcontrolerul conectat de reteaua WiFi, si ceasul incepe sa afiseze.
Dupa un mic logo cu numele fabricantului codului :haha: , sa fiti atenti, pentru ca va afisa adresa IP la care s-a conectat ceasul. Este foarte importanta aceasta adresa, pentru ca este adresa la care creaza serverul web unde este creata interfata web de unde putem controla acest ceas NTP.

La mine adresa scrisa pe ecran a fost 192.168.0.36, astfel in browserul de pe laptop (pc, tableta sau telefon) am introdus astfel: http://192.168.0.36
Bineinteles fiecare trebuie sa introduca adresa pe care i-a afisat-o ecranul, nu adresa care-mi este mie folositoare.
Dupa ce avem adresa in browser, apasam un enter si avem interfata web de unde putem face cateva mici setari in ceasul NTP.

Image

Pentru moment putem schimba numele zilelor saptamanii si numele luniilor in limba pe care dorim ca acestea sa fie afisate.

ATENTIE!
Ceasul a fost construit cu un display Max 7219 care in are 4 module de 8x8!
Din aceasta cauza, pe ecran nu incap decat maxim 6 litere! Asigurati-va pentru buna functionare sa scrieti la numele zilelor saptamanii si la numele lunilor anului maxim 6 caractere! Pentru ca altfel majoritatea animatiilor nu vor permite afisarea corecta a acestor date. Am comandat inca cateva module din acest display, astfel incat sa prelungesc ecranul, astfel incat aceste date sa fie afisate corect, chiar daca lungimea datelor introduse este mai mare. Bineinteles asta in viitorul apropiat, cand cei de la ALiExpress vor livra modulele.


Dupa ce am introdus datele in limba pe care dorim sa fie afisate, setam UTC OFFSET, care va fi decalajul timpului local fata de ora UTC.
De aici setam ora exacta pentru tara in care suntem, astfel incat timpul afisat pe display sa fie ora LOCALA nu ora UTC! Ca valoare implicita apare UTC 3, care este ora Romaniei pentru perioada de vara.

Daca avem totul setat, apasam butonul SAVE, si din acest moment displayul afiseaza datele in functie de ce am setat noi in interfata web al ceasului.

Am adaugat si un buton REBOOT, care la apasare restarteaza microcontrolerul, desi cred ca pe moment acesta nu-si are rolul, pentru ca ceasul i-si salveaza datele la apasarea butonului SAVE in sistemul de fisiere si va si rula cu datele salvate imediat dupa apasarea butonului SAVE, fara a fi nevoie de apasarea acestui buton REBOOT.

In interfata WEB al ceasului, mai putem introduce valori care sa seteze daca temperatura sa fie afisata in grade Celsius sau in grade Fahrenheit, care deocamdata nu este functional, (desi se salveaza datele in fisierul de configurare si le si citeste la pornire microcontrolerul) dar pe moment nu este functional, pentru ca nu am hotarat ce tip de senzor de temperatura sa insoteasca acest ceas, astfel incat pe langa datele afisate in acest moment sa afiseze si temperatura ambientala, umiditate si eventual presiune atmosferica.

O alta imbunatatire ar mai fi utila pe viitor, este adaugarea unui LDR, astfel incat luminozitatea ceasului sa fie reglata pe display in functie de luminozitatea ambientala.

Ultimul lucru pe care trebuie sa-l stiti pentru a-l putea realiza, este conectarea hardware (firele) dintre modulul dot matrix Max7219 (cu 4 module 8x8!) si modelul hardware de al acestui modul dot matrix.
Image

BUG.
Pentru moment am observat un bug in functionarea ceasului, dar pe care o sa incerc sa-l corectez in viitoarele versiuni. Aceasta eroare nu creaza probleme de stabilitate a ceasului, sau alte minuni care sa faca acest ceas inutilizabil.

Spor la bricolat ! :drink:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 06 Sep 2023 21:26

Dupa cateva ore de "lupta" am reusit sa rezolv si bugul, pe care mult prea tarziu am observat ca eu l-am produs! :haha: .
Asa ca am un nou firmware al ceasului, in care nu se mai intampla fenomenul. Cu aceasta ocazie am si facut putina curatenie prin cod, pentru ca era mult prea complicat totul, si deja i-mi pierdeam ideeile cand vroiam sa corectez ceva. :haha:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 11 Sep 2023 20:24

Am avut o intrebare in comentarii, despre cum se poate schimba modelul hardware al displayului, pentru cei care folosesc alte modele de displayuri.
O sa incerc sa adaug in interfata web si setari ale displayului, cum ar fi tipul displayului, schimbarea numarului de ecrane din care este alcatuit displayul si luminozoiatea displayului, eventual si un invert la ecran.

Deocamdata nu am reusit sa fac astea functionale in interfata web, asa ca am scos fisierul binar pentru inca 3 modele de displayuri:

ICSTATION_HW
GENERIC_HW
PAROLA_HW

Sper sa fie functionale aceste fisiere. Nu am aceste modele de displayuri pentru teste, doar modelul FC16_HW.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Digital clock - Max 7219 dot matrix display - DS1307 RTC module - DHT11 sensor

Unread postby Levy » 12 Sep 2023 22:42

Am adaugat cateva elemente la interfata web:

Image

Tot ce este nou adaugat salveaza datele din interfata web si la pornire le citeste, deci partea asta este in regula.
Luminozitatea displayului se poate regla din slider, iar inversarea ecranului dintr-un checkbox, si chiar si dupa reboot se pastreaza datele salvate.

O problema pe care inca nu am reusit s-o rezolv, desi azi sunt deja la a doua zi de cautari fara reusita, este schimbarea modului hardware din interfata web si schimbarea numarului de elemente din care este alcatuit displayul. Datele se salveaza din interfata web, sunt recitite la pornire, si de aici nu mai sunt legate de nimic... :bang:

Pentru ca nu am gasit cum pot schimba tipul hardwareului si numarul de elemente din care este alcatuit displayul din timpul mersului, cu displayul deja initializat.
Orice sfat bun mi-ar prinde bine in acest moment. Simt ca am ajuns pe o strada infundata si pe moment nu reusesc sa mai merg inainte. :kava:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image

Return to “Arduino”

Who is online

Users browsing this forum: No registered users and 9 guests