ARDUINO - Ceas care citeste ora exacta de pe internet - Network Time Protocol Clock

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

ARDUINO - Ceas care citeste ora exacta de pe internet - Network Time Protocol Clock

Unread postby Levy » 18 Jun 2021 19:09

Necesare pentru acest proiect, de un Wemos D1, arata la fel ca un arduino, insa are procesor mai rapid, spatiul de stocare este mai mare 4 Mb in acest caz, si cel mai important lucru, se poate conecta de o retea Wifi.

In primul rand avem nevoie de un:
Image

Seamana destul de mult cu Arduino Uno ca format, insa daca ne uitam mai atent, observam ca este total diferit.
Diferit este si modul in care-l integram in Arduino IDE, dar despre asta poate povestesc mai tarziu...
Wemos D1 este boardul din mijloc, in stanga avem un arduino Uno, iar in dreapta lui un arduino nano pentru comparatie.

Mai avem devoie de un display, in acest caz a fost folosit un 1602, cu interfata i2C, ca sa economisim din pini wemos, si sa nu avem o padure de fire intre cele doua componente.

Image

Pentru ca am folosit aceasta interfatam legaturile vor fi extrem de simple de facut.
Am pus fire de culori diferite, ca sa puteti identifica cat mai simplu legaturile.

Image

Deci pe display avem, rosu VCC care vine legat de 5V de pe Wemos,
negru la GROUND pe display, GROUND pe Wemos
verde de pe display la SCL si se leaga de D3 de pe wemos care la randul lui este SCL
galben de pe display la SDA si se leaga de D4 de pe Wemos care la randul lui este inscriptionat cu SDA.

Image

Cu asta am si terminat legaturile, care ar fi fost mult mai complexe in cazul in care nu aveam interfata i2c pe display.

Codul din Arduino Ide este urmatorul:

Code: Select all

#include "NTPClient.h"
#include "ESP8266WiFi.h"
#include "WiFiUdp.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27,16,2);

const char *ssid = "SSID-ul retelei tale WIFI";
const char *password = "*PAROLA retelei tale WIFI";
const long utcOffsetInSeconds = 10800;
int a = 0;
char daysOfTheWeek[7][12] = {"Duminică", "Luni", "Marți", "Miercuri", "Joi", "Vineri", "Sâmbătă"};

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Conectare WIFI");
  lcd.setCursor(0,1);
  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED )
        {
          delay ( 500 );
          lcd.setCursor(a,1);
          lcd.print(".");
          a = a+1;
        }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Conectat la");
  lcd.setCursor(0,1);
  lcd.print(ssid);
  delay(2000);
  timeClient.begin();
  lcd.clear();
}

void loop()
{

  timeClient.update();
  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[timeClient.getDay()]);
  lcd.setCursor(8,1);
  lcd.print(timeClient.getFormattedTime());
  delay(1000);

}


este foarte simplu, se poate bineinteles imbunatatii.
Nu uitati sa declarati Wemos ca ESP Generic 8266 ca si board, iar la board manager sa descarcati librariile ESP8266, altfel va va da doar erori.
Inca ceva la ce trebuie sa fiti atenti daca vreti sa faceti acest mic ceas functional, in codul din IDE sa nu uitati sa treceti SSID-ul retelei WIFI de care o conectati si parola. Altfel nu va putea sa se conecteze de reteaua wireless.
Este un proiect cu dificultate minima, cred ca oricine o poate executa fara probleme.

Dupa ce am incarcat codul, am alimentat totul de pe un powerbank solar, sint curios daca se incarca ziua atat de mult incat sa duca o noapte cu backlight-ul aprins.
In spatele interfetei i2C avem un jumper, in acest caz conectat, pe care daca-l deconectam, afisajul nu va avea lumina aceea albastra din spate, si va fi afisat fara lumina, doar ca un simplu LCD. Banuiesc ca acesta i-i va scadea si consumul total de curent.
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
delta2k2
Site Admin
Posts: 1990
Joined: 11 Sep 2013 15:18
Location: Over the rainbow ...

Re: ARDUINO - Ceas care citeste ora exacta de pe internet - Network Time Protocol Clock

Unread postby delta2k2 » 18 Jun 2021 20:49

Câteva aspecte :

1. Lumina albastră a display-ului este dată de un simplu led alb, montat în spatele ecranului.

2. Cu biblioteca potrivită, respectivul led poate fi aprins/stins direct din soft.
lcd.setBacklight(LOW) respectiv lcd.setBacklight(HIGH)

