Klocka på arduino nano. Klocka på Arduino utan att använda RTC-modul

I artikeln kommer du att bekanta dig med en utmärkt batteridriven realtidsklockmodul.

Med den här modulen kan du hålla koll på tiden i dina Arduino-projekt även i händelse av omprogrammering eller strömavbrott. Det är ett av de nödvändiga elementen för projekt av väckarklockor, larm, realtidsavläsningar från sensorer. En av de mest populära modeller realtidsklockamodul - DS1307. Det är på den vi kommer att sluta. Modulen passar perfekt till Arduino mikrokontroller, där den logiska effekten är 5 V.

Funktioner i modulen från tillverkaren Adafruit (det kinesiska erbjudandet liknande alternativ tre till fyra gånger billigare):

  • Allt inklusive: chip, sele, batteri;
  • Lätt att montera och lätt att använda;
  • Monteras på valfri breadboard eller ansluts direkt med ledningar;
  • Det finns utmärkta bibliotek och skissexempel;
  • Två monteringshål;
  • Arbetets varaktighet - cirka fem år!

Realtidsklockmodulen kan redan lödas, eller så kan den säljas som separata komponenter, vars lödning tar cirka 15 minuter, inte mer.

Vad är en realtidsklocka?

En realtidsklocka är... en klocka. Modulen kör på autonom strömförsörjning- batterier och fortsätter att hålla reda på tiden, även om strömmen tappas på ditt Arduino-projekt. Med hjälp av realtidsmodulen kan du hålla koll på tiden även om du vill göra ändringar i din skiss och programmera om mikrokontrollern.

De flesta mikrokontroller, inklusive Arduino, har en inbyggd tidsräknare som kallas millis(). Det finns också timers inbyggda i chippet som kan spåra längre tidsperioder (minuter eller dagar). Så varför behöver du en separat klockmodul? Det största problemet är att millis() bara håller reda på tiden sedan Arduino startade. Det vill säga så fort du kopplar bort kortet återställs timern till 0. Din Arduino vet inte vad det är, till exempel torsdag eller 8 mars. Allt du kan få från den inbyggda räknaren är "14000 millisekunder har gått sedan senaste uppstarten".

Du har till exempel skapat ett program och vill hålla koll på tiden från det ögonblicket. Om du stänger av strömmen till mikrokontrollern återställs tidsräknaren. Ungefär samma som det händer med billigt Kinesiska klockor: När batteriet är lågt börjar de blinka klockan 12:00.

I vissa Arduino-projekt du behöver pålitlig tidskontroll utan avbrott. Det är i sådana fall det extern modul riktig tids klocka. Chipet som används i dessa klockor håller koll på året och vet till och med hur många dagar det är på en månad (det enda som vanligtvis utelämnas är sommartid och vintertid, eftersom sådana översättningar är olika i olika delar av världen).

Bilden nedan visar moderkort dator med realtidsklocka DS1387. Klockan är använd litiumbatteri så de har vuxit i storlek.

Vi kommer att titta på ett exempel på hur du använder realtidsklockan DS1307. Det är en billig, lättanvänd modul som håller flera år på ett litet batteri.

Tills batteriet i modulen tar slut kommer DS1307 att fortsätta tajma även om Arduino stängs av eller omprogrammeras.

Noderna som utgör realtidsklockmodulen

Adafruit DS1307 Real Time Clock Module delar
Bild Beteckning Beskrivning Tillverkare Kvantitet
IC2 realtidsklocka DS1307 1
Q1 32,768 kHz, 12,5 pF kristall Generisk 1
R1, R2 1/4W 5% 2,2Kohm motstånd Röd, Röd, Röd, Guld Generisk 2
C1 0,1uF keramisk kondensator Generisk 1
Skena för 5 stift (1x5) Generisk 1
Batteri 12 mm 3V litiumbatteri CR1220 1
12 mm myntcellshållare Keystone 3001 1
Betala Adafruit Industries 1

Montering av realtidsklockmodulen

Montering av Adafruits DS1307 realtidsklocka
Ett foto Förklaringar

Gör dig redo att montera. Kontrollera att du har alla nödvändiga delar och verktyg. Installera kretskort i en skruvstäd.

Applicera lite löd på batteriets minuspol.

Installera två 2,2 kΩ motstånd och en keramisk kondensator. Hur exakt du ordnar dem - det spelar ingen roll. Polariteten spelar ingen roll. Därefter installerar du kristallen (också symmetriskt), hållaren (hållaren) för batteriet och realtidsklockan. Realtidsmodulchippet måste installeras på ett sådant sätt att markeringen (spåret) på chippet är placerad i enlighet med beteckningen på kretskortet. Titta noga på bilden till vänster, chippet är korrekt installerat där.


