NodeMcu NTP Óra 8×8-as led mátrixszal

Ezt a projektet, az a személyes indíttatás vezérelte, hogy semmi kedvem sincs az órákat átállítani beállítani stb. Tanulva a DS1307 pontatlanságából az RTC-k szóba sem jöhettek. Tudom van más RTC-je is Dallasnak ami pontosabb, de szerintem egy óra akkor jó, ha nem kell hozzányúlni soha (mobiltelefonon), ezt egyik RTC sem teszi lehetővé. Ebben az órában csak egy buktató van, ha nincs wifi, akkor nincs pontos idő sem. Viszont mint tudjuk, wifi nélkül élni sem lehet. Mármint nem bemeneti feltétele az életnek, de az ismerőseim körében a háztartások 90%-ában van Wifi. Igen még a nagyiknak is. Így hát próba szerencse alapon, az eltelt idő lesz a mércéje, annak hogy ez az ötlet mennyire életképes. Lássunk is neki.

Első körben, ha nincs telepítve az ESP core az Arduino Ide alá, akkor azt telepítsük. A GIT és a leírás ITT található. A telepítést a szokásos módon tudjuk végrehajtani, beillesztjük a github repo-t, a Beállítások ->> További alaplapkezelő URL-ekhez és az alaplapkezelőben telepítjük az ESP8266 csomagot. Személy szerint én a 2.4.1-es verziót használom, mert azzal a régi könyvtárak is működnek.

ESP8266 Arduino Core Reference

Ha ezzel megvagyunk, vagy már telepítve volt a lapkakészlet, akkor telepítsük a könyvtárakat, amiket használni fogunk.

Keressünk rá az alábbi könyvtárakra: MD_Max72xx , NTPclient, majd telepítsük is azokat a legfrissebb verzióval. 

Ezzel a szoftveres részével a dolognak meg is vagyunk, nézzük a hardveres részét, ami ennél sokkal egyszerűbb lesz.

Bekötés:

D5 – CLK

D7 – DIN

D8 – CS

3,3V – VCC

GND – GND

A Modul működik 3.3 V-on is bár, ez az NodeMcu-nak nem tesz túl jót. Érdemes külön tápellátással ellátni mindenképpen.

Lássuk a kódot:

#include <MD_MAX72xx.h>
#include <SPI.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid     = "Your SSID";
const char *password = "Password";
char timeprint[20]="";
String timenow;

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "hu.pool.ntp.org", 7200, 60000);

#define  DEBUG  1

#if  DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)

#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)

#endif

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8

#define CLK_PIN   D5 //  SCK
#define DATA_PIN  D7 //  MOSI
#define CS_PIN    D8 //  SS

MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#define  DELAYTIME  200  // millisecundum

void scrollText(char *p)
{
  uint8_t charWidth;
  uint8_t cBuf[10];  // Karakterek száma

  PRINTS("\nScrolling text");
  mx.clear();

  while (*p != '\0')
  {
    charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);

    for (uint8_t i=0; i<=charWidth; i++)	
    {
      mx.transform(MD_MAX72XX::TSL);
      if (i < charWidth)
        mx.setColumn(0, cBuf[i]);
      delay(DELAYTIME);
    }
  }
}

void setup()
{
 Serial.begin(115200);
  WiFi.begin(ssid, password);
  if ( WiFi.status() != WL_CONNECTED ) 
  {
    delay ( 500 );
    Serial.print ("\n No Wifi");
  }
  timeClient.begin();
  mx.begin();

#if  DEBUG
  Serial.begin(115200);
#endif
  PRINTS("\n NTP Time");
}

void loop()
{
timeClient.update();
timenow = timeClient.getFormattedTime();
timenow.toCharArray(timeprint, 20);
#if 1
if ( WiFi.status() != WL_CONNECTED )
{
scrollText("No Wifi");
WiFi.begin(ssid, password);
}
else
{
  scrollText(timeprint);
  Serial.println("\n"+timeClient.getFormattedTime());
  delay(100);
} 
#endif

}

Ezzel a megoldással csak, egyetlen egy probléma van, hogy ez a jelenlegi nyári időszámítás szerinti időt mutatja. Tehát UTC + 2-ben. Konklúzió? Hozzá kell nyúlni az órához, tehát nem jó.

A következő oldalon bemutatom, azt a megoldást, ahol már nem kell a kódhoz hozzányúlni, és teljesen automatán átáll a téli vagy a nyári időszámításra.

(Statisztika: 296 megtekintés)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.