Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • OS
  • Ora në DS3231 dhe mikrokontrollues AVR. DS3231 – lidhja e një biblioteke të orës në kohë reale për të punuar me modulin

Ora në DS3231 dhe mikrokontrollues AVR. DS3231 – lidhja e një biblioteke të orës në kohë reale për të punuar me modulin

Moduli DS3231 (RTC, ZS-042) është një tabelë me kosto të ulët me një orë jashtëzakonisht të saktë në kohë reale (RTC), me kompensim të temperaturës të oshilatorit dhe kristalit të kristalit. Moduli përfshin një bateri litiumi që ruan funksionimin e pandërprerë edhe kur furnizimi me energji elektrike është i fikur. Një gjenerator i integruar përmirëson saktësinë e pajisjes dhe zvogëlon numrin e komponentëve.

Specifikimet teknike

Tensioni i furnizimit: 3.3V dhe 5V
Çipi i memories: AT24C32 (32 KB)
Saktësia: ±0,432 sek në ditë
Frekuenca e kuarcit: 32.768 kHz
Protokolli i mbështetur: I2C
Dimensionet: 38mm x 22mm x 15mm

Informacion i pergjithshem

Shumica e mikroqarqeve, si DS1307, përdorin një oshilator të jashtëm kuarci me një frekuencë prej 32 kHz, por ato kanë një pengesë të konsiderueshme: kur ndryshon temperatura, frekuenca e kuarcit ndryshon, gjë që çon në një gabim në kohën. Ky problem eliminohet në çipin DS3231, i cili përmban një oshilator kristal dhe një sensor të temperaturës që kompenson ndryshimet e temperaturës në mënyrë që koha të mbetet e saktë (të dhënat e temperaturës mund të lexohen nëse është e nevojshme). Çipi DS3231 gjithashtu mbështet sekondat, minutat, orët, ditën e javës, datën, muajin dhe informacionin e vitit, dhe gjithashtu monitoron numrin e ditëve në një muaj dhe bën rregullime për vitet e brishtë. Ai mbështet orët në dy formate: 24 dhe 12, dhe gjithashtu është e mundur të programohen dy alarme. Moduli funksionon në një autobus I2C me dy tela.


Tani pak për vetë modulin është ndërtuar në çipin DS3231N. Asambleja e rezistencës RP1 (4,7 kOhm) kërkohet për të tërhequr linjat 32K, SQW, SCL dhe SDA (nga rruga, nëse përdoren disa module me një autobus I2C, është e nevojshme që të shkrihen rezistorët tërheqës në module të tjera) . Asambleja e dytë e rezistorëve është e nevojshme për të shtrënguar linjat A0, A1 dhe A2, ato janë të nevojshme për të ndryshuar adresimin e çipit të memories AT24C32N. Rezistenca R5 dhe dioda D1 shërbejnë në parim për të rimbushur baterinë, ato mund të hiqen, pasi një bateri e zakonshme SR2032 zgjat me vite; Është instaluar gjithashtu një çip memorie AT24C32N, ky është si një bonus, nuk nevojitet për të përdorur orën RTC DS3231N. Rezistenca R1 dhe drita LED e energjisë sinjalizojnë që moduli është i ndezur. Siç u përmend, moduli funksionon në autobusin I2C për lehtësi, këta autobusë u drejtuan në dy lidhës J1 dhe J2 caktimi i kontakteve të mbetura mund të shihet më poshtë; Qëllimi J1
32K: dalje, frekuencë 32 kHz
SQW: prodhimi
SDA: linja e të dhënave (Dфta serike)
VCC: Furnizimi me energji i modulit "+".
GND: Furnizimi me energji i modulit “-”. Qëllimi J2
SCL: Ora serike
SDA: Linja e të dhënave serike
VCC: Furnizimi me energji i modulit "+".
GND: Furnizimi me energji i modulit “-”.


Unë do t'ju tregoj pak për çipin AT24C32N, ky është një çip me memorie 32k (EEPROM) nga prodhuesi Atmel, i montuar në një paketë SOIC8, që funksionon në një autobus I2C me dy tela. Adresa e mikroqarqeve është 0x57 nëse është e nevojshme, ajo mund të ndryshohet lehtësisht duke përdorur kërcyesit A0, A1 dhe A2 (kjo ju lejon të rritni numrin e mikroqarqeve të lidhura AT24C32/64). Meqenëse çipi AT24C32N ka tre hyrje adresash (A0, A1 dhe A2), të cilat mund të jenë në dy gjendje, ose log "1" ose log "0", tetë adresa janë të disponueshme për çipin. nga 0x50 në 0x57.

Lidhja e DS3231 me Arduino

Pjesët e nevojshme:
Arduino UNO R3 x 1 copë.
Ora në kohë reale në DS3231, RTC, SPI, AT24C32 x 1 pc.
Teli DuPont, 2.54 mm, 20 cm, F-M (Femër - Mashkull) x 1 copë.
Kabllo USB 2.0 A-B x 1 pc.

Lidhje:
Në këtë shembull, unë do të përdor vetëm modulin DS3231 dhe Arduino UNO R3, të gjitha të dhënat do të transferohen në "Port Monitoring". Qarku nuk është i komplikuar, nevojiten vetëm katër tela, së pari lidhim autobusin I2C, SCL në A4 (Arduino UNO) dhe SDA në A5 (Arduino UNO), gjithçka që mbetet është të lidhim furnizimin me energji GND me GND dhe VCC me 5V (mund të shkruhet nga 3.3V), qark i montuar, tani duhet të përgatisim pjesën e softuerit.

Nuk ka asnjë bibliotekë që funksionon me DS3231 në Arduino IDE, ju duhet të shkarkoni "DS3231" dhe ta shtoni atë në mjedisin e zhvillimit Arduino.

Vendosja e kohës DS3231
Kur e ndizni për herë të parë, duhet të programoni kohën, të hapni shembullin nga biblioteka DS3231 "Skedar" -> "Shembuj" -> "DS3231" -> "Arduino" -> "DS3231_Serial_Easy" ose kopjoni kodin nga poshtë

/* Testimi u krye në Arduino IDE 1.8.0 Data e testimit 31.08.2018. */ #përfshi // Lidhni bibliotekën Wire DS3231 rtc(SDA, SCL); // Inicializoni DS3231 void setup() ( Serial.begin(115200); // Vendosni një lidhje serike rtc.begin(); // Inicializoni rtc // Vendosni kohën rtc.setDOW(FRIDAY); // Caktoni ditën e javës rtc. 2018) void loop() ( Serial. print(rtc.getDOWStr()); // Dërgo ditën-javore Serial.print(" "); Serial.print(rtc.getDateStr()); // Dërgo datën Serial .print (" -- ") println(rtc.getTimeStr());

Testimi u krye në Arduino IDE 1.8.0

Data e testimit: 31.08.2018

#përfshi // Përfshi bibliotekën Wire

DS3231 rtc (SDA, SCL); // Inicializoni DS3231

konfigurimi i zbrazët ()

Serial. fillo (115200); // Krijoni një lidhje serike

rtc. fillo(); // Inicializoni rtc

// Vendosni kohën

rtc. setDOW (E Premte); // Cakto ditën e javës

rtc. setTime (16, 29, 0); // Cakto orën në 16:29:00 (format 24 orë)

void loop ()

Serial. print (rtc. getDOWStr ()); // Dërgo ditë-javë

Serial. printoni ("");

Serial. print (rtc. getDateStr ()); // Dërgo datën

Serial. print ("-");

