Kuidas teha Arduinost kella. ds1302 reaalajas kella ühendamine Arduinoga

Üks esimesi projekte, mida algajad Arduino tahvli abil ehitavad, on lihtne kell, lugedes aega maha. Põhimõtteliselt põhinevad sellised kellad Arduinoga ühendatud RTC moodulil ( Reaalajas Kell või reaalajas kell). Täna turul elektroonilised osad saadaval erinevad mudelid RTC-d, mille täpsus ja hind on erinevad. Levinud mudelid on DS1302, DS1307, DS3231.



Kuid kella saab Arduino peal teha ka ilma kasutades RTC-d, eriti kui te ei saa selliseid mooduleid hankida. Täpsus muidugi on sel juhul jääb väikeseks, seega tuleks projekti käsitleda pigem koolitusprojektina.


Selliste kellade tööpõhimõte on üsna lihtne. Iga kord, kui lülitate selle Arduino kella sisse, peate selle seadistama praegusele kellaajale, nagu igale teisele analoogkell. Kindlasti on parem selliseid kellasid omas mitte kasutada Igapäevane elu kui nad on pikka aega aktiivsed ilma taaskäivituseta ja edasine kohandamine, kuna desünkroniseerimine praeguse ajaga võib pikaajalise töö ajal olla märkimisväärne.


Seda kella saab kokku panna tavalise kellaga leivalaud, kuna see ei vaja palju komponente. Meie peamine link siin on Arduino Uno tahvel. Aja kuvamiseks võite võtta 16x2 LCD-ekraani. Ajaseadete muutmiseks peate ühendama kaks nuppu (tundide ja minutite jaoks). Nupud on ühendatud Aduinoga 10KΩ takistite kaudu. Ekraani heleduse muutmiseks vajate 10 kOhm potentsiomeetrit. Allpool on toodud kõigi nende komponentide ühendusskeem Arduino Uno plaadiga.



Nüüd peate Arduino programmeerima. Allpool on toodud lihtne kood (visand), mis võimaldab LCD-ekraanil kellaaega kuvada.


#kaasa LiquidCrystal lcd(12,11,5,4,3,2); int h=12; int m; int s; int lipp; int TIME; const int hs=8; const int ms=9; sisemine olek1; sisemine olek2; void setup() ( lcd.begin(16,2); ) void loop() ( lcd.setCursor(0,0); s=s+1; lcd.print("TIME:"); lcd.print(h lcd.print(":");<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(lipp==24)lipp=0; viivitus(1000); lcd.clear(); if(s==60)(s=0; m=m+1; ) if(m==60) (m=0; h=h+1; lipp=lipp+1; ) if(h==13 ) ( h=1; ) lcd.setCursor(0,1); lcd.print("ILUSAT PÄEVA"); //-------Aeg // seadistus-------// olek1=digitalRead(hs); if(olek1==1) ( h=h+1; lipp=lipp+1; if(lipp<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(lipp==24)lipp=0; kui(h==13)h=1; ) olek2=digitalRead(ms); if(olek2==1)(s=0; m=m+1; ) )

   Täname, et tundsite huvi veebisaidi teabeprojekti vastu.
   Kui soovite huvitavat ja kasulikud materjalid ilmus sagedamini ja reklaami oli vähem,
   Saate meie projekti toetada, annetades selle arendamiseks mis tahes summa.

Tere pärastlõunast, täna jagan juhiseid toatermomeetriga kella tegemiseks( DIY Arduino kell). Kell jookseb edasi Arduino UNO, WG12864B graafilist ekraani kasutatakse aja ja temperatuuri kuvamiseks. Temperatuuriandurina - ds18b20. Erinevalt enamikust teistest kelladest ei kasuta ma RTS-i (Real Time Clock), vaid proovin ilma selle lisamoodulita hakkama saada.

Arduino ahelad eristuvad oma lihtsuse poolest ja igaüks võib alustada Arduino õppimist. Teekide ühendamise ja Arduino välklampide ühendamise kohta saate lugeda meie artiklist.

Alustame.

Selle kella loomiseks vajame:

Arduino UNO (või mõni muu Arduinoga ühilduv maksma)
- Graafiline ekraanWG12864B
- Temperatuuriandur ds18b20
- Takisti 4,7 Kom 0,25 W
- Takisti 100 oomi 0,25 W
- Patareipesa 4 AA patarei jaoks
- Sobiv kast
- Hea fail
- küünelakk (must või kehavärvi)
- Mõni õhuke plastik või papp
- Elektrilint
- Ühendusjuhtmed
- Trükkplaat
- Nupud
- Jootekolb
- Joote, kampol
- Kahepoolne teip

Graafilise ekraani ettevalmistamine.
Esmapilgul tekitab ekraani ühendamine palju probleeme ja raskusi. Kuid kui mõistate kõigepealt nende tüüpe, muutub see palju lihtsamaks ja selgemaks. Kontrolleril ks0107/ks0108 on palju erinevaid ja tüüpe ekraane. Kõik ekraanid jagunevad tavaliselt 4 tüüpi:
Valik A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Valik B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Kuvarid AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway S12864-88, Topway LDG1,428t LDG1,48t 12864L-2, 12864J-1
Valik C: Shenzhen Jinghua Displays Co Ltd. JM12864
Valik D: Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS191264/

Nimekiri pole täielik, neid on palju. Kõige tavalisem ja minu arvates mugavam on WG12864B3 V2.0. Ekraani saab ühendada Arduinoga läbi jada- või paralleelport. Arduino UNOga kasutamisel on parem valida ühendus läbi jadaport– siis vajame paralleelpordi kaudu ühendatud vähemalt 13 liini asemel ainult 3 mikrokontrolleri väljundit. Kõik ühendab üsna lihtsalt. Üks nüanss on veel: müügil on kaks kuvamisvõimalust, sisseehitatud potentsiomeetriga (kontrastsuse reguleerimiseks) ja ilma selleta. Ma valisin ja soovitan teil teha sama sisseehitatud seadmega.


See vähendab osade arvu ja jootmisaega. Taustavalgustuseks tasub paigaldada ka 100-oomine voolu piirav takisti. 5 volti otse ühendades on oht taustvalgustuse läbipõlemiseks.
WG12864B – Arduino UNO
1 (GND) – GND
2 (VCC) - +5 V
4 (RS) – 10
5 (R/W) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – läbi takisti - +5V
20 (BLK) – GND

Kõige mugavam on kõik ekraani taha kokku panna ja sealt välja tuua 5 Arduino UNO-ga ühendavat juhet. Lõpptulemus peaks välja nägema umbes selline:


Neile, kes ikka valivad paralleelühendus Toon ühendustabeli.

Ja valiku B ekraanide diagramm:



Ühele sideliinile saab ühendada mitu andurit. Meie kellade jaoks piisab ühest. Ühendame juhtme ds18b20 DQ tihvtist Arduino UNO kontaktiga 5.

Tahvli ettevalmistamine nuppudega.
Kella kellaaja ja kuupäeva määramiseks kasutame kolme nuppu. Mugavuse huvides jootme trükkplaadil kolm nuppu ja eemaldame juhtmed.


Ühendame järgmiselt: ühendame kõigi kolme nupu ühise juhtme Arduino GND-ga. Esimene nupp, mida kasutatakse kellaaja seadistusrežiimi sisenemiseks ning kellaaja ja kuupäeva järgi ümberlülitamiseks, on ühendatud nööpnõelaga 2. Teine, väärtuse suurendamise nupp, on "Pin 3" ja kolmas, väärtuse vähendamise nupp, on "Pin 4".

Kõike kokku panema.
Vältima lühis, ekraan peaks olema isoleeritud. Mähime selle elektrilindiga ringiks ja edasi tagasi Kahepoolsele lindile kinnitame isolatsioonimaterjali riba, mis on lõigatud mõõtu. Paks papp või õhuke plast sobib. Paberiks kasutasin tahvelarvutist plastikut. Tulemus on järgmine:


Ekraani ette, piki serva, liimime kahepoolse vahtteibi, eelistatavalt musta.


Ühendage ekraan Arduinoga:


Pluss alates patareipesaÜhendage Arduino VIN-koodiga, miinus GND-ga. Asetame selle Arduino taha. Enne korpusesse paigaldamist ärge unustage temperatuuriandurit ja plaati nuppudega ühendada.


