Een real-time module aansluiten op Arduino. Grote wandklok met automatische helderheid op Arduino

Ik moest op de een of andere manier iets groters maken. Wandklok met automatische helderheid.

Deze klokken zijn perfect voor grote kamers, zoals een kantoorgang of een groot appartement.

Met deze instructies is het maken van zo'n grote wandklok niet zo moeilijk.


Om de grootte van het horloge te schatten, kunt u ervan uitgaan dat één segment van het horloge het formaat van A4-papier heeft, waardoor het gemakkelijk wordt om fotolijsten van het juiste formaat te gebruiken.

Stap 1. Onderdelen van een grote wandklok.

Draden, soldeer, soldeerbout, LED-strip Arduino Nano DC-DC-omzetter LM2596
4 meter LED-strip WS2811 licht sensor real-time klok DS3231
microschakelaars

Wat ik voor dit project heb gebruikt:

Stap 8. Programmeer de klok.

Na wat gepruts heb ik een horloge kunnen bemachtigen dat volledig aan mijn wensen voldeed. Ik weet zeker dat jij het beter kunt dan ik.

De code is goed becommentarieerd en het zal voor u niet moeilijk zijn om deze te begrijpen; de foutopsporingsberichten zijn ook zeer goed becommentarieerd.

Als u de gebruikte kleur van de wandklok wilt wijzigen, moet u de variabele op regel 22 wijzigen ( int ledkleur = 0x0000FF; // Gebruikte kleur (in hex)). Een lijst met kleuren en hun hexadecimale codes vindt u op de pagina: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Als je problemen hebt met downloaden, gebruik dan de mirror: http://bit.ly/1Qjtgg0

Mijn definitieve schets kan worden gedownload.

Stap 9. Maak cijfers met polystyreen.

Snijbasis Werklichaam van de snijder Algemene vorm snijder
Resultaat van de snijder

Snij elk segment in de sjabloon die aan het begin is afgedrukt.
Polystyreen kan worden gesneden met een scherp mes, wat vrij moeilijk is, of met een eenvoudig apparaat gemaakt van nichroomdraad of gitaarsnaar en verschillende stukken OSB-plaat.

Hoe ik het deed, kun je zien in de afbeeldingen hierboven.

Om de snijder van stroom te voorzien, heb ik een 12V-voeding gebruikt.

Als resultaat van het snijden zou je vier segmenten moeten krijgen grote klok, waarvan er één op de foto staat.

Stap 10. Lijm de cijfers en bedek alles met een diffuser. De laatste grote wandklok.

Gloed gedurende de dag Gloed 's nachts

Nadat u alle vier de cijfers en punten van de wandklok hebt uitgesneden, plakt u ze allemaal samen met het karton op het karton LED-strips(Ik gebruikte dubbelzijdige tape om het proces eenvoudiger te maken)

Om het harde te verdrijven LED verlichting Ik heb twee vellen papier bovenop de piepschuimcijfers gebruikt. Voor het gemak en de esthetiek heb ik papier van A2-formaat dubbelgevouwen gebruikt.

Nadat ik al deze stappen had voltooid, plaatste ik de resulterende grote wandklok in een bijpassende grote fotolijst.

Dit horloge bleek zeer indrukwekkend en opvallend te zijn. Ik denk dat zo'n grote wandklok veel kamers perfect zal decoreren.

In contact met

Realtimeklok dus. Dit handige kleine ding lost de meeste nuttige tijdgerelateerde problemen op. Laten we zeggen dat u om 5 uur 's ochtends de watergift in uw datsja regelt. Of het licht aan en uit doen bepaald moment. Op datum kunt u in elk huis beginnen met verwarmen. Het ding is best interessant en nuttig. En meer specifiek? We zullen kijken naar de DS1302 real-time klok voor het populaire Arduino-platform.

Uit dit artikel leer je:

Goededag, beste lezers blokkeer Kip-wereld! Hoe is het met je? Schrijf in de reacties: ben je geïnteresseerd in robotica? Wat betekent dit onderwerp voor jou?

Ik kan er geen minuut over nadenken. Ik droom en zie wanneer we eindelijk op het punt komen waarop iedereen het zich kan veroorloven een persoonlijke robotassistent te kopen. Het maakt niet uit wat hij doet: afval ophalen, gazons maaien, auto wassen.

Ik kan me gewoon voorstellen hoe moeilijke algoritmes ze moeten het in hun ‘hersenen’ bevatten.

We komen tenslotte op het punt waarop we software op dezelfde manier gaan flashen als op pc's. Ook downloaden applicatieprogramma's. Naai armen, benen vast, verander klauwen, manipulatoren.

Bekijk de films "I Robot", " Kunstmatige intelligentie", "Star Wars".

De Japanners voeren hun ontwikkelingen al heel lang door. Waarom zijn wij slechter?? We hebben heel weinig populariteit. Ik ken weinig ontwikkelaars. Ik kan het op mijn vingers tellen. Wij doen iets anders. Wij zijn wederverkopers. We kopen alleen maar kant-en-klare bouwpakketten, robots, speelgoed en allerlei soorten afval.

Waarom ontwikkelen we dit niet:

Of dit:

Ik rondde mijn gedachten hardop af. Laten we het hebben over het aansluiten van de DS1302 Real Time Clock Timer op Arduino.

Realtimeklok DS1302

De Arduino-controller heeft geen eigen klok. Daarom moet het indien nodig worden aangevuld met een speciale DS1302-microschakeling.

Voor de stroomvoorziening kunnen deze borden hun eigen batterij gebruiken, of rechtstreeks vanaf het Arduino-bord worden gevoed.

Pinout-tabel:

Aansluitschema met Arduino UNO:


Methode voor het programmeren van Arduino om met DS1302 te werken

Het is absoluut noodzakelijk om een ​​geldige bibliotheek van betrouwbare bronnen te downloaden.

Met de bibliotheek kunt u realtime parameters lezen en schrijven. Hieronder geef ik een korte beschrijving:

#erbij betrekken // Verbind de bibliotheek.
iarduino_RTC EEN VOORWERP ( NAAM [, RST_OUTPUT [, CLK_OUTPUT [, DAT_OUTPUT ]]] ); // Maak een object.

Functie beginnen();// Initialisatie van werk RTC-module.

Functie tijd instellen( SEC [, MIN [, UUR [, DAG [, MAAND [, JAAR [, DAG]]]]]] ); // De tijd instellen.

Functie krijg tijd([ LIJN ] ); // Lees de tijd.

functie knippertijd( PARAMETER [ FREQUENTIE ] ); // Zorgt ervoor dat de gettime-functie "knippert" opgegeven parameter tijd.

functie periode ( MINUTEN ); // Geeft de minimale periode aan voor toegang tot de module in minuten.

Variabel seconden// Geeft seconden terug van 0 tot 59.

Variabel minuten// Geeft minuten terug van 0 tot 59.

Variabel uur// Geeft uren terug van 1 tot 12.

Variabel Uur// Geeft uren terug van 0 tot 23.

Variabel middag// Retourneert middag 0 of 1 (0.00 uur, 13.00 uur).

Variabel dag// Geeft de dag van de maand terug van 1 tot 31.

Variabel weekdag// Geeft de dag van de week terug van 0 tot 6 (0 is zondag, 6 is zaterdag).

Variabel maand// Geeft de maand terug van 1 tot 12.

Variabel jaar// Geeft het jaar terug van 0 tot 99.

We schrijven een eenvoudig programma. De huidige tijd instellen in de RTC-module (DS1302):

Arduino

#erbij betrekken iarduino_RTC-tijd (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 uur, 27 oktober 2015, dinsdag ) void loop())( if(millis()%1000==0)( // if 1 seconde is verstreken Serial.println(time.gettime("d-m-Y, H:i: s, D")); // geef de tijdsvertraging weer (1); // pauzeer gedurende 1 ms om de tijd niet meerdere keren in 1 ms weer te geven) )

#erbij betrekken

iarduino_RTCtime(RTC_DS1302, 6, 7, 8);

ongeldige setup() (

vertraging(300);

Serieel. begin(9600);

tijd. beginnen();

tijd. insteltijd(0, 51, 21, 27, 10, 15, 2); // 0 sec, 51 min, 21 uur, 27 oktober 2015, dinsdag

lege lus() (

als (milli() % 1000 == 0 ) ( // als er 1 seconde is verstreken

Serieel. println (tijd . gettime ("d-m-Y, H:i:s, D" ) ); // weergavetijd

vertraging(1); // pauzeer gedurende 1 ms om de tijd niet meerdere keren in 1 ms weer te geven

Lezing huidige tijd van de RTC-module (DS1302) en uitvoer naar de "Seriële poort":

#erbij betrekken iarduino_RTC-tijd (RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop())( if(millis()%1000==0)( // als 1 seconde is verstreken Serieel .println (time.gettime("d-m-Y, H:i:s, D")); // geef de tijdsvertraging weer (1); // pauzeer gedurende 1 ms om de tijd niet meerdere keren in 1 ms weer te geven) )

Goedemiddag, vandaag zal ik instructies delen voor het maken van een klok met een kamerthermometer( DIY Arduino-klok). De klok draait op Arduino UNO; het WG12864B grafische scherm wordt gebruikt om tijd en temperatuur weer te geven. Als temperatuursensor - ds18b20. In tegenstelling tot de meeste andere horloges gebruik ik geen RTS ( Echte tijd Clock), maar ik zal proberen het zonder deze extra module te doen.

Arduino-circuits onderscheiden zich door hun eenvoud en iedereen kan beginnen met het leren van Arduino. Hoe u bibliotheken kunt aansluiten en Arduino kunt flashen, leest u in ons artikel.

Laten we beginnen.

Om deze klok te maken hebben we nodig:

Arduino UNO (of een ander Arduino-compatibel betalen)
- Grafisch schermWG12864B
- Temperatuursensor ds18b20
- Weerstand 4,7 Kom 0,25 W
- Weerstand 100 ohm 0,25 W
- Batterijvak voor 4 AA-batterijen
- Bijpassende doos
- Fijn bestand
- Nagellak (zwart of carrosseriekleur)
- Wat dun plastic of karton
- Elektrische tape
- Aansluitdraden
- Printplaat
- Toetsen
- Soldeerbout
- Soldeer, hars
- Dubbelzijdige tape

Het grafische scherm voorbereiden.
Op het eerste gezicht levert het aansluiten van het scherm veel problemen en moeilijkheden op. Maar als je eerst hun typen begrijpt, zal het veel gemakkelijker en duidelijker worden. Er zijn veel varianten en typen schermen op de ks0107/ks0108-controller. Alle schermen zijn meestal onderverdeeld in 4 typen:
Optie A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Optie B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, 4F, TM12864L-2, 12864J-1
Optie C: Shenzhen Jinghua Displays Co Ltd. JM12864
Optie D: Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

De lijst is niet compleet, er zijn er veel. De meest voorkomende en, naar mijn mening, handige is WG12864B3 V2.0. Het display kan via een seriële of parallelle poort op Arduino worden aangesloten. Bij gebruik met Arduino UNO is het beter om de verbinding via te kiezen seriële poort– dan hebben we slechts 3 microcontrolleruitgangen nodig, in plaats van minstens 13 lijnen bij aansluiting via een parallelle poort. Alles sluit heel eenvoudig aan. Er is nog een nuance: je kunt twee weergaveopties in de uitverkoop vinden, met een ingebouwde potentiometer (om het contrast aan te passen) en zonder. Ik heb ervoor gekozen, en ik raad je aan hetzelfde te doen, met de ingebouwde.


Dit vermindert het aantal onderdelen en de soldeertijd. Het is ook de moeite waard om een ​​stroombegrenzende weerstand van 100 Ohm voor de achtergrondverlichting te installeren. Door direct 5 volt aan te sluiten, bestaat het risico dat de achtergrondverlichting doorbrandt.
WG12864B – Arduino UNO
1 (GND) - GND
2 (VCC) - +5V
4 (RS) – 10
5 (R/W) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – via een weerstand - +5V
20 (BLK) – GND

De handigste manier is om alles achter het scherm te monteren en er 5 draden uit te halen die verbinding maken met de Arduino UNO. Het eindresultaat zou er ongeveer zo uit moeten zien:


Voor wie nog kiest parallelle verbinding Ik zal een verbindingstabel verstrekken.

En het diagram voor schermen van optie B:



Op één communicatielijn kunnen meerdere sensoren worden aangesloten. Eén is genoeg voor onze horloges. We verbinden de draad van de “DQ” pin van de ds18b20 met “pin 5” van de Arduino UNO.

Het bord voorbereiden met knoppen.
Om de tijd en datum op het horloge in te stellen, gebruiken we drie knoppen. Voor het gemak solderen we drie knoppen op de printplaat en verwijderen we de draden.


We verbinden als volgt: we verbinden de draad die gemeenschappelijk is voor alle drie de knoppen met de “GND” van de Arduino. De eerste knop, die wordt gebruikt om naar de tijdinstelmodus te gaan en op tijd en datum te schakelen, is verbonden met “Pin 2”. De tweede, de knop om de waarde te verhogen, is op “Pin 3”, en de derde, de knop om de waarde te verlagen, is op “Pin 4”.

Alles op een rij zetten.
Vermijden kortsluiting, moet het scherm geïsoleerd zijn. We wikkelen het in een cirkel met elektrische tape, enzovoort rug Op dubbelzijdig plakband plakken we een strook isolatiemateriaal, op maat geknipt. Dik karton of dun plastic is voldoende. Als papier heb ik plastic van een tablet gebruikt. Het resultaat is het volgende:


Voor het scherm, langs de rand, lijmen we dubbelzijdig schuimtape, bij voorkeur zwart.


Verbind het scherm met Arduino:


Plus van batterijcompartiment verbinden met “VIN” van Arduino, min met “GND”. Wij plaatsen hem achter de Arduino. Voordat u het in de behuizing installeert, vergeet dan niet om de temperatuursensor en het bord met knoppen aan te sluiten.


Het voorbereiden en invullen van de schets.
Voor de temperatuursensor is de OneWire-bibliotheek vereist.

Uitvoer naar het scherm wordt uitgevoerd via de U8glib-bibliotheek:

Om een ​​schets te bewerken en te vullen, moet u deze twee bibliotheken installeren. Er zijn twee manieren om dit te doen. Pak deze archieven eenvoudig uit en plaats de uitgepakte bestanden in de map “bibliotheken” in de installatiemap Arduino-IDE. Of de tweede optie is om de bibliotheken rechtstreeks in de programmeeromgeving te installeren. Zonder de gedownloade archieven uit te pakken, selecteert u in de Arduino IDE het menu Sketch - Connect Library. Selecteer helemaal bovenaan de vervolgkeuzelijst 'Add.Zip-bibliotheek'. Selecteer in het dialoogvenster dat verschijnt de bibliotheek die u wilt toevoegen. Open opnieuw het Schetsmenu – Connect Library. Helemaal onderaan de vervolgkeuzelijst zou u de nieuwe bibliotheek moeten zien. Nu kan de bibliotheek in programma's worden gebruikt. Vergeet na dit alles niet de Arduino IDE opnieuw op te starten.

De temperatuursensor werkt via het One Wire-protocol en heeft voor elk apparaat een uniek adres: een 64-bits code. Het is niet praktisch om elke keer naar deze code te zoeken. Daarom moet u eerst de sensor op de Arduino aansluiten en de schets uploaden die u vindt in het menu Bestand – Voorbeelden – Dallas Temperatuur – OneWireSearch. Start vervolgens Tools - Port Monitor. Arduino moet onze sensor vinden, het adres en de huidige temperatuurmetingen schrijven. Wij kopiëren of noteren eenvoudigweg het adres van onze sensor. Open de schets Arduino_WG12864B_Term, zoek naar de regel:

Byte addr=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97);//adres van mijn sensor

Wij noteren het adres van uw sensor ertussen gekrulde beugels, ter vervanging van het adres van mijn sensor.

Voorraad:

//u8g.setPrintPos(44, 64); u8g.print(sec); // Voer seconden uit om de juistheid van de zet te controleren

Dient om de seconden weer te geven naast de inscriptie “Data”. Dit is nodig voor nauwkeurige installatie het tijdsverloop.
Als de klok snel of achterloopt, moet u de waarde in de regel wijzigen:

If (micros() - prevmicros >494000) ( // verander naar iets anders om dit te corrigeren was 500000

Ik heb empirisch het getal bepaald waarbij de klok vrij nauwkeurig loopt. Als je klok snel is, moet je dit getal verhogen; als hij achterloopt, verlaag je hem. Om de nauwkeurigheid van de zet te bepalen, moet u de seconden weergeven. Na nauwkeurige kalibratie van het getal kunnen seconden worden becommentarieerd en zo van het scherm worden verwijderd.

Het begon allemaal met het feit dat ik bij toeval eigenaar werd van een BTHQ 22005VSS tekst-LCD-scherm (2 regels van elk 20 tekens) en een bord elektronisch horloge DS1302. Om de waarheid te zeggen zet ik mijn eerste stappen in de Arduino-productie, dus de beslissende rol bij het verwerven van deze onderdelen werd gespeeld door redelijke prijs en kans snelle bezorging. Er is tenslotte vaak geen tijd om te wachten tot het 'apparaat' uit het Middenrijk arriveert, nadat je bijna 'de halve wereld' hebt gereisd, en dat wil je gewoon niet.

Waarom horloges? In een tijd waarin er veel verschillende horloges in de aanbieding zijn, is de prijs van de eenvoudigste vergelijkbaar met die van een sapdoos. Maar het punt is dat het vaak niet alleen nodig is om de exacte tijd (en datum, wat soms ook nodig is) te weten, maar ook om met deze tijd te werken. Houd bijvoorbeeld logboeken bij van temperatuurveranderingen (vochtigheid, druk, licht, enz.) en geef het exacte tijdstip aan waarop deze veranderingen plaatsvonden. Hier zal ARDUINO, uitgerust met een klok, een geweldige service bieden. En bovendien is het fijn als het toestel ook de tijd aangeeft. Er wordt tenslotte zelfs voor gewerkt persoonlijke computer We kijken af ​​en toe naar de rechter benedenhoek: wat als het al tijd is voor de lunch, of het is het einde van de werkdag, of misschien is het al zonsopgang?

Met mijn hart van dit project Ik heb ARDUINO UNO gebruikt, wat vrij gemakkelijk aan te schaffen is - dit is natuurlijk als je iets van hoge kwaliteit en snel wilt kopen. Je kunt het natuurlijk goedkoper vinden, maar nogmaals, je moet wachten, en ik wilde niet wachten. De Arduinka knipperde vrolijk met zijn LED, deed alles wat van hem werd verlangd en gaf eenvoudige boodschappen door seriële poort, over het algemeen was ik tevreden. Maar laten we teruggaan naar de klok. De problemen begonnen, zoals altijd, onverwacht. Het was niet mogelijk om verstandige artikelen en al het andere te vinden, noch op het scherm, noch urenlang tijdens de rally. Op andere schermen - dat is er, op andere horloges - zoveel als je wilt, maar op wat je in handen hebt - bijna niets. Maar als er niets is, is ‘bijna’ ook veel.

Laten we beginnen met het scherm. De BTHQ 22005VSS bleek een banaal 20x2 LCD-scherm te zijn (d.w.z. het heeft 2 regels van elk 20 tekens); in plaats daarvan is het heel goed mogelijk om bijvoorbeeld een scherm te gebruiken - hoewel het "slechts" 16 tekens in elke regel heeft; , maar voor de meeste projecten is dit meer dan genoeg. Dit scherm heeft een 16-pins connector, weliswaar geen enkele rij, maar dubbele rij (2x8), als je het apparaat vasthoudt met het scherm van je af gericht en de connector aan de rechterkant, dan bevindt de eerste pin zich linksonder, de tweede rechtsonder, de derde boven de eerste, de vierde boven de tweede, etc. . Linksboven (15) is de anode, rechtsboven (16) is de kathode. Als je kennis van het Engels hebt en nieuwsgierig bent, kun je de technische beschrijving lezen. Als er heel weinig van het eerste is, en de nieuwsgierigheid veel zwakker is dan het verlangen om te experimenteren, heb ik het als volgt verbonden:

Schermcontact Arduino-contact Opmerking
1 GND Dit is "minus" of "grond".
2 +5V
3 GND Als je heldere tekens nodig hebt.
4 4
5 GND Al was het maar om te ‘schrijven’.
6 5
7 -- Niet gebruikt
8 -- Niet gebruikt
9 -- Niet gebruikt
10 -- Niet gebruikt
11 10
12 11
13 12
14 13
EEN(15) +5V Ik heb aangesloten via een weerstand van 500 Ohm
K(16) GND

In sommige bronnen is de "pinout" aan de Arduino-kant anders, maar op deze manier was het handiger voor mij. Ook het aansluiten van het horloge leverde geen problemen op:

Kijk DS1302 Arduino Opmerking
VCC +5V
GND GND Hier heb ik hem aangesloten via een weerstand van 10 kOhm.
CLK 0 Niet te verwarren met GND!!! De pin wordt ook wel SCLK genoemd
DAT 1 Contact wordt ook wel IO genoemd
RST 3 Contact wordt ook wel CE genoemd

Je kunt hem verbinden met draden of een kabel; ik heb hem persoonlijk op een breadboard gemonteerd.

De problemen begonnen toen de demosketch werd geladen en het horloge begon te werken. Het is waar dat ze het jaar 2165, maand 45, week 85 lieten zien... Waarschijnlijk is dit volgens de kalender "Uranian" of "Neptunus"... Maar ik ga niet op aarde leven, en ik ga ook niet tot Uranus en Neptunus nog niet. Over het algemeen moet er iets gebeuren. Het solderen van een weerstand van 10 kOhm in het GND->GND-circuit hielp niet. Het probleem bleek een onjuiste bibliotheek te zijn. Dat zeg ik meteen juiste bibliotheek kan genomen worden . Dit is voor het horloge. Het kleine scherm maakt met succes gebruik van de bibliotheek standaard ingesteld, genaamd LiquidCrystal.h.

Probleem #2. Elke keer dat de klok start, begint deze te tellen vanaf de tijd die in het programma is “gehecht”. Eten moeilijke beslissing dit probleem. Maak een hash, schrijf deze naar het klokgeheugen en lees hem vervolgens vanaf daar af, vergelijk hem... Over het algemeen is het voor een beginner in Arduino-techniek een beetje ingewikkeld. Het blijkt dat er een eenvoudige oplossing is. of liever heel simpel. Flits het namelijk 2 keer. De eerste keer - flits het met het instellen van de datum en tijd, de tweede keer flitst het, nadat u eerder de regels hebt "gecommentarieerd" (door een // teken helemaal aan het begin van de regel te plaatsen) met het instellen van deze datum.

Eigenlijk de schets:

// DS1302_LCD (C) 2010 Henning Karlsen
// internet: http://www.henningkarlsen.com/electronics
// Een snelle demo van hoe ik mijn DS1302-bibliotheek kan gebruiken om snel een
// klok met behulp van een DS1302 en een 20x2 LCD.
// Correspondentie tussen de klokpinnen en het Arduino pinpm-scherm.
// DS1302: CE-pin -> Arduino Digital 3
// I/O-pin -> Arduino Digital 1
// SCLK-pin -> Arduino Digital 0
// LCD-scherm: DB7 -> Arduino Digital 13
// DB6 -> Arduino Digitaal 12
// DB5 -> Arduino Digitaal 11
// DB4 -> Arduino Digital 10
// E -> Arduino Digitaal 5
// RS -> Arduino Digitaal 4

#erbij betrekken // De schermbibliotheek aansluiten.
#erbij betrekken // De klokbibliotheek aansluiten.

// Initialiseer klokpinnen
DS1302 rtc(3, 1, 0);
// Initialiseer schermpinnen
LiquidCrystal-lcd (4, 5, 10, 11, 12, 13);

ongeldige instellingen()
{
// Start de klok
rtc.halt(onwaar);
rtc.writeProtect(onwaar);

// Start een scherm met het aantal tekens en regels
lcd.begin(20, 2);

// De drie onderste regels zijn voor het eerst zonder commentaar; we geven daarin de huidige datum en tijd aan. De tweede keer - laten we commentaar geven.
//rtc.setDOW(DONDERDAG); // Dag van de week, als het vrijdag is, schrijf dan geen VRIJDAG in het Russisch!
//rtc.setTime(11, 41, 0); // Uren, minuten, seconden in 24-uursnotatie.
//rtc.setDate(13, 6, 2013); // Datum van. IN CIJFERS!!! Je hoeft geen nul voor een enkel cijfer te zetten!
}

lege lus()
{
// Geef de tijd weer gecentreerd op de bovenste regel
lcd.setCursor(6, 0); // Stel de cursor in om de tijd op de bovenste regel af te drukken
lcd.print(rtc.getTimeStr()); // Druk de tijd af

// Geef de afgekorte dag van de week weer in de linkerbenedenhoek
lcd.setCursor(0, 1); // Zet de cursor linksonder om de dag van de week af te drukken
lcd.print(rtc.getDOWStr(FORMAT_LONG)); // Druk de dag van de week volledig af, aangezien het scherm dit toelaat.

// Datum weergeven in de rechter benedenhoek
lcd.setCursor(9, 1); // Stel de cursor in om de datum af te drukken
lcd.print(rtc.getDateStr()); // Druk de datum af

// Wacht een seconde voordat u herhaalt
vertraging(1000); // Pauzeer 1 seconde en begin opnieuw!
}

Dit artikel bespreekt een voorbeeld van het maken van een realtime klok. De indicator geeft de exacte tijd weer en de dubbele punt knippert één keer per seconde. Exacte tijd wordt automatisch geïnstalleerd tijdens het compileren van de firmware.

Beschrijving van componenten

Realtime klok

Wij maken gebruik van de real-time klokmodule van Seeed Studio. Ze zijn gebaseerd op de DS1307-chip van Maxim Integrated. Van de omsnoeringselementen zijn drie weerstanden, een klokkwarts en een batterij nodig, die al op deze module aanwezig zijn. De module heeft de volgende eigenschappen:

    Teltijd (seconden, minuten, uren), datum (jaar, maand, dag), dag van de week

    Tweedraads I²C-interface

De essentie van een real-time klok is dat als er een batterij is, deze kan werken, zelfs als het hoofdapparaat spanningsloos is. Dergelijke klokken komen we voortdurend tegen in laptops of digitale fototoestellen. Als u bij deze apparaten de batterij verwijdert en deze na een tijdje weer terugplaatst, wordt de tijd niet gereset. Dit is te danken aan de real-time klok, Real Time Clock (RTC).

Alle benodigde bibliotheken kan worden gedownload van de officiële website.

Indicator

We gebruiken een viercijferige indicator van Seeed Studio. Het belangrijkste in de indicator is de TM1637-chip, die een driver is voor individuele 7-segmentbits. Deze module gebruikt 4 bits. De module heeft de volgende eigenschappen:

    8 helderheidsniveaus

    Tweedraads bedieningsinterface (CLK, DIO)

Deze module gebruiken we om de tijd weer te geven: uren en minuten. Het gemak van de module is dat deze via slechts twee draden wordt aangesloten en geen bedrading nodig heeft software-implementatie dynamische indicatie, omdat alles al in de module is geïmplementeerd.

Dynamische indicatie is een proces waarbij de indicatoren in onze module opeenvolgend oplichten. Maar we zien geen flikkeringen, omdat het menselijk oog een grote traagheid heeft. Deze methode Hiermee kunt u heel goed het aantal verbindingen tussen de indicatoren en de controller opslaan:

    Statische weergave: 4 cijfers × 7 segmenten = 28 verbindingen.

    Dynamische indicatie: 7 segmenten + 4 gemeenschappelijke anodes of kathodes = 11 aansluitingen.

    Chip TM1637: 2 aansluitingen.

Het voordeel ligt voor de hand.

Verbinding

De real-time klokmodule moet worden aangesloten op de SCL/SDA-pinnen die verband houden met de I²C-bus. Het is ook noodzakelijk om de voedingskabels (Vcc) en de aardekabels (GND) aan te sluiten.

De SDA/SCL-lijnen hebben hun eigen afzonderlijke pinnen op de Arduino, maar intern zijn ze op de een of andere manier verbonden met de pinnen algemeen doel. Als we overwegen Arduino Uno, de SDA-lijn komt overeen met pin A4 en de SCL-lijn komt overeen met A5.

De module wordt geleverd met een kabel met vrouwelijke contacten, die handiger aan te sluiten zijn op Troyka Shield. Er worden echter geen afzonderlijke SDA- en SCL-pinnen weergegeven, dus hebben we rechtstreeks verbinding gemaakt via pinnen A5 en A4.

Wat betreft het aansluiten van de indicator is alles veel eenvoudiger. De CLK- en DIO-pinnen kunnen op elke digitale pinnen worden aangesloten. IN in dit geval respectievelijk de 12e en 11e pin worden gebruikt.

Firmware schrijven

De setup-functie moet de real-time klok en indicator initialiseren en de compilatietijd registreren intern geheugen realtime klok. De hele actie, of beter gezegd, het aflezen van de tijd van de RTC en het weergeven ervan op de indicator, wordt uitgevoerd in lus-functies.

De code hiervoor ziet er als volgt uit:

rtc.ino #include #erbij betrekken //De klassen TM1637 en DS1307 worden daarin gedeclareerd klok ; void setup() (klok .begin (); klok klok .setTime () ; ) void loop() ( int8_t timeDisp[4] ;//Vraag de tijd op vanaf de klok ] = klok .minuut % 10 ; display.point (klok .seconde % 2 ? POINT_ON: POINT_OFF) ; )//De inhoud van de functie wordt hieronder uitgelegd

char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

getInt-functie uitgelegd

Eerst moet u begrijpen waar de tijd vandaan komt in de compileTime-array. Het verschijnt in deze regel:

niet-ondertekende char compileTime = __TIME__;

De compiler vervangt __TIME__ door een string die de compilatietijd bevat in de vorm __TIME__ = "hh:mm:ss" , waarbij hh uren is, mm minuten, ss seconden.

Laten we terugkeren naar de code die moet worden uitgelegd:

char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

In de stringarray die als parameter aan de getInt-functie wordt doorgegeven, krijgen we het teken bij index startIndex en het teken dat erop volgt, om te eindigen met een geheel getal van twee cijfers. In eerste instantie is dit echter geen getal, maar een paar karakters. Om een ​​getal uit een symbool te krijgen, moeten we het nulsymbool (“0”) van dit symbool aftrekken: immers in ASCII-tabel alle cijfersymbolen komen achter elkaar, beginnend met het nulsymbool. Daarom doet de code int(string) - "0") letterlijk het volgende: "Neem het tekennummer startIndex , trek het nulteken ervan af en converteer het naar een geheel getal."

Problemen

Ja, deze code werkt en de klok loopt. Als u echter de stroom uitschakelt en een paar minuten later weer inschakelt, wordt de tijd na het inschakelen weer hetzelfde als tijdens het compileren.

Dit gebeurt omdat na het inschakelen van de stroom de code uit de setup-functie opnieuw wordt uitgevoerd. En hij schrijft de oude tijdwaarde naar de realtime klok.

Om dit te voorkomen, moeten we de code iets meer aanpassen. Elke keer dat in de setup-functie een “hash” van de compilatietijd wordt berekend - het aantal seconden dat is verstreken tussen 00:00:00 en de compilatietijd wordt berekend. En deze hash wordt vergeleken met de hash in de EEPROM. Laten we u eraan herinneren dat EEPROM een geheugen is dat niet wordt gereset wanneer de stroom wordt uitgeschakeld.

Als de waarden van de berekende en eerder opgeslagen hash samenvallen, betekent dit dat het niet nodig is om de tijd in de klokmodule te herschrijven: dit is al gedaan. Maar als deze controle niet slaagt, wordt de tijd in de RTC overschreven.

Een getal schrijven/lezen niet-ondertekend type int naar/van EEPROM twee worden geschreven extra functies EEPROMWriteInt en EEPROMReadInt. Ze zijn toegevoegd omdat de functies EEPROM.read en EEPROM.write alleen char-gegevens kunnen lezen en schrijven.

rtc-eeprom.ino #include #erbij betrekken #include "TM1637.h" #include "DS1307.h" //Array met compileertijd char compileertijd = __TIME__; //Aantallen Arduino-pinnen waarmee de indicator is verbonden#define DISPLAY_CLK_PIN 12 #define DISPLAY_DIO_PIN 13 //Om met de klokchip en indicator te werken, gebruiken we bibliotheken TM1637-weergave (DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS1307 klok; ongeldige setup() ( // Schakel de indicator in en configureer deze weergave.set(); weergave.init(); //Start de realtimeklok klok.begin(); //Haal een getal uit een string, waarbij je het nummer van het eerste teken kent byte-uur = getInt(compileTime, 0 ); byte minuut = getInt(compileTime, 3 ); byte seconde = getInt(compileTime, 6 ); //Geïmproviseerde tijdhash //Bevat het aantal seconden sinds het begin van de dag niet-ondertekende int hash = uur * 60 * 60 + minuut * 60 + seconde; //Controleer of de nieuwe hash niet overeenkomt met de hash in de EEPROM if (EEPROMReadInt(0 ) != hash) ( //Sla de nieuwe hash op EEPROMWriteInt(0, hash) ; // Bereid uren, minuten, seconden voor op opname in RTC klok .fillByHMS (uur, minuut, seconde) ; //Schrijf deze gegevens naar het interne geheugen van het horloge. //Vanaf dit moment beginnen ze de tijd te tellen die we nodig hebben klok.setTime(); ) ) ongeldige lus() ( //Waarden die op elk van de 4 cijfers moeten worden weergegeven int8_t tijdDisp[4] ; void setup() (klok .begin (); klok klok .setTime () ; ) void loop() ( int8_t timeDisp[4] ;] = klok .minuut % 10 ; //... en geef het vervolgens weer op het scherm display.display(tijdweergave); // we hebben geen afzonderlijke cijfers voor seconden, dus //we zullen de dubbele punt elke seconde aan- en uitzetten display.point (klok .seconde % 2 ? POINT_ON: POINT_OFF) ; ) char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0" ) * 10 + int (string[ startIndex+ 1 ] ) - "0" ; ) //Schrijf een getal van twee bytes in het geheugen void EEPROMWriteInt(int adres, int waarde) ( EEPROM.write (adres, lowByte(waarde) ); EEPROM.write (adres + 1 , highByte(waarde) ); ) //Een getal uit het geheugen lezen unsigned int EEPROMReadInt(int adres) ( byte lowByte = EEPROM.read (adres) ; byte highByte = EEPROM.read (adres + 1 ) ; return (highByte<< 8 ) | lowByte; }

Conclusie

Dit artikel toonde een voorbeeld van het werken met de RTC DS1307 real-time klokchip en de TM1637 indicator driver-chip. We leerden ook hoe we de datum en tijd konden verkrijgen tijdens de compilatiefase. Als u nu de gewenste tijd op de klok instelt en vervolgens de stroom voor minimaal een paar uur uitschakelt, zal de tijd na het inschakelen weer nauwkeurig zijn. Gecontroleerd!