För att batterihållaren inte ska falla ut är det bättre att löda den ovanpå. Vänd sedan på brädan och löd de återstående stiften.

Ta bort eventuella kontaktrester från motstånden, kristallen och kondensatorn.

Om du vill använda stift för att montera modulen på ett lödfritt kretskort, montera stiftskenan på breadboarden, realtidsklockmodulen ovanpå och löd stiften.

Installera batteriet. Den platta delen av batteriet ska vara ovanpå. I genomsnitt kommer batteriet att hålla i cirka 5 år. Även om batteriet är urladdat, lämna inte batterifacket tomt.

Arduino-bibliotek för att arbeta med DS1307

DS1307 ansluts enkelt till vilken mikrokontroller som helst med 5V logikström och I2C-anslutning. Vi kommer att titta på att ansluta och använda denna modul med Arduino.

Vi kommer att använda RTClib-biblioteket för att ta emot och konfigurera avläsningar från DS1307. Om du har frågor om redovisning ytterligare bibliotek Arduino - kolla in den här manualen.

Artikeln tittar på ett exempel på en realtidsklocka från Adafruit, men du kan lika gärna använda de kinesiska motsvarigheterna. Principen för drift och anslutning är inte annorlunda.

  • KÖP Arduino Uno R3 ;
  • KÖP Breadboard ;
  • KÖP realtidsklockmodul DS1307 ;

Det finns 5 stift på realtidsklockan: 5V, GND, SCL, SDA och SQW.

  • 5V används för att driva realtidsklockmodulens chip när du gör en begäran till den om tidsdata. Om 5 V-signalen inte tas emot går chipet i "sleep"-läge.
  • GND - gemensam grund. Måste finnas med i diagrammet.
  • SCL - i2c klockkontakt - krävs för datautbyte med realtidsklockan.
  • SDA är en kontakt genom vilken data från en realtidsklocka överförs via i2c.
  • SQW låter dig anpassa fyrkantvågsutgången. I de flesta fall används inte denna kontakt.

Om du ställer in analogt stift 3 (digitalt 17) till OUTPUT och HIGH, och analogt stift 2 (digitalt 16) till OUTPUT och LOW, kan du driva realtidsklockan direkt från dessa stift!

Anslut analogt stift 4 på Arduino till SDA. Analog stift 5 på Arduino anslut till SCL.


Skiss för Arduino

Kontrollerar realtidsklockan

Den första skissen att köra är ett program som läser data från realtidsklockmodulen en gång per sekund.

Låt oss först se vad som händer om vi tar bort batteriet och ersätter det med ett annat medan Arduino inte är ansluten till USB. Vänta 3 sekunder och ta bort batteriet. Som ett resultat kommer chippet på realtidsklockan att återställas. Efter det, klistra in koden nedan (koden kan även laddas upp från menyn Exempel→RTClib→ds1307 till Arduino IDE) och ladda upp den till Arduino.

Du behöver också OneWire.h-biblioteket, du kan ladda ner det

.

// datum- och tidsfunktioner med DS1307 realtidsklocka ansluten via I2C. Skissen använder Wire lib-biblioteket

#include <Wire.h>

#include "RTClib.h"

Serial.begin(57600);

