Ceas DIY pe arduino uno. Ceas mare de perete cu luminozitate automată pe Arduino


Un astfel de ceas va arăta foarte original pe perete, are ace LED care simulează un ceas analogic, un ceas LED în centru și o iluminare frumoasă de fundal RGB. Realizarea unui astfel de proiect de casă cu greu poate fi numită simplă, dar timpul și efortul petrecut nu vor fi irosite.

Materiale carcasei:
- Placi acrilice negre 300x300x3 mm 3buc
- Iluminare de fundal acrilic transparent 300x300x3 mm 1 bucata
- Agent de lustruire pentru plăci acrilice
- Lipici
- Manșoane distanțiere 15 mm cu filet m3 20 buc
- Șuruburi M3 cu șaibe 20 buc
- Rama poza 300x300 mm 1 bucata

Materiale electronice:
- Registru de schimbare CD74HC595 8buc
- Driver LED TLC5940 1buc
- Ceas în timp real (RTC) DS1307 1 buc
- Regulator liniar LM317 1 buc
- Tranzistor bipolar BD139 8buc
- Condensator electrolitic 1 uF 2buc
- Condensator 0,1 uF 1 bucata
- Rezistoare 120 Ohm 60 buc
- Rezistoare 10 kOhm 9 buc
- Rezistor 2 kOhm 1 bucata
- Rezistoare 1 kOhm 9 buc
- Rezistor 330 Ohm 1 bucata
- LED-uri 480 buc
- Indicator digital LED cu 4 cifre (cu anozi comuni) 1 buc.
- Bandă LED RGB (cu un anod comun) 1 buc (lungime până la circumferința cadranului)
- Modul Arduino Mega ADK (Rev3) 1buc
- baterie 12V 1buc

Primul pas. Fabricarea corpului.
Pentru început, plăcile acrilice sunt tăiate și găurite conform desenului. Apoi, placa neagră frontală a corpului este lipită de partea de conectare (transparentă) și de placa pentru LED-uri.

Pasul doi. Lucrări de finisare pe corp.
Pentru o mai bună stabilitate, autorul lipește o placă acrilică pe partea din spate a ramei, sticla din cadru este mai întâi îndepărtată și nu va mai fi necesară.
Patru bucșe de 15 mm sunt înșurubate pe placă ca în fotografie. Acum, este posibil să lipiți bucșele de la cadru pe placa frontală. Aceste bucșe lipite sunt apoi deșurubate pentru utilizare ulterioară.

Pasul trei. Inserție LED.
În primul rând, LED-urile sunt introduse în primul rând de găuri (1 rând necesită 60 LED-uri). Catozii sunt lipiți împreună în jurul plăcii folosind un fir de cupru de 0,8 mm, iar anozii sunt îndoiți în lateral. Această procedură se repetă pentru celelalte 7 rânduri. Acum că anozii sunt aranjați într-o coloană, ei sunt, de asemenea, lipiți împreună. Astfel, rezultatul a fost o matrice de 8 rânduri și 60 de coloane.

Pasul patru. Lipirea cablurilor la matrice.
Pentru acest pas, se folosesc conectori de cablu cu 8 fire, dintre care unul este lipit la catozii de pe matrice. Opt astfel de conectori au fost lipiți la 60 de coloane anodice. Întrucât autorul a folosit conectori cu 8 fire, a primit un cablu cu 64 de fire, ceea ce înseamnă că au mai rămas 4, au fost învelite cu bandă electrică. De asemenea, autorul recomandă utilizarea a șapte conectori cu 8 fire și a unui conector cu 4 fire pentru a obține exact 60.

Pasul cinci. Atașarea unui indicator.
Se face o gaură în placa acrilică sub formă de disc și un indicator este lipit cu fire pre-lidate pentru confort.

Pasul șase. A plati.
Dintr-o bucată de tablă mai mare decât este necesar, tăiați 2 bucăți astfel încât să se potrivească în rama de imagine. În continuare, ei își fac mai mulți conectori, așa cum se poate vedea în fotografia de mai jos.

Pasul șapte. Asamblare ceas.
Apoi, toate piesele sunt instalate în carcasă conform diagramei atașate mai jos. Autorul a instalat o baterie reîncărcabilă de 1000 mAh în ceas pentru a putea funcționa fără cablu extern. Arduino este instalat cu codul programului atașat în partea de jos a articolului. Astfel, sunt instalate biblioteci pentru modulul de ceas în timp real și driverul LED TLC5940, care sunt de asemenea atașate sub articol. Diagrama cu rezoluție bună: (descărcări: 293)

Astfel de ceasuri pot fi îmbunătățite dacă se dorește controlând automat luminozitatea utilizând un fotorezistor sau ajustând manual luminozitatea folosind un potențiometru de 10 kOhm. Există spațiu pentru a instala un buton și cu ajutorul lui poți comuta între diferite programe. În plus, este posibilă instalarea unei benzi LED care va ilumina partea transparentă din plastic a panoului frontal.