Serial. println(rtc. getTimeStr()); // Dërgo kohë

vonesë (1000); // Një sekondë vonesë

Ngarkoni skicën në kontrolluesin Arduino dhe hapni "Port Monitoring"

Pse është e nevojshme e gjithë kjo?

60 sekonda * 60 minuta * 24 orë * 365 ditë = 31,536,000 sekonda në vit.

Për secilën nga këto miliona, 2 sekonda mund të shkojnë në një drejtim ose në një tjetër. Pjestoni 31.5 milion me një milion dhe shumëzoni me 2: marrim 63 sekonda në vit (maksimumi). Opsioni i pranueshëm? Shumë. Por një herë në gjashtë muaj sinkronizoja kohën në mënyrë që të përshtatej në 1 minutë.

Në çfarë mënyrash mund ta vendosni përgjithësisht kohën në orën e modulit?

Tradicionalisht, duke filluar me modulin DS3107, koha u vendos duke përdorur një skicë Arduino nga shembujt e përdorimit të bibliotekës. Algoritmi është si më poshtë: hapni skicën, klikoni "përpiloni dhe ngarkoni" dhe kur kontrolluesi të hapet për herë të parë, caktohet koha. Pyetja mbetet: sa orë? Si mund ta dijë Arduino saktësisht se çfarë ore duhet të vendosë? Dhe është shumë e thjeshtë - koha e përpilimit të skicave. Megjithatë, unë shoh disa disavantazhe me këtë qasje:
  • koha e përpilimit varet nga "fuqia" e kompjuterit;
  • koha e shkarkimit varet nga shpejtësia me të cilën skica e përpiluar transferohet në tabelën Arduino;
  • skica e ngarkuar është "e disponueshme" (ajo bëhet e vjetëruar menjëherë pas ngarkimit në Arduino).
Si mund të "punoni" për të kapërcyer këto kufizime? Epo, për shembull, duke ditur (duke vendosur në mënyrë eksperimentale) kohën e përpilimit, mund ta "çoni" orën në kompjuterin tuaj përpara në këtë kohë. Pastaj ekzekutoni përpilimin, ndezni tabelën dhe koha do të caktohet. Avantazhi i metodës është thjeshtësia e saj relative. Disavantazhet - metodë relativisht e papërshtatshme, relativisht e pasaktë, një herë.

Çfarë tjetër mund të mendoni? Për shembull, mund të vendosni manualisht kohën e kërkuar në skicë, të siguroni një buton që mund të shtypet momentin e duhur do të vendosë kohën e specifikuar "me dorë", për shembull, 2 minuta nga momenti aktual: ndërsa skica është "mbushur", ndërsa ne përgatitemi të gjurmojmë manualisht momentin shumë të nevojshëm të shtypjes së butonit, do të kalojnë vetëm disa minuta. . Dhe pastaj, duke parë orën në kompjuter, prisni "po atë moment" për të shtypur butonin. Pro - më e ndërlikuar se metoda e mëparshme, por ende relativisht e thjeshtë, por më e saktë se metoda e parë. Disavantazhet - kjo metodë është edhe më e papërshtatshme, kërkon më shumë kohë dhe është ende një skicë "një herë".

Kush është fajtor dhe çfarë duhet bërë?

Pasi i bëra vetes këto dy pyetje retorike, shkova në internet për të kërkuar se kush e kishte shkruar tashmë sinkronizimin e kohës së modulit të orës me kompjuterin. Dhe, siç e dini, ai që kërkon gjithmonë gjen. Kam gjetur një opsion me. Në teori, gjithçka është e thjeshtë: një "skedar grumbull" i rregullt analizon kohën aktuale të plotë të marrë në metodën "e parë" (sepse përveç vetë kohës, ju duhet edhe një datë), rrit kohën me 2 sekonda dhe " drives” një lak bosh deri në momentin kur vjen ky i ri, “plus_two_seconds”, koha për të “hedhur” të dhënat në portën COM. Për më tepër, koha "e re plus_two_seconds" gjurmohet në një mënyrë tjetër (përmes %time%, nëse dikush është i interesuar). Por për “jambet” e një vendimi të tillë më vonë. Të dhënat e "hedhura" në portin COM analizohen nga Arduino dhe më pas vendos kohën në modul. Gjithçka duket e thjeshtë, logjike dhe e përshtatshme. Por ka një fjalë shumë të keqe "POR". E gjithë kjo duket se është shkruar nga një gjerman, dhe standardet e tij rajonale në Windows ndryshojnë nga "tonat", dhe në veçanti, pjesa e pjesshme ndahet me një pikë, jo me presje. Kur lëshohet me standardet vendase rajonale, skedari i grupit nuk funksionon, sepse në të koha për të dalë nga cikli bosh përshkruhet nga kushti i krahasimit me XX:XX:XX.xxx. Epo, duhet të vendosni presje në vend të pikës - dhe kjo është ajo, "Unë rregullova gjithçka". Por kjo nuk është e gjitha (mund të kontrolloni se kush tjetër kujton se çfarë lloj të keqeje është të programosh në "skedarët e grupit"). Dosja e trupit duhet të korrigjohet më seriozisht. Dhe e rregullova duke përdorur "rrogoza për kthim prapa" dhe një "manual" për DOS. "Batniku" e rregulloi, por skica ende nuk funksionoi - koha nuk ishte caktuar. Kjo do të thotë, të dhënat u dërguan në port, Arduino e pa atë, por "diçka shkoi keq".

Le të hedhim një vështrim se çfarë dërgon skedari i grupit në Arduino dhe në çfarë formati (për referencë).

Rasti 83: //S = rasti i dytë 68: //D = Minute (Daghigheh në persisht) rasti 72: //H = Rasti i orës 84: //T = Dita e muajit (Etiketa në gjermanisht) rasti 77: /// M = Rasti i muajit 74: /// J = Viti (Jahr në gjermanisht)
Të dhënat dërgohen në formatin S**~D**~H**~T*~M**~J****~, ku ~ është 2 bajt e kthimit të transportit. Gjithsej, 31 bajt. Nuk duket shumë, të dhënat do të dërgohen shpejt.

Sidoqoftë, ekziston edhe një shqetësim - siç mund ta shihni, dita e javës nuk dërgohet. Vetëm ditën e muajit. Do të ketë një problem me zbatimin e orëve me alarme që varen nga ditët e javës. Dita e javës do të duhet të vendoset "me dorë" në skicë, e cila përsëri lë të kuptohet për një "disponueshmëri" të skicës, inferioritetin e saj.

Duke mbledhur faktorët - inferioritetin e skicës "nga fabrika", refuzimin e saj për të punuar normalisht, nevojën për të korrigjuar "skedarin e trupit" për gjerësitë "tona" - vendosa të zhvilloj gjithçka vetë. Dhe nëse po, atëherë mund të eliminoj mangësitë dhe të optimizoj formatin e të dhënave.

Software dhe harduer.

Në mënyrë që gjithçka të funksionojë, ju nevojiten 2 komponentë: një program për Windows dhe një kombinim harduer-softuer Arduino.

Së pari, të dhëna të përgjithshme mbi protokollin e shkëmbimit. Pasi isha i lirë të zgjidhja formatin e të dhënave që do të dërgoheshin, vendosa që dërgimi i 31 bajt informacioni nuk ishte racional dhe reduktova të dhënat e transmetuara në 4 bajt. Pra, a mjaftonte kjo? Çfarë mund të vendosni në 4 bajt? Po, mjafton. Gjithçka që ju nevojitet përshtatet. Unë jam i sigurt se shumë kanë marrë me mend se çfarë janë 4 bajt. Për ata që nuk e kanë marrë me mend, unë do të citoj një fragment të një artikulli nga Wikipedia:

Ora UNIX (koha POSIX) është një sistem për përshkrimin e momenteve në kohë, i miratuar në UNIX dhe sisteme të tjera operative të pajtueshme me POSIX. Përcaktohet si numri i sekondave që kanë kaluar që nga mesnata (00:00:00 UTC) 1 janar 1970 (e enjte).
Koha UNIX përfaqësohet si një numër i plotë që rritet me çdo sekondë që kalon pa pasur nevojë për llogaritje për të përcaktuar vitin, muajin, ditën, orën ose minutën për lexueshmërinë e njeriut. Koha moderne UNIX është në përputhje me UTC - numërimi ndodh në sekonda SI.

Pra, numri i plotë që ruan kohën UNIX merr 4 bajt, që mjafton për të zgjatur deri në 2,147,483,648 sekonda. Dhe pastaj të mundshme probleme të mundshme. Pse potencial? Sepse ky është pragu në të cilin numri Ndoshta të interpretohet si negative (si me iPhone-ët e shumë shokëve kureshtarë në të njëjtën kohë). Ndoshta, por nuk do të ndodhë domosdoshmërisht - varet nëse duart e programuesve rriten nga vendi i ofruar nga natyra. Numri i sekondave i treguar korrespondon me 03:14:08 19-Jan-2038. Deri në këtë kohë, ju mund të kaloni ngadalë në një version 64-bit të OS, ku koha do të ruhet në një variabël 8-byte, i cili do të zgjasë lehtësisht për 292 miliardë vitet e ardhshme. Ekziston mundësia që kjo të jetë e mjaftueshme për jetën tonë. Dhe pastaj do t'ju duhet të përmirësoni në versionin 128-bit të UNIX.

Çfarë problemesh zgjidha duke ardhur në këtë opsion? Së pari, zvogëloi shumë numrin e bajteve të transferuara, gjë që rrit saktësinë e përcaktimit të kohës me milisekonda. E shkëlqyeshme, apo jo? Dhe dy: Unë (ndoshta) e kam bërë më të lehtë përputhshmërinë me Linux. Për turpin tim, nuk mund të mësohem me Linux dhe kryesisht përdor vetëm Windows. Unë mund të shkruaj një program përcjellës për këtë Windows, por jo për Linux. Por besoj se në Linux mund ta merrni vlerën e kohës së UNIX shumë më lehtë sesa në Windows dhe ta dërgoni këtë numër në portin COM.

Asnje shtesë Nuk ka nevojë të transmetohen të dhëna si dita e javës etj. Vetëm kohë UNIX. Gjithçka tjetër bëhet në Arduino.

Tani pak specifika direkt rreth së pari komponent - një program për Windows. Programi është shkruar në Delphi të vjetër të mirë. Kur hapet, një dritare kërcyese ju kërkon të zgjidhni një port COM për të dërguar të dhëna. Le të zgjedhim. Cilësimet e mbetura duhet të lihen si parazgjedhje.

Si funksionon programi? Ai konverton formatin e kohës së Windows në formatin e kohës UNIX, domethënë numrin e sekondave që nga mesnata, 1 janar 1970. Më pas shton 3 sekonda dhe "bie" në një lak bosh (duke zgjatur më pak se ato 3 sekonda shtesë), dalja nga e cila ndodh në numrin e kërkuar të sekondave, sa më afër 000 milisekonda të jetë e mundur. Me fjalë të tjera, monitorohet ndodhja e fillimit të asaj sekonde kohe, vlera e së cilës do të duhet të dërgohet në Arduino. Pajtohem, dërgimi i të dhënave që, për shembull, tani janë XXXXXXXXX5 sekonda, kur në fakt tashmë janë, për shembull, XXXXXXXXX5 dhe 756 të mijëtat (për shembull) sekonda, nuk do të ishte e saktë. Kjo është arsyeja pse ju duhet të gjurmoni fillimin e sekondës për të filluar transferimin e të dhënave. Pas transferimit të të dhënave, programi raporton në mënyrë miqësore statusin "U krye:)". Kjo përfundon misionin e programit.


Së dyti komponent - harduer dhe softuer - Arduino. Ka 2 varieteteve"hardware" për këtë projekt: një version "i plotë" me një ekran dhe një buton dhe një version "i zhveshur" për përcaktimin e shpejtë të kohës së modulit, i mbledhur nga "mut dhe shkopinj". Rreth dallimeve të tyre - më poshtë. Versioni "i plotë" përbëhet nga një Arduino Nano, një mburojë 1602 me një "përshtatës" nga I2C në mburojë, një buton opsional të rivendosjes së Arduino dhe një kokë pin (femër) për lidhjen e modulit të orës. Gjithashtu, sipas dëshirës, ​​nga trupi i pajisjes me një ngjitëse "të lezetshme". Versioni i "zhveshur" përbëhet nga një Arduino (Uno, Nano, Pro Mini + përshtatësi "korrekt" USB me DTR) dhe 4 tela për lidhjen e modulit të orës.



Siç mund të shihet nga diagramet, versioni "i plotë", përveç versionit "të zhveshur", përmban një buton rivendosjeje dhe një ekran 1602 me një "përshtatës". koha Ekrani është i nevojshëm vetëm për të shfaqur fazat e procesit dhe, pas përfundimit të procesit të përcaktimit të kohës, do të shfaqen ora, data dhe dita e sapocaktuar e javës Nga vetë moduli i orës Në versionin "e zhveshur", roli i ekranit luhet nga LED i integruar në tabelën Arduino: pasi të përfundojë procesi i vendosjes së orës së re, kjo është e gjitha treguesi.

Për çfarë shërben butoni i rivendosjes? Kështu që në versionin e plotë, pas vendosjes së orës, Arduino do të hyjë në një lak të pafund për të shfaqur kohën shumë të vendosur rishtazi, domethënë, në fakt, do të bëhet një orë. Për më tepër, ato janë orë të bëra me nxitim, dhe për këtë arsye nuk mund të zëvendësojnë një orë normale për disa arsye (zgjedhja e sekondave zbatohet me vonesë, shfaqja e kohës do të zhduket kur të fiket energjia). Në fund të fundit, qëllimi është të siguroheni që koha të sinkronizohet saktë, asgjë më shumë. Prandaj, për të sinkronizuar modulin tjetër të orës, nuk mund të bëni pa rivendosje (më saktë, mund ta bëni duke "shtrembëruar" kabllon USB). Me fjalë të tjera, qëllimi i butonit është thjesht utilitar. Nëse dëshironi, mund të bëni pa të.

Si të flash Arduino, pasi ka dy versione harduerike, por vetëm një skicë? Për të përpiluar versionin "korrekt" të firmuerit, duhet të vendosni vlerën e dëshiruar të parametrit në kokën e skicës versioni i plotë: e vërtetë për versionin "të plotë", ose i rremë - për "zhveshjen". Kështu, përpiluesi do të përcaktojë se për cilin version të harduerit do të përpilojë firmuerin.

Pra, kemi diagramin e lidhjes, na duhet kodi i skicës. Ju lutemi vini re se që skica të funksionojë siç duhet me versionin "të plotë", nevojitet një bibliotekë LiquidCrystal I2C nga Frank de Brabander(instaluar nga depoja duke përdorur Menaxherin e Bibliotekës). Ne gjithashtu kemi nevojë për një bibliotekë për të mbështetur modulin e orës, dhe jo vetëm ndonjë :). Shkarkoni këtu:. Ne i kemi rregulluar bibliotekat.