if (! RTC.isrunning()) (

Serial.println("RTC körs INTE!");

// RTC.adjust(DateTime(__DATE__, __TIME__));

DateTime nu = RTC.now();

seriell utskrift("/");

seriell utskrift("/");

Serial.print(now.day(), DEC);

seriell utskrift(" ");

seriell utskrift(":");

seriell utskrift(":");

Serial.println();

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.println("d");

// beräkna datumet: 7 dagar och 30 sekunder

DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(" nu + 7d + 30s: ");

Serial.print(future.year(), DEC);

seriell utskrift("/");

Serial.print(future.month(), DEC);

seriell utskrift("/");

Serial.print(future.day(), DEC);

seriell utskrift(" ");

Serial.print(future.hour(), DEC);

seriell utskrift(":");

Serial.print(future.minute(), DEC);

seriell utskrift(":");

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

Öppna nu fönstret för seriell monitor och se till att baudhastigheten är korrekt inställd på 57600 bps.

Som ett resultat bör du se något så här i fönstret för seriell monitor:


Om realtidsklockan tappar ström visar den 0:0:0. Sekunderna slutar räkna ned. Efter att ha ställt in tiden börjar en ny nedräkning. Det är av denna anledning som batteriet inte kan tas bort medan realtidsklockmodulen är igång.

Ställa in tiden på klockmodulen

I samma skiss, avkommentera raden som börjar med RTC.adjust:

// raden nedan används för att ställa in datum och tid för klockan

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

Processen att ställa in datum och tid är implementerad mycket elegant. Den här raden innehåller data från din räknare på personlig dator(vid tidpunkten för kompileringen av koden). Dessa data används för att blinka din realtidsklockmodul. Det vill säga, om tiden på din PC är felaktigt inställd rekommenderar vi att du först fixar det här felet och sedan går vidare till Arduino-klockmodulens firmware.

Öppna den seriella monitorn efter inställningen och se till att klockan är rätt inställd:


Allt. Från och med nu, och under de närmaste åren, behöver du inte konfigurera DS1307.

Lästid från DS1307

Efter att ha ställt in realtidsklockan kan DS1307 skicka förfrågningar till dem. Låt oss ta en titt på den del av skissen som implementerar dessa frågor.

DateTime nu = RTC.now();

Serial.print(now.year(), DEC);

seriell utskrift("/");

Serial.print(now.month(), DEC);

seriell utskrift("/");

Serial.print(now.day(), DEC);

seriell utskrift(" ");

Serial.print(now.hour(), DEC);

seriell utskrift(":");

Serial.print(now.minute(), DEC);

seriell utskrift(":");

Serial.print(now.second(), DEC);

Serial.println();

Faktum är att det finns ett alternativ för att få tiden med hjälp av en realtidsklocka. För att göra detta, använd funktionen now(), som returnerar ett DateTime-objekt. Detta objekt innehåller data om år, månad, dag, timme, minut och sekund.

Det finns ett antal realtidsklockbibliotek som tillhandahåller funktioner som RTC.year() och RTC.hour(). Dessa funktioner extraherar år och timme separat. Men att använda dem kommer med ett antal problem: om du gör en begäran om att mata ut minuter vid en tidpunkt, till exempel 3:14:59, det vill säga precis innan minuterna ska motsvara "15" (3:15) :00), kommer mottagna data att vara lika med 3:14:00 - det vill säga, du kommer att förlora en minut.

I allmänhet är det motiverat att använda separata funktioner för att anropa timmen eller året endast om noggrannheten av tidskontroll med en spridning på en minut/år inte är kritisk för ditt projekt (som regel är detta i fall där avläsningar görs sällan - en gång om dagen, en gång i veckan). I vilket fall som helst, om du vill undvika fel i avläsningar, använd now(), och från mottagna data, dra de avläsningar du behöver (minuter, år, etc.).

Det finns ytterligare ett dataformat som vi kan lära oss - antalet sekunder sedan midnatt den 1 januari 1970. Funktionen unixtime() används för detta:

Serial.print(" sedan 1970 = ");

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.print(now.unixtime() / 86400L);

Serial.println("d");

Eftersom det finns 60 * 60 * 24 = 86400 sekunder på en dag, kan du översätta det resulterande värdet till dagar och år. Mycket bekvämt alternativ om du behöver hålla reda på hur lång tid som har gått sedan dess sista förfrågan. Till exempel, om 5 minuter har gått sedan förra gången Arduino anropade realtidsklockan DS1307, kommer värdet som returneras av funktionen unixtime() att vara 300 mer.

Lämna dina kommentarer, frågor och dela personlig erfarenhet Nedan. I diskussionen föds ofta nya idéer och projekt!


En sådan klocka kommer att se väldigt original ut på väggen, de har LED-pilar som imiterar visare klocka, LED klocka i mitten och vacker RGB bakgrundsbelysning. Implementeringen av en sådan hemgjord produkt kan knappast kallas enkel, men den tid och ansträngning som spenderas kommer inte att slösas bort.

Husmaterial:
- Svarta akrylplattor 300x300x3 mm 3st
- Transparent akrylbakgrundsbelysning 300x300x3 mm 1st
- Polermedel för akrylplattor
- Limma
- Distansbrickor 15 mm med m3 gänga 20 st
- M3 skruvar med brickor 20 st
- Tavelram 300x300 mm 1st

Elektroniskt material:
- Skiftregister CD74HC595 8st
- LED-drivrutin TLC5940 1st
- Realtidsklocka (RTC) DS1307 1st
- Linjär regulator LM317 1st
- bipolär transistor BD139 8st
- Elektrolytkondensator 1uF 2st
- Kondensator 0,1uF 1st
- Motstånd 120 Ohm 60st
- Motstånd 10 kOhm 9st
- Motstånd 2 kOhm 1 st
- Motstånd 1 kOhm 9st
- Motstånd 330 Ohm 1 st
- Lysdioder 480st
- 4-siffrig LED digital indikator (med gemensamma anoder) 1 st
- RGB LED-remsa(med en gemensam anod) 1 st (lång under urtavlans omkrets)
- Modul Arduino Mega ADK (Rev3) 1st
- 12V batteri 1st