Eskiisi ettevalmistamine ja täitmine.
Temperatuuriandur nõuab OneWire'i raamatukogu.

Ekraanile edastamine toimub U8glibi teegi kaudu:

Visandi redigeerimiseks ja täitmiseks peate installima need kaks teeki. Selleks on kaks võimalust. Pakkige need arhiivid lihtsalt lahti ja asetage lahtipakitud failid installikaustas asuvasse kausta "teegid" Arduino IDE. Või teine ​​võimalus on installida teegid otse programmeerimiskeskkonda. Allalaaditud arhiive lahti pakkimata valige Arduino IDE-s menüü Sketch - Connect Library. Valige ripploendi ülaosas "Add.Zip teek". Valige kuvatavas dialoogiboksis teek, mille soovite lisada. Avage uuesti menüü Sketch – Ühenda raamatukogu. Rippmenüü allosas peaksite nägema uut teeki. Nüüd saab raamatukogu programmides kasutada. Ärge unustage pärast kõike seda Arduino IDE-d taaskäivitada.

Temperatuuriandur töötab One Wire protokolli abil ja sellel on iga seadme jaoks kordumatu aadress – 64-bitine kood. Seda koodi pole otstarbekas iga kord otsida. Seetõttu tuleb esmalt ühendada andur Arduinoga, laadida üles menüüst File – Näited – Dallase temperatuur – OneWireSearch leitud eskiis. Järgmisena käivitage Tools - Port Monitor. Arduino peab leidma meie anduri, kirjutama selle aadressi ja hetke temperatuurinäidud. Kopeerime või kirjutame lihtsalt üles oma anduri aadressi. Avage visand Arduino_WG12864B_Term, otsige rida:

Baitiadr=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97);//minu anduri aadress

Kirjutame vahel üles Sinu anduri aadressi lokkis traksid, asendades minu anduri aadressi.

Laoseis:

//u8g.setPrintPos(44, 64); u8g.print(sek); // Väljund sekundid käigu õigsuse kontrollimiseks

Kasutatakse sekundite kuvamiseks pealdise „Andmed” kõrval. See on vajalik selleks täpne paigaldus aja kulgemine.
Kui kell on kiire või maha jäänud, tuleks rea väärtust muuta:

If (micros() - prevmicros >494000) ( // muutke parandamiseks midagi muud, see oli 500000

Määrasin empiiriliselt üsna täpselt numbri, mille juures kell töötab. Kui teie kell on kiire, peaksite seda numbrit suurendama, kui see on maha jäänud, vähendage seda. Liikumise täpsuse määramiseks peate kuvama sekundid. Pärast arvu täpset kalibreerimist saab sekundeid kommenteerida ja seeläbi ekraanilt eemaldada.

Selles artiklis vaatleme, kuidas täpset kella sisse lülitada Arduino baasil või AVR mikrokontrolleri reaalajas kella kiip DS1307. Kellaaeg kuvatakse LCD-ekraanil.

Mis on vajalik

  • arvuti, kuhu on installitud Arduino IDE;
  • DS1307 kiip või sellel põhinev RTC-moodul;
  • komponendid elementide loendist.

Saate asendada Arduino plaat Atmeli kontrollerile, kuid veenduge, et sellel oleks piisavalt sisend- ja väljundviigusid ning I2C-liidese riistvararakendus. Ma kasutan ATMega168A-PU. Kui kasutate eraldi mikrokontrollerit, vajate programmeerijat, näiteks AVR MKII ISP.

Eeldatakse, et lugeja tunneb leivalauda, ​​programmeerimist Arduino IDE-s ja tunneb veidi C programmeerimiskeelt. Mõlemad alltoodud programmid ei vaja täiendavat selgitust.

Sissejuhatus

Kuidas jälgivad mikrokontrollerid kellaaega ja kuupäeva? Tavalisel mikrokontrolleril on taimeri funktsioon, mis alustab toitepinge rakendamisel nullist ja hakkab seejärel loendama. Arduino maailmas saame kasutada millis() funktsiooni, et teada saada, mitu millisekundit on toiteallika käivitamisest möödunud. Toite eemaldamisel ja uuesti kasutuselevõtmisel hakkab see loendama algusest peale. See pole eriti mugav kellade ja kuupäevadega töötamisel.

Siin on mugav kasutada RTC (Real Time Clock) kiipi. See 3V aku või mõne muu toiteallikaga mikroskeem jälgib kellaaega ja kuupäeva. Kell/kalender annab teavet sekundite, minutite, tundide, nädalapäeva, kuupäeva, kuu ja aasta kohta. Kiip töötab korrektselt kuude pikkusega 30/31 päeva ja liigaaastatega. Side toimub I2C siini kaudu (I2C siini selles artiklis ei käsitleta).

Kui põhitoiteliini pinge Vcc langeb alla aku pinge Vbat, lülitub RTC automaatselt madal energiatarve varuakust. Varu aku- see on tavaliselt 3-voldise pingega miniaku ("mündi", "tahvelarvuti" kujul), mis on ühendatud kontakti 3 ja korpuse vahele. Nii hoiab kiip endiselt kellaaega ja kuupäeva ning kui peavooluahelale toide on, saab mikrokontroller kätte praeguse kellaaja ja kuupäeva.

Selles projektis kasutame DS1307. Selle kiibi jaoks on tihvt 7 SQW/OUT kontakt (ruutlaine väljund). Saate seda tihvti kasutada LED-tule vilkumiseks ja mikrokontrolleri hoiatamiseks, et aeg jäädvustada. Teeme mõlemat. Allpool on selgitus SQW/OUT kontakti töö kohta.

Juhtregistrit DS1307 kasutatakse SQW/OUT kontakti töö juhtimiseks.

Bit 7: Väljundi juhtimine (OUT) See bitt juhib SQW/OUT kontakti väljundtaset, kui ruutlaine väljund on välja lülitatud. Kui SQWE = 0, loogika tase SQW/OUT kontaktil on 1, kui OUT = 1 ja 0, kui OUT = 0. Algselt on see bitt tavaliselt 0. Bit 4: Square Wave Enable (SQWE) See bitt, kui see on seatud loogikale 1, lubab väljundostsillaatori. Ruutlaine impulsside sagedus sõltub RS0 ja RS1 bittide väärtustest. Kui ruutlaine sagedus on seatud 1 Hz, uuendatakse kella registreid ruutlaine langemise ajal. Esialgu on see bit tavaliselt seatud väärtusele 0. Bitid 1 ja 0: sageduse valimine (RS) Need bitid juhivad ruutlaine väljundi sagedust, kui ruutlaine väljund on sisse lülitatud. Järgmises tabelis on loetletud ruutlaine sagedused, mida saab nende bittide abil valida. Need bitid on tavaliselt algselt seatud väärtusele 1.

See tabel aitab teid sagedusega:

DS1307 ruutlaine sageduse valik
PulsisagedusBitt 7Bitt 6Bitt 5Bitt 4Bitt 3Bitt 2Bitt 1Bitt 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

Kui ühendate LED-i ja takisti viiguga 7 ja soovite, et LED-tuli vilkuks sagedusega 1 Hz, peate juhtregistrisse kirjutama väärtuse 0b00010000. Kui soovite 4,096 kHz impulsse, siis kirjutaksite 0b000100001. Sel juhul vajate impulsside nägemiseks ostsilloskoopi, kuna LED-tuli vilgub nii kiiresti, et näib, et see põleb pidevalt. Kasutame impulsse sagedusega 1 Hz.

Riistvara

Näidatud allpool struktuurne skeem mida me vajame.

Meid on vaja:

  • ISP pistik (In System Programming, in-circuit programming) mikrokontrolleri püsivara vilkumiseks;
  • nupud kellaaja ja kuupäeva seadmiseks;
  • mikrokontroller suhtlemiseks RTC-ga I2C siini kaudu;
  • ekraan kuupäeva ja kellaaja kuvamiseks.

Skemaatiline diagramm:


Elementide loend

Allpool on Eagle'i ekraanipilt:


Tarkvara

Selles õpetuses kasutame kahte erinevat visandit: ühte, mis kirjutab kellaaja ja kuupäeva RTC-sse, ja teist, mis loeb kellaaega ja kuupäeva RTC-st. Tegime seda, sest nii saate rohkem täisvaade selle kohta, mis toimub. Kasutame mõlema programmi jaoks sama skeemi.

Kõigepealt kirjutame kellaaja ja kuupäeva RTC-sse, mis sarnaneb kella aja seadistamisega.

Kasutame kahte nuppu. Üks tundide, minutite, kuupäeva, kuu, aasta ja nädalapäeva suurendamiseks ning teine ​​nende vahel valimiseks. Rakendus ei loe ühegi kriitilise anduri olekuid, seega kasutame katkestusi nupuvajutuse kontrollimiseks ja kontakti põrke käsitlemiseks.

Järgmine kood määrab väärtused ja kirjutab need RTC-sse:

#kaasa // Define LCD kontaktid #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Katkestus 0 on mikrokontrolleri viik 4 (Arduino digitaalne viik 2) int btnSet = 0; // Katkestus 1 on mikrokontrolleri viik 5 (Arduino digitaalne viik 3) int btnSel = 1; // Katkestuste lipud volatile int togBtnSet = false; volatile int togBtnSel = vale; lenduv int counterVal = 0; // Muutujad, et jälgida, kus "menüüs" me kõikuvad int menuCounter = 0; // Lenduvate väärtuste massiiv in menuValues; // 0=tunnid, 1=minutid, 2=kuu päev, 3=kuu, 4=aasta, 5=nädalapäev // Menüüpealkirjad char* menuTitles = ( "Määra tund.", "Määra minut.", "Määra kuupäev. ", "Määra kuu. ", "Määra aasta. ", "Määra päev (1=esmaspäev)."; // Nädalapäevade massiiv char* days = ( "NA", "esmaspäev", "teispäev", "kolm", "neljapäev", "vab", "laup", "p" ); void setup() ( // Katkestuste deklareerimine, funktsioonide täitmine suurendadaValue/nextItem // btnXXX tõusval serval attachInterrupt(btnSet, expandValue, RISING); attachInterrupt(btnSel, nextItem, RISING); Wire.begin(); lcd.begin ( 16,2 showWelcome( ) // Katkestusfunktsioon void growthValue() ( // Muutujad staatilised märgita long lastInterruptTime = 0; // Ajatempli loomine unsigned long interruptTime = millis(); // Kui ajatempel on suurem kui lastInterruptTime, kui 200 if (interruptTime - lastInterruptTime > 200) ( togBtnSet = true; // Suurenda counterVal 1 võrra counterVal++; ) // Seadke lastInterruptTime ajatemplile // et teaksime, et oleme läinud kaugemale lastInterruptTime) = interruptTime funktsioon järgmise menüüelemendi jaoks void nextItem() ( staatiline märgita long lastInterruptTime = 0; signed long interruptTime = millis(); if (interruptTime - lastInterruptTime > 200) ( togBtnSel = true; // Suurendame menüüloendurit, nii et läheme juurde järgmine menüüelement menuCounter++ ; if (menuLoendur > 6) menuLoendur = 0; // Asetage counterVal menüü loenduri massiivi elementiValues ​​​​= counterVal; // Nulli loendurVal, nüüd alustame järgmise menüüelemendi puhul 0-st counterVal = 0; ) lastInterruptTime = katkestusaeg; ) // Teisendusfunktsioon kümnendarvud to BCD byte decToBCD(byte val) ( return ((val/10*16) + (val%10)); ) // Funktsioon, mis kontrollib, kas menüünuppe on vajutatud, // ja värskendab pealkirja ekraanil. void checkCurrentMenuItem() ( if (togBtnSel) ( togBtnSel = false; lcd.setCursor(0,0); lcd.print(menuTitles); ) ) // Funktsioon, mis kontrollib, kas suurendamisnuppu vajutati, // ja muutuja värskendamine sobivas kohas massiivi element, // pluss uue väärtuse väljund kuvale. void checkAndUpdateValue() ( // Kontrollige, kas katkestus on käivitatud = nuppu vajutatakse if (togBtnSet) ( // Värskendage massiivi elemendi väärtust käsuga counterVal menuValues ​​​​= counterVal; // Katkestuse lipu lähtestamine togBtnSet = false; lcd.setCursor(7,1) // Uue väärtuse trükkimine lcd.print(" " // Lühike tervitussõnum, nüüd teame, et kõik on korras void showWelcome() ( lcd. setCursor(2,0); lcd .print("Tere maailm.") lcd.setCursor("olen elus."); ; ) // Kirjuta andmed RTC-sse void writeRTC() ( Wire.beginTransmission(0x68); Wire.write(0); // algusaadress Wire.write(0x00); // sekundit Wire.write(decToBCD(menuValues)) // teisendab minutid BCD-koodiks ja kirjuta Wire.write(decToBCD(menuValues) // teisendab tunnid BCD-koodiks ja kirjuta Wire.write(decToBCD(menuValues)); BCD kood ja kirjuta Wire.write(decToBCD( menuValues) // teisenda kuu päev BCD koodiks ja kirjuta Wire.write(decToBCD(menuValues)); // teisenda kuu BCD koodiks ja kirjuta Wire.write(decToBCD(menuValues)); // teisendage aasta BCD koodiks ja kirjutage Wire.write(0b00010000); // lülita sisse ruudu impulsid 1 Hz viigul 7 Wire.endTransmission(); // sulgege ülekanne ) // Näita aega // Et näha, kas RTC töötab, peate vaatama mõnda teist programmi void showTime() ( lcd.setCursor(0,0); lcd.print(" "); lcd.print (menuValues ​​lcd.print(":") // hours lcd.print(":" // minutes lcd.setCursor(days); lcd.print(" "); // funktsiooni writeRTC kutsumine writeRTC() ( if (menuCounter)< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

See programm algab lühikese tervitussõnumiga. See teade annab meile teada, et toide on sisse lülitatud, LCD-ekraan töötab ja programm on käivitunud. Kuna sketš on mõeldud ainult selleks, et näidata, kuidas Arduinost RTC DS1307-sse andmeid kirjutada, puudub sellel abifunktsioon (kontrollimine, kas väärtused jäävad vastuvõetavatesse vahemikesse; nupu vajutamisel silmus, et väärtust suurendada, st lähtestada 0-le, kui väärtus näiteks minutid ületab 60 jne)

// Kaasa arvatud päisefailid #include #kaasa // Define LCD kontaktid #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Pin, mis võtab vastu impulsse RTC volatile int clockPin = 0; // Kellaaja ja kuupäeva muutujad bait sekund; baidi minut baittund; baidipäev; baidi kuupäev; baiti kuu; baidi aasta; // Nädalapäevade massiiv char* days = ( "NA", "esmaspäev", "teispäev", "kolm", "neljapäev", "vab", "laup", "p" ); // Funktsioon, mis käivitatakse ainult käivitamisel void setup() ( pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); ) / / Lühike tervitussõnum, nüüd teame, et kõik on korras void showWelcome() ( lcd.setCursor(2,0); lcd.print("Tere maailm."); lcd.setCursor(3,1); lcd.print( "Ma olen elus."); delay(500); lcd.clear(); bait bcdToDec(bait val) ( return ((val/16*10) + (val%16)); ) // See käivitatakse pidevalt void loop() ( // Kui clockPin on kõrge if (digitalRead(clockPin)) ( // Käivitage I2C edastamine aadressil 0x68 Wire.beginTransmission(0x68); // Alusta aadressilt 0 Wire.write(0); // Close transfer Wire.endTransmission( // 7 binaarsete andmete lugemist alates 0x68 Wire.requestFrom(0x68, 7 second = bcdToDec(Wire.read())); (Wire.read() päev = bcdToDec(Wire.read())); // Vormindamine ja kuvamise aeg lcd.setCursor(4,0); kui (tund< 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); } }

Järeldus

Selles artiklis vaatlesime Maxim Integratedi kiipi DS1307 ja kirjutasime kaks demoprogrammi: ühe kellaaja ja kuupäeva määramiseks ning teise kellaaja ja kuupäeva lugemiseks. Nuppude vajutamise kontrollimiseks kasutasime katkestusi, mis välistasid ka kontakti põrkumise mõju.

Foto ja video

Kellaaja määramine

Aja lugemine

Niisiis, reaalajas kell. See kasulik väike asi lahendab enamiku kasulikke ajaga seotud probleeme. Oletame, et kontrollite oma suvilas kastmist kell 5 hommikul. Või tulede sisse-välja lülitamine teatud hetk. Kuupäeva järgi saate kütma hakata igas majas. Asi on päris huvitav ja kasulik. Ja täpsemalt? Vaatame populaarse Arduino platvormi reaalajas kella DS1302.

Sellest artiklist saate teada:

Head päeva, kallid lugejad blokeeri kip-maailm! Kuidas sul läheb? Kirjuta kommentaaridesse, kas oled robootikast huvitatud? Mida see teema sinu jaoks tähendab?

Ma ei suuda hetkekski lõpetada sellele mõtlemist. Unistan ja näen, millal jõuame lõpuks selleni, et igaüks saab endale lubada endale isikliku robot-assistendi soetada. Pole tähtis, mida ta teeb, korjab prügi, niidab muru, peseb autot.

Ma kujutan ette, kuidas keerulised algoritmid need peavad sisalduma oma "ajus".

Jõuame ju selleni, et vilgutame tarkvara samamoodi nagu personaalarvutites. Samuti laadige alla rakendusprogrammid. Õmble käed, jalad, vaheta küünised, manipulaatorid.

Vaadake filme "I Robot", " Tehisintellekt", "Tähtede sõda".

Jaapanlased on oma arendusi ellu viinud juba pikka aega. Miks me halvemad oleme?? Meil on väga vähe populaarsust. Ma tean vähe arendajaid. Ma võin seda oma sõrmedel üles lugeda. Me teeme midagi muud. Oleme edasimüüjad. Ostame lihtsalt valmis komplekte, roboteid, mänguasju ja igasugust prügi.

Miks me ei arenda seda:

Või see:

Lõpetasin oma mõtted valjusti. Räägime DS1302 reaalajas kella taimeri ühendamisest Arduinoga.

Reaalajas kell DS1302

Arduino kontrolleril pole oma kella. Seetõttu tuleb seda vajadusel täiendada spetsiaalse DS1302 mikroskeemiga.

Toiteallikaks võivad need plaadid kasutada oma akut või saada toite otse Arduino plaadilt.

Pinout tabel:

Ühendusskeem Arduino UNO-ga:


Meetod Arduino programmeerimiseks töötama DS1302-ga

Kehtiv raamatukogu tuleb usaldusväärsetest allikatest alla laadida.

Teek võimaldab lugeda ja kirjutada reaalajas parameetreid. Annan allpool lühikese kirjelduse:

#kaasa // Ühendage raamatukogu.
iarduino_RTC OBJEKT ( NIMI [, RST_OUTPUT [, CLK_OUTPUT [, DAT_OUTPUT]]] ); // Objekti loomine.

Funktsioon alustada();// Initsialiseerige RTC mooduli töö.

Funktsioon määra aeg( SEK [, MIN [, TUND [, PÄEV [, KUU [, AASTA [, PÄEV]]]]]] ); // Kellaaja määramine.

Funktsioon saada aeg ([ LINE ] ); // Lugege kellaaega.

funktsiooni blinktime( PARAMEETER [ SAGEDUS ] ); // paneb funktsiooni gettime "vilguma" määratud parameeter aega.

funktsiooni periood( MINUTID ); // Näitab moodulile juurdepääsu minimaalset perioodi minutites.

Muutuv sekundit// Tagastab sekundid vahemikus 0 kuni 59.

Muutuv minutit// Tagastab minutid 0 kuni 59.

Muutuv tundi// Tagastab tunnid 1.–12.

Muutuv Tundi// Tagastab tunnid vahemikus 0 kuni 23.

Muutuv keskpäev// Tagastab keskpäeval 0 või 1 (0-am, 1-pm).

Muutuv päeval// Tagastab kuu päeva vahemikus 1 kuni 31.

Muutuv argipäev// Tagastab nädalapäeva 0 kuni 6 (0 on pühapäev, 6 on laupäev).

Muutuv kuu// Tagastab kuu vahemikus 1 kuni 12.

Muutuv aastal// Tagastab aastaarvu vahemikus 0 kuni 99.

Me kirjutame lihtne programm. Praeguse kellaaja seadistamine RTC-moodulis (DS1302):

Arduino

#kaasa iarduino_RTC aeg(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 sek, 51 min, 21 tundi, 27. oktoober 2015, teisipäev ) void loop())( if(millis()%1000==0)( // kui 1 sekund on möödunud Serial.println(time.gettime("d-m-Y, H:i: s, D")); // viivituse kuvamine (1); // paus 1 ms, et mitte kuvada aega mitu korda 1 ms jooksul ) )

#kaasa

iarduino_RTCtime(RTC_DS1302, 6, 7, 8);

void setup() (

viivitus(300);

Sari. begin(9600);

aega. alustada();

aega. settime(0, 51, 21, 27, 10, 15, 2); // 0 sek, 51 min, 21 tundi, 27. oktoober 2015, teisipäev

void loop() (

if (millis() % 1000 == 0 ) ( // kui 1 sekund on möödas

Sari. println (aeg . gettime ( "d-m-Y, H:i:s, D" ) ); // kuvamise aeg

viivitus(1); // pausi 1 ms, et mitte kuvada aega mitu korda 1 ms jooksul

Lugemine praegune aeg RTC moodulist (DS1302) ja väljund "jadaporti":

#kaasa iarduino_RTC aeg(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop())( if(millis()%1000==0)( // kui 1 sekund on möödas Serial .println (time.gettime("d-m-Y, H:i:s, D") // kuvab viivituse (1) // paus 1 ms, et mitte näidata aega mitu korda 1 ms jooksul; )

Mul oli vaja midagi suuremat teha. Seinakell automaatse heledusega.

Need kellad sobivad suurepäraselt suurtesse ruumidesse, näiteks kontori esikusse või suurde korterisse.

Sellise suure seinakella valmistamine pole neid juhiseid kasutades kuigi keeruline.


Kella suuruse hindamiseks võib eeldada, et kella üks segment on A4 formaadis paberit, mis teeb sobiva suurusega pildiraamide kasutamise lihtsaks.

1. samm. Suure seinakella komponendid.

Juhtmed, joodis, jootekolb, LED riba Arduino nano DC-DC muundur LM2596
4 meetrit LED-riba WS2811 valgusandur reaalajas kell DS3231
mikrolülitid

Mida ma selle projekti jaoks kasutasin:

Samm 8. Programmeerige kell.

Pärast mõningast askeldamist õnnestus mul hankida kell, mis rahuldas minu vajadused täielikult. Olen kindel, et saad paremini kui mina.

Kood on hästi kommenteeritud ja sellest pole raske aru saada, ka silumissõnumid on väga hästi kommenteeritud.

Kui teil on vaja muuta kasutatavat seinakella värvi, peate muutma muutujat real 22 ( int ledColor = 0x0000FF; // Kasutatud värv (kuuskuus)). Värvide ja nende kuueteistkümnendkoodide loendi leiate lehelt: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Kui teil on allalaadimisega probleeme, kasutage peeglit: http://bit.ly/1Qjtgg0

Minu lõpliku visandi saab alla laadida.

Samm 9. Tehke polüstüreeni abil numbrid.

Lõikuri alus Lõikuri töökorpus Üldine vorm lõikur
Lõikuri tulemus

Lõika iga segment alguses trükitud malliks.
Polüstüreeni saab lõigata terava noaga, mis on üsna raske, või lihtsa seadmega, mis on valmistatud nikroomtraadist või kitarrikonnist ja mitmest OSB-plaadist.

Näete ülaltoodud piltidelt, kuidas ma seda tegin.

Lõikuri toiteks kasutasin 12V toiteallikat.

Lõikamise tulemusena peaksite saama neli segmenti suur kell, millest üks on fotol näidatud.

Samm 10. Liimige numbrid ja katke kõik difuusoriga. Viimane suur seinakell.

Sära päeva jooksul Öösel särama

Pärast seinakella kõigi nelja numbri ja punkti välja lõikamist liimige need kõik koos papile LED ribad(Protsessi hõlbustamiseks kasutasin kahepoolset teipi)

Raske hajutamiseks led valgus Kasutasin polüstüreennumbrite peal kahte paberilehte. Mugavuse ja esteetika huvides kasutasin pooleks volditud A2 formaadis paberit.

Pärast kõigi nende toimingute tegemist asetasin saadud suure seinakella koostu sobivasse suurde pildiraami.

See kell osutus väga muljetavaldavaks ja pilkupüüdvaks. Arvan, et nii suur seinakell kaunistab suurepäraselt paljusid tube.

Kokkupuutel