Video cu asamblare parțială și un exemplu de funcționare a ceasului

  • Trăsături distinctive:
  • Calculul timpului real în secunde, minute, ore, date ale lunii, luni, zile ale săptămânii și ani, ținând cont de înălțimea anului curent până la 2100.
  • RAM suplimentară de 31 x 8 pentru stocarea datelor
  • Intrare serială - informații de ieșire pentru a reduce pinii microcircuitului
  • Efectuați toate funcțiile cu o tensiune de alimentare de 2,0-5,5 V
    - efectuarea tuturor funcțiilor la o tensiune de 2,0-5,5 V pe puterea suplimentară de ieșire
  • Consum nu mai mult de 300 nA la alimentare de 2,5 V
  • Citirea și scrierea informațiilor pe un octet sau flux
  • Execuție într-un pachet DIP cu 8 pini și, de asemenea, la cerere, într-un pachet SOIC cu montare la suprafață cu 8 pini
  • Interfață simplă cu 3 fire
  • Compatibil cu cipuri TTL (Vcc= 5V)
  • Disponibil în intervalul de temperatură industrial: -40°C până la +85°C
  • Compatibil DS1202
  • Diferențele față de DS1202:
    posibilitatea de a conecta circuitul de încărcare încorporat la pinul Vcc1
    două ieșiri de putere pentru conectarea surselor de alimentare principale și de rezervă
    RAM a crescut cu 7 octeți

Descrierea pinii:

X1, X2conectarea unui rezonator de cuarț 32,768 kHz
GNDgeneral
RSTresetare
I/Odate de intrare - ieșire
SCLKsincronizarea comunicațiilor seriale
VCC1, VCC2pini de alimentare

Schema bloc a DS1302:

Descriere generala:

Cipul DS1302 conține un ceas în timp real cu un calendar și 31 de octeți de memorie RAM statică. Comunică cu microprocesorul printr-o interfață serială simplă. Informațiile în timp real și calendarul sunt prezentate în secunde, minute, ore, zi, dată, lună și an. Dacă luna curentă conține mai puțin de 31 de zile, atunci cipul va determina automat numărul de zile din lună, ținând cont de mărimea anului curent. Ceasul funcționează fie în format de 24 de ore, fie în format de 12 ore, cu un indicator AM/PM (am/pm). Conectarea DS1302 la un microprocesor este simplificată prin comunicarea serială sincronă. Necesită doar 3 fire: (1) RST (resetare), (2) I/O (linie de date) și (3) SCLK (ceas de comunicare în serie). Datele pot fi transferate câte un octet sau într-o secvență de până la 31 de octeți. DS1302 este succesorul lui DS1202. Pe lângă funcțiile de bază de stocare a timpului ale DS1202, DS1302 are doi pini de alimentare pentru conectarea surselor de alimentare primare și de rezervă, capacitatea de a conecta un circuit de încărcare programabil la pinul VCC1 și șapte octeți suplimentari de RAM.

Conexiune:

Conectarea DS1307 la Arduino:

RTC DS1307Arduino UNO
GNDGND
VCC+5V
S.D.A.A4
SCLA5

Conectarea DS1302 la Arduino:

RTC DS1302Arduino UNO
GNDGND
VCC+5V
RST6 (Poate fi schimbat cu altele din schiță)
CLK7 (Poate fi schimbat cu altele din schiță)
DAT

(Poate fi schimbat cu altele din schiță)

Conectarea DS3231 la Arduino:

RTC DS3231Arduino UNO
GNDGND
VCC+5V
S.D.A.A4
SCLA5

Modulul DS1302 ceas în timp real pe Aliexpress http://ali.pub/1br52w

Cod de program pentru modulul 1302 și afișajul 1602 I2C

În funcție de modulul pe care îl conectați, trebuie să specificați în program

Pentru DS1302 :

timp. începe(RTC_DS1302, 10, 13, 12);

#include

virtuabotixRTC myRTC(6, 7, 8); //CLK, DAT, RST

Program

#include

#include

LiquidCrystal_I2C lcd(0x3F ,2,1,0,4,5,6,7,3, POZITIV);

