Kako napraviti sat od Arduina. Spajanje ds1302 sata stvarnog vremena na Arduino

Jedan od prvih projekata koje početnici grade pomoću Arduino ploče je jednostavan sat, odbrojavanje vremena. U osnovi, takvi satovi se temelje na RTC modulu spojenom na Arduino ( Stvarno vrijeme sat ili sat stvarnog vremena). Danas na tržištu elektroničke komponente dostupno različiti modeli RTC koji se razlikuju po točnosti i cijeni. Uobičajeni modeli uključuju DS1302, DS1307, DS3231.



Ali sat se može napraviti na Arduinu i bez njega koristeći RTC, pogotovo ako ne možete nabaviti takve module. Naravno, točnost je u ovom slučaju bit će mali, pa bi se projekt prije trebao smatrati projektom obuke.


Princip rada takvih satova je prilično jednostavan. Svaki put kada uključite ovaj Arduino sat, morat ćete ga postaviti na trenutno vrijeme, baš kao i svaki drugi analogni sat. Svakako je bolje ne koristiti takve satove u svom Svakidašnjica kada su aktivni dulje vrijeme bez ponovnog pokretanja i daljnje prilagođavanje, budući da desinkronizacija s trenutnim vremenom tijekom dugotrajnog rada može biti značajna.


Ovaj sat se može sastaviti pomoću običnog maketa, budući da ne zahtijeva mnogo komponenti. Naša glavna poveznica ovdje bit će Arduino Uno ploča. Za prikaz vremena možete uzeti LCD zaslon 16x2. Za promjenu postavki vremena morate spojiti dva gumba (za sate i minute). Gumbi su spojeni na Aduino preko otpornika od 10KΩ. Za promjenu svjetline zaslona trebat će vam potenciometar od 10 kOhm. Dijagram spajanja svih ovih komponenti na Arduino Uno ploču prikazan je u nastavku.



Sada trebate programirati Arduino. Dolje je dan jednostavan kod (skica) koji vam omogućuje prikaz vremena na LCD zaslonu.


#uključi LiquidCrystal lcd (12,11,5,4,3,2); int h=12; int m; int s; int zastavica; int VRIJEME; const int hs=8; const int ms=9; int stanje1; int stanje2; 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(m); lcd.print(":"); lcd.print(s); if(zastavica<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); ako(zastavica==24)zastavica=0; kašnjenje (1000); lcd.clear(); if(s==60)( s=0; m=m+1; ) if(m==60) ( m=0; h=h+1; zastavica=zastavica+1; ) if(h==13 ) ( h=1; ) lcd.setCursor(0,1); lcd.print("UGODAN DAN"); //-------Vrijeme // postavka-------// state1=digitalRead(hs); if(stanje1==1) ( h=h+1; zastavica=zastavica+1; if(zastavica<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); ako(zastavica==24)zastavica=0; if(h==13)h=1; ) stanje2=digitalnoČitanje(ms); if(stanje2==1)( s=0; m=m+1; ) )

   Zahvaljujemo na interesu za informacijski projekt web stranice.
   Ako želite zanimljivo i korisni materijali izlazio češće i bilo je manje reklama,
   Naš projekt možete podržati tako što ćete donirati bilo koji iznos za njegov razvoj.

Dobar dan, danas ću podijeliti upute za izradu sata sa sobnim termometrom ( DIY Arduino sat). Sat radi dalje Arduino UNO, grafički zaslon WG12864B koristi se za prikaz vremena i temperature. Kao senzor temperature - ds18b20. Za razliku od većine drugih satova, neću koristiti RTS (Real Time Clock), ali ću pokušati bez ovog dodatnog modula.

Arduino sklopovi odlikuju se svojom jednostavnošću i svatko može početi učiti Arduino. O tome kako spojiti biblioteke i flash Arduino možete pročitati u našem članku.

Započnimo.

Za izradu ovog sata trebat će nam:

Arduino UNO (Ili bilo koji drugi Arduino kompatibilan platiti)
- Grafički ekranWG12864B
- Senzor temperature ds18b20
- Otpornik 4,7 Kom 0,25 W
- Otpornik 100 ohm 0,25 W
- Pretinac za baterije za 4 AA baterije
- Odgovarajuća kutija
- Fina turpija
- Lak za nokte (crni ili u boji tijela)
- Malo tanke plastike ili kartona
- Električna traka
- Spajanje žica
- tiskana ploča
- Gumbi
- Lemilica
- Lem, kolofonij
- Dvostrana traka