3. Ai pus LiquidCrystal_I2C lcd(0x27,16,2). Pentru majoritatea ecranelor, 0x27 e adresa standard. Dar am primit din China și cu alte adrese. Adresa poate fi schimbată la nevoie (poate ai nevoie de un proiect cu două display-uri pe același arduino/esp). Îți recomand să folosești ecrane cu 4 rânduri (20x4), îți oferă mai multă libertate.

4. Pe ESP8266 folosesc de ceva ani MQTT conectat la NodeRed. Mai folosesc (și merge foarte bine) și un REST API.
Practic, conectezi ESP-ul la un NodeRed și muți toată dezvoltarea software pe NodeRed.

5. Pentru diverse monitorizări acasă, serverul de NodeRed îl țin pe un smartphone cu Android. Merge super stabil, consumă foarte puțin și desigur... am backup pe alimentare (datorită bateriei telefonului). Poți accesa inclusiv camera telefonului, GPS-ul, "lanterna".
Mai folosesc la alte proiecte și Raspberry, dar pentru acasă nu se merită. Telefonul e perfect.
User avatar
Levy
Gold User
Posts: 1540
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: ARDUINO - Ceas care citeste ora exacta de pe internet - Network Time Protocol Clock

Unread postby Levy » 18 Jun 2021 21:35

AM folosit un scaner i2c pentru a afla adresa displayului.
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: 1540
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: ARDUINO - Ceas care citeste ora exacta de pe internet - Network Time Protocol Clock

Unread postby Levy » 19 Jun 2021 11:24

Am adaugat citirea datei de pe serverul NTP, ziua saptamanii, ziua din luna, luna si anul.
Mici corecturi, probabil o sa mai fie si altele.

Image

Codul complet cu noile adaugiri si corecturi:

Code: Select all

#include "NTPClient.h"
#include "ESP8266WiFi.h"
#include "WiFiUdp.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

WiFiClient client;

WiFiClientSecure sclient;
LiquidCrystal_I2C lcd(0x27,16,2);

const char *ssid = "SSID-ul retelei tale WIFI";
const char *password = "Parola retelei tale WIFI";
const long utcOffsetInSeconds = 10800;
int a = 0;
char daysOfTheWeek[7][12] = {"Dumin", "Luni", "Marti", "Mierc", "Joi", "Vineri", "Sambata"};
//Month names
String months[12]={"Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"};

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup()
{
  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("NETWORK CLOCK");
  lcd.setCursor(0,1);
  lcd.print("satelit-info.com");
  delay(3000);
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("Conectare WIFI");
  lcd.setCursor(0,1);
  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED )
        {
          delay ( 1000 );
          lcd.setCursor(a,1);
          lcd.print(".");
          a = a+1;
        }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Conectat la");
  lcd.setCursor(0,1);
  lcd.print(ssid);
  delay(2000);
  timeClient.begin();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("IP-ul meu: ");
  lcd.setCursor(0,1);
  lcd.println(WiFi.localIP());
  delay(4000);
  lcd.clear();
}

void loop()
{
              timeClient.update();
                  unsigned long epochTime = timeClient.getEpochTime();
                  struct tm *ptm = gmtime ((time_t *)&epochTime);
                  int monthDay = ptm->tm_mday;
                  int currentMonth = ptm->tm_mon+1;
                  int currentYear = ptm->tm_year+1900;
                  String currentMonthName = months[currentMonth-1];
              lcd.setCursor(0,1);
              lcd.print(daysOfTheWeek[timeClient.getDay()]);
              lcd.setCursor(8,1);
              lcd.print(timeClient.getFormattedTime());   
              lcd.setCursor(0,0);
              lcd.print(monthDay);
              lcd.setCursor(2,0);
              lcd.print("-");
              lcd.setCursor(3,0);
              lcd.print(currentMonthName);
              lcd.setCursor(6,0);
              lcd.print("-");
              lcd.setCursor(7,0);
              lcd.print(currentYear);
              delay(1000);
              if (timeClient.getFormattedTime() == "00:00:01")
               {
                  lcd.clear();
               }

}


Pentru ca citirea zi/luna/an si ziua saptamanii, este necesar un downgrade la board manager la versiunea 2.7.4, altfel va afisa date fara nici o legatura cu realitatea.
Downgradul la Board Maganer se face din meniurile TOOLS--> BOARD-->BOARD MANAGER unde in casuta de cautare introduceti esp8266, se dezinstaleaza board managerul curent, la mine a fost versiunea 3.0 si se instaleaza versiunea 2.7.4

Image

In acest moment am ajuns la acest stadiu

phpBB [video]
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 3 guests