void setup() (

lcd.begin(16,2);

//myRTC.setDS1302Time(00.04, 12, 06, 18, 04, 2017);

void loop() (

myRTC.updateTime();

lcd.setCursor(0, 0);

lcd.print("data: ");

lcd.print(myRTC.dayofmonth);

lcd.print("/");

lcd.print(myRTC.luna);

lcd.print("/");

lcd.print(myRTC.an);

lcd.print(" ");

lcd.setCursor(0, 1);

lcd.print("timp: ");

lcd.print(myRTC.hours);

lcd.print(":");

lcd.print(myRTC.minute);

lcd.print(":");

lcd.print(myRTC.secunde);

lcd.println(" ");

De asemenea, nu uităm de economisire atunci când cumpărăm bunuri pe Aliexpress folosind cashback

Avantajele bibliotecii:

Biblioteca are funcții interne pentru procesarea hardware a protocoalelor de transfer de date I2C și SPI și, prin urmare, nu necesită conectarea unor biblioteci suplimentare, dar nici nu intră în conflict cu acestea, dacă acestea sunt conectate.

Biblioteca are funcții interne ca un program pentru procesarea protocolului de transfer de date cu 3 fire

Pentru a inițializa un modul, trebuie să apelați funcția start cu numele modulului.

Modulele sunt conectate la pinii hardware arduino ai magistralei utilizate (cu excepția celor 3 fire)

Ușor de setat și de citit, folosind funcțiile settime și gettime

Funcția de setare a orei poate seta data și ora, complet sau parțial (de exemplu, doar minute, sau numai ziua etc.)

Funcția gettime funcționează ca și funcția de dată din php, returnând un șir cu ora, dar dacă este apelată fără un parametru, funcția nu va returna nimic, iar ora poate fi citită din variabile ca numere.

Biblioteca este extensibilă, adică pentru a putea funcționa cu un modul nou, trebuie să specificați parametrii acestui modul în matricele existente ale fișierului RTC.h (tipul magistralei, frecvența magistralei în kHz, moduri de operare, înregistrați adrese etc.), deoarece toate acestea sunt descrise în extensia fișierului.txt

Astfel, prin adăugarea unui nou modul în bibliotecă, vom crește doar aria de memorie dinamică ocupată cu ~ 36 de octeți, fără a afecta zona de memorie a programului.

La apelarea funcției de pornire, biblioteca citește steagurile registrelor modulului și, dacă este necesar, le setează sau resetează astfel încât modulul să poată funcționa pe baterie, iar frecvența de 1 Hz este setată pe pinul de undă pătrată programabil (dacă modulul are unul), atunci acest pin poate fi folosit ca întrerupere externă pe secundă.

Când lucrați cu modulul DS1302, nu sunt necesare rezistențe pe pinul GND (care sunt necesare pentru ca acesta să funcționeze cu alte biblioteci ale acestui modul), acest lucru se realizează prin faptul că o frecvență specifică de 10 kHz este specificată pentru 3- Wire bus, indiferent de frecvența procesorului Arduino.

Biblioteca implementează încă unul opțional funcție de perioadă, luând ca singur argument numărul de minute (de la 1 la 255)

dacă funcția gettime a fost apelată de mai multe ori în timpul specificat, atunci cererea către modul prin intermediul magistralei va fi trimisă doar prima dată, iar răspunsul la toate celelalte solicitări va fi suma timpului ultimului răspuns al modulului și timpul scurs de la acest răspuns.

Funcția punct trebuie apelată o singură dată.

Descriere detaliata:

} // DESCRIEREA PARAMETRILOR FUNCȚIILOR:// // Conectarea bibliotecii:// #include // iarduino_RTC time(numele modulului [, SS/RST pin [, CLK pin [, DAT pin]]]);// dacă modulul funcționează pe magistrala I2C sau SPI, atunci este suficient să specificați 1 parametru, de exemplu: iarduino_RTC time(RTC_DS3231);// dacă modulul funcționează pe magistrala SPI și pinul SS hardware este ocupat, atunci numărul pinului SS alocat pentru modul este indicat de al doilea parametru, de exemplu: iarduino_RTC time(RTC_DS1305,22);// dacă modulul funcționează pe o magistrală cu trei fire, atunci sunt indicate numerele tuturor pinii, de exemplu: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT// // Pentru a lucra cu module, biblioteca implementează 5 funcții:// initiaza modulul begin();// se specifică ora setata (secunde [, minute [, ore [, zi [, lună [, anul [, ziua săptămânii]]]]]]);// obține ora gettime("șir cu parametri");// timp de clipire blinktime(0-not_blink / 1-blink_sec / 2-blink_min / 3-blink_hour / 4-blink_days / 5-blink_month / 6-blink_year / 7-blink_days_of-wept / 8-blink_noon)// descărcare perioada autobuzului (minute);// // Funcția începe(): // funcția inițiază modulul: verifică registrele modulului, pornește generatorul de module etc.// // Setarea funcției timp(secunde [, minute [, ore [, zi [, lună [, anul [, ziua săptămânii]]]]]]):// scrie timpul în modul// se indică anul fără a lua în considerare secolul, în formatul 0-99// orele sunt indicate în format de 24 de ore, de la 0 la 23// ziua săptămânii este specificată ca un număr de la 0-duminică la 6-sâmbătă// dacă parametrul anterior trebuie lăsat neschimbat, atunci puteți specifica o valoare negativă sau evident mai mare// exemplu: settime(-1, 10); va seta 10 minute și va lăsa secundele, orele și data neschimbate// exemplu: settime(0, 5, 13); va seta 13 ore, 5 minute, 0 secunde și va lăsa data neschimbată// exemplu: settime(-1, -1, -1, 1, 10, 15); va seta data la 10/01/2015 și va lăsa neschimbate ora și ziua săptămânii// // Funcția gettime("șir cu parametri"):// funcția primește și afișează un șir, înlocuind caracterele descrise mai jos cu ora curentă// exemplu: gettime("d-m-Y, H:i:s, D"); va răspunde cu linia „01-10-2015, 14:00:05, joi”// exemplu: gettime("s"); va răspunde cu linia „05”// caracterele specificate sunt identice cu caracterele pentru funcția date() în PHP// s secunde de la 00 la 59 (două cifre)// i minute de la 00 la 59 (două caractere)// h ore în format de 12 ore de la 01 la 12 (două cifre)// H ore în format de 24 de ore de la 00 la 23 (două cifre)// d ziua lunii de la 01 la 31 (două caractere)// w ziua săptămânii de la 0 la 6 (un semn: 0-duminică, 6-sâmbătă)// Numele zilei D a săptămânii de la Luni la Duminica (trei semne: Luni Mar Mier Joi Vin Sâmbăt Duminică)// m lună de la 01 la 12 (două cifre)// Numele lunii M din ianuarie până în dec (trei caractere: ian feb mar apr mai iun iul august sept oct nov dec)// Y an de la 2000 la 2099 (patru cifre)// y an de la 00 la 99 (două cifre)// la prânz dimineața sau seara (două caractere, litere mici)// O amiază AM sau PM (două caractere, majuscule)// linia nu trebuie să depășească 50 de caractere// // dacă trebuie să obțineți timpul sub formă de numere, puteți apela funcția gettime() fără un parametru și apoi obțineți timpul din variabile// secunde secunde 0-59// minute minute 0-59 // ore ore 1-12 // ore ore 0-23

Ceasul în timp real este un modul care stochează data curentă și nu o resetează atunci când alimentarea este oprită datorită bateriei încorporate. Poate ați auzit despre ceasuri bazate pe cipul DS1307. Acest cip are o precizie extrem de scăzută a ceasului. O întârziere de o oră pe zi este prea mare. Recomand folosirea unui modul bazat pe un cip DS3231 de înaltă precizie, care este echipat cu un termometru pentru a regla frecvența ceasului în funcție de temperatură. Precizia ceasului acestui cip este la nivelul unui ceas de mână bun și este de 2 ppm la o temperatură ambientală de 0°-40°. În același timp, modulul este compatibil cu toate bibliotecile scrise pentru modul bazat pe cipul DS1307. Articolul vorbește despre conectarea modulului la Arduino și interacțiunea cu ele folosind biblioteca Time. Puteți cumpăra un astfel de modul de la un vânzător pe care l-am verificat.

Conexiune ceas în timp real

Ceasul este conectat folosind protocolul I2C cu doar două fire. Este necesar să strângeți suplimentar bornele la care ceasul este conectat la șina de alimentare folosind rezistențe de 2 KΩ. Ieșirea ceasului arată astfel:

Pinii 32K și SQW pot fi ignorați. Scopul lor nu este discutat în acest articol. SCL și SDA sunt pinii interfeței I2C. Acestea trebuie conectate la controler. VCC și GND sunt +5V și, respectiv, masă.

SCL și SDA sunt situate pe diferiți pini pe diferite plăci:

Uno, Nano A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)