Priprema grafičkog ekrana.
Na prvi pogled, povezivanje zaslona predstavlja mnogo problema i poteškoća. Ali ako prvo shvatite njihove vrste, bit će vam mnogo lakše i jasnije. Postoji mnogo varijanti i tipova zaslona na ks0107/ks0108 kontroleru. Svi zasloni obično se dijele u 4 vrste:
Opcija A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Opcija B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-128 64F, TM12864L-2, 12864J-1
Opcija C: Shenzhen Jinghua Displays Co Ltd. JM12864
Opcija D: Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

Popis nije potpun, ima ih puno. Najčešći i, po mom mišljenju, prikladan je WG12864B3 V2.0. Zaslon se može spojiti na Arduino preko serijskog ili paralelni priključak. Kada koristite s Arduino UNO, bolje je odabrati vezu putem serijski priključak– tada će nam trebati samo 3 mikrokontrolerska izlaza, umjesto najmanje 13 linija pri spajanju preko paralelnog porta. Sve se povezuje vrlo jednostavno. Postoji još jedna nijansa: u prodaji možete pronaći dvije opcije zaslona, ​​s ugrađenim potenciometrom (za podešavanje kontrasta) i bez njega. Ja sam odabrao, a savjetujem i vama, s onom ugrađenom.


Time se smanjuje broj dijelova i vrijeme lemljenja. Također je vrijedno instalirati otpornik za ograničavanje struje od 100 Ohma za pozadinsko osvjetljenje. Izravnim spajanjem 5 volti postoji opasnost od izgaranja pozadinskog osvjetljenja.
WG12864B – Arduino UNO
1 (GND) - GND
2 (VCC) - +5 V
4 (RS) – 10
5 (R/P) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – kroz otpornik - +5V
20 (CRNO) – GND

Najprikladniji način je sastaviti sve iza ekrana i iz njega izvući 5 žica koje se spajaju na Arduino UNO. Krajnji rezultat trebao bi izgledati otprilike ovako:


Za one koji još biraju paralelna veza Dat ću spojnu tablicu.

I dijagram za ekrane opcije B:



Na jednu komunikacijsku liniju može se spojiti više senzora. Jedan je dovoljan za naše satove. Spojimo žicu od pina "DQ" ds18b20 na "pin 5" Arduino UNO.

Priprema ploče s gumbima.
Za postavljanje vremena i datuma na satu koristit ćemo tri gumba. Radi praktičnosti, lemimo tri gumba na tiskanoj ploči i uklanjamo žice.


Povezujemo se na sljedeći način: spajamo žicu zajedničku za sva tri gumba na "GND" Arduina. Prva tipka, koja se koristi za ulazak u mod podešavanja vremena i prebacivanje po vremenu i datumu, spojena je na “Pin 2”. Drugi, gumb za povećanje vrijednosti, je na "Pin 3", a treći, gumb za smanjenje vrijednosti, je na "Pin 4".

Sve skupa.
Izbjeći kratki spoj, ekran bi trebao biti izoliran. Omotamo ga u krug električnom trakom i dalje leđa Traku izolacijskog materijala pričvrstimo na dvostranu traku, izrezanu na veličinu. Debeli karton ili tanka plastika će učiniti. Koristio sam plastiku od tableta za papir. Rezultat je sljedeći:


Ispred ekrana, uz rub, lijepimo dvostranu pjenastu traku, po mogućnosti crnu.


Spojite zaslon na Arduino:


Plus od pretinac za baterije spojite na "VIN" Arduina, minus na "GND". Postavljamo ga iza Arduina. Prije nego što ga instalirate u kućište, ne zaboravite spojiti senzor temperature i ploču s gumbima.


Priprema i ispunjavanje skice.
Senzor temperature zahtijeva knjižnicu OneWire.

Izlaz na ekran provodi se kroz biblioteku U8glib:

Za uređivanje i popunjavanje skice morate instalirati ove dvije biblioteke. Postoje dva načina za to. Jednostavno raspakirajte ove arhive i smjestite raspakirane datoteke u mapu “libraries” koja se nalazi u instalacijskoj mapi Arduino IDE. Ili je druga opcija instalirati biblioteke izravno u programsko okruženje. Bez raspakiranja preuzetih arhiva, u Arduino IDE odaberite izbornik Skica - Poveži biblioteku. Na samom vrhu padajućeg popisa odaberite “Add.Zip library”. U dijaloškom okviru koji se pojavi odaberite biblioteku koju želite dodati. Ponovno otvorite izbornik Sketch – Connect Library. Na samom dnu padajućeg popisa trebali biste vidjeti novu biblioteku. Sada se biblioteka može koristiti u programima. Ne zaboravite ponovno pokrenuti Arduino IDE nakon svega ovoga.

Senzor temperature radi pomoću protokola One Wire i ima jedinstvenu adresu za svaki uređaj - 64-bitni kod. Nije praktično svaki put tražiti ovaj kod. Stoga prvo morate spojiti senzor na Arduino, učitati skicu koja se nalazi u izborniku File – Examples – Dallas Temperature – OneWireSearch. Zatim pokrenite Alati - Port Monitor. Arduino mora pronaći naš senzor, napisati njegovu adresu i trenutna očitanja temperature. Kopiramo ili jednostavno zapišemo adresu našeg senzora. Otvorite skicu Arduino_WG12864B_Term, potražite redak:

Byte addr=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97);//adresa mog senzora

Zapisujemo adresu vašeg senzora između vitičaste zagrade, zamjenjujući adresu mog senzora.

Zaliha:

//u8g.setPrintPos(44, 64); u8g.ispis(sek); // Ispis sekundi za kontrolu ispravnosti poteza

Služi za prikaz sekundi pored natpisa “Podaci”. Ovo je neophodno za precizna ugradnja protok vremena.
Ako je sat brz ili kasni, trebali biste promijeniti vrijednost u retku:

If (micros() - prevmicros >494000) ( // promijenite u nešto drugo da ispravite da je bilo 500000

Empirijski sam dosta točno odredio broj na kojem sat teče. Ako vam je sat brz, trebali biste povećati ovaj broj; ako kasni, smanjite ga. Da biste odredili točnost poteza, morate prikazati sekunde. Nakon precizne kalibracije broja, sekunde se mogu komentirati i tako ukloniti sa zaslona.

U ovom članku ćemo pogledati kako napraviti točan sat Temeljen na Arduinu ili AVR mikrokontrolerski čip sata stvarnog vremena DS1307. Vrijeme će biti prikazano na LCD zaslonu.

Što je potrebno

  • računalo s instaliranim Arduino IDE;
  • DS1307 čip ili RTC modul temeljen na njemu;
  • komponente s popisa elemenata.

Možete zamijeniti Arduino ploča na Atmel kontroler, ali provjerite ima li dovoljno ulaznih i izlaznih pinova i ima li hardversku implementaciju I2C sučelja. Koristim ATMega168A-PU. Ako ćete koristiti zasebni mikrokontroler, tada će vam trebati programator, na primjer, AVR MKII ISP.

Pretpostavlja se da je čitatelj upoznat s programiranjem, programiranjem u Arduino IDE i ima određeno znanje o programskom jeziku C. Oba programa u nastavku ne trebaju dodatna objašnjenja.

Uvod

Kako mikrokontroleri prate vrijeme i datum? Konvencionalni mikrokontroler ima funkciju mjerača vremena koja počinje od nule kada se priključi napon napajanja, a zatim počinje brojati. U Arduino svijetu, možemo koristiti millis() funkciju da saznamo koliko je milisekundi prošlo od kada je uključeno napajanje. Kada isključite i ponovno uključite napajanje, počet će brojati ispočetka. Ovo nije baš zgodno kada je u pitanju rad sa satovima i datumima.

Ovdje će korištenje RTC (Real Time Clock) čipa biti zgodno. Ovaj mikro krug s baterijom od 3 V ili nekim drugim izvorom napajanja prati vrijeme i datum. Sat/kalendar pruža informacije o sekundama, minutama, satima, danu u tjednu, datumu, mjesecu i godini. Čip radi ispravno s mjesecima koji traju 30/31 dan i s prijestupnim godinama. Komunikacija se odvija preko I2C sabirnice (I2C sabirnica se ne raspravlja u ovom članku).

Ako napon glavne tračnice napajanja Vcc padne ispod napona baterije Vbat, RTC se automatski prebacuje na mala potrošnja energije iz pomoćne baterije. Rezervna baterija- ovo je obično minijaturna baterija (u obliku "kovanice", "tablete") s naponom od 3 volta, spojena između pina 3 i kućišta. Na ovaj način, čip će i dalje pratiti vrijeme i datum, a kada se napaja glavni krug, mikrokontroler će dobiti trenutno vrijeme i datum.

U ovom projektu koristit ćemo DS1307. Za ovaj čip, pin 7 je SQW/OUT pin (izlaz pravokutnog vala). Ovu iglu možete koristiti za treptanje LED-a i upozoravanje mikrokontrolera da uhvati vrijeme. Oba ćemo učiniti. Ispod je objašnjenje rada SQW/OUT pina.

Kontrolni registar DS1307 služi za kontrolu rada SQW/OUT pina.

Bit 7: Kontrola izlaza (OUT) Ovaj bit kontrolira izlaznu razinu SQW/OUT pina kada je pravokutni izlaz isključen. Ako je SQWE = 0, logička razina na SQW/OUT pinu je 1 ako je OUT = 1 i 0 ako je OUT = 0. U početku, ovaj bit je obično 0. Bit 4: Omogućavanje kvadratnog vala (SQWE) Ovaj bit, kada je postavljen na logiku 1, omogućuje izlazni oscilator. Frekvencija pravokutnih impulsa ovisi o vrijednostima bitova RS0 i RS1. Kada je frekvencija pravokutnog vala postavljena na 1 Hz, registri sata se ažuriraju tijekom pada pravokutnog vala. U početku je ovaj bit obično 0. Bitovi 1 i 0: Odabir frekvencije (RS) Ovi bitovi kontroliraju frekvenciju izlaza pravokutnog vala kada je izlaz pravokutnog vala uključen. Sljedeća tablica navodi kvadratne frekvencije valova koje se mogu odabrati pomoću ovih bitova. Ovi bitovi obično su inicijalno postavljeni na 1.

Ova tablica pomoći će vam s učestalošću:

Odabir frekvencije kvadratnog vala DS1307
Frekvencija pulsaBit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
1 Hz0 0 0 1 0 0 0 0
4,096 kHz0 0 0 1 0 0 0 1
8,192 kHz0 0 0 1 0 0 1 0
32,768 kHz0 0 0 1 0 0 1 1

Ako ste spojili LED i otpornik na pin 7 i želite da LED trepće frekvencijom od 1 Hz, morate upisati vrijednost 0b00010000 u kontrolni registar. Ako želite impulse od 4,096 kHz, tada biste napisali 0b000100001. U tom slučaju, trebat će vam osciloskop da biste vidjeli pulseve, jer će LED treptati tako brzo da će se činiti da je stalno uključen. Koristit ćemo impulse frekvencije 1 Hz.

Hardver

Prikazano ispod strukturna shemašto nam treba.

Potrebni smo:

  • ISP konektor (u programiranju sustava, programiranje unutar kruga) za flashanje firmvera mikrokontrolera;
  • tipke za podešavanje vremena i datuma;
  • mikrokontroler za komunikaciju s RTC-om preko I2C sabirnice;
  • zaslon za prikaz datuma i vremena.

Shematski dijagram:


Popis elemenata

Ispod je snimak zaslona iz Eaglea:


Softver

U ovom vodiču koristit ćemo dvije različite skice: jednu koja upisuje vrijeme i datum u RTC i drugu koja čita vrijeme i datum iz RTC-a. Učinili smo to jer na ovaj način možete dobiti više puni prikaz o tome što se događa. Koristit ćemo istu shemu za oba programa.

Prvo ćemo upisati vrijeme i datum u RTC, što je slično postavljanju vremena na satu.

Koristimo dva gumba. Jedan za povećanje sati, minuta, datuma, mjeseca, godine i dana u tjednu, a drugi za odabir između njih. Aplikacija ne očitava stanja nijednog kritičnog senzora, pa ćemo koristiti prekide da provjerimo je li gumb pritisnut i da riješimo odbijanje kontakta.

Sljedeći kod postavlja vrijednosti i zapisuje ih u RTC:

#uključi // Definirajte LCD pinove #definirajte RS 9 #definirajte E 10 #definirajte D4 8 #definirajte D5 7 #definirajte D6 6 #definirajte D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Prekid 0 je pin 4 mikrokontrolera (Arduino digitalni pin 2) int btnSet = 0; // Prekid 1 je pin 5 mikrokontrolera (Arduino digitalni pin 3) int btnSel = 1; // Oznake prekida volatile int togBtnSet = false; volatile int togBtnSel = lažno; volatile int counterVal = 0; // Varijable za praćenje gdje smo u "izborniku" volatile int menuCounter = 0; // Niz promjenjivih vrijednosti int menuValues; // 0=sati, 1=minute, 2=dan u mjesecu, 3=mjesec, 4=godina, 5=dan u tjednu // Naslovi izbornika char* menuTitles = ( "Postavi sat.", "Postavi minute.", "Postavi datum.", "Postavi mjesec.", "Postavi godinu.", "Postavi dan (1=pon)." ); // Niz dana u tjednu char* days = ( "NA", "Mon", "Tue", "Wed", "Thu", "Fre", "Sat", "Sun" ); void setup() ( // Deklariranje prekida, izvršavanje funkcija increaseValue/nextItem // na rastućem rubu na btnXXX attachInterrupt(btnSet, increaseValue, RISING); attachInterrupt(btnSel, nextItem, RISING); Wire.begin(); lcd.begin ( 16,2); showWelcome(); ) // Funkcija prekida void increaseValue() ( // Varijable static unsigned long lastInterruptTime = 0; // Stvorite vremensku oznaku unsigned long interruptTime = millis(); // Ako je vremenska oznaka - lastInterruptTime veće od 200 if (interruptTime - lastInterruptTime > 200) ( togBtnSet = true; // Povećaj counterVal za 1 counterVal++; ) // Postavi lastInterruptTime jednako vremenskoj oznaci // tako da znamo da smo otišli dalje lastInterruptTime = interruptTime; ) / / Funkcija prekida za sljedeću stavku izbornika void nextItem() ( static unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis(); if (interruptTime - lastInterruptTime > 200) ( togBtnSel = true; // Povećaj brojač izbornika, pa idemo na sljedeću stavku izbornika menuCounter++ ; if (Brojač izbornika > 6) Brojač izbornika = 0; // Postavite counterVal u element polja brojača izbornika menuValues ​​​​= counterVal; // Reset counterVal, sada počinjemo od 0 za sljedeću stavku izbornika counterVal = 0; ) lastInterruptTime = vrijeme prekida; ) // Funkcija pretvorbe decimalni brojevi u BCD byte decToBCD(byte val) ( return ((val/10*16) + (val%10)); ) // Funkcija za provjeru jesu li pritisnute tipke izbornika // i ažuriranje naslova na zaslonu. void checkCurrentMenuItem() ( if (togBtnSel) ( togBtnSel = false; lcd.setCursor(0,0); lcd.print(menuTitles); ) ) // Funkcija za provjeru je li pritisnut gumb za povećanje, // i ažuriranje varijable u odgovarajućem element niza, // plus izlaz nove vrijednosti na zaslon. void checkAndUpdateValue() ( // Provjerite je li prekid pokrenut = gumb je pritisnut if (togBtnSet) ( // Ažuriranje vrijednosti elementa niza s counterVal menuValues ​​​​= counterVal; // Ponovno postavite oznaku prekida togBtnSet = false; lcd.setCursor(7,1); // Ispis nove vrijednosti lcd.print(menuValues); lcd.print(" "); ) ) // Kratka poruka dobrodošlice, sada znamo da je sve u redu void showWelcome() ( lcd.setCursor(2,0); lcd .print("Zdravo svijete."); lcd.setCursor(3,1); lcd.print("Ja sam živ."); delay(500); lcd.clear (); ) // Zapisivanje podataka u RTC void writeRTC() ( Wire.beginTransmission(0x68); Wire.write(0); // početna adresa Wire.write(0x00); // sekunde Wire.write(decToBCD(menuValues) )); // pretvaranje minuta u BCD kod i pisanje Wire.write(decToBCD(menuValues)); // pretvaranje sati u BCD kod i pisanje Wire.write(decToBCD(menuValues)); // pretvaranje dana tjedan u BCD kod i upišite Wire.write(decToBCD( menuValues)); // pretvorite dan u mjesecu u BCD kod i upišite Wire.write(decToBCD(menuValues)); // pretvaranje mjeseca u BCD kod i pisanje Wire.write(decToBCD(menuValues)); // pretvorite godinu u BCD kod i napišite Wire.write(0b00010000); // upaliti kvadratni impulsi 1 Hz na pinu 7 Wire.endTransmission(); // zatvori prijenos ) // Pokaži vrijeme // Da vidiš da RTC radi, moraš pogledati drugi program void showTime() ( lcd.setCursor(0,0); lcd.print(" "); lcd.print (menuValues); lcd.print(":"); // sati lcd.print(menuValues); lcd.print(":"); lcd.print("00 "); // minute lcd.setCursor(3, 1) ; lcd.print(days); lcd.print(" "); // dan u tjednu lcd.print(menuValues); lcd.print("."); // datum lcd.print(menuValues); lcd.print( "."); // mjesec lcd.print(menuValues); lcd.print(" "); // godina // poziv writeRTC funkcije writeRTC(); ) void loop() ( if (menuCounter< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Ovaj program počinje kratkom porukom dobrodošlice. Ova poruka nam govori da je napajanje uključeno, LCD radi i da je program pokrenut. Budući da skica služi samo da pokaže kako upisati podatke iz Arduina u RTC DS1307, nedostaje joj pomoćna funkcionalnost (provjera da li su vrijednosti unutar prihvatljivih raspona; petlja prilikom pritiska na tipku za povećanje vrijednosti, odnosno resetiranje na 0, kada vrijednost, na primjer, minuta prelazi 60, itd.)

// Uključujući datoteke zaglavlja #include #uključi // Definirajte LCD pinove #definirajte RS 9 #definirajte E 10 #definirajte D4 8 #definirajte D5 7 #definirajte D6 6 #definirajte D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Pin koji će primati impulse od RTC volatile int clockPin = 0; // Varijable vremena i datuma byte second; bajt minuta bajt sat; dan bajta; bajt datum; bajt mjesec; bajtova godina; // Niz dana u tjednu char* days = ( "NA", "Mon", "Tue", "Wed", "Thu", "Fre", "Sat", "Sun" ); // Funkcija koja se izvršava samo pri pokretanju void setup() ( pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); ) / / Kratka poruka dobrodošlice, sada znamo da je sve u redu void showWelcome() ( lcd.setCursor(2,0); lcd.print("Zdravo svijete."); lcd.setCursor(3,1); lcd.print( " Ja sam živ."); delay(500); lcd.clear(); ) byte bcdToDec(byte val) ( return ((val/16*10) + (val%16)); ) // Ovo se izvodi kontinuirano void loop() ( // Ako je clockPin visok if (digitalRead(clockPin)) ( // Pokrenite I2C prijenos na adresi 0x68 Wire.beginTransmission(0x68); // Počnite na adresi 0 Wire.write(0); / / Zatvori prijenos Wire.endTransmission(); // Počni čitati 7 binarnih podataka iz 0x68 Wire.requestFrom(0x68, 7); sekunda = bcdToDec(Wire.read()); minuta = bcdToDec(Wire.read()); sat = bcdToDec(Wire.read()); dan = bcdToDec(Wire.read()); datum = bcdToDec(Wire.read()); mjesec = bcdToDec(Wire.read()); godina = bcdToDec(Wire.read ( )); // Formatiranje i prikaz vremena lcd.setCursor(4,0); ako (sat< 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(":"); if (second < 10) lcd.print("0"); lcd.print(second); lcd.setCursor(2,1); // Форматирование и отображение даты lcd.print(days); lcd.print(" "); if (date < 10) lcd.print("0"); lcd.print(date); lcd.print("."); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("."); lcd.print(year); } }

Zaključak

U ovom smo članku pogledali DS1307 čip tvrtke Maxim Integrated i napisali dva demo programa: jedan za postavljanje vremena i datuma i jedan za očitavanje vremena i datuma. Za provjeru jesu li tipke pritisnute koristili smo se prekidima, koji su također eliminirali utjecaj odbijanja kontakta.

Foto i video

Postavljanje vremena

Vrijeme čitanja

Dakle, sat stvarnog vremena. Ova korisna stvarčica rješava većinu korisnih problema povezanih s vremenom. Recimo da kontrolirate zalijevanje u 5 sati ujutro na svojoj dači. Ili paljenje i gašenje svjetla određeni trenutak. Po datumu možete započeti grijanje u bilo kojoj kući. Stvar je dosta zanimljiva i korisna. A konkretnije? Pogledat ćemo DS1302 sat stvarnog vremena za popularnu Arduino platformu.

Iz ovog članka ćete naučiti:

Dobar dan, dragi čitatelji blokiraj kip-svijet! Kako si? Pišite u komentarima, zanima li vas robotika? Što vam znači ova tema?

Ne mogu prestati razmišljati o ovome ni na minutu. Sanjam i vidim kada ćemo konačno doći do točke u kojoj će si svatko moći priuštiti kupnju osobnog robota pomoćnika. Nije važno što radi, skuplja smeće, kosi travnjake, pere auto.

Mogu samo zamisliti kako složeni algoritmi moraju sadržavati u svojim “mozgovima”.

Uostalom, doći ćemo do toga da ćemo flashati softver na isti način kao na osobnim računalima. Također preuzmite aplikacijski programi. Šivati ​​ruke, noge, mijenjati kandže, manipulatore.

Pogledajte filmove "Ja robot", " Umjetna inteligencija“, „Ratovi zvijezda”.

Japanci već dugo provode svoj razvoj. Zašto smo gori?? Imamo jako malu popularnost. Znam nekoliko programera. Mogu ga nabrojati na prste. Radimo nešto drugo. Mi smo preprodavači. Samo kupujemo gotove setove, robote, igračke i svakakvo smeće.

Zašto ne razvijemo ovo:

Ili ovo:

Završio sam svoje misli naglas. Razgovarajmo o povezivanju DS1302 Timera za sat stvarnog vremena na Arduino.

Sat realnog vremena DS1302

Arduino kontroler nema vlastiti sat. Stoga, ako je potrebno, mora se nadopuniti posebnim mikro krugom DS1302.

Za napajanje ove ploče mogu koristiti vlastitu bateriju ili se napajati izravno s Arduino ploče.

Tablica s pinoutima:

Dijagram povezivanja s Arduino UNO:


Metoda programiranja Arduina za rad s DS1302

Neophodno je preuzeti valjanu biblioteku iz pouzdanih izvora.

Knjižnica vam omogućuje čitanje i pisanje parametara u stvarnom vremenu. U nastavku dajem kratak opis:

#uključi // Povežite biblioteku.
iarduino_RTC OBJEKT ( IME [, RST_OUTPUT [, CLK_OUTPUT [, DAT_OUTPUT ]]] ); // Kreirajte objekt.

Funkcija početi();// Inicijaliziranje rada RTC modula.

Funkcija Postavi vrijeme( SEK [, MIN [, SAT [, DAN [, MJESEC [, GODINA [, DAN]]]]]] ); // Postavljanje vremena.

Funkcija gettime([ CRTA ] ); // Pročitajte vrijeme.

funkcija vrijeme treptanja ( PARAMETAR [FREKVENCIJA] ); // Uzrokuje "treperenje" funkcije gettime navedeni parametar vrijeme.

funkcija razdoblje ( MINUTE ); // Označava minimalno razdoblje za pristup modulu u minutama.

Varijabilna sekundi// Vraća sekunde od 0 do 59.

Varijabilna minuta// Vraća minute od 0 do 59.

Varijabilna sati// Vraća sate od 1 do 12.

Varijabilna Sati// Vraća sate od 0 do 23.

Varijabilna podne// Vraća podne 0 ili 1 (0 ujutro, 13 sati).

Varijabilna dan// Vraća dan u mjesecu od 1 do 31.

Varijabilna radni dan// Vraća dan u tjednu od 0 do 6 (0 je nedjelja, 6 je subota).

Varijabilna mjesec// Vraća mjesec od 1 do 12.

Varijabilna godina// Vraća godinu od 0 do 99.

Pišemo jednostavan program. Postavljanje trenutnog vremena u RTC modulu (DS1302):

Arduino

#uključi iarduino_RTC vrijeme(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 sec, 51 min, 21 sat, 27. listopada 2015., utorak ) void loop())( if(millis()%1000==0)( // ako je prošla 1 sekunda Serial.println(time.gettime("d-m-Y, H:i: s, D")); // prikaz vremenske odgode (1); // pauza od 1 ms da se vrijeme ne prikazuje nekoliko puta u 1 ms ) )

#uključi

iarduino_RTCvrijeme(RTC_DS1302, 6, 7, 8);

void setup() (

kašnjenje (300);

Serijski. započeti (9600);

vrijeme. početi();

vrijeme. vrijeme postavljanja (0, 51, 21, 27, 10, 15, 2); // 0 sek, 51 min, 21 sat, 27. listopada 2015., utorak

void petlja() (

if (milis() % 1000 == 0 ) ( // ako je prošla 1 sekunda

Serijski. println (vrijeme . gettime ( "d-m-Y, H:i:s, D" ) ) ; // vrijeme prikaza

kašnjenje(1); // pauza od 1 ms da se vrijeme ne prikazuje nekoliko puta u 1 ms

Čitanje Trenutno vrijeme iz RTC modula (DS1302) i izlaz na "Serijski port":

#uključi iarduino_RTC vrijeme(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop())( if(millis()%1000==0)( // ako je prošla 1 sekunda Serial .println (time.gettime("d-m-Y, H:i:s, D")); // prikaz vremenske odgode (1); // pauza od 1 ms da se vrijeme ne prikazuje nekoliko puta u 1 ms ) )

Morao sam nekako napraviti nešto veće. Zidni sat s automatskim osvjetljenjem.

Ovi satovi su savršeni za velike prostorije, poput uredskog hodnika ili velikog stana.

Napraviti tako veliki zidni sat nije teško pomoću ovih uputa.


Za procjenu veličine sata možete pretpostaviti da će jedan segment sata biti veličine A4 papira, što će omogućiti jednostavno korištenje okvira za fotografije odgovarajuće veličine.

Korak 1. Komponente velikog zidnog sata.

Žice, lem, lemilo, LED traka Arduino Nano DC-DC pretvarač LM2596
4 metra LED trake WS2811 Svijetli senzor sat realnog vremena DS3231
mikroprekidači

Što sam koristio za ovaj projekt:

Korak 8. Programirajte sat.

Nakon malo petljanja uspio sam nabaviti sat koji je u potpunosti zadovoljio moje potrebe. Sigurna sam da možeš bolje od mene.

Kod je dobro komentiran i neće vam biti teško razumjeti ga; poruke za otklanjanje pogrešaka također su vrlo dobro komentirane.

Ako trebate promijeniti boju korištenog zidnog sata, trebate promijeniti varijablu u liniji 22 ( int ledColor = 0x0000FF; // Korištena boja (u hex)). Popis boja i njihove heksadecimalne kodove možete pronaći na stranici: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Ako imate problema sa preuzimanjem, upotrijebite zrcalo: http://bit.ly/1Qjtgg0

Moju konačnu skicu možete preuzeti.

Korak 9. Napravite brojeve pomoću polistirena.

Baza rezača Radno tijelo glodalice Opći obrazac rezač
Rezultat rezača

Svaki segment izrežite u šablonu ispisanu na početku.
Polistiren se može rezati oštrim nožem, što je prilično teško, ili jednostavnom napravom napravljenom od nikrom žice ili žice za gitaru i nekoliko komada OSB ploča.

Možete vidjeti kako sam to napravio na gornjim slikama.

Za napajanje rezača koristio sam napajanje od 12 V.

Kao rezultat rezanja, trebali biste dobiti četiri segmenta za veliki sat, od kojih je jedan prikazan na fotografiji.

Korak 10. Zalijepite brojeve i sve prekrijte difuzorom. Posljednji veliki zidni sat.

Sjaj tijekom dana Sjaj noću

Nakon što ste izrezali sva četiri broja i vrha zidnog sata, zalijepite ih zajedno na karton LED trake(Koristio sam dvostranu traku kako bih olakšao postupak)

Da raspršim teško LED svjetlo Koristio sam dva lista papira na polistirenskim brojevima. Radi praktičnosti i estetike koristio sam papir veličine A2 presavijen na pola.

Nakon dovršetka svih ovih koraka, stavio sam dobiveni sklop velikog zidnog sata u odgovarajući veliki okvir za fotografije.

Ovaj sat se pokazao vrlo impresivnim i privlačnim. Mislim da će tako veliki zidni sat savršeno ukrasiti mnoge prostorije.

U kontaktu s