Këtu është kodi për skicën:

//================================================ ====== cilësimi i disponueshëm për ndryshim === ===================================== #define fullVersion true //true = versioni "i plotë" me ekran; false = versioni "i hequr" me LED të integruar //=================================== ============ bibliotekat e përdorura dhe deklarimi i variablave = =============================== ==== #përfshi #përfshi #nëse (Versioni i plotë) #përfshi #endif i panënshkruar i gjatë t1 = 0; //ndryshore për kohën e marrë të panënshkruar gjatë t2 = 0; //ndryshore për bajtin e kohës së marrë b; //buffer për marrjen e të dhënave nga porta COM #if (fullVersion) byte day = 0; #endif ora DS3231; RTCDateTime dat1; #if (Versioni i plotë) LiquidCrystal_I2C LCD (0x3F,16,2); //Kinezëve u pëlqen adresa e re për "përshtatësit" nga i2c në ekran #endif //============================= == ================================================ ===== ==================================== konfigurimi i pavlefshëm())( #if ( !fullVersion) // relevante vetëm për versionin "zhveshur" - fillimi i seksionit të kodit pinMode(13, OUTPUT #endif //relevant vetëm për versionin "e zhveshur"); seksioni i kodit clock.begin(); parametrat e portit për të zgjedhur në programin lcd.setCursor(0,1) lcd.print ("Gati për sinkronizim") - gati për vonesë sinkronizimi (1000); - fundi i seksionit të kodit) void loop())( if (Serial.available())( //nëse ka "barut në balonë" të portës COM Serial.readBytes(b,4); //count të gjitha 4 bajt (nuk presim asgjë tjetër) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Disa foto të versionit "të plotë" të pajisjes së përfunduar.


Dhe së fundi, një video e pajisjes që funksionon "në betejë":

Ku mund ta shkarkoj skicën dhe programin?

Shkarkoni skicën (Dropbox).
Shkarkoni programin për Windows (Dropbox).

"Avantazhet dhe disavantazhet".

Është e vështirë të formulosh "pro" dhe "kundër" në këtë rast. Rrjedhimisht, të gjithë vendosin vetë se çfarë është e mirë dhe çfarë është e keqe.

Total.

Më pëlqeu shumë se si caktohet koha tani në module! Kur më duhet të caktoj kohën, nuk duhet të kujtoj çdo herë se çfarë skice më nevojitet dhe të mendoj se sa saktë do të vendoset koha në modul. Për më tepër, së shpejti do të ketë një rishikim të një ore të bërë në shtëpi, ku unë kam ndërtuar një metodë të tillë sinkronizimi - më pëlqeu aq shumë metoda. Shpresoj se disa nga lexuesit do ta kenë të dobishme edhe këtë metodë.

Projekti është falas, jo komercial. Gjithkush ka të drejtë të përdorë të dhënat nga rishikimi për çfarëdo qëllimi të ndryshëm nga ai komercial.

Gjithe te mirat.

Kam në plan të blej +48 Shto te të preferuarat Më pëlqeu rishikimi +60 +114

Në shumë projekte Arduino, kërkohet monitorimi dhe regjistrimi i kohës së ndodhjes së ngjarjeve të caktuara. Moduli i orës në kohë reale, i pajisur me një bateri shtesë, ju lejon të ruani datën aktuale pa u varur nga disponueshmëria e energjisë në vetë pajisjen. Në këtë artikull do të flasim për modulet më të zakonshme RTC DS1307, DS1302, DS3231 që mund të përdoren me bordin Arduino.

Moduli i orës është një tabelë e vogël që përmban, si rregull, një nga mikroqarqet DS1307, DS1302, DS3231 Për më tepër, në tabelë mund të gjeni praktikisht një mekanizëm instalimi të baterisë. Borde të tilla shpesh përdoren për të gjurmuar kohën, datën, ditën e javës dhe parametra të tjerë kronometrikë. Modulet funksionojnë me energji autonome - bateri, akumulatorë dhe vazhdojnë të numërohen edhe nëse energjia e Arduino është e fikur. Modelet më të zakonshme të orëve janë DS1302, DS1307, DS3231. Ato bazohen në një modul RTC (orë në kohë reale) të lidhur me Arduino.

Orët numërohen në njësi që janë të përshtatshme për një person mesatar - minuta, orë, ditë të javës dhe të tjera, në kontrast me numëruesit konvencionalë dhe gjeneratorët e orës që lexojnë "tik-ta". Arduino ka një funksion të veçantë millis() i cili gjithashtu mund të lexojë intervale të ndryshme kohore. Por disavantazhi kryesor i këtij funksioni është se ai rivendoset në zero kur kohëmatësi është i ndezur. Me ndihmën e tij mund të lexoni vetëm kohën; Modulet e orës në kohë reale përdoren për të zgjidhur këtë problem.

Qarku elektronik përfshin një mikroqark, një furnizim me energji elektrike, një rezonator kuarci dhe rezistorë. Rezonatori i kuarcit funksionon në një frekuencë prej 32768 Hz, e cila është e përshtatshme për një numërues konvencional binar. Qarku DS3231 ka kuarc të integruar dhe stabilizim termik, i cili lejon vlera shumë të sakta.

Krahasimi i moduleve të njohura RTC DS1302, DS1307, DS3231

Në këtë tabelë ne kemi ofruar një listë të moduleve më të njohura dhe karakteristikat e tyre kryesore.

Emri Frekuenca Saktësia Protokollet e mbështetur
DS1307 1 Hz, 4,096 kHz, 8,192 kHz, 32,768 kHz Varet nga kuarci - zakonisht vlera arrin 2.5 sekonda në ditë, është e pamundur të arrihet saktësi më e lartë se 1 sekondë në ditë. Gjithashtu, saktësia varet nga temperatura. I2C
DS1302 32.768 kHz 5 sekonda në ditë I2C, SPI
DS3231 Dy dalje - e para në 32,768 kHz, e dyta e programueshme nga 1 Hz në 8,192 kHz ±2 ppm në temperatura nga 0C deri në 40C.

±3,5 ppm në temperatura nga -40C deri në 85C.

Saktësia e matjes së temperaturës – ±3С

I2C

Moduli DS1307

DS1307 është një modul që përdoret për kohën. Është mbledhur në bazë të çipit DS1307ZN, energjia furnizohet nga një bateri litiumi për funksionim autonom për një periudhë të gjatë kohore. Bateria në tabelë është montuar në anën e pasme. Moduli ka një çip AT24C32 - kjo është një memorie EEPROM jo e paqëndrueshme 32 KB. Të dy mikroqarqet lidhen me një autobus I2C. DS1307 ka konsum të ulët të energjisë dhe përmban një orë dhe kalendar për vitin 2100.

Moduli ka parametrat e mëposhtëm:

  • Furnizimi me energji elektrike - 5 V;
  • Gama e temperaturës së funksionimit nga -40C deri në 85C;
  • 56 bajt memorie;
  • Bateri litiumi LIR2032;
  • Zbaton mënyrat 12 dhe 24 orë;
  • Mbështetja e ndërfaqes I2C.

Moduli justifikohet në rastet kur të dhënat lexohen mjaft rrallë, në intervale prej një jave ose më shumë. Kjo ju lejon të kurseni energji, pasi përdorimi i pandërprerë do të kërkojë më shumë tension, edhe me bateri. Prania e kujtesës ju lejon të regjistroni parametra të ndryshëm (për shembull, matja e temperaturës) dhe të lexoni informacionin e marrë nga moduli.