Pinul SDA al ceasului este conectat la pinul SDA al controlerului. Ceasul SDL, respectiv, către controlerul SDL. După conectarea firelor, ar trebui să obțineți următoarea imagine:

Cel mai convenabil mod de a lucra cu modulul de ceas în timp real este utilizarea bibliotecii. Cel mai convenabil în acest sens se numește: Timp ( Engleză timp).
Biblioteca este un „înveliș” pentru o altă bibliotecă populară pentru lucrul cu modulul de ceas: DS1307RTC. În ciuda faptului că biblioteca a fost dezvoltată pentru cipul DS1307, funcționează perfect cu DS3231, deoarece protocoalele de comunicare sunt compatibile.

Descărcați ambele biblioteci.

După descărcare, plasați conținutul arhivelor în folderul biblioteci, care se află în folderul cu mediul de dezvoltare Arduino. Lansați Arduino IDE și deschideți biblioteca de exemplu standard: Exemple->Timp->TimeRTC
Sau doar copiați acest cod:

#include #include #include void setup() ( Serial.begin(9600); while (!Serial) ; // așteptați până când Arduino Serial Monitor deschide setSyncProvider(RTC.get); // funcția pentru a obține ora de la RTC if(timeStatus()! = timeSet) Serial.println("Nu se poate sincroniza cu RTC"); else Serial.println("RTC a setat ora sistemului" void loop() ( if (timeStatus() == timeSet) ( digitalClockDisplay( )); ; ) else ( Serial.println("Ora nu a fost setată. Vă rugăm să rulați Ora"); Serial.println("Exemplu TimeRTCSet, sau exemplu DS1307RTC SetTime."); Serial.println(); delay(4000) ; ) întârziere(1000); void digitalClockDisplay())( // afișarea ceasului digital al orei Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" " ); Serial.print(day()); Serial.print(month() ) void printDigits(int digits)( // funcția de utilitate pentru afișarea ceasului digital: afișează două puncte anteriore(": "); dacă (cifre< 10) Serial.print("0"); Serial.print(digits); }