Steg ett. Fodraltillverkning.
Till att börja med skärs och borras akrylplattor enligt ritningen. Vidare limmas den främre svarta plattan på kroppen med anslutningsdelen (transparent) och med plattan för lysdioderna.

Steg två. Slutförande av arbete på skrovet.
För bättre stabilitet limmar författaren en akrylplatta på baksidan av tavelramen, medan glaset tas bort från ramen och inte längre behövs.
Fyra 15 mm bussningar skruvas fast i plattan som på bilden. Nu är det möjligt att limma bussningarna från ramen till frontplattan. Dessa limmade bussningar skruvas sedan loss för framtida bruk.

Steg tre. LED-insats.
Först och främst sätts lysdioderna in i den första raden med hål (60 lysdioder användes för 1 rad). Katoderna löds samman runt plattan med en 0,8 mm koppartråd och anoderna böjs åt sidan. Denna procedur upprepas för de återstående 7 raderna. Nu när anoderna är ordnade i en kolumn är de också sammanlödda. Således erhölls en matris med 8 rader och 60 kolumner.

Steg fyra. Löd kablar till matrisen.
För detta steg används 8-trådskabelkontakter, en av dem är lödd till katoderna på matrisen. Åtta av dessa kopplingar löddes till 60 anodkolonner. Eftersom författaren använde 8-trådskontakter fick han en kabel med 64 ledningar, vilket betyder att 4 var kvar, de var omlindade med eltejp. Författaren rekommenderar också att man använder sju 8-trådskontakter och tar en 4-trådskontakt för att få exakt 60.

Steg fem. Bifogar en indikator.
Ett hål görs i akrylplattan i form av en skiva och en indikator limmas med förlödda trådar för bekvämlighet.

Steg sex. Betala.
Från en bit brödbräda större storlekän vad som krävs, skär av 2 bitar så att de passar in i tavelramen. Vidare är flera kontakter gjorda oberoende, som kan ses på bilden nedan.

Steg sju. Klockmontering.
Därefter installeras alla delar i höljet enligt diagrammet nedan. Författaren installerade ett laddningsbart 1000mAh batteri i klockan så att den kan fungera utan extern kabel. Installerad på Arduino programmeringskod bifogas längst ner i artikeln. Så, biblioteken för realtidsklockmodulen och TLC5940 LED-drivrutinen är installerade, som också är bifogade under artikeln. Schema med bra upplösning:

I den här artikeln ska vi titta på hur man gör exakt klockaArduino bas eller AVR-mikrokontroller realtidsklocka chip DS1307. Tiden kommer att visas på LCD-skärmen.

Vad är nödvändigt

  • dator med Arduino IDE installerad;
  • DS1307-chip eller RTC-modul baserat på det;
  • tillbehör från listan över element.

Du kan byta ut Arduino-brädet med Atmel styrenhet, men se till att den har tillräckligt med in- och utgångsstift och har en hårdvaruimplementering av I2C-gränssnittet. Jag använder ATMega168A-PU. Om du kommer att använda en separat mikrokontroller behöver du en programmerare, till exempel AVR MKII ISP.

Det antas att läsaren är bekant med breadboarding, programmering med Arduino IDE och har viss kunskap om programmeringsspråket C. Båda programmen nedan behöver ingen ytterligare förklaring.

Introduktion

Hur håller mikrokontroller koll på tid och datum? En konventionell mikrokontroller har en timerfunktion som startar från noll när matningsspänningen läggs på och sedan börjar räknas. I Arduino-världen kan vi använda funktionen millis() för att ta reda på hur många millisekunder som har gått sedan matningsspänningen applicerades. När du tar bort och sätter på strömmen igen börjar den räknas från början. Detta är inte särskilt bekvämt när det kommer till att arbeta med timmar och datum.

Det är här användningen av RTC-chippet (realtidsklocka, realtidsklocka) kommer att vara bekvämt. Denna mikrokrets, med ett 3V batteri eller någon annan strömkälla, håller reda på tid och datum. Klockan/kalendern ger information om sekunder, minuter, timmar, veckodag, datum, månad och år. Chipet fungerar korrekt med 30/31 dagars månader och skottår. Kommunikation sker via I2C-bussen (I2C-bussen diskuteras inte i den här artikeln).

Om huvudströmskenans spänning Vcc sjunker under batterispänningen Vbat, kommer RTC automatiskt att växla till lågeffektläge från reservbatteriet. Reservbatteriet är vanligtvis ett miniatyrbatteri (i form av ett "mynt", "piller") med en spänning på 3 volt, kopplat mellan stift 3 och höljet. På så sätt kommer chippet fortfarande att hålla reda på tid och datum, och när huvudkretsen slås på kommer mikrokontrollern att få aktuell tid och datum.