Ndërveprimi me pajisjet e tjera dhe shkëmbimi i informacionit me to kryhet duke përdorur ndërfaqen I2C nga kunjat SCL dhe SDA. Qarku përmban rezistorë që ju lejojnë të siguroni nivelin e kërkuar të sinjalit. Pllaka ka gjithashtu një vend të veçantë për montimin e sensorit të temperaturës DS18B20. Kontaktet shpërndahen në 2 grupe, hapësire 2.54 mm. Grupi i parë i kontakteve përmban kunjat e mëposhtme:

  • DS – dalje për sensorin DS18B20;
  • SCL – linja e orës;
  • SDA – linja e të dhënave;
  • KQV – 5V;

Grupi i dytë i kontakteve përmban:

  • SQ - 1 MHz;
  • BAT – hyrje për bateri litium.

Për t'u lidhur me bordin Arduino, ju nevojitet vetë bordi (në këtë rast po shqyrtojmë Arduino Uno), një modul i orës në kohë reale RTC DS1307, tela dhe një kabllo USB.

Për të lidhur kontrolluesin me Arduino, përdoren 4 kunja - VCC, tokëzimi, SCL, SDA.. VCC nga ora lidhet me 5V në Arduino, toka nga ora lidhet me tokën nga Arduino, SDA - A4, SCL - A5.

Për të filluar punën me modulin e orës, duhet të instaloni bibliotekat DS1307RTC, TimeLib dhe Wire. Ju gjithashtu mund të përdorni RTCLib për punë.

Kontrollimi i modulit RTC

Kur ekzekutoni kodin e parë, programi do të lexojë të dhënat nga moduli një herë në sekondë. Së pari, mund të shihni se si sillet programi nëse e hiqni baterinë nga moduli dhe e zëvendësoni me një tjetër, ndërsa bordi Arduino nuk është i lidhur me kompjuterin. Duhet të prisni disa sekonda dhe të hiqni baterinë, më në fund ora do të rindizet. Pastaj ju duhet të zgjidhni një shembull nga menyja Shembuj→RTClib→ds1307. Është e rëndësishme të vendosni saktë shpejtësinë e transmetimit në 57600 bps.

Kur hapni dritaren e Monitorit Serial, duhet të shfaqen rreshtat e mëposhtëm:

Ora do të tregojë 0:0:0. Kjo për shkak se ora humbet fuqinë dhe do të ndalojë së numëruari kohën. Për këtë arsye, bateria nuk duhet të hiqet ndërsa moduli është në punë.

Për të vendosur kohën në modul, duhet të gjeni vijën në skicë

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

Kjo linjë do të përmbajë të dhëna nga kompjuteri që përdoret për të ndezur modulin e orës në kohë reale. Për funksionimin e saktë, së pari duhet të kontrolloni datën dhe orën e saktë në kompjuter dhe vetëm atëherë të filloni të ndezni modulin e orës. Pas konfigurimit, monitori do të shfaqë të dhënat e mëposhtme:

Konfigurimi është bërë në mënyrë korrekte dhe nuk ka nevojë të rikonfiguroni shtesë orën në kohë reale.

Leximi i kohës. Pasi të konfigurohet moduli, mund të dërgohen kërkesat për kohë. Kjo bëhet duke përdorur funksionin now(), i cili kthen një objekt DateTime që përmban informacione për kohën dhe datën. Ka një sërë bibliotekash që përdoren për të lexuar kohën. Për shembull, RTC.year() dhe RTC.hour() - ata marrin veçmas informacion rreth vitit dhe orës. Kur punoni me ta, mund të lindë një problem: për shembull, një kërkesë për të shfaqur kohën do të bëhet në orën 1:19:59. Para se të tregojë orën 1:20:00, ora do të shfaqë orën 1:19:00, që do të thotë, në thelb, një minutë do të humbasë. Prandaj, këto biblioteka këshillohen të përdoren në rastet kur leximi ndodh rrallë - një herë në disa ditë. Ekzistojnë funksione të tjera për kohën e thirrjes, por nëse keni nevojë të zvogëloni ose shmangni gabimet, është më mirë të përdorni tani() dhe të nxirrni leximet e nevojshme prej tij.

Shembull i projektit me modulin e orës i2C dhe ekranin

Projekti është një orë e rregullt, koha e saktë do të shfaqet në tregues dhe dy pika midis numrave do të pulsojë në intervale prej një herë në sekondë. Për të zbatuar projektin, do t'ju duhet një tabelë Arduino Uno, një tregues dixhital, një orë në kohë reale (në këtë rast, moduli i përshkruar më sipër ds1307), një mburojë për lidhje (në këtë rast, përdoret Troyka Shield), një bateri për orën dhe telat.

Projekti përdor një tregues të thjeshtë katërshifror në çipin TM1637. Pajisja ka një ndërfaqe me dy tela dhe siguron 8 nivele të ndriçimit të monitorit. Përdoret vetëm për të shfaqur kohën në formatin orë:minuta. Treguesi është i lehtë për t'u përdorur dhe i lehtë për t'u lidhur. Është e dobishme të përdoret për projekte ku nuk kërkohet verifikimi i të dhënave minuta ose orë. Për të marrë informacion më të plotë për kohën dhe datën, përdoren monitorët LCD.

Moduli i orës është i lidhur me kunjat SCL/SDA, të cilat i përkasin autobusit I2C. Ju gjithashtu duhet të lidhni tokën dhe energjinë. Është i lidhur me Arduino në të njëjtën mënyrë siç përshkruhet më sipër: SDA – A4, SCL – A5, tokëzimi nga moduli në tokë nga Arduino, VCC -5V.

Treguesi është i lidhur thjesht - kunjat e tij CLK dhe DIO janë të lidhura me çdo kunj dixhitale në tabelë.

Skicë. Për të shkruar kodin, përdorni funksionin e konfigurimit, i cili ju lejon të inicializoni orën dhe treguesin dhe të regjistroni kohën e përpilimit. Printimi i kohës në ekran do të bëhet duke përdorur lak.

#përfshi #include "TM1637.h" #include "DS1307.h" //ju duhet të përfshini të gjitha bibliotekat e nevojshme për të punuar me orën dhe ekranin. char compileTime = __TIME__; //koha e përpilimit. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //numrat nga daljet Arduino me të cilat është lidhur ekrani; void setup() ( display.set(); display.init(); //lidhni dhe konfiguroni ekranin. clock.begin(); //ndizni orën. orë bajt = getInt(compileTime, 0); minutë bajt = getInt( compileTime, 2 byte sekond = getInt(compileTime, 4) informacion në memorien e brendshme, filloni të lexoni kohën ) void loop() ( int8_t timeDisp; //afisho në secilin prej katër biteve. clock.getTime();//kërkesë për të marrë kohën. timeDisp = clock.hour / 10; timeDisp. = clock.hour % 10; .point(clock.second % 2 ? POINT_ON: POINT_OFF);//ndizni dhe fikni dy pika pas një sekonde) char getInt(const char* string, int startIndex) ( return int(string - "0") * 10 + int(string) - "0"; //veprimet për të shkruar saktë kohën në një numër të plotë dyshifror. Përndryshe, vetëm disa simbole do të shfaqen në ekran. )

Pas kësaj, skica duhet të ngarkohet dhe koha do të shfaqet në monitor.