#include

#include

#include

void setup() (

Serial. începe(9600);

în timp ce (! Serial ) ; // așteptați până când se deschide Arduino Serial Monitor

setSyncProvider(RTC.get); // funcția pentru a obține ora de la RTC

if (timeStatus() != timeSet)

Serial. println("Nu se poate sincroniza cu RTC");

altfel

Serial. println("RTC a setat ora sistemului");

buclă goală ()

dacă (timeStatus() == timeSet) (

digitalClockDisplay();

) altfel (

Serial. println( „Ora nu a fost setată. Vă rugăm să rulați Ora”) ;

Serial. println( „Exemplu TimeRTCSet sau exemplu DS1307RTC SetTime.”) ;

Serial. println();

întârziere (4000);

întârziere (1000);

void digitalClockDisplay() (

// Afișarea ceasului digital al orei

Serial. print(ora());

printDigits(minut());

printDigits(second());

Serial. imprimare (" " ) ;

Serial. print(ziua());

Serial. imprimare (" " ) ;

Serial. print(luna());

Serial. imprimare (" " ) ;

Serial. print(an());

Serial. println();

void printDigits(int digits) (

// funcția de utilitate pentru afișarea ceasului digital: afișează două puncte înainte și 0 înainte

Serial. imprimare(":");

dacă (cifre< 10 )

Serial. print("0");

Serial. print(cifre);

După ce ați încărcat schița pe placă, lansați monitorul portului (Tools->port monitor). Veți vedea mesaje din bibliotecă. Ora afișată va fi incorectă sau biblioteca se va plânge că ceasul nu este configurat. Pentru a seta ceasul, încărcați un exemplu din biblioteca „SetTime” DS1307RTC pe placă (Exemple->DS1307RTC->SetTime). Încărcați acest exemplu în tabla dvs. După descărcare, ceasul va fi setat la timpul de compilare a schițelor. Întârzierea dintre compilare și descărcarea completă va fi foarte scurtă, ceea ce va fi suficient pentru un ceas reglat fin. Dar dacă deconectați și reconectați alimentarea plăcii, chiar și după câteva ore, ora ceasului va fi totuși resetată la momentul compilării și va fi incorectă. Prin urmare, utilizați acest exemplu numai pentru configurare, după configurare, opriți ceasul sau încărcați o altă schiță pe tablă.

Unul dintre primele proiecte pe care începătorii le construiesc folosind o placă Arduino este un ceas simplu care ține timpul. Practic, astfel de ceasuri se bazează pe un modul RTC (Real Time Clock) conectat la Arduino. Astăzi, pe piața componentelor electronice sunt disponibile diferite modele RTC, variind ca precizie și preț. Modelele comune includ DS1302, DS1307, DS3231.



Dar puteți face un ceas pe Arduino fără a utiliza un RTC, mai ales dacă nu puteți obține astfel de module. Desigur, acuratețea în acest caz va fi scăzută, așa că proiectul ar trebui mai degrabă considerat ca un proiect de formare.


Principiul de funcționare al unor astfel de ceasuri este destul de simplu. De fiecare dată când porniți acest ceas Arduino, va trebui să îl setați la ora curentă, la fel ca orice ceas analogic. Cu siguranță este mai bine să nu folosiți un astfel de ceas în viața de zi cu zi dacă este activ pentru o lungă perioadă de timp fără repornire și ajustare ulterioară, deoarece desincronizarea cu ora curentă în timpul utilizării pe termen lung poate fi semnificativă.


Acest ceas poate fi asamblat pe o placă obișnuită, deoarece nu necesită multe componente. Linkul nostru principal aici va fi placa Arduino Uno. Pentru a afișa ora, puteți lua un afișaj LCD 16x2. Pentru a modifica setările de timp, trebuie să conectați două butoane (pentru ore și minute). Butoanele sunt conectate la Aduino prin rezistențe de 10KΩ. Pentru a schimba luminozitatea afișajului veți avea nevoie de un potențiometru de 10 kOhm. Schema de conectare pentru toate aceste componente la placa Arduino Uno este prezentată mai jos.



Acum trebuie să programați Arduino. Un cod simplu (schiță) care vă permite să afișați ora pe ecranul LCD este prezentat mai jos.


#include LiquidCrystal lcd(12,11,5,4,3,2); int h=12; int m; int s; int steag; int TIME; const int hs=8; const int ms=9; int stare1; int stare2; void setup() ( lcd.begin(16,2); ) void loop() ( lcd.setCursor(0,0); s=s+1; lcd.print("TIME:"); lcd.print(h ); lcd.print(":"); lcd.print(":");<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flag==24)flag=0; întârziere (1000); lcd.clear(); if(s==60)( s=0; m=m+1; ) if(m==60) (m=0; h=h+1; flag=flag+1; ) if(h==13 ) ( h=1; ) lcd.setCursor(0,1); lcd.print("O ZI FRUMOĂ"); //-------Timp // setare-------// state1=digitalRead(hs); dacă(stare1==1) (h=h+1; steag=steag+1; dacă(steagul<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flag==24)flag=0; dacă(h==13)h=1; ) stare2=digitalRead(ms); dacă(starea2==1)( s=0; m=m+1; ) )

   Vă mulțumim pentru interesul acordat proiectului de informare a site-ului.
   Dacă doriți ca materiale interesante și utile să fie publicate mai des și cu mai puțină publicitate,
   Puteți susține proiectul nostru donând orice sumă pentru dezvoltarea lui.

În acest articol vă veți familiariza cu un excelent modul de ceas în timp real alimentat de baterie.

Cu acest modul, puteți urmări timpul în proiectele dvs. Arduino chiar și în cazul reprogramarii sau a unei pene de curent. Acesta este unul dintre elementele necesare pentru proiectele de ceasuri deșteptătoare, alarme și luarea de citiri de la senzori în timp real. Unul dintre cele mai populare modele de modul de ceas în timp real este DS1307. Aici ne vom concentra. Modulul se potrivește perfect cu microcontrolerele Arduino, care au putere logică de 5 V.

Caracteristici ale modulului de la compania de producție Adafruit (chinezii oferă opțiuni similare de trei până la patru ori mai ieftine):

  • Totul este inclus: cip, ham, baterie;
  • Ușor de asamblat și ușor de utilizat;
  • Se instalează pe orice placă sau se conectează direct folosind fire;
  • Există biblioteci excelente și exemple de schițe;
  • Doua gauri pentru montare;
  • Durata muncii - aproximativ cinci ani!

Modulul de ceas în timp real poate fi deja lipit sau poate fi vândut ca componente separate, lipirea cărora va dura aproximativ 15 minute, nu mai mult.

Ce este un ceas în timp real?

Un ceas în timp real este... un ceas. Modulul funcționează cu putere autonomă - baterii și continuă să numere timpul invers, chiar dacă energia este pierdută pe proiectul tău Arduino. Folosind un modul în timp real, puteți urmări timpul chiar dacă doriți să faceți modificări schiței și să reprogramați microcontrolerul.

Majoritatea microcontrolerelor, inclusiv Arduino, au un contor de timp încorporat numit millis(). Există, de asemenea, cronometre încorporate în cip care pot urmări perioade mai lungi de timp (minute sau zile). Deci, de ce aveți nevoie de un modul separat de ceas? Principala problemă este că millis() urmărește doar timpul din momentul în care este aplicată puterea la Arduino. Adică, de îndată ce deconectați placa, cronometrul este resetat la 0. Păduchii Arduino nu știe ce este, de exemplu, joi sau 8 martie. Tot ce puteți obține de la contorul încorporat este „au trecut 14000 de milisecunde de la ultima pornire”.

De exemplu, ați creat un program și doriți să numărați timpul invers din acest moment. Dacă opriți alimentarea microcontrolerului, contorul de timp se va pierde. La fel ca și cu ceasurile chinezești ieftine: când bateria se epuizează, încep să clipească la 12:00.

În unele proiecte Arduino veți avea nevoie de un control fiabil al timpului, fără întreruperi. În astfel de cazuri este utilizat un modul extern de ceas în timp real. Cipul care este folosit în astfel de ceasuri ține evidența anilor și chiar știe câte zile sunt într-o lună (singurul lucru care de obicei nu este luat în considerare este trecerea la ora de vară și cea de iarnă, deoarece astfel de conversii sunt diferite în diferite părți ale lumii).

Figura de mai jos arată o placă de bază de computer cu un ceas în timp real DS1387. Ceasul folosește o baterie cu litiu, așa că a crescut în dimensiune.

Ne vom uita la un exemplu folosind ceasul în timp real DS1307. Acesta este un modul ieftin, ușor de utilizat, care durează câțiva ani cu o baterie mică.

Până când bateria din modul în sine se epuizează, DS1307 va păstra timpul, chiar dacă Arduino este deconectat sau reprogramat.

Nodurile care alcătuiesc modulul de ceas în timp real

Detalii modul de ceas în timp real Adafruit DS1307
Desen Desemnare Descriere Producător Cantitate
IC2 Cip de ceas în timp real DS1307 1
Î1 32,768 KHz, cristal de 12,5 pF Generic 1
R1, R2 1/4W 5% 2.2Kohm rezistență Roșu, Roșu, Roșu, Auriu Generic 2
C1 Condensator ceramic de 0,1uF Generic 1
șină cu 5 pini (1x5) Generic 1
Baterie baterie litiu 12mm 3V CR1220 1
Suport pentru baterii de 12 mm Keystone 3001 1
A plati Industriile Adafruit 1

Asamblarea modulului de ceas în timp real

Asamblarea ceasului în timp real Adafruit DS1307
Fotografie Explicații

Pregătiți-vă pentru asamblare. Verificați dacă aveți toate piesele și instrumentele necesare. Puneți placa de circuite într-un menghină.

Aplicați puțină lipire la borna negativă a bateriei.

Instalați două rezistențe de 2,2 KΩ și un condensator ceramic. Cum exact le aranjați nu este important. Polaritatea nu contează. După aceasta, instalați cristalul (și simetric), suportul (suportul) pentru baterie și cipul de ceas în timp real. Cipul modulului în timp real trebuie instalat astfel încât marcajul (canelura) de pe cip să fie localizat în conformitate cu denumirea de pe placa de circuit. Privește cu atenție fotografia din stânga, cipul este instalat corect.


Pentru a preveni căderea suportului bateriei, este mai bine să-l lipiți deasupra. După aceasta, întoarceți placa și lipiți pinii rămași.

Scoateți contactele rămase de la rezistențe, cristal și condensator.

Dacă doriți să utilizați pinii pentru a monta modulul pe o placă de circuit fără lipire, instalați șina de pini pe placa de breadboard, modulul RTC deasupra și lipiți pinii.

Instalați bateria. Partea plată a bateriei ar trebui să fie deasupra. În medie, bateria va dura aproximativ 5 ani. Chiar dacă bateria este descărcată, nu lăsați slotul pentru baterie gol.

Biblioteca Arduino pentru lucrul cu DS1307

DS1307 se conectează cu ușurință la orice microcontroler cu putere logică de 5V și conectivitate I2C. Ne vom uita la conectarea și utilizarea acestui modul cu Arduino.

Vom folosi biblioteca RTClib pentru a obține și configura citiri de la DS1307. Dacă aveți întrebări despre instalarea bibliotecilor Arduino suplimentare, consultați aceste instrucțiuni.

Articolul discută un exemplu de ceas în timp real de la Adafruit, dar puteți folosi la fel de ușor analogi chinezi. Principiul de funcționare și conectare nu este diferit.

  • CUMPĂRĂ Arduino Uno R3;
  • CUMPĂRĂ Breadboard ;
  • CUMPĂRĂ modul de ceas în timp real DS1307;

Există 5 pini pe ceasul real: 5V, GND, SCL, SDA și SQW.

  • 5V este folosit pentru a alimenta chipul modulului ceasului în timp real atunci când îl întrebați pentru date de timp. Dacă semnalul de 5V nu este furnizat, cipul intră în modul de repaus.
  • GND - punct comun. Trebuie conectat la circuit.
  • SCL - contact de ceas i2c - este necesar pentru schimbul de date cu ceasul în timp real.
  • SDA este un contact prin care datele din ceasul în timp real sunt transmise prin i2c.
  • SQW face posibilă configurarea datelor de ieșire sub formă de undă pătrată. În cele mai multe cazuri, acest contact nu este utilizat.

Dacă ați configurat pinul analogic 3 (digital 17) să fie OUTPUT și HIGH și analogic pinul 2 (digital 16) să fie OUTPUT și LOW, puteți alimenta ceasul în timp real direct de la acești pini!

Conectați pinul analogic 4 de pe Arduino la SDA. Conectați pinul analogic 5 de pe Arduino la SCL.


Schiță pentru Arduino

Verificarea ceasului în timp real

Prima schiță care se rulează este un program care va citi datele din modulul de ceas în timp real o dată pe secundă.

Mai întâi, să vedem ce se întâmplă dacă scoatem bateria și o înlocuim cu alta în timp ce Arduino nu este conectat la USB. Așteptați 3 secunde și scoateți bateria. Ca rezultat, cipul de pe ceasul în timp real se va reporni. După aceea, lipiți codul de mai jos (codul poate fi încărcat și în Exemple→RTClib→ds1307 în Arduino IDE) și încărcați-l în Arduino.

Veți avea nevoie și de biblioteca OneWire.h, o puteți descărca

.

// funcții de dată și oră folosind ceasul în timp real DS1307 conectat prin I2C. Schița folosește biblioteca Wire lib

#include <Wire.h>

#include „RTClib.h”

Serial.begin(57600);

dacă (!RTC. isrunning()) (

Serial.println("RTC NU rulează!");

// RTC.adjust(DateTime(__DATE__, __TIME__));

DateTime acum = RTC.now();

Serial.print("/");

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(":");

Serial.print(":");

Serial.println();

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.println("d");

// calculează data: 7 zile și 30 de secunde

DateTime viitor(now.unixtime() + 7 * 86400L + 30);

Serial.print(" acum + 7d + 30s: ");

Serial.print(future.year(), DEC);

Serial.print("/");

Serial.print(future.month(), DEC);

Serial.print("/");

Serial.print(future.day(), DEC);

Serial.print(" ");

Serial.print(future.hour(), DEC);

Serial.print(":");

Serial.print(future.minute(), DEC);

Serial.print(":");

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

Acum deschideți fereastra monitorului serial și asigurați-vă că rata de transmisie este setată corect: 57600 bps.

Ca rezultat, ar trebui să vedeți ceva de genul acesta în fereastra monitorului serial:


Dacă ceasul în timp real își pierde puterea, va afișa 0:0:0. Secundele nu vor mai conta. După setarea orei, va începe o nouă numărătoare inversă. Din acest motiv, bateria nu poate fi scoasă în timp ce modulul ceasului în timp real funcționează.

Setarea orei pe modulul ceas

În aceeași schiță, decomentați linia care începe cu RTC.adjust:

// linia de mai jos este folosită pentru a seta data și ora ceasului

RTC.adjust(DateTime(__DATE__, __TIME__));

Procesul de setare a datei și orei este foarte elegant. Această linie conține date de la contorul dvs. de pe computerul dvs. personal (la momentul în care este compilat codul). Aceste date sunt folosite pentru a intermite modulul de ceas în timp real. Adică, dacă ora de pe computer este setată incorect, vă recomandăm să remediați mai întâi această eroare și apoi să treceți la intermiterea modulului de ceas pentru Arduino.

După configurare, deschideți monitorul serial și asigurați-vă că ceasul este setat corect:


Toate. De acum înainte și în următorii câțiva ani, nu va mai fi nevoie să configurați DS1307.

Timp de citire de la DS1307

Odată ce ceasul în timp real DS1307 este configurat, acesta îi poate trimite interogări. Să ne uităm la partea din schiță care implementează aceste interogări.

DateTime acum = RTC.now();

Serial.print(acum.an(), DEC);

Serial.print("/");

Serial.print(acum.lună(), DEC);

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(now.hour(), DEC);

Serial.print(":");

Serial.print(acum.minut(), DEC);

Serial.print(":");

Serial.print(acum.second(), DEC);

Serial.println();

În esență, există o opțiune pentru obținerea timpului folosind un ceas în timp real. Pentru a face acest lucru, utilizați funcția now(), care returnează un obiect DateTime. Acest obiect conține date despre an, lună, zi, oră, minut și secundă.

Există o serie de biblioteci de ceasuri în timp real care oferă funcții precum RTC.year() și RTC.hour(). Aceste funcții scot anul și ora separat. Dar utilizarea lor vine cu o serie de probleme: dacă faceți o solicitare de afișare a minutelor la un moment dat, de exemplu, 3:14:59, adică chiar înainte ca citirea minutelor să fie egală cu „15” (3:15: 00), datele rezultate vor fi egale cu 3:14:00 - adică veți pierde un minut.

În general, utilizarea unor funcții separate pentru apelarea orei sau a anului este justificată numai dacă acuratețea controlului timpului cu o distanță de un minut/an nu este critică pentru proiectul dvs. (de regulă, aceasta este în cazurile în care sunt luate citiri). rar - o dată pe zi, o dată pe săptămână). În orice caz, dacă doriți să evitați erorile în citiri, utilizați acum(), iar din datele primite extrageți citirile de care aveți nevoie (minute, ani etc.).

Există un alt format de date pe care îl putem afla - numărul de secunde de la miezul nopții, 1 ianuarie 1970. Funcția unixtime() este utilizată pentru aceasta:

Serial.print(" din 1970 = ");

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.print(now.unixtime() / 86400L);

Serial.println("d");

Deoarece există 60*60*24 = 86400 de secunde într-o zi, puteți converti valoarea rezultată în zile și ani. O opțiune foarte convenabilă dacă trebuie să urmăriți cât timp a trecut de la ultima solicitare. De exemplu, dacă au trecut 5 minute de când Arduino a accesat ultima dată ceasul în timp real DS1307, valoarea returnată de funcția unixtime() va fi mai mare de 300.

Lasă-ți comentariile, întrebările și împărtășește-ți experiențele personale mai jos. Noi idei și proiecte se nasc adesea în discuții!