I det här projektet kommer vi att använda DS1307. På denna IC är stift 7 stiftet SQW/OUT (kvadratvågsutgång). Du kan använda denna stift för att blinka en lysdiod och meddela mikrokontrollern att ta en tidsstämpel. Vi kommer att göra båda. Följande är en förklaring av hur SQW/OUT-stiftet fungerar.

DS1307-kontrollregistret används för att styra driften av SQW/OUT-stiftet.

Bit 7: Output Control (OUT) Denna bit styr utnivån för SQW/OUT-stiftet när fyrkantvågsutgången är avstängd. Om SQWE = 0 är den logiska nivån på SQW/OUT-stiftet 1 om OUT = 1 och 0 om OUT = 0. Inledningsvis är denna bit normalt 0. Bit 4: Square Wave Enable (SQWE) Denna bit, när inställd på logik 1, sätter på utgångsgeneratorn. Fyrkantvågsfrekvensen beror på värdena för RS0- och RS1-bitarna. När fyrkantvågsfrekvensen är inställd på 1 Hz uppdateras klockregistren under fyrkantvågens avklingning. Initialt är denna bit normalt 0. Bit 1 och 0: Frekvensval (RS) Dessa bitar styr frekvensen för fyrkantvågsutgången när fyrkantvågsutgången är aktiverad. Följande tabell listar fyrkantvågsfrekvenserna som kan väljas med dessa bitar. Inledningsvis är dessa bitar vanligtvis 1.

Det här bordet hjälper dig med frekvens:

DS1307 fyrkantsvågsfrekvensval
PulsfrekvensBit 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

Om du kopplat en lysdiod och ett motstånd till stift 7 och du vill att lysdioden ska blinka vid 1 Hz måste du skriva 0b00010000 till kontrollregistret. Om du behöver 4,096 kHz pulser måste du skriva 0b000100001. I det här fallet behöver du ett oscilloskop för att se pulserna, eftersom lysdioden blinkar så snabbt att den ser ut att lysa hela tiden. Vi kommer att använda pulser med en frekvens på 1 Hz.

Hårdvara

Visas nedan strukturplan vad vi behöver.

Vi behöver:

  • ISP-kontakt (In System Programming, in-circuit programmering) för fast programvara för mikrokontroller;
  • knappar för att ställa in tid och datum;
  • mikrokontroller för kommunikation med RTC via I2C-buss;
  • display för att visa datum och tid.

Schematiskt diagram:


Objektlista

Nedan är en skärmdump från Eagle:


programvara

I den här handledningen kommer vi att använda två olika skisser: en som skriver tid och datum till RTC, och en som läser tid och datum från RTC. Vi gjorde detta för att det kommer att ge dig en bättre uppfattning om vad som händer. Vi kommer att använda samma schema för båda programmen.

Först skriver vi in ​​tid och datum i RTC, vilket är samma sak som att ställa in tiden på en klocka.

Vi använder två knappar. En för att öka timmar, minuter, datum, månad, år och veckodag, och den andra för att välja mellan dem. Applikationen läser inte av status för några kritiska sensorer, så vi kommer att använda avbrott för att kontrollera om knappen är nedtryckt och hantera kontaktstuds.

Följande kod ställer in värdena och skriver dem till RTC:

#omfatta // Definiera LCD-stift #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); // Avbrott 0 är mikrokontrollerstift 4 ( digital utgång 2 Arduino) int btnSet = 0; // Avbrott 1 är mikrokontroller stift 5 (Arduino digital stift 3) int btnSel = 1; // Interrupt flags volatile int togBtnSet = false; volatile int togBtnSel = falskt; flyktig int counterVal = 0; // Variabler för att spåra var i "menyn" vi är flyktiga int menuCounter = 0; // Array of values ​​volatile int menuValues; // 0=timmar, 1=minuter, 2=dag i månaden, 3=månad, 4=år, 5=veckodag // Menyrubriker char* menuTitles = ( "Ställ in timme. ", "Ställ in minut. ", "Ställ in datum. ", "Ställ in månad. ", "Ställ in år. ", "Ställ in dag (1=mån)." ); // Uppsättning av veckodagar char* dagar = ( "NA", "mån", "tis", "ons", "tors", "fre", "lör", "sön" ); void setup() ( // Deklarera avbrott, exekvera funktioner ökaValue/nextItem // på stigande kant på btnXXX attachInterrupt(btnSet, ökningValue, RISING); attachInterrupt(btnSel, nextItem, RISING); Wire.begin(); lcd.begin(); lcd.begin(); 16,2); showWelcome(); ) // Avbrottsfunktion void ökaValue() ( // Variabler statiska unsigned long lastInterruptTime = 0; // Skapa tidsstämpel unsigned long interruptTime = millis(); // Om tidsstämpel - lastInterruptTime är större, än 200 if (interruptTime - lastInterruptTime > 200) ( togBtnSet = true; // Öka counterVal med 1 counterVal++; ) // Ställ lastInterruptTime till tidsstämpeln // så att vi vet att vi har gått längre lastInterruptTime = interruptTime; ) // Avbrottsfunktion för nästa menyalternativ void nextItem() (statisk unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis(); if (interruptTime - lastInterruptTime > 200) ( togBtnSel = true; // Öka menyräknaren så vi går till nästa menyalternativ menyCounter++; om (menyRäknare > 6) menyRäknare = 0; // Placera counterVal i meny räknare array element menuValues ​​= counterVal; // Återställ counterVal, nu börjar vi på 0 för nästa menyalternativ counterVal = 0; ) lastInterruptTime = interruptTime; ) // Transformeringsfunktion decimaltal till BCD byte decToBCD(byte val) ( return ((val/10*16) + (val%10)); ) // Funktion för att kontrollera om menyrullningsknappen har tryckts ned, // och uppdatera titeln på displayen . void checkCurrentMenuItem() ( if (togBtnSel) ( togBtnSel = false; lcd. setCursor(0,0); lcd. print(menuTitles); ) ) // Funktion för att kontrollera om värdeökningsknappen trycktes ned, // och uppdatera variabel i relevant arrayelement, // plus matar ut det nya värdet till displayen. void checkAndUpdateValue() ( // Kontrollera om avbrott avfyrades = knappen nedtryckt if (togBtnSet) ( // Uppdatera arrayelementvärde med counterVal menuValues ​​= counterVal; // Återställ avbrottsflagga togBtnSet = false; lcd.setCursor(7,1) ; // Skriv ut det nya värdet lcd.print(menuValues); lcd.print(" "); ) ) // Kort välkomstmeddelande, nu vet vi att allt är bra void showWelcome() ( lcd.setCursor(2,0); lcd .print("Hej världen."); lcd.setCursor(3,1); lcd.print("Jag" lever."); delay(500); lcd.clear(); ) // Skriv data till RTC void writeRTC() ( Wire.beginTransmission(0x68); Wire.write(0); // startadress Wire.write(0x00); // sekunder Wire.write(decToBCD(menuValues)); // konvertera minuter till BCD - kod och skriv Wire.write(decToBCD(menuValues)); // konvertera timmar till BCD-kod och skriv Wire.write(decToBCD(menuValues)); // konvertera veckodag till BCD-kod och skriv Wire.write(decToBCD (menuValues)); // konvertera dagen i månaden till BCD-co d och skriv Wire.write(decToBCD(menuValues)); // konvertera månad till BCD-kod och skriv Wire.write(decToBCD(menuValues)); // konvertera år till BCD-kod och skriv Wire.write(0b00010000); // sätta på rektangulära pulser 1 Hz på stift 7 Wire.endTransmission(); // stäng sändning ) // Visa tid // För att se om RTC körs måste du titta på ett annat program void showTime() ( lcd.setCursor(0,0); lcd.print(" "); lcd.print( menuValues ​​); lcd.print(":"); // timmar lcd.print(menuValues); lcd.print(":"); lcd.print("00 "); // minuter lcd.setCursor(3,1 ); lcd.print(days); lcd.print(" "); // veckodag lcd.print(menuValues); lcd.print("."); // date lcd.print(menuValues); lcd .print( "."); // månad lcd.print(menuValues); lcd.print(" "); // år // writeRTC-funktionsanrop writeRTC(); ) void loop() ( if (menuCounter< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Detta program börjar med ett kort välkomstmeddelande. Det här meddelandet talar om för oss att strömmen är på, LCD-skärmen fungerar och att programmet har startat. Eftersom skissen endast tjänar till att visa hur man skriver data från Arduino till RTC DS1307, saknar den extra funktionalitet (kontrollerar om värdena ligger inom acceptabla intervall; looping när man trycker på knappen för att öka värde, det vill säga återställ till 0, när värdet på till exempel minuter överstiger 60, etc.)