Programi mund të modernizohet pak. Kur rryma është e fikur, skica e shkruar më sipër do të bëjë që ekrani të tregojë kohën e caktuar gjatë përpilimit pas ndezjes. Në funksionin e konfigurimit, çdo herë do të llogaritet koha që ka kaluar nga ora 00:00:00 deri në fillimin e përpilimit. Ky hash do të krahasohet me atë që ruhet në EEPROM, i cili mbahet kur hiqet energjia.

Për të shkruar dhe lexuar kohën në ose nga memoria jo e paqëndrueshme, duhet të shtoni funksionet EEPROMWriteInt dhe EEPROMReadInt. Ato nevojiten për të kontrolluar nëse hash-i përputhet ose nuk përputhet me hash-in e regjistruar në EEPROM.

Projekti mund të përmirësohet. Nëse përdorni një monitor LCD, mund të bëni një projekt që shfaq datën dhe kohën në ekran. Lidhja e të gjithë elementëve është paraqitur në figurë.

Si rezultat, kodi do të duhet të specifikojë një bibliotekë të re (për ekranet me kristal të lëngshëm kjo është LiquidCrystal) dhe të shtojë linja në funksionin loop() për të marrë datën.

Algoritmi i funksionimit është si më poshtë:

  • Lidhja e të gjithë komponentëve;
  • Kontrollo - ora dhe data në ekranin e monitorit duhet të ndryshojnë çdo sekondë. Nëse koha në ekran është e pasaktë, duhet të shtoni funksionin RTC.write (tmElements_t tm) në skicë. Problemet me oraret e pasakta janë për shkak të faktit se moduli i orës rivendos datën dhe orën në 00:00:00 01/01/2000 kur është i fikur.
  • Funksioni i shkrimit ju lejon të merrni datën dhe kohën nga kompjuteri, pas së cilës parametrat e duhur do të tregohen në ekran.

konkluzioni

Modulet e orës përdoren në shumë projekte. Ato nevojiten për sistemet e regjistrimit të të dhënave, kur krijohen kohëmatës dhe pajisje kontrolli që funksionojnë sipas një orari të caktuar, në pajisjet shtëpiake. Me module të disponueshme gjerësisht dhe të lira, mund të krijoni projekte të tilla si një orë me zile ose një regjistrues të dhënash me sensor, duke regjistruar informacione në një kartë SD ose duke shfaqur kohën në një ekran ekrani. Në këtë artikull, ne shikuam skenarët tipikë të përdorimit dhe opsionet e lidhjes për llojet më të njohura të moduleve.

Sot ne do të vazhdojmë kërkimin tonë për çipin e përsosur të orës reale (RTC). Ne do të bëjmë ora bazuar në . Ekrani do të jetë më i përshtatshëm për zhvillim - një ekran LCD, i cili do të shfaqë të gjitha informacionet menjëherë, përveç cilësimeve. Në këtë formë, ora është e përshtatshme për t'u përdorur si një opsion desktopi.

Pra, le të shohim vetë çipin DS3231. DS3231 është një orë në kohë reale me lëvizje jashtëzakonisht të sakta (prodhuesit zgjodhën fjalën) falë një rezonatori të integruar kuarci me kompensim të temperaturës. Ndërfaqja e transferimit të të dhënave është I 2 C. Ky mikroqark ka gjithashtu një hyrje për tensionin e baterisë rezervë kur rryma kryesore është e fikur, mikroqarku kalon automatikisht në funksionim nga bateria rezervë, saktësia e funksionimit nga bateria rezervë nuk është; të prekura. Është shumë e këndshme, apo jo? DS3231 mbështet numërimin e sekondave, minutave, orëve, ditëve të muajit (data), ditëve të javës, muajve dhe viteve (duke përfshirë vitin e brishtë për muaj). Mbështet punën në formatin 12 dhe 24 orë. Ka 2 orë alarmi me aftësinë për t'i konfiguruar dhe monitoruar statusin e tyre. Rregullimi i saktësisë së kompensimit të temperaturës. Dhe gjithashtu dy dalje - në 32 kHz (dalja është 32,768 kHz) dhe një dalje e programueshme nga 1 Hz në 8,192 kHz. Ekziston gjithashtu një kunj rivendosjeje - RST. Çipi i orës në kohë reale është i disponueshëm në një paketë SO-16. Rasti është mjaft i madh, por nëse keni parasysh që tashmë ka kuarc brenda, dhe gjithashtu kompensohet temperatura, atëherë më duket se gjithçka është në rregull me dimensionet. DS3231 ka një binjak në formën e DS3232, i cili, megjithatë, ka 2 këmbë të tjera. E gjithë kjo të kujton shumë produktet NXP - çipat e orës PCA2129 dhe PCF2129. Rezonator kuarci i integruar me kompensim të ngjashëm me temperaturë, të dy janë të njëjtët binjakë vetëm me numra të ndryshëm n.c. kunjat dhe funksionet e ngjashme në lidhje me DS3231 përveç matjes së kohës.

RTC DS3231 janë në dispozicion për shitje në formën e moduleve me instalime elektrike të nevojshme, si dhe të kompletuar me një çip EEPROM, i cili më shpesh nuk është i nevojshëm, ai vetëm shton peshë:

Përveç pjesëve të nevojshme, në tabelën e modulit ka edhe një LED, funksioni i së cilës është të tregojë lidhjen e energjisë me terminalet. Ndoshta e kanë dorëzuar vetëm për bukuri.

Ajo që është e rëndësishme të dini kur punoni me një çip të tillë të orës në kohë reale është se si të nxirrni të dhëna prej tij ose t'i shkruani ato atje. Ora ka një ndërfaqe I 2 C Për të shkruar të dhëna (dhe kjo është gjithashtu e nevojshme për të lexuar të dhënat), duhet të kaloni kushtin e fillimit (këto komanda kryhen duke përdorur harduerin ose softuerin I 2 C. mikrokontrollues), pastaj kaloni adresën e çipit me regjistrimin e bitit, më pas kaloni adresën e regjistrit në të cilin do të aksesojmë dhe më pas transferoni një bajt të dhënash në këtë regjistër, nëse më pas transferoni një bajt tjetër të të dhënave, do të jetë shkruar në regjistrin tjetër, e kështu me radhë. Kur të përfundoni, duhet të kaloni një kusht ndalimi. Paraqitja grafike e sa më sipër në figurë:

Regjistrimi i të dhënave kërkohet për konfigurimin fillestar, si dhe për caktimin e orës aktuale. Më pas, duhet të marrim vazhdimisht të dhëna për kohën dhe datën aktuale. Për ta bërë këtë, është e nevojshme të lexoni nga regjistrat që ruajnë këtë informacion. Leximi përbëhet nga dy procedura - vendosja e një treguesi në regjistrin e dëshiruar dhe leximi i tij. Për të vendosur një tregues në regjistrin e dëshiruar, duhet të kaloni kushtin e fillimit, pastaj të kaloni adresën e çipit me bitin e shkrimit dhe një bajt me adresën e regjistrit. Tjetra është ose një kusht ndalimi dhe më pas një kusht fillimi, ose thjesht një rinisje. Tani procedura e dytë është leximi i drejtpërdrejtë nga regjistrat. Fillimi transmetohet, më pas duhet të dërgoni adresën e mikroqarkut me një bit leximi dhe më pas të lexoni regjistrat në numrin e kërkuar dhe pas përfundimit të transmetoni gjendjen e ndalimit. Nëse informacioni nga regjistri është lexuar, treguesi kalon automatikisht në regjistrin tjetër pa veprime të panevojshme nga ana e mikrokontrolluesit (mjeshtri i pajisjes). Figura ilustron gjithçka që u tha më sipër në lidhje me regjistrat e leximit duke përdorur ndërfaqen I 2 C:

Adresa e çipit:

  • për regjistrim - 0b11010000
  • për lexim - 0b11010001

Kodi C do të duket si ky:

// funksionet me orën ============================================ ================================================== ================== ======== // inicializimi i cilësimeve fillestare void RTC_init(void)( i2c_start_cond(); // fillimi i i2c i2c_send_byte (RTC_adr_write); // transferimi i adresës së pajisjes, mënyra e regjistrimit i2c_send_byte (0x0E // transferimi i adresës së memories i2c_send_byte (0b00100000) // ndalo i2c ) // marrjen e orës dhe datës void RTC_read_time(void)( i2c_start_cond() ; // nis i2c_send_byte(RTC_adr_write); // transfero adresën e pajisjes, modalitetin e shkrimit i2c_stop_cond(); // ndalo i2c i2c_send_byte ; / adresa e pajisjes, mënyra e leximit sec = bcd (i2c_get_byte (0) // lexoni sekonda, ACK min = bcd (i2c_get_byte (0)), ACK orë = bcd (i2c_get_byte (0)); / lexo orën, ACK wday = bcd(i2c_get_byte(0)); // leximi i ditës së javës, dita ACK = bcd(i2c_get_byte(0)); // leximi i numrit, ACK muaj = bcd(i2c_get_byte(0)); // muaji i leximit, viti ACK = bcd(i2c_get_byte(1)); // viti i leximit, NACK i2c_stop_cond(); // ndalo i2c ) // cakto kohën e pavlefshme RTC_write_time (hara e panënshkruar 1, char e panënshkruar min1, char sec1 e panënshkruar)( i2c_start_cond(); // nis i2c i2c_send_byte(RTC_adr_write); // transfero modalitetin i2tec_regjistrimi, 0x00); ;Clock i2c_stop_cond(// stop i2c ) // vendosja e datës void RTC_write_date(char wday, pa nënshkruar, muaji i panënshkruar, viti i panënshkruar)( i2c_start_cond(); / transferimi i adresave të pajisjes, mënyra e regjistrimit i2c_send_byte (0x03 // transferimi i adresës së memories i2c_send_byte (bin(wday)) E premte, e shtunë 7 ) i2c_send_byte(bin(ditë) // 0x04 ditë muaj i2c_send_byte(bin(muaj) // 0x05 muaj i2c_send_byte(bin(vit) // ndal i2c ) // lexo temperaturën e pavlefshme RTC_read_temper(void)( i2c_start_cond(); // nis i2c i2c_send_byte(RTC_adr_write); // transfero adresën e pajisjes, modalitetin e shkrimit i2c_send_byte(0x11); // transfero adresën e sipërme të kujtesës i2c (// stop i2c_start_cond// start i2c_send_byte//////////////////////////////) / ndalim i2c t2=(t2/128 // zhvendosje me 6 - saktësi 0,25 (2 bit) // zhvendosje me 7 - saktësi 0,5 (1 bit) t2=t2*5;

Ky është i gjithë kodi burimor i përdorur për të punuar me mikroqarkun, rregullimi i shpejtësisë së orës nuk u ndikua, pasi ora nuk kishte humbur asnjë sekondë në disa ditë.

Po - një veçori e shkëlqyer DS3231 është se i njëjti çip kryen funksionet e një termometri (përndryshe si të kryhet kompensimi i temperaturës) dhe aftësia për të lexuar temperaturën aktuale. Rezolucioni maksimal i temperaturës është 0,25 gradë Celsius. Gjithashtu, periudha e përditësimit të temperaturës është mjaft e gjatë - rreth 1 minutë. Po, nuk kemi nevojë ta përditësojmë shpejt.

Diagrami i të gjithë strukturës së orës duket si ky:

Mikrokontrolluesi u zgjodh nga Atmega8 për disponueshmërinë e tij të gjerë dhe çmimin e ulët. Ky mikrokontrollues mund të përdoret si në një paketë DIP-28 ashtu edhe në një version SMD në një paketë TQFP-32. Rezistenca R3 është e nevojshme për të parandaluar rinisjen spontane të mikrokontrolluesit në rast të zhurmës së rastësishme në pinin PC6. Rezistenca R3 tërheq fuqinë plus në këtë kunj, duke krijuar në mënyrë të besueshme një potencial përtej tij. Për ekran përdoret një ekran me kristal të lëngshëm (LCD). Kam përdorur ekranin 2004A - 4 rreshta me 20 karaktere janë më shumë për bukurinë, kështu që mund të përdorni një ekran më të njohur - 2 rreshta me 16 karaktere. Ekrani LCD është i lidhur me mikrokontrolluesin duke përdorur një sistem katër-bitësh. Rezistenca e ndryshueshme R2 është e nevojshme për të rregulluar kontrastin e karaktereve në ekran. Duke rrotulluar rrëshqitësin e kësaj rezistence ne arrijmë leximet më të qarta në ekran për ne. Drita e prapme e ekranit LCD organizohet përmes kunjave "A" dhe "K" në tabelën e ekranit. Drita e prapme ndizet përmes një rezistence kufizuese të rrymës - R1. Sa më e lartë të jetë vlera, aq më e zbehtë do të jetë drita e prapme e ekranit. Sidoqoftë, kjo rezistencë nuk duhet të neglizhohet për të shmangur dëmtimin e dritës së prapme. Butonat S1 - S4 kontrollojnë cilësimet e orës. LED tregon se alarmi është fikur. LED mund të zëvendësohet me një lloj qarku të zërit. Rezistorët R5 - R8 janë tërheqës dhe janë të nevojshëm për formimin e pulseve drejtkëndore në terminalet e çipit të orës. Kjo është gjithashtu e nevojshme për funksionimin e saktë të protokollit I2C. Për të fuqizuar qarkun, përdoret një çip stabilizues linear L7805, ai mund të zëvendësohet me një analog të brendshëm të stabilizatorit linear me pesë volt KR142EN5A, ose mund të përdorni një çip tjetër stabilizues të tensionit në përputhje me lidhjen e tij në qark (për shembull, LM317 ose stabilizues ndërrimi LM2576, LM2596, MC34063, e kështu me radhë). Më pas, 5 volt stabilizohen nga një mikroqark tjetër - versioni AMS1117, i cili jep një dalje prej 3.3 volt. Çipi i orës, sipas fletës së të dhënave, mundësohet nga një tension prej 3.3 volt. Megjithatë, voltazhi maksimal është 5.5 volt. Prandaj, ky stabilizues mund të përdoret ose jo, sipas gjykimit tuaj. Stabilizuesi i tensionit AMS1117 gjithashtu mund të zëvendësohet me versionin ADJ (AMS1117ADJ) - domethënë një version i rregullueshëm, do t'ju duhet të vendosni tensionin e kërkuar me këtë zgjedhjeduke përdorur dy rezistorë të lidhur me mikroqarkun në përputhje me fletën e të dhënave të tij.

Qarku u montua dhe u korrigjua duke përdorur një tabelë zhvillimi për mikrokontrolluesin ATmega8:

Qëllimi i butonave:

  • S1 - fik sinjalin e alarmit ose del në menynë kryesore nga çdo meny cilësimesh
  • S2- rivendosja e mikrokontrolluesit
  • S3 - ndryshon orën ose datën në menynë e cilësimeve
  • S4 - futni menynë e cilësimeve dhe lëvizni nëpër meny

