Kuinka tehdä kello Arduinosta. ds1302-reaaliaikakellon yhdistäminen Arduinoon

Yksi ensimmäisistä projekteista, joita aloittelijat rakentavat Arduino-levyllä, on yksinkertainen kello, laskee aikaa. Pohjimmiltaan tällaiset kellot perustuvat Arduinoon kytkettyyn RTC-moduuliin ( Reaaliaika Kello tai reaaliaikainen kello). Markkinoilla tänään elektroniset komponentit saatavilla eri malleja RTC:t, joiden tarkkuus ja hinta vaihtelevat. Yleisiä malleja ovat DS1302, DS1307, DS3231.



Mutta kellon voi tehdä Arduinossa ilmankin käyttämällä RTC:tä, varsinkin jos et saa tällaisia ​​moduuleja. Tietysti tarkkuus on tässä tapauksessa tulee olemaan pieni, joten hanketta tulee pitää pikemminkin koulutusprojektina.


Tällaisten kellojen toimintaperiaate on melko yksinkertainen. Joka kerta kun kytket tämän Arduino-kellon päälle, sinun on asetettava se nykyiseen aikaan, kuten mikä tahansa analoginen kello. On varmasti parempi olla käyttämättä tällaisia ​​kelloja Jokapäiväinen elämä kun ne ovat aktiivisia pitkän aikaa ilman uudelleenkäynnistystä ja lisäräätälöintiä, koska epäsynkronointi nykyisen ajan kanssa voi olla merkittävää pitkän aikavälin käytön aikana.


Tämä kello voidaan koota tavallisella kellolla leipälauta, koska se ei vaadi monia komponentteja. Päälinkkimme täällä on Arduino Uno -levy. Voit näyttää ajan ottamalla 16x2 LCD-näytön. Voit muuttaa aika-asetuksia yhdistämällä kaksi painiketta (tunnit ja minuutit). Painikkeet on kytketty Aduinoon 10KΩ vastusten kautta. Näytön kirkkauden muuttamiseksi tarvitset 10 kOhm potentiometrin. Kaikkien näiden komponenttien kytkentäkaavio Arduino Uno -korttiin on esitetty alla.



Nyt sinun täytyy ohjelmoida Arduino. Alla on yksinkertainen koodi (luonnos), jonka avulla voit näyttää ajan LCD-näytöllä.


#sisältää Liquid Crystal lcd(12,11,5,4,3,2); int h = 12; int m; int s; int lippu; int TIME; const int hs=8; const int ms=9; int state1; int state2; 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(lippu==24)lippu=0; viive (1000); lcd.clear(); jos(s==60)(s=0; m=m+1; ) jos(m==60) (m=0; h=h+1; lippu=lippu+1; ) jos(h==13) ) ( h=1; ) lcd.setCursor(0,1); lcd.print("HYVÄÄ PÄIVÄÄ"); //-------Aika // asetus-------// tila1=digitalRead(hs); if(tila1==1) ( h=h+1; lippu=lippu+1; if(lippu<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(lippu==24)lippu=0; jos(h==13)h=1; ) tila2=digitalRead(ms); jos(tila2==1)(s=0; m=m+1; ) )

   Kiitos mielenkiinnostasi verkkosivuston tietoprojektia kohtaan.
   Jos haluat kiinnostavan ja hyödyllisiä materiaaleja ilmestyi useammin ja mainoksia oli vähemmän,
   Voit tukea projektiamme lahjoittamalla minkä tahansa summan sen kehittämiseen.

Hyvää iltapäivää, tänään jaan ohjeet kellon tekemiseen huonelämpömittarilla( DIY Arduino kello). Kello käy Arduino UNO, WG12864B-graafista näyttöä käytetään ajan ja lämpötilan näyttämiseen. Lämpötila-anturina - ds18b20. Toisin kuin useimmat muut kellot, en käytä RTS:ää (Real Time Clock), mutta yritän tulla ilman tätä lisämoduulia.

Arduino-piirit erottuvat yksinkertaisuudestaan, ja kuka tahansa voi aloittaa Arduinon oppimisen. Voit lukea artikkelistamme kuinka yhdistää kirjastoja ja flash-Arduino.

Aloitetaan.

Tämän kellon luomiseksi tarvitsemme:

Arduino UNO (tai mikä tahansa muu Arduino yhteensopiva maksaa)
- Graafinen näyttöWG12864B
- Lämpötila-anturi ds18b20
- Vastus 4,7 Kom 0,25 W
- Vastus 100 ohm 0,25 W
- Paristokotelo 4 AA-paristolle
- Vastaava laatikko
- Hieno tiedosto
- Kynsilakka (musta tai vartalonvärinen)
- Ohut muovia tai pahvia
- Sähköteippi
- Liitäntäjohdot
- Piirilevy
- Painikkeet
- Juotosrauta
- Juotos, hartsi
- Kaksipuolinen teippi

Graafisen näytön valmistelu.
Ensi silmäyksellä näytön yhdistäminen aiheuttaa monia ongelmia ja vaikeuksia. Mutta jos ymmärrät ensin niiden tyypit, siitä tulee paljon helpompaa ja selkeämpää. ks0107/ks0108-ohjaimessa on monia erilaisia ​​ja erityyppisiä näyttöjä. Kaikki näytöt on yleensä jaettu 4 tyyppiin:
Vaihtoehto A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Vaihtoehto B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ-näytöt AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway S12864-88, Topway LDW1,48t 12864L-2, 12864J-1
Vaihtoehto C: Shenzhen Jinghua Displays Co Ltd. JM12864
Vaihtoehto D: Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS191262/

Lista ei ole täydellinen, niitä on paljon. Yleisin ja mielestäni kätevin on WG12864B3 V2.0. Näyttö voidaan yhdistää Arduinoon sarja- tai kautta rinnakkaisportti. Käytettäessä Arduino UNO:n kanssa on parempi valita liitäntä kautta sarjaportti– silloin tarvitsemme vain 3 mikrokontrollerilähtöä vähintään 13 linjan sijasta, kun ne on kytketty rinnakkaisportin kautta. Kaikki liittyy hyvin yksinkertaisesti. On vielä yksi vivahde: ​​myynnissä on kaksi näyttövaihtoehtoa, sisäänrakennetulla potentiometrillä (kontrastin säätämiseksi) ja ilman sitä. Valitsin, ja suosittelen sinua tekemään samoin, sisäänrakennetun laitteen kanssa.


Tämä vähentää osien määrää ja juotosaikaa. Myös taustavaloon kannattaa asentaa 100 ohmin virtarajoitusvastus. Kytkemällä 5 volttia suoraan, on olemassa vaara, että taustavalo palaa.
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) - vastuksen läpi - +5V
20 (BLK) – GND

Kätevin tapa on koota kaikki näytön taakse ja tuoda siitä ulos 5 johtoa, jotka yhdistävät Arduino UNO:han. Lopputuloksen pitäisi näyttää suunnilleen tältä:


Niille, jotka vielä valitsevat rinnakkaisliitäntä Tarjoan kytkentätaulukon.

Ja kaavio vaihtoehdon B näytöille:



Yhteen tietoliikennelinjaan voidaan kytkeä useita antureita. Yksi riittää kelloihimme. Yhdistämme johdon ds18b20:n "DQ"-nastasta Arduino UNO:n "nastaan ​​5".

Taulun valmistelu painikkeilla.
Kellon ajan ja päivämäärän asettamiseen käytämme kolmea painiketta. Mukavuuden vuoksi juotamme kolme painiketta piirilevylle ja poistamme johdot.


Yhdistämme seuraavasti: yhdistämme kaikille kolmelle painikkeelle yhteisen johdon Arduinon "GND":hen. Ensimmäinen painike, jolla siirrytään ajan asetustilaan ja vaihdetaan kellonajan ja päivämäärän mukaan, on kytketty "Pin 2" -liitäntään. Toinen, arvoa lisäävä painike, on "Pin 3", ja kolmas, painike arvon pienentämiseksi, on "Pin 4".

Laittamalla kaikki yhteen.
Välttää oikosulku, näytön tulee olla eristetty. Käärimme sen ympyrään sähköteipillä ja eteenpäin takaisin Kiinnitämme eristysmateriaalin nauhan kaksipuoliseen teippiin, leikataan mittojen mukaan. Paksu pahvi tai ohut muovi käy. Käytin paperia tabletista muovia. Tulos on seuraava:


Näytön eteen, reunaa pitkin, liimaamme kaksipuolista vaahtomuoviteippiä, mieluiten mustaa.


Liitä näyttö Arduinoon:


Plus alkaen akkuosasto yhdistä Arduinon VIN-numeroon, miinus GND:hen. Asetamme sen Arduinon taakse. Ennen kuin asennat sen koteloon, älä unohda kytkeä lämpötila-anturi ja kortti painikkeilla.


Luonnoksen valmistelu ja täyttö.
Lämpötila-anturi vaatii OneWire-kirjaston.

Tulostus näytölle suoritetaan U8glib-kirjaston kautta:

Jos haluat muokata ja täyttää luonnoksen, sinun on asennettava nämä kaksi kirjastoa. Voit tehdä tämän kahdella tavalla. Pura nämä arkistot ja sijoita pakkaamattomat tiedostot asennuskansion "kirjastot"-kansioon. Arduino IDE. Tai toinen vaihtoehto on asentaa kirjastot suoraan ohjelmointiympäristöön. Puramatta ladattuja arkistoja, valitse Arduino IDE:ssä valikko Sketch - Connect Library. Valitse avattavan luettelon yläreunasta "Add.Zip-kirjasto". Valitse näkyviin tulevasta valintaikkunasta kirjasto, jonka haluat lisätä. Avaa Sketch-valikko uudelleen – Yhdistä kirjasto. Avattavan luettelon alaosassa sinun pitäisi nähdä uusi kirjasto. Nyt kirjastoa voidaan käyttää ohjelmissa. Älä unohda käynnistää Arduino IDE uudelleen kaiken tämän jälkeen.

Lämpötila-anturi toimii One Wire -protokollalla ja sillä on jokaiselle laitteelle yksilöllinen osoite - 64-bittinen koodi. Ei ole käytännöllistä etsiä tätä koodia joka kerta. Siksi sinun on ensin kytkettävä anturi Arduinoon, ladattava luonnos, joka löytyy valikosta Tiedosto – Esimerkit – Dallasin lämpötila – OneWireSearch. Käynnistä sitten Tools - Port Monitor. Arduinon on löydettävä anturimme, kirjoitettava sen osoite ja nykyiset lämpötilalukemat. Kopioimme tai yksinkertaisesti kirjoitamme muistiin anturin osoitteen. Avaa luonnos Arduino_WG12864B_Term, etsi rivi:

Byte addr=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97);//anturin osoite

Kirjoitamme anturin osoitteen muistiin välillä aaltosulkeet, joka korvaa anturin osoitteen.

Varasto:

//u8g.setPrintPos(44, 64); u8g.print(s); // Tulosta sekuntia ohjataksesi liikkeen oikeellisuutta

Näyttää sekunnit "Data"-tekstin vieressä. Tämä on tarpeen tarkka asennus Ajan kuluminen.
Jos kello on nopea tai jäljessä, sinun tulee muuttaa rivin arvoa:

Jos (micros() - prevmicros >494000) ( // muuta johonkin muuhun korjataksesi se oli 500000

Määritin empiirisesti numeron, jolla kello käy melko tarkasti. Jos kellosi on nopea, lisää tätä numeroa, jos se on jäljessä, vähennä sitä. Liikkeen tarkkuuden määrittämiseksi sinun on näytettävä sekunnit. Numeron tarkan kalibroinnin jälkeen sekuntia voidaan kommentoida ja siten poistaa näytöltä.

Tässä artikkelissa tarkastellaan, kuinka tarkka kello tehdään Arduino pohjainen tai AVR-mikrokontrollerin reaaliaikainen kellopiiri DS1307. Kellonaika näkyy LCD-näytössä.

Mikä on välttämätöntä

  • tietokone, johon on asennettu Arduino IDE;
  • DS1307-siru tai siihen perustuva RTC-moduuli;
  • komponentit elementtiluettelosta.

Voit vaihtaa Arduino-levy Atmel-ohjaimeen, mutta varmista, että siinä on tarpeeksi tulo- ja lähtönastat ja että siinä on I2C-liitännän laitteistototeutus. Käytän ATMega168A-PU:ta. Jos käytät erillistä mikro-ohjainta, tarvitset ohjelmoijan, esimerkiksi AVR MKII ISP:n.

Oletuksena on, että lukija tuntee leipälaudan, ohjelmoinnin Arduino IDE:ssä ja hänellä on jonkin verran tietoa C-ohjelmointikielestä. Molemmat alla olevat ohjelmat eivät kaipaa lisäselvitystä.

Johdanto

Kuinka mikro-ohjaimet seuraavat aikaa ja päivämäärää? Perinteisessä mikrokontrollerissa on ajastintoiminto, joka käynnistyy nollasta, kun syöttöjännite kytketään, ja alkaa sitten laskea. Arduino-maailmassa voimme käyttää millis()-funktiota selvittääksemme, kuinka monta millisekuntia on kulunut virtalähteen kytkemisestä. Kun poistat virran ja kytket sen uudelleen, se alkaa laskea alusta. Tämä ei ole kovin kätevää kellojen ja päivämäärien kanssa työskentelyssä.

Tässä tapauksessa RTC (Real Time Clock) -sirun käyttö on kätevää. Tämä 3V paristolla tai muulla virtalähteellä varustettu mikropiiri valvoo kellonaikaa ja päivämäärää. Kello/kalenteri antaa tietoja sekunneista, minuutteista, tunteista, viikonpäivästä, päivämäärästä, kuukaudesta ja vuodesta. Siru toimii oikein 30/31 päivän kuukausilla ja karkausvuosilla. Viestintä tapahtuu I2C-väylän kautta (I2C-väylää ei käsitellä tässä artikkelissa).

Jos päävirtakiskon jännite Vcc putoaa akkujännitteen Vbat alapuolelle, RTC vaihtaa automaattisesti alhainen virrankulutus vara-akusta. Vara-akku- tämä on yleensä miniakku ("kolikon", "tabletin" muodossa), jonka jännite on 3 volttia, kytketty nastan 3 ja kotelon väliin. Tällä tavalla siru edelleen pitää kirjaa kellonajasta ja päivämäärästä, ja kun virta kytketään pääpiiriin, mikro-ohjain vastaanottaa nykyisen kellonajan ja päivämäärän.

Tässä projektissa käytämme DS1307:ää. Tämän sirun nasta 7 on SQW/OUT-nasta (neliaaltolähtö). Voit käyttää tätä nastaa vilkkumaan LED-valoa ja hälyttämään mikro-ohjainta tallentamaan ajan. Teemme molemmat. Alla on selitys SQW/OUT-nastan toiminnasta.

DS1307-ohjausrekisteriä käytetään ohjaamaan SQW/OUT-nastan toimintaa.

Bitti 7: Output Control (OUT) Tämä bitti ohjaa SQW/OUT-nastan lähtötasoa, kun neliöaaltolähtö on kytketty pois päältä. Jos SQWE = 0, logiikan taso SQW/OUT-nastassa on 1, jos OUT = 1 ja 0, jos OUT = 0. Aluksi tämä bitti on normaalisti 0. Bitti 4: Square Wave Enable (SQWE) Tämä bitti, kun se on asetettu logiikaksi 1, ottaa käyttöön lähtöoskillaattorin. Neliöaaltopulssien taajuus riippuu RS0- ja RS1-bittien arvoista. Kun neliöaallon taajuudeksi on asetettu 1 Hz, kellorekisterit päivitetään neliöaallon laskun aikana. Aluksi tämä bitti asetetaan yleensä arvoon 0. Bitit 1 ja 0: Taajuuden valinta (RS) Nämä bitit ohjaavat neliöaaltolähdön taajuutta, kun neliöaaltolähtö kytketään päälle. Seuraavassa taulukossa on lueteltu neliöaaltotaajuudet, jotka voidaan valita näiden bittien avulla. Nämä bitit asetetaan yleensä aluksi arvoon 1.

Tämä pöytä auttaa sinua taajuudessa:

DS1307 neliöaaltotaajuuden valinta
PulssitaajuusBitti 7Bitti 6Bitti 5Bitti 4Bittinen 3Bitti 2Bitti 1Bittinen 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

Jos liitit LEDin ja vastuksen nastaan ​​7 ja haluat LEDin vilkkuvan 1 Hz:n taajuudella, sinun on kirjoitettava ohjausrekisteriin arvo 0b00010000. Jos haluat 4,096 kHz pulsseja, kirjoitat 0b000100001. Tässä tapauksessa tarvitset oskilloskoopin nähdäksesi pulssit, koska LED-valo vilkkuu niin nopeasti, että se näyttää palavan jatkuvasti. Käytämme pulsseja, joiden taajuus on 1 Hz.

Laitteisto

Nähtävissä alapuolella rakennesuunnitelma mitä tarvitsemme.

Meitä tarvitaan:

  • ISP-liitin (In System Programming, in-circuit ohjelmointi) mikro-ohjaimen laiteohjelmiston vilkkumiseen;
  • painikkeet ajan ja päivämäärän asettamiseen;
  • mikro-ohjain viestintään RTC:n kanssa I2C-väylän kautta;
  • näyttö näyttää päivämäärän ja ajan.

Kaaviokuva:


Luettelo elementeistä

Alla kuvakaappaus Eaglesta:


Ohjelmisto

Tässä opetusohjelmassa käytämme kahta eri luonnosta: toista, joka kirjoittaa kellonajan ja päivämäärän RTC:hen, ja toista, joka lukee kellonajan ja päivämäärän RTC:stä. Teimme tämän, koska tällä tavalla voit saada enemmän täysi näkymä siitä, mitä tapahtuu. Käytämme samaa kaavaa molemmissa ohjelmissa.

Ensin kirjoitamme kellonajan ja päivämäärän RTC:hen, mikä on samanlainen kuin kellon ajan asettaminen.

Käytämme kahta painiketta. Yksi lisää tunteja, minuutteja, päivämäärää, kuukautta, vuotta ja viikonpäivää, ja toinen valitaan niiden välillä. Sovellus ei lue kriittisten antureiden tiloja, joten käytämme keskeytyksiä tarkistaaksemme, onko painiketta painettu, ja käsittelemään kontaktien pomppimista.

Seuraava koodi asettaa arvot ja kirjoittaa ne RTC:hen:

#sisältää // Määritä LCD-nastat #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); // Keskeytys 0 on mikro-ohjaimen nasta 4 (Arduino digitaalinen nasta 2) int btnSet = 0; // Keskeytys 1 on mikro-ohjaimen nasta 5 (Arduino digitaalinen nasta 3) int btnSel = 1; // Keskeytysliput volatile int togBtnSet = false; volatile int togBtnSel = false; haihtuva int counterVal = 0; // Muuttujat, joilla seurataan missä "valikon" kohdassa olemme haihtuvia int menuCounter = 0; // Haihtuvien arvojen joukko in menuValues; // 0=tunnit, 1=minuutit, 2=kuukauden päivä, 3=kuukausi, 4=vuosi, 5=viikonpäivä // Valikkojen otsikot char* menuTitles = ( "Aseta tunnit", "Aseta minuutit.", "Aseta päivämäärä. ", "Aseta kuukausi. ", "Aseta vuosi. ", "Aseta päivä (1=ma)." // Viikonpäivien joukko char* days = ( "NA", "ma", "ti", "ke", "to", "vapaa", "la", "su" ); void setup() ( // Keskeytysten ilmoittaminen, toimintojen suorittaminen expandValue/nextItem // btnXXX:n nousevalla reunalla attachInterrupt(btnSet, expandValue, RISING); attachInterrupt(btnSel, nextItem, RISING); Wire.begin(); lcd.begin ( 16,2 showWelcome( ) // Keskeytysfunktio void growthValue() ( // Muuttujat staattinen etumerkitön long lastInterruptTime = 0; // Luo aikaleima etumerkitön pitkä keskeytysaika = millis(); // Jos aikaleima on suurempi kuin lastInterruptTime, kuin 200 if (interruptTime - lastInterruptTime > 200) ( togBtnSet = true; // Kasvata counterVal:lla counterVal++; ) // Aseta lastInterruptTime aikaleimaksi // jotta tiedämme, että olemme menneet pidemmälle lastInterruptTime) = interruptTime funktio seuraavalle valikkokohdalle void nextItem() ( staattinen etumerkitön long lastInterruptTime = 0; etumerkitön pitkä keskeytysaika = millis(); if (interruptTime - lastInterruptTime > 200) ( togBtnSel = true; // Kasvata valikkolaskuria, joten siirrymme kohtaan seuraava valikon kohta menuCounter++ ; if (menuLaskuri > 6) menuLaskuri = 0; // Sijoita counterVal valikon laskuritaulukon elementtiinValues> = counterVal; // Nollaa counterVal, nyt aloitetaan 0:sta seuraavalle valikon vaihtoehdolle counterVal = 0; ) lastInterruptTime = keskeytysaika; ) // Muunnosfunktio desimaalilukuja BCD-tavuun decToBCD(byte val) ( return ((arvo/10*16) + (val%10)); ) // Toiminto tarkistaa, onko valikkopainikkeita painettu, // ja päivittää näytön otsikko. void checkCurrentMenuItem() ( if (togBtnSel) ( togBtnSel = false; lcd.setCursor(0,0); lcd.print(menuTitles); ) ) // Toiminto tarkistaa, onko lisäyspainiketta painettu, // ja päivittää muuttuja sopivassa taulukon elementti, // plus uuden arvon tulostus näyttöön. void checkAndUpdateValue() ( // Tarkista, laukeaako keskeytys = painiketta painetaan if (togBtnSet) ( // Päivitä taulukon elementin arvo komennolla counterVal menuValues>= counterVal; // Nollaa keskeytyslippu togBtnSet = false; lcd.setCursor(7,1) // Tulosta uusi arvo lcd.print(" " // Lyhyt tervetuloviesti, nyt tiedämme, että kaikki on kunnossa void showWelcome() ( lcd. setCursor(2,0); lcd .print("Hei maailma.") lcd.setCursor("Olen elossa."); ; ) // Kirjoita tiedot RTC:hen void writeRTC() ( Wire.beginTransmission(0x68); Wire.write(0); // aloitusosoite Wire.write(0x00); // sekuntia Wire.write(decToBCD(menuValues)) // muuntaa minuutit BCD-koodiksi ja kirjoittaa Wire.write(decToBCD(menuValues) // muuntaa tunnit BCD-koodiksi ja kirjoittaa Wire.write(decToBCD(menuValues)); BCD-koodi ja kirjoitus Wire.write(decToBCD( menuValues) // muuntaa kuukauden päivä BCD-koodiksi ja kirjoittaa Wire.write(decToBCD(menuValues)); // muuntaa kuukausi BCD-koodiksi ja kirjoittaa Wire.write(decToBCD(menuValues)); // muuntaa vuosi BCD-koodiksi ja kirjoittaa Wire.write(0b00010000); // kiihottua neliömäisiä pulsseja 1 Hz nastassa 7 Wire.endTransmission(); // sulje siirto ) // Näytä aika // Nähdäksesi, että RTC toimii, sinun on katsottava toista ohjelmaa void showTime() ( lcd.setCursor(0,0); lcd.print(" "); lcd.print (menuValues ​​lcd.print(":"); lcd.print(" "); // viikonpäivä lcd.print(menuValues); // kutsuu writeRTC-funktiota writeRTC() ( if (menuCounter)< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Tämä ohjelma alkaa lyhyellä tervetuloviestillä. Tämä viesti kertoo, että virta on päällä, LCD-näyttö toimii ja että ohjelma on käynnistynyt. Koska luonnos on tarkoitettu vain osoittamaan, kuinka tietoja kirjoitetaan Arduinosta RTC DS1307:ään, siitä puuttuu lisätoimintoja (tarkistaa, ovatko arvot hyväksyttävillä alueilla; silmukka, kun painiketta painetaan arvon kasvattamiseksi, eli nollaus, kun arvo esimerkiksi minuutit ylittää 60 jne.)

// Sisältää otsikkotiedostot #include #sisältää // Määritä LCD-nastat #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, joka vastaanottaa pulsseja RTC:n haihtuvasta int clockistaPin = 0; // Aika- ja päivämäärämuuttujat tavu sekunti; tavuminuutti tavutunti; tavu päivä; tavun päivämäärä; tavu kuukausi; tavu vuosi; // Viikonpäivien joukko char* days = ( "NA", "ma", "ti", "ke", "to", "vapaa", "la", "su" ); // Funktio, joka suoritetaan vain käynnistyksen yhteydessä void setup() ( pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); ) / / Lyhyt tervetuloviesti, nyt tiedämme, että kaikki on hyvin void showWelcome() ( lcd.setCursor(2,0); lcd.print("Hei maailma."); lcd.setCursor(3,1); lcd.print( "Olen elossa."); delay(500); lcd.clear(); tavu bcdToDec(byte val) ( return ((arvo/16*10) + (arvo%16)); ) // Tämä suoritetaan jatkuvasti void loop() ( // Jos clockPin on korkea if (digitalRead(clockPin)) ( // Aloita I2C-lähetys osoitteesta 0x68 Wire.beginTransmission(0x68); // Aloita osoitteesta 0 Wire.write(0); // Sulje siirto Wire.endTransmission( // Aloita 7 binaarisen tiedon lukeminen kohteesta 0x68 Wire.requestFrom(0x68, 7 second = bcdToDec(Wire.read()); (Wire.read()) = bcdToDec(Wire.read()); // Muotoilu ja näyttöaika lcd.setCursor(4,0); jos (tunti< 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); } }

Johtopäätös

Tässä artikkelissa tarkastelimme Maxim Integratedin DS1307-sirua ja kirjoitimme kaksi esittelyohjelmaa: yhden kellonajan ja päivämäärän asettamiseen ja toisen kellonajan ja päivämäärän lukemiseen. Painikkeiden painamisen tarkistamiseksi käytimme keskeytyksiä, jotka myös eliminoivat kontaktien pomppimisen vaikutuksen.

Valokuva ja video

Kellonajan asettaminen

Ajan lukeminen

Siis reaaliaikainen kello. Tämä hyödyllinen pieni asia ratkaisee useimmat hyödylliset aikaan liittyvät ongelmat. Oletetaan, että hallitset kastelua kello 5 aamulla mökilläsi. Tai sytyttää ja sammuttaa valot tietty hetki. Päivämäärään mennessä voit aloittaa lämmityksen missä tahansa talossa. Asia on varsin mielenkiintoinen ja hyödyllinen. Ja tarkemmin? Tarkastelemme DS1302-reaaliaikakelloa suositulle Arduino-alustalle.

Tästä artikkelista opit:

Hyvää päivää, rakkaat lukijat blokkaa kip-maailma! Miten menee? Kirjoita kommentteihin, oletko kiinnostunut robotiikasta? Mitä tämä aihe merkitsee sinulle?

En voi olla ajattelematta tätä hetkeäkään. Haaveilen ja näen milloin vihdoin päästään siihen pisteeseen, että jokaisella on varaa ostaa henkilökohtainen robottiassistentti. Ei ole väliä mitä hän tekee, kerää roskat, leikkaa nurmikot, pesee auton.

Voin vain kuvitella kuinka monimutkaiset algoritmit niiden on oltava "aivoissaan".

Loppujen lopuksi tulemme siihen pisteeseen, että flash-ohjelmistot samalla tavalla kuin henkilökohtaisissa tietokoneissa. Lataa myös sovellusohjelmia. Ompele käsivarret, jalat, vaihda kynnet, manipulaattorit.

Katso elokuvia "I Robot", " Tekoäly", "Tähtien sota".

Japanilaiset ovat toteuttaneet kehitystään pitkään. Miksi olemme huonompia?? Meillä on hyvin vähän suosiota. Tunnen muutaman kehittäjän. Voin laskea sen sormillani. Teemme jotain muuta. Olemme jälleenmyyjiä. Ostamme vain valmiita sarjoja, robotteja, leluja ja kaikenlaista roskaa.

Miksi emme kehitä tätä:

Tai tämä:

Lopetin ajatukseni ääneen. Puhutaanpa DS1302 Real Time Clock Timerin yhdistämisestä Arduinoon.

Reaaliaikainen kello DS1302

Arduino-ohjaimella ei ole omaa kelloa. Siksi sitä on tarvittaessa täydennettävä erityisellä DS1302-mikropiirillä.

Virtalähteenä nämä levyt voivat käyttää omaa akkuaan tai saada virtaa suoraan Arduino-levyltä.

Pinout-taulukko:

Kytkentäkaavio Arduino UNO:n kanssa:


Menetelmä ohjelmoida Arduino toimimaan DS1302:n kanssa

On välttämätöntä ladata kelvollinen kirjasto luotettavista lähteistä.

Kirjaston avulla voit lukea ja kirjoittaa reaaliaikaisia ​​parametreja. Annan lyhyen kuvauksen alla:

#sisältää // Yhdistä kirjasto.
iarduino_RTC ESINE ( NIMI [, RST_OUTPUT [, CLK_OUTPUT [, DAT_OUTPUT ]]] ); // Luo objekti.

Toiminto alkaa();// Alustaa RTC-moduulin toiminta.

Toiminto Asettaa aika( SEK [, MIN [, TUNTI [, PÄIVÄ [, KUUKAUSI [, VUOSI [, PÄIVÄ]]]]]] ); // Kellonajan asettaminen.

Toiminto saada aika ([ LINE ] ); // Lue aika.

toiminto vilkkuaika( PARAMETRI [TAAJUUS] ); // Saattaa gettime-funktion "vilkkumaan" määritetty parametri aika.

toiminto jakso( PÖYTÄKIRJA ); // Ilmaisee moduuliin pääsyn vähimmäisajan minuutteina.

Muuttuva sekuntia// Palauttaa sekuntia 0:sta 59:ään.

Muuttuva pöytäkirja// Palauttaa minuutit 0:sta 59:ään.

Muuttuva tuntia// Palauttaa tunnit 1-12.

Muuttuva Tuntia// Palauttaa tunnit 0-23.

Muuttuva keskipäivä// Palauttaa keskipäivällä 0 tai 1 (0-am, 1-pm).

Muuttuva päivä// Palauttaa kuukauden päivän 1:stä 31:een.

Muuttuva arkipäivä// Palauttaa viikonpäivän 0:sta 6:een (0 on sunnuntai, 6 on lauantai).

Muuttuva kuukausi// Palauttaa kuukauden 1-12.

Muuttuva vuosi// Palauttaa vuoden 0:sta 99:ään.

Me kirjoitamme yksinkertainen ohjelma. Nykyisen ajan asettaminen RTC-moduulissa (DS1302):

Arduino

#sisältää iarduino_RTC aika(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 tuntia, 27. lokakuuta 2015, tiistai ) void loop())( if(millis()%1000==0)( // jos 1 sekunti on kulunut Serial.println(time.gettime("d-m-Y, H:i: s, D")); // näytä aikaviive(1); // keskeytä 1 ms, jotta aika ei näy useita kertoja 1 ms:ssa ) )

#sisältää

iarduino_RTCtime(RTC_DS1302, 6, 7, 8);

void setup() (

viive (300);

Sarja. alkaa(9600);

aika. alkaa();

aika. settime(0, 51, 21, 27, 10, 15, 2); // 0 s, 51 min, 21 tuntia, 27. lokakuuta 2015, tiistai

void loop() (

jos (millis() % 1000 == 0 ) ( // jos 1 sekunti on kulunut

Sarja. println (aika . gettime ( "d-m-Y, H:i:s, D" ) ); // näyttöaika

viive(1); // tauko 1 ms, jotta aika ei näy useita kertoja 1 ms:n sisällä

Lukeminen nykyinen aika RTC-moduulista (DS1302) ja lähtö "Sarjaporttiin":

#sisältää iarduino_RTC aika(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop())( if(millis()%1000==0)( // jos 1 sekunti on kulunut Serial .println (time.gettime("d-m-Y, H:i:s, D") // näyttää aikaviiveen (1 // tauko 1 ms, jotta aika ei näy useita kertoja 1 ms); )

Minun piti jotenkin tehdä jotain suurempaa. Seinäkello automaattisella kirkkaudella.

Nämä kellot sopivat erinomaisesti suuriin huoneisiin, kuten toimistokäytävään tai suureen asuntoon.

Näin suuren seinäkellon tekeminen ei ole kovin vaikeaa näiden ohjeiden avulla.


Kellon koon arvioimiseksi voit olettaa, että yksi kellon segmentti on A4-kokoista paperia, mikä helpottaa sopivan kokoisten valokuvakehysten käyttöä.

Vaihe 1. Suuren seinäkellon osat.

Johdot, juotos, juotoskolvi, LED-nauha Arduino Nano DC-DC muunnin LM2596
4 metriä LED-nauhaa WS2811 valon anturi reaaliaikainen kello DS3231
mikrokytkimet

Mitä käytin tässä projektissa:

Vaihe 8. Ohjelmoi kello.

Hetken puuhastelun jälkeen onnistuin hankkimaan kellon, joka täytti tarpeitani täysin. Olen varma, että pystyt paremmin kuin minä.

Koodi on hyvin kommentoitu, eikä sinun ole vaikea ymmärtää sitä.

Jos sinun on vaihdettava käytetyn seinäkellon väriä, sinun on vaihdettava muuttuja rivillä 22 ( int ledColor = 0x0000FF; // Käytetty väri (heksadesimaali)). Löydät luettelon väreistä ja niiden hex-koodeista sivulta: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Jos sinulla on ongelmia lataamisessa, käytä peiliä: http://bit.ly/1Qjtgg0

Lopullisen luonnokseni voi ladata.

Vaihe 9. Tee numerot polystyreenistä.

Leikkurin pohja Leikkurin työrunko Yleinen muoto leikkuri
Leikkurin tulos

Leikkaa jokainen segmentti alussa painettuun malliin.
Polystyreeni voidaan leikata terävällä veitsellä, mikä on melko vaikeaa, tai yksinkertaisella laitteella, joka on valmistettu nikromilangasta tai kitaran kielestä ja useista OSB-levyistä.

Näet kuinka tein sen yllä olevista kuvista.

Leikkurin syöttämiseen käytin 12V virtalähdettä.

Leikkauksen tuloksena sinun pitäisi saada neljä segmenttiä varten iso kello, joista yksi näkyy kuvassa.

Vaihe 10. Liimaa numerot ja peitä kaikki diffuusorilla. Viimeinen iso seinäkello.

Hehkuu päivän aikana Hehkuu yöllä

Kun olet leikannut seinäkellon kaikki neljä numeroa ja pistettä, liimaa ne kaikki pahville LED-nauhat(Käytin kaksipuolista teippiä prosessin helpottamiseksi)

Hälventämään kovia LED-valo Käytin kahta paperiarkkia polystyreeninumeroiden päälle. Mukavuuden ja esteettisyyden vuoksi käytin puoliksi taitettua A2-kokoista paperia.

Kaikkien näiden vaiheiden suorittamisen jälkeen sijoitin tuloksena olevan suuren seinäkellokokoonpanon sopivaan suureen valokuvakehykseen.

Tämä kello osoittautui erittäin vaikuttavaksi ja huomiota herättäväksi. Uskon, että niin suuri seinäkello koristaa täydellisesti monia huoneita.

Yhteydessä