// Inkludera rubrikfiler #include #omfatta // Definiera LCD-stift #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 som kommer att ta emot pulser från RTC:s flyktiga int clockPin = 0; // Tids- och datumvariabler byte sekund; byte minut; byte timme; byte dag; byte datum; byte-månad; byte-år; // Uppsättning av veckodagar char* dagar = ( "NA", "mån", "tis", "ons", "tors", "fre", "lör", "sön" ); // En funktion som endast körs vid start void setup() ( pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); ) // Kort välkomstmeddelande, nu vet vi att allt är bra void showWelcome() ( lcd.setCursor(2,0); lcd.print("Hej världen."); lcd.setCursor(3,1); lcd.print(" I "m vid liv."); delay(500); lcd.clear(); ) byte bcdToDec(byte val) (retur ((val/16*10) + (val%16)); ) // Detta är gjort allt the time void loop() ( // Om clockPin-stiftet är högt if (digitalRead(clockPin)) ( // Starta I2C-överföring, adress 0x68 Wire.beginTransmission(0x68); // Starta vid adress 0 Wire.write(0) ; / / Stäng överföringen Wire.endTransmission(); // Börja läsa 7 binära data från 0x68 Wire.requestFrom(0x68, 7); second = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read()) ; timme = bcdToDec(Wire.read()); dag = bcdToDec(Wire.read()); datum = bcdToDec(Wire.read()); månad = bcdToDec(Wire.read()); år = bcdToDec(Wir e.read()); // Formatera och visa tid lcd.setCursor(4,0); om (timme< 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); } }

Slutsats

I den här artikeln tog vi en titt på DS1307-chippet från Maxim Integrated och skrev två demoprogram, ett för att ställa in tid och datum, och ett för att läsa tid och datum. För att testa knapptryckningar använde vi interrupts, där vi också blev av med påverkan av kontaktstuds.

Foto och video

Tidsinställning

Tidsläsning

Ett av de första projekten som nybörjare bygger baserat på Arduino-brädet är enkel klocka leder nedräkningen. I grund och botten är sådana klockor baserade på RTC-modulen (Real Time Clock) ansluten till Arduino. Idag på marknaden elektroniska komponenter tillgängliga olika modeller RTC, skiljer sig i noggrannhet och pris. Bland de vanliga modellerna finns DS1302, DS1307, DS3231.



Men du kan göra en Arduino-klocka utan att använda en RTC, speciellt om du inte kan få sådana moduler. Naturligtvis noggrannheten det här fallet kommer att vara litet, så projektet bör snarare betraktas som ett utbildningsprojekt.


Funktionsprincipen för sådana klockor är ganska enkel. Varje gång du slår på den här klockan på Arduino måste du ställa in den på det aktuella tidsvärdet, precis som alla andra analog klocka. Det är verkligen bättre att inte använda sådana klockor i din Vardagsliv med sin långa aktivitet utan att starta om och ytterligare anpassning, eftersom desynkronisering med den aktuella tiden under långvarig drift kan vara betydande.


Denna klocka kan monteras på en konventionell bakbord, eftersom det inte kommer att behövas många komponenter här. Vår huvudlänk här kommer att vara betalningen Arduino Uno. Du kan ta en 16x2 LCD för att visa tiden. För att ändra tidsinställningarna, anslut två knappar (för timmar och minuter). Knapparna är anslutna till Aduino via 10kΩ motstånd. För att ändra ljusstyrkan på displayen krävs en 10 kΩ potentiometer. Schemat för att ansluta alla dessa komponenter till Arduino-bräda Uno visas nedan.



Nu måste du programmera Arduino. En enkel kod (skiss) som låter dig visa tiden på LCD-skärmen visas nedan.


#omfatta LiquidCrystal lcd(12,11,5,4,3,2); int h=12; intm; int s; int flagga; int TID; 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(":"); lcd.print(m); lcd.print(":"); lcd.print(s); if(flagga<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flagga==24)flagga=0; fördröjning(1000); lcd.clear(); if(s==60)( s=0; m=m+1; ) if(m==60) (m=0; h=h+1; flagga=flagga+1; ) if(h==13 ) (h=1; ) lcd.setCursor(0,1); lcd.print("HA EN TREVLIG DAG"); //-------Tid // inställning-------// state1=digitalRead(hs); if(tillstånd1==1) (h=h+1; flagga=flagga+1; if(flagga<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(flagga==24)flagga=0; om(h==13)h=1; ) state2=digitalRead(ms); if(tillstånd2==1)( s=0; m=m+1; ) )

   Tack för visat intresse för informationsprojekt hemsida.
   Om du vill ha intressant och användbara material kom ut oftare och det var färre annonser,
   Du kan stödja vårt projekt genom att donera valfritt belopp för dess utveckling.

Så, realtidsklocka. Denna användbara sak löser de flesta användbara uppgifter relaterade till tid. Låt oss säga vattningshantering klockan 5 på morgonen på landet. Eller tända och släcka belysningen vid ett visst tillfälle. Efter datum kan du börja värma i vilket hus som helst. Saken är ganska intressant och användbar. Och mer specifikt? Vi kommer att överväga realtidsklockan DS1302 för den populära Arduino-plattformen.

Från den här artikeln kommer du att lära dig:

God dag kära läsare av kip-världsblocket! Hur mår du? Skriv i kommentarerna, är du förtjust i robotik? Vad betyder det här ämnet för dig?

Jag lämnar inte tanken på det för en minut. Jag sover och ser när vi äntligen kommer till den punkten att alla har råd att köpa en personlig assistentrobot. Det spelar ingen roll vad han kommer att göra, sophämtning, gräsklippning, biltvätt.

Jag föreställer mig bara hur komplexa algoritmer de måste innehålla i sina "hjärnor".

När allt kommer omkring kommer vi till den punkten att vi kommer att flasha programvaran på samma sätt som på persondatorer. Ladda ner också applikationsprogram. Sy armar, ben, byt klor, manipulatorer.

Se filmerna "I am a robot", " Artificiell intelligens"," Stjärnornas krig.

Japanerna har implementerat sin utveckling under lång tid. Varför är vi sämre? Vi har väldigt låg popularitet. Jag känner få utvecklare. Räkna på fingrarna. Vi gör något annat. Vi är återförsäljare. Vi köper bara färdiga byggsatser, robotar - leksaker och allt möjligt skräp.

Varför utvecklar vi inte detta:

Eller det här:

Jag avslutade mina reflektioner högt. Låt oss prata om att ansluta DS1302 Real Time Clock Timer till Arduino.

Realtidsklocka DS1302

Arduino-kontrollern har inte sin egen egen klocka. Därför är det vid behov nödvändigt att komplettera med ett speciellt DS1302-chip.

För ström kan dessa kort använda sitt eget batteri, eller drivas direkt från Arduino-kortet.

Pinout tabell:

Kopplingsschema med Arduino UNO:


Arduino-programmeringsmetod för att fungera med DS1302

Se till att ladda ner det aktuella biblioteket från pålitliga källor.

Biblioteket låter dig läsa och skriva realtidsparametrar. Jag ger en kort beskrivning nedan:

#omfatta // Inkludera biblioteket.
arduino_RTC ETT OBJEKT ( NAMN [, OUT_RST [, OUT_CLK [, OUT_DAT ]]] ); // Skapa ett objekt.

Fungera Börja();// Initiering av RTC-modulen.

Fungera Ställ klockan( SEC[, MIN[, HOUR[, DAY[, MONTH[, YEAR[, DAY]]]]]] ); // Ställ klockan.

Fungera få tid([ LINE ] ); // Lästid.

fungera blinktid( PARAMETER [FREKVENS] ); // Får gettime-funktionen att "blinka" den angivna tidsparametern.

fungera period( MINUTER ); // Specificerar minsta modulåtkomstperiod i minuter.

Variabel sekunder// Returnerar sekunder från 0 till 59.

Variabel minuter// Returnerar minuter från 0 till 59.

Variabel timmar// Returnerar timmar från 1 till 12.

Variabel Timmar// Returnerar timmar från 0 till 23.

Variabel middag// Returnerar middag 0 eller 1 (0-am, 1-pm).

Variabel dag// Returnerar dagen i månaden från 1 till 31.

Variabel veckodag// Returnerar veckodagen från 0 till 6 (0 är söndag, 6 är lördag).

Variabel månad// Returnerar månaden från 1 till 12.

Variabel år// Returnerar året från 0 till 99.

Vi skriver ett enkelt program. Ställa in aktuell tid i RTC-modulen (DS1302):

Arduino

#omfatta iarduino_RTC time(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, Tisdagen den 21 oktober 27, 2015 ) void loop()( if(millis()%1000==0)( // om 1 sekund har passerat Serial.println(time.gettime("dmY, H:i: s, D ")); // visa tidsfördröjningen(1); // pausa i 1 ms, för att inte visa tiden flera gånger i 1 ms) ) )

#omfatta

iarduino_RTCtime(RTC_DS1302 , 6 , 7 , 8 ) ;

void setup()(

delay(300) ;

Serie. börja(9600);

tid. Start();

tid. inställningstid (0 , 51 , 21 , 27 , 10 , 15 , 2 ); // 0 sek, 51 min, 21.00, tisdag 27 oktober 2015

void loop()(

if (millis () % 1000 == 0 ) ( // om 1 sekund har gått

Serie. println (tid . gettime ("d-m-Y, H:i:s, D") ); // utgångstid

fördröjning(1); // pausa i 1ms för att inte visa tiden flera gånger i 1ms

Läsning aktuell tid från RTC-modulen (DS1302) och visas i " Serieport" :

#omfatta iarduino_RTC time(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop()( if(millis()%1000==0)( // om 1 sekund har passerat Serial. println (time.gettime("dmY, H:i:s, D")); // visa tidsfördröjningen(1); // pausa i 1 ms för att inte visa tiden flera gånger i 1ms ) )