Pini 32 kHz mund të përdoret për të kontrolluar frekuencën kristalore. Ne lidhim një matës frekuence ose oshiloskop me këtë kunj dhe kontrollojmë frekuencën:

Siç mund të shihet nga pamja e ekranit të oshilogramit, frekuenca përafërsisht korrespondon me 32.768 kHz (përafërsisht për shkak të kufizimeve në rezolucionin e matjeve të frekuencës, dhe është e vështirë të përcaktohet kaq saktë "me sy").

Rezultati ishte një orë me karakteristikat e mëposhtme:

  • tregues i kohës
  • shfaqja e datës
  • tregues i ditës së javës
  • tregues i aktivitetit të orës së alarmit
  • 1 orë alarmi me dalje sinjali nga një mikrokontrollues
  • treguesi i temperaturës së ambientit (vetëm temperatura pozitive zbatohet në softuer; temperatura negative, mendoj se nuk është e dobishme për ne)
  • cilësimet e alarmit
  • cilësimet e kohës
  • cilësimet e datës
  • Ekran LCD me dritë prapa
  • ruajtja e cilësimeve dhe vazhdimi i orës kur rryma kryesore është e fikur

Le të përmbledhim. Çipi i orës DS3231 në kohë reale është një zgjidhje e shkëlqyer. Saktësia është e krahasueshme me disa DS1307 ose më të larta, por PCA/PCF2129 ende mund të konkurrojë me të. Ndër çipat e orës në kohë reale që kam shqyrtuar, ky shembull aktualisht renditet i pari për sa i përket funksionalitetit dhe saktësisë.

Për të programuar mikrokontrolluesin Atmega8, duhet të dini konfigurimin e pjesëve të siguresave (pamja e ekranit e marrë në program):

Artikulli shoqërohet me firmware për mikrokontrolluesin Atmega8, një dizajn qarku në program, si dhe një video të orës që funksionon (në fillim alarmi do të fiket - LED do të ndizet).

Lista e radioelementeve

Emërtimi Lloji Emërtimi sasi shënimDyqanblloku im i shënimeve
IC1 MK AVR 8-bit

ATmega8

1 Në bllokun e shënimeve
IC2 Ora në kohë reale (RTC)

DS3231

1 Në bllokun e shënimeve
VR1 Rregullator linear

L7805AB

1 Në bllokun e shënimeve
VR2 Rregullator linear

AMS1117-3.3

1 Në bllokun e shënimeve
VD1 Diodë ndreqës

1N4148

1 Në bllokun e shënimeve
C1 470 µF1 Në bllokun e shënimeve
C2, C3, C5, C7 Kondensator100 nF4 Në bllokun e shënimeve
C4 Kondensator elektrolitik220 µF1 Në bllokun e shënimeve
C6, C8 Kondensator elektrolitik10 µF2 Në bllokun e shënimeve
R1 Rezistencë

22 Ohm

1 Në bllokun e shënimeve
R2 Rezistenca prerëse10 kOhm1 3296W-1-103LF

". Le të njihemi me modulin e orës DS3231 në kohë reale. Artikulli përmban udhëzime video, lista të programeve, qëllimin dhe metodat e lidhjes së moduleve nga familja DS me Arduino.

DS3231 Moduli i orës në kohë reale

Çfarë është moduli i orës në kohë reale DS3231?

Moduli i orës në kohë reale- ky është një qark elektronik i krijuar për të regjistruar të dhënat kronometrike (koha aktuale, data, dita e javës, etj.), dhe është një sistem i përbërë nga një burim autonom energjie dhe një pajisje regjistrimi.

Moduli DS3231 Në thelb është një orë e zakonshme. Bordet Arduino tashmë kanë një sensor të integruar të kohës Millis, megjithatë, funksionon vetëm kur fuqia aplikohet në tabelë. Nëse fikni dhe më pas ndizni Arduino, koha Millis do të rivendoset në zero. Dhe DS3231 ka një bateri në bord, e cila, edhe kur bordi Arduino është i shkëputur, vazhdon të "ushqejë" modulin, duke e lejuar atë të masë kohën.

Moduli mund të përdoret si orë ose orë alarmi bazuar në bordet Arduino. Ose si një alarm për sisteme të ndryshme, për shembull në një shtëpi inteligjente.

Specifikimet e DS3231:

  • moduli llogarit orë, minuta, sekonda, data, muaj, vite (vitet e brishtë merren parasysh deri në 2100);
  • Për t'u lidhur me pajisje të ndryshme, ora lidhet nëpërmjet një ndërfaqeje I2C.

32 mijë— Prodhimi i projektuar për të furnizuar energji të jashtme >12V.

S.Q.W.— Dalja e sinjalit me valë katrore të programueshme.

SCL– Nëpërmjet këtij pin, të dhënat shkëmbehen me orën nëpërmjet ndërfaqes I2C.

S.D.A.– Të dhënat nga ora transmetohen përmes këtij pin.

KQV– Furnizimi me energji për orën në kohë reale, kërkohet 5 volt. Nëse nuk ka tension të furnizuar në këtë kunj, ora kalon në modalitetin e fjetjes.

GND- Toka.

Diagrami i lidhjes për orën DS3231 në kohë reale dhe një program i thjeshtë

Kunjat SDA dhe SCL në pllaka të ndryshme Arduino:

S.D.A. SCL
OKB A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Le të lidhim modulin e orës në kohë reale me Arduino UNO. SDA - pin A4, SCL - pin A5.

Programi i mëposhtëm është i përshtatshëm që modeli të funksionojë (ju thjesht mund ta kopjoni programin në Arduino IDE):

#përfshi

konfigurimi i zbrazët () (
vonesë (300);
Seriali.fillim(9600);
koha.fillimi();
}
void loop ()



}
}

Në këtë skicë, koha thjesht po numëron mbrapsht.

Para së gjithash, në sktech, lidhni bibliotekën iarduino_RTC.h.

Atje, tregoni emrin e saktë të modulit tuaj për të punuar me të saktë.

Si rezultat, ne marrim daljen e kohës nga moduli DS3231 në monitorin e portit. Shfaqen orët, minutat, sekondat.

Në skicën tjetër do të shtojmë një funksion vendos oren, i cili ju lejon të vendosni kohën fillestare të numërimit mbrapsht.

#përfshi
koha iarduino_RTC (RTC_DS3231);
konfigurimi i zbrazët () (
vonesë (300);
Seriali.fillim(9600);
koha.fillimi();
koha.vendosja (0,0,18,24,04,17,1); // 0 sek, 0 min, 18 orë, 24 prill 2017, e hënë
}
void loop ()
if(millis()%1000==0)( // nëse ka kaluar 1 sekondë
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // koha e shfaqjes
vonesë (1); // ndaloni për 1 ms në mënyrë që të mos shfaqet koha disa herë në 1 ms
}
}

Në shembull, koha fillon të numërojë nga 0 sek, 0 min, ora 18, 24 prill 2017, e hënë.

Postimet e mësimit:

  1. Mesimi i pare: .
  2. Mësimi i dytë: .
  3. Mësimi i tretë: .
  4. Mësimi i katërt: .
  5. Mësimi i pestë: .
  6. Mësimi i gjashtë: .
  7. Mësimi i shtatë: .
  8. Mësimi i tetë: .
  9. Mësimi i nëntë:

Artikujt më të mirë mbi këtë temë