LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere La Campana?
Niente spam

In questo articolo vedremo come fare orologio preciso basato sul microcontrollore Arduino o AVR del microcircuito dell'orologio in tempo reale DS1307. L'ora verrà visualizzata sul display LCD.

Cosa è necessario

  • computer con installato Arduino IDE;
  • Microcircuito DS1307 o modulo RTC basato su di esso;
  • componenti dall'elenco degli elementi.

Puoi sostituire Scheda Arduino a un controller Atmel, ma assicurati che disponga di pin di input e output sufficienti e abbia un'implementazione hardware dell'interfaccia I2C. Sto usando ATMega168A-PU. Se utilizzerai un microcontrollore separato, avrai bisogno di un programmatore come AVR MKII ISP.

Si presume che il lettore abbia familiarità con la prototipazione, la programmazione nell'IDE Arduino e una certa conoscenza del linguaggio di programmazione C. Entrambi i programmi di seguito non necessitano di ulteriori spiegazioni.

introduzione

In che modo i microcontrollori tengono traccia di data e ora? Un comune microcontrollore ha una funzione timer che parte da zero quando viene applicata la tensione di alimentazione, e poi inizia a contare. Nel mondo Arduino possiamo usare la funzione millis() per scoprire quanti millisecondi sono trascorsi da quando è stata applicata la tensione di alimentazione. Quando rimuovi e riapplica l'alimentazione, inizierà a contare dall'inizio. Questo non è molto utile quando si tratta di lavorare con orari e date.

È qui che torna utile il chip RTC (Real Time Clock). Questo circuito integrato con una batteria da 3 V o un'altra fonte di alimentazione tiene traccia dell'ora e della data. L'orologio/calendario fornisce informazioni su secondi, minuti, ore, giorno della settimana, data, mese e anno. Il microcircuito funziona correttamente con mesi di 30/31 giorni e con anni bisestili. La comunicazione avviene tramite il bus I2C (il bus I2C non è discusso in questo articolo).

Se la linea di alimentazione principale Vcc scende al di sotto della tensione della batteria Vbat, l'RTC passa automaticamente alla modalità di basso consumo dalla batteria di backup. La batteria di backup è solitamente una batteria in miniatura (a forma di "moneta", "pillola") con una tensione di 3 volt, collegata tra il pin 3 e la custodia. In questo modo, il microcircuito continuerà a tenere traccia dell'ora e della data e, quando il circuito principale viene acceso, il microcontrollore riceverà l'ora e la data correnti.

In questo progetto utilizzeremo il DS1307. Su questo microcircuito, il pin 7 è il pin SQW / OUT (uscita onda quadra). È possibile utilizzare questo pin per far lampeggiare un LED e avvisare il microcontrollore del timestamp. Faremo entrambe le cose. Quella che segue è una spiegazione di come funziona il pin SQW / OUT.

Il registro di controllo DS1307 viene utilizzato per controllare il funzionamento del pin SQW/OUT.

Bit 7: Controllo uscita (OUT) Questo bit controlla il livello di uscita del pin SQW / OUT quando l'uscita dell'onda quadra è disattivata. Se SQWE = 0, il livello logico sul pin SQW / OUT è 1 se OUT = 1 e 0 se OUT = 0. Inizialmente, questo bit è generalmente 0. Bit 4: Abilitazione onda quadra (SQWE) Questo bit, quando impostato alla logica 1, accende il generatore di uscita. La frequenza dell'onda quadra dipende dai valori dei bit RS0 e RS1. Quando la frequenza dell'onda quadra è impostata su 1 Hz, i registri di clock vengono aggiornati durante la caduta dell'onda quadra. Inizialmente, questo bit è generalmente 0. Bit 1 e 0: Selezione frequenza (RS) Questi bit controllano la frequenza dell'uscita dell'onda quadra quando l'uscita dell'onda quadra è attiva. La tabella seguente elenca le frequenze dell'onda quadra che possono essere selezionate utilizzando questi bit. Inizialmente, questi bit sono generalmente 1.

Questo tavolo ti aiuterà con la frequenza:

DS1307 Selezione frequenza onda quadra
Frequenza degli impulsiBit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
1Hz0 0 0 1 0 0 0 0
4.096kHz0 0 0 1 0 0 0 1
8.192kHz0 0 0 1 0 0 1 0
32,768kHz0 0 0 1 0 0 1 1

Se hai collegato un LED e una resistenza al pin 7 e vuoi che il LED lampeggi a 1 Hz, devi scrivere 0b00010000 nel registro di controllo. Se hai bisogno di 4.096 impulsi di kHz, allora devi scrivere 0b000100001. In questo caso, avrai bisogno di un oscilloscopio per vedere gli impulsi, poiché il LED lampeggerà così velocemente da sembrare sempre acceso. Useremo impulsi da 1 Hz.

Parte hardware

Mostrato sotto schema strutturale ciò che ci serve.

Abbiamo bisogno:

  • Connettore ISP (In System Programming) per il firmware del microcontrollore;
  • pulsanti per l'impostazione di ora e data;
  • microcontrollore per la comunicazione con l'RTC tramite bus I2C;
  • display per la visualizzazione di data e ora.

Diagramma schematico:


Elenco degli articoli

Di seguito uno screenshot di Eagle:


Software

In questo tutorial utilizzeremo due diversi sketch: uno che scrive l'ora e la data nell'RTC e uno che legge l'ora e la data nell'RTC. Lo abbiamo fatto perché ti dà una migliore comprensione di cosa sta succedendo. Useremo lo stesso schema per entrambi i programmi.

Innanzitutto, scriveremo l'ora e la data nell'RTC, che è simile all'impostazione dell'ora su un orologio.

Usiamo due pulsanti. Uno per aumentare le ore, i minuti, la data, il mese, l'anno e il giorno della settimana e l'altro per selezionarli. L'applicazione non legge gli stati di alcun sensore critico, quindi utilizzeremo gli interrupt per verificare se un pulsante viene premuto e gestire il rimbalzo del contatto.

Il codice seguente imposta i valori e li scrive nell'RTC:

#includere // Definisci i pin LCD #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); // L'interrupt 0 è il pin 4 del microcontrollore (pin digitale 2 di Arduino) int btnSet = 0; // L'Interrupt 1 è il pin 5 del microcontrollore (pin 3 digitale Arduino) int btnSel = 1; // Flag di interrupt volatile int togBtnSet = false; volatile int togBtnSel = false; volatile int counterVal = 0; // Variabili per tenere traccia di dove siamo nel "menu" volatile int menuCounter = 0; // Array di valori volatili int menuValues; // 0 = ore, 1 = minuti, 2 = giorno del mese, 3 = mese, 4 = anno, 5 = giorno della settimana // Titoli menu char * menuTitles = ("Imposta ora.", "Imposta minuti. ", "Imposta data. "," Imposta mese. "," Imposta anno. "," Imposta giorno (1 = lun. "); // Array di giorni della settimana char * days = ("NA", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"); void setup () (// Dichiarare gli interrupt, eseguire le funzioni aumentareValue / nextItem // sul bordo d'attacco a btnXXX attachInterrupt (btnSet, aumentareValue, RISING); attachInterrupt (btnSel, nextItem, RISING); Wire.begin (); lcd.begin ( 16,2); showWelcome ();) // Funzione di interrupt void aumentareValue () (// Variabili static unsigned long lastInterruptTime = 0; // Crea timestamp unsigned long interruptTime = millis (); // Se timestamp - lastInterruptTime è maggiore , di 200 if (interruptTime - lastInterruptTime> 200) (togBtnSet = true; // Aumenta counterVal di 1 counterVal ++;) // Imposta lastInterruptTime uguale al timestamp // così sappiamo che siamo andati oltre lastInterruptTime = interruptTime;) // Funzione di interrupt per la voce di menu successiva void nextItem() (static unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis (); if (interruptTime - lastInterruptTime> 200) (togBtnSel = true; // Aumenta il contatore del menu, quindi vai a la voce di menu successiva menuCounter ++; if (Contamenu> 6) Contamenu = 0; // Posiziona counterVal nella voce del menu counter array menuValues ​​= counterVal; // Resetta counterVal, ora partiamo da 0 per la prossima voce di menu counterVal = 0; ) lastInterruptTime = interruptTime; ) // Funzione per convertire i numeri decimali in codice binario-decimale byte decToBCD (byte val) (return ((val / 10 * 16) + (val% 10));) // Funzione per verificare se i pulsanti del menu sono stati premuti, // e aggiorna il titolo sul display. void checkCurrentMenuItem() (if (togBtnSel) (togBtnSel = false; lcd.setCursor (0,0); lcd.print (menuTitles);)) // Funzione per verificare se è stato premuto il pulsante per aumentare il valore, // e aggiorna la variabile nel corrispondente elemento di matrice, // più l'output del nuovo valore sul display. void checkAndUpdateValue() (// Controlla se l'interrupt è attivato = il pulsante è premuto if (togBtnSet) (// Aggiorna il valore dell'elemento dell'array con counterVal menuValues ​​= counterVal; // Resetta il flag di interrupt togBtnSet = false; lcd.setCursor (7,1); // Stampa il nuovo valore lcd.print (menuValues); lcd.print ("");)) // Un breve messaggio di benvenuto, ora sappiamo che va tutto bene void showWelcome () ( lcd.setCursor (2,0); lcd .print ("Ciao mondo."); lcd.setCursor (3,1); lcd.print ("Io" sono vivo. "); delay (500); lcd.clear ();) // Scrivi i dati su RTC void writeRTC () (Wire.beginTransmission (0x68); Wire.write (0); // indirizzo iniziale Wire.write (0x00); // secondi Wire.write (decToBCD (menuValues )); // converte i minuti in codice BCD e scrive Wire.write (decToBCD (menuValues)); // converte l'orologio in codice BCD e scrive Wire.write (decToBCD (menuValues)); // converte il giorno della settimana in BCD codice e scrivi Wire.write (decToBCD ( menuValues)); // converte il giorno del mese in BCD e scrivi Wire.write (decToBCD (menuValues)); // converte il mese in BCD e scrive Wire.write (decToBCD (menuValues)); // converte l'anno in BCD e scrive Wire.write (0b00010000); // abilita gli impulsi ad onda quadra da 1 Hz sul pin 7 Wire.endTransmission (); // chiudi trasmissione) // Mostra ora // Per vedere che RTC funziona, devi guardare un altro programma void showTime () (lcd.setCursor (0,0); lcd.print (""); lcd.print (menuValues ​​); lcd.print (":"); // ore lcd.print (menuValues); lcd.print (":"); lcd.print ("00"); // minuti lcd.setCursor (3, 1) ; lcd.print (giorni); lcd.print (""); // giorno della settimana lcd.print (menuValues); lcd.print ("."); // data lcd.print (menuValues); lcd.print ( "."); // mese lcd.print (menuValues); lcd.print (""); // anno // chiama la funzione writeRTC writeRTC ();) void loop () (if (menuCounter< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Questo programma inizia con un breve messaggio di benvenuto. Questo messaggio ci dice che l'alimentazione è accesa, il display LCD funziona e che il programma è stato avviato. Poiché lo sketch serve solo a mostrare come scrivere i dati dall'Arduino all'RTC DS1307, non è presente alcuna funzionalità ausiliaria (verifica se i valori rientrano negli intervalli consentiti; loop quando si preme il pulsante per aumentare il valore, che cioè, reimpostato a 0, quando il valore, ad esempio, minuti supera 60, ecc.)

// Include i file di intestazione #include #includere // Definisci i pin LCD #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); // Un pin che riceverà impulsi dall'RTC volatile int clockPin = 0; // Variabili di data e ora byte secondo; byte minuto; byte-ora; byte-giorno; data in byte; byte mese; byte anno; // Array di giorni della settimana char * days = ("NA", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"); // Funzione che viene eseguita solo all'avvio void setup() (pinMode (clockPin, INPUT); pinMode (clockPin, LOW); Wire.begin (); lcd.begin (16,2); showWelcome ();) // Un breve messaggio di benvenuto, ora sappiamo che va tutto bene void showWelcome() (lcd.setCursor (2,0); lcd.print ("Hello world."); Lcd.setCursor (3,1); lcd.print (" Sono "vivo."); Delay (500); lcd.clear ();) byte bcdToDec (byte val) (return ((val / 16 * 10) + (val% 16));) // Fatto all the time void loop () (// Se il pin clockPin è alto if (digitalRead (clockPin)) (// Avvia il trasferimento I2C, indirizzo 0x68 Wire.beginTransmission (0x68); // Inizia all'indirizzo 0 Wire.write (0) ; // Chiude la trasmissione Wire.endTransmission (); // Inizia a leggere 7 dati binari da 0x68 Wire.requestFrom (0x68, 7); second = bcdToDec (Wire.read ()); minute = bcdToDec (Wire.read ()) ; ora = bcdToDec (Wire.read ()); giorno = bcdToDec (Wire.read ()); data = bcdToDec (Wire.read ()); mese = bcdToDec (Wire.read ()); anno = bcdToDec (Wir e.leggi ()); // Formattazione e visualizzazione dell'ora lcd.setCursor (4,0); se (ora< 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); } }

Conclusione

In questo articolo, abbiamo esaminato il chip DS1307 di Maxim Integrated e scritto due programmi demo: uno per impostare l'ora e la data e uno per leggere l'ora e la data. Per testare la pressione dei pulsanti, abbiamo utilizzato gli interrupt, in cui abbiamo anche eliminato l'influenza del rimbalzo del contatto.

Foto e video

Impostazioni orario

Leggere l'ora

display LCD- un ospite frequente nei progetti arduino. Ma in schemi complessi potremmo avere il problema della mancanza di porte Arduino a causa della necessità di collegare uno shield, che ha molti pin. La via d'uscita in questa situazione può essere I2C / IIC un adattatore che collega uno schermo Arduino 1602 quasi standard a schede Uno, Nano o Mega con soli 4 pin. In questo articolo vedremo come collegare uno schermo LCD con un'interfaccia I2C, quali librerie è possibile utilizzare, scrivere un breve esempio di schizzo e analizzare gli errori tipici.

Schermo a cristalli liquidi LCD 1602è un bella scelta per visualizzare le stringhe di caratteri in vari progetti. È economico, ci sono varie modifiche con diversi colori di illuminazione, puoi facilmente scaricare librerie già pronte per gli schizzi Arduino. Ma lo svantaggio principale di questo schermo è il fatto che il display ha 16 pin digitali, di cui almeno 6. Pertanto, l'utilizzo di questo schermo LCD senza i2c aggiunge serie limitazioni alle schede Arduino Uno o Nano. Se i contatti non sono sufficienti, allora dovrai acquistare una scheda Arduino Mega o salvare i contatti, anche collegando il display tramite i2c.

Breve descrizione dei pin LCD 1602

Diamo un'occhiata più da vicino ai pin LCD1602:

Ciascuna delle conclusioni ha il suo scopo:

  1. Terra GND;
  2. Alimentazione 5V;
  3. Impostazione del contrasto del monitor;
  4. Comando, dati;
  5. Scrittura e lettura di dati;
  6. Abilitare;

7-14. Linee dati;

  1. Inoltre retroilluminazione;
  2. Controluce meno.

Specifiche dello schermo:

  • Tipo di visualizzazione simbolica, è possibile caricare simboli;
  • Luci a LED;
  • controllore HD44780;
  • Tensione di alimentazione 5V;
  • Formato 16x2 caratteri;
  • Intervallo di temperatura di esercizio da -20C a + 70C, intervallo di temperatura di conservazione da -30C a + 80C;
  • Angolo di visione 180 gradi.

Schema di collegamento dell'LCD alla scheda Arduino senza i2C

Lo schema standard per collegare un monitor direttamente a un microcontrollore Arduino senza I2C è il seguente.

A causa dell'elevato numero di contatti collegati, potrebbe non esserci spazio sufficiente per collegare gli elementi richiesti. L'utilizzo di I2C riduce il numero di fili a 4 e il numero di pin occupati a 2.

Dove acquistare schermi LCD e schermi per arduino

Lo schermo LCD 1602 (e la versione 2004) è piuttosto popolare, quindi puoi trovarlo facilmente sia nei negozi online nazionali che su siti stranieri. Ecco alcuni link alle opzioni più convenienti:

LCD1602 + Modulo schermo blu I2C, compatibile con Arduino Semplice display LCD 1602 (retroilluminazione verde) costa meno di 80 rubli LCD2004 grande schermo con I2C HD44780 per arduino (retroilluminazione blu e verde)
Display 1602 con adattatore IIC e retroilluminazione blu Un'altra variante del LCD1602 con un modulo I2C saldato Modulo adattatore porta IIC / I2C / TWI / SPI per schermo 1602, compatibile con Arduino
Display retroilluminato RGB! LCD 16×2 + tastiera + Buzzer Shield per Arduino Scudo per Arduino con pulsanti e schermo LCD1602 LCD 1602 Display LCD per stampante 3D (Smart Controller per RAMPS 1.4, Text LCD 20 × 4), modulo lettore di schede SD e MicroSD

Descrizione del protocollo I2C

Prima di parlare del collegamento di un display a un arduino tramite un adattatore i2c, parliamo brevemente del protocollo i2C stesso.

I2C / IIC(Inter-Integrated Circuit) è un protocollo originariamente creato per la comunicazione di circuiti integrati all'interno di dispositivo elettronico... Lo sviluppo appartiene a Philips... Al centro del protocollo i2c c'è l'utilizzo di un bus a 8 bit, necessario per collegare i blocchi nell'elettronica di controllo, e di un sistema di indirizzamento, grazie al quale è possibile comunicare sugli stessi fili con più dispositivi. Trasferiamo semplicemente i dati a uno o un altro dispositivo, aggiungendo l'identificatore dell'elemento richiesto ai pacchetti di dati.

Più circuito semplice I2C può contenere un dispositivo master (il più delle volte è un microcontrollore Arduino) e diversi slave (ad esempio, un display LCD). Ogni dispositivo ha un indirizzo nell'intervallo da 7 a 127. Non dovrebbero esserci due dispositivi con lo stesso indirizzo nello stesso circuito.

La scheda Arduino supporta i2c nell'hardware. È possibile utilizzare i pin A4 e A5 per collegare i dispositivi utilizzando questo protocollo.

Ci sono diversi vantaggi nel funzionamento di I2C:

  • Sono necessarie solo 2 linee per funzionare: SDA (linea dati) e SCL (linea di sincronizzazione).
  • Collegamento di un gran numero di dispositivi leader.
  • Tempi di sviluppo ridotti.
  • È necessario un solo microcontrollore per controllare l'intero set di dispositivi.
  • Il possibile numero di microcircuiti collegati a un bus è limitato solo dalla capacità massima.
  • Elevato grado di sicurezza dei dati grazie a uno speciale filtro di soppressione dei picchi integrato nei circuiti.
  • Procedura semplice per la diagnosi di guasti emergenti, rapida risoluzione dei problemi.
  • Il bus è già integrato nello stesso Arduino, quindi non è necessario sviluppare un'interfaccia bus aggiuntiva.

Svantaggi:

  • C'è una limitazione di linea capacitiva di 400 pF.
  • Programmazione difficile di un controller I2C se sul bus sono presenti più dispositivi diversi.
  • Con un numero elevato di dispositivi, diventa difficile localizzare un errore se uno di essi imposta erroneamente uno stato di basso livello.

Modulo I2c per LCD 1602 Arduino

Il modo più veloce e conveniente per utilizzare un display i2c in arduino è acquistare un display già pronto con supporto del protocollo integrato. Ma non ci sono molti di questi schermi e non sono economici. Ma è già stato rilasciato un numero enorme di vari schermi standard. Pertanto, l'opzione più conveniente e popolare oggi è l'acquisto e l'uso di un modulo I2C separato, un adattatore simile a questo:

Su un lato del modulo, vediamo i pin i2c: terra, alimentazione e 2 per il trasferimento dei dati. Sull'altro adattatore vediamo connettori di alimentazione esterni. E, naturalmente, ci sono molti pin sulla scheda, con l'aiuto del quale il modulo viene saldato ai pin dello schermo standard.


Per il collegamento alla scheda arduino vengono utilizzate le uscite i2c. Se necessario, colleghiamo un alimentatore esterno per l'illuminazione. Con il trimmer integrato possiamo regolare i valori di contrasto regolabili J

Sul mercato puoi trovare moduli LCD 1602 con adattatori già saldati, il loro utilizzo è semplificato il più possibile. Se hai acquistato un adattatore separato, dovrai prima saldarlo al modulo.

Collegamento di uno schermo LCD ad Arduino tramite I2C

Per connetterti, hai bisogno della stessa scheda Arduino, un display, una breadboard, cavi di collegamento e un potenziometro.

Se stai utilizzando uno speciale adattatore i2c separato, devi prima saldarlo al modulo dello schermo. È difficile commettere un errore lì, puoi essere guidato da un tale schema.


Il monitor LCD compatibile con i2c si collega alla scheda tramite quattro fili: due per i dati, due per l'alimentazione.

  • Il pin GND si collega al GND sulla scheda.
  • Il pin VCC è a 5V.
  • SCL è collegato al pin A5.
  • SDA si collega al pin A.

Ed è tutto! Nessuna ragnatela di fili in cui è facile impigliarsi. Allo stesso tempo, possiamo semplicemente affidare alle librerie l'intera complessità dell'implementazione del protocollo i2C.

Librerie per lavorare con il display LCD i2c

Per comunicare con Arduino LCD 1602 tramite il bus I2C sono necessarie almeno due librerie:

  • La libreria Wire.h per lavorare con I2C è già disponibile in programma standard Arduino IDE.
  • La libreria LiquidCrystal_I2C.h, che include un'ampia varietà di comandi per il controllo del monitor tramite il bus I2C e rende lo schizzo più semplice e breve. È necessario installare anche la libreria Dopo aver collegato il display, è necessario installare anche la libreria LiquidCrystal_I2C.h

Dopo aver collegato tutte le librerie necessarie allo schizzo, creiamo un oggetto e possiamo utilizzare tutte le sue funzioni. A scopo di test, scarichiamo il seguente schizzo standard dall'esempio.

#includere #includere // Collegamento della libreria // # include // Collegamento di una libreria alternativa LiquidCrystal_I2C lcd (0x27,16,2); // Specificare l'indirizzo I2C (il valore più comune), nonché i parametri dello schermo (nel caso di LCD 1602 - 2 righe di 16 caratteri ciascuna // LiquidCrystal_PCF8574 lcd (0x27); // Opzione per la configurazione della libreria PCF8574 void () (lcd.init (); // Inizializzazione del display lcd.backlight (); // Collegamento della retroilluminazione lcd.setCursor (0,0); // Posizionamento del cursore all'inizio della prima riga lcd.print ( "Hello"); // Digitando sulla prima riga lcd.setCursor (0,1); // Posizionando il cursore all'inizio della seconda riga lcd.print ("ArduinoMaster"); // Digitando sulla seconda riga) ciclo vuoto () ()

Descrizione delle funzioni e dei metodi della libreria LiquidCrystal_I2C:

  • home () e clear () - la prima funzione ti consente di riportare il cursore all'inizio dello schermo, anche la seconda, ma allo stesso tempo elimina tutto ciò che era prima sul monitor.
  • write (ch) - consente di stampare un singolo carattere ch sullo schermo.
  • cursor () e noCursor () - mostra / nasconde il cursore sullo schermo.
  • lampeggia () e noBlink () - il cursore lampeggia / non lampeggia (se era visualizzato in precedenza).
  • display() e noDisplay() - consente di collegare/scollegare il display.
  • scrollDisplayLeft () e scrollDisplayRight () - scorre lo schermo di un carattere a sinistra/destra.
  • autoscroll() e noAutoscroll() - consente di abilitare/disabilitare la modalità di scorrimento automatico. In questa modalità, tutti nuovo simboloè scritto nello stesso posto, spostando ciò che era precedentemente scritto sullo schermo.
  • leftToRight () e rightToLeft () - Imposta la direzione del testo visualizzato, da sinistra a destra o da destra a sinistra.
  • createChar (ch, bitmap) - Crea un carattere con codice ch (0 - 7) utilizzando un array di bitmap per creare punti in bianco e nero.

Libreria alternativa per lavorare con il display i2c

In alcuni casi, quando si utilizza la libreria specificata con dispositivi dotati di controller PCF8574, possono verificarsi errori. In questo caso, la libreria LiquidCrystal_PCF8574.h può essere offerta come alternativa. Estende LiquidCrystal_I2C, quindi non dovrebbero esserci problemi nell'usarlo.

Problemi di connessione del display lcd I2c

Se dopo aver caricato lo schizzo non vedi alcun testo sul display, prova i seguenti passaggi.

Innanzitutto, puoi aumentare o diminuire il contrasto del tuo monitor. Spesso i caratteri non sono semplicemente visibili a causa della modalità di contrasto e della retroilluminazione.

Se ciò non aiuta, controlla la corretta connessione dei contatti, se l'alimentazione della retroilluminazione è collegata. Se hai utilizzato un adattatore i2c separato, ricontrolla la qualità della saldatura dei contatti.

Un altro motivo comune per l'assenza di testo sullo schermo può essere un indirizzo i2c errato. Per prima cosa prova a cambiare l'indirizzo del dispositivo da 0x27 0x20 o 0x3F nello schizzo. Diversi produttori possono avere indirizzi predefiniti diversi. Se questo non aiuta, puoi eseguire uno schizzo dello scanner i2c, che esegue la scansione di tutti i dispositivi collegati e determina il loro indirizzo utilizzando un metodo di forza bruta. Un esempio di schizzo di uno scanner i2c.

Se lo schermo continua a non funzionare, prova a dissaldare l'adattatore e a collegare l'LCD come al solito.

Conclusione

In questo articolo, abbiamo trattato i problemi di base dell'utilizzo di uno schermo LCD in progetti Arduino complessi quando è necessario salvare pin liberi sulla scheda. Un adattatore i2c semplice ed economico consente di collegare uno schermo LCD 1602 con solo 2 pin analogici. Questo può essere molto importante in molte situazioni. Paga per comodità - la necessità di utilizzare un modulo aggiuntivo - convertitore e libreria. A nostro avviso, il prezzo per comodità non è affatto elevato e consigliamo vivamente di utilizzare questa funzionalità nei progetti.

Modulo orologio in tempo reale DS1307
Piccolo modulo RTC I2C 24C32 memoria DS1307 clock

Un piccolo modulo che svolge le funzioni di un orologio in tempo reale. Si basa sul microcircuito DS1307ZN +. La temporizzazione continua è dovuta all'alimentazione autonoma dalla batteria installata nel modulo. Il modulo contiene anche una memoria EEPROM da 32 Kbyte, che conserva le informazioni quando tutti i tipi di alimentazione sono spenti. La memoria e l'orologio sono collegati da un bus di interfaccia I2C comune. I segnali del bus I2C vengono emessi ai contatti del modulo. Quando viene collegata un'alimentazione esterna, la batteria viene ricaricata tramite un primitivo circuito di ricarica. Sulla scheda è presente lo spazio per il montaggio di un sensore di temperatura digitale DS18B20. Non è incluso nel pacchetto.
L'uso di questo dispositivo si verifica quando si misurano intervalli di tempo nell'arco di una settimana con dispositivi basati su un microcontrollore. È ingiustificato e spesso impossibile utilizzare le risorse proprie del MK per questo scopo. È costoso fornire un'alimentazione ininterrotta per lungo tempo; è impossibile installare una batteria per alimentare il MK a causa del notevole consumo di corrente. È qui che il modulo orologio in tempo reale DS1307 viene in soccorso.
Inoltre, il modulo orologio in tempo reale DS1307, grazie alla propria memoria, consente di registrare i dati di eventi che si verificano più volte al giorno, ad esempio le misurazioni della temperatura. Il registro eventi viene quindi letto dalla memoria del modulo. Queste capacità consentono di utilizzare il modulo come parte di una stazione meteorologica automatica autonoma o per studi climatici in luoghi difficili da raggiungere: grotte, cime rocciose. Diventa possibile registrare i parametri tenso delle strutture architettoniche, ad esempio, supporti per ponti e altri. Quando si dota il dispositivo di comunicazione radio, è sufficiente installarlo nell'area rilevata.

Specifiche

Tensione di alimentazione 5 V
Dimensioni 27 x 28 x 8,4 mm

Schema elettrico

Il dispositivo comunica con l'elettronica del dispositivo utilizzando segnali SCL e SDA. IC2 è un orologio in tempo reale. I condensatori C1 e C2 riducono il livello di rumore sulla linea di alimentazione VCC. I resistori R2 e R3 assicurano che i segnali SCL e SDA siano al livello corretto. Il pin 7 di IC2 emette un segnale ad onda quadra SQ di 1 Hz. Viene utilizzato per testare la funzionalità di MS IC2. I componenti R4, R5, R6, VD1 provvedono alla ricarica della batteria BAT1. Per l'archiviazione dei dati, il modulo orologio in tempo reale DS1307 contiene IC1, una memoria non volatile. US1 - sensore di temperatura. I segnali del modulo e delle linee di alimentazione vengono indirizzati ai connettori JP1 e P1.

Bus dati

I2C è un'interfaccia seriale standard con due linee di segnale SCL, SDA e un filo comune. Le linee di interfaccia formano un bus. Alle linee di interfaccia I2C possono essere collegati diversi microcircuiti, non solo i microcircuiti del modulo. Identificare il microcircuito sul bus, vale a dire scrivere i dati sulla MS richiesta e determinare da quale MS provengono i dati. Ogni microcircuito ha un indirizzo univoco per il bus posato. DS1307 ha l'indirizzo 0x68. È registrato in fabbrica. Il chip di memoria ha un indirizzo 0x50. V Software Arduino è incluso libreria software fornendo supporto I2C.

Microcircuito orologio in tempo reale

DS1307 ha un basso consumo energetico, comunica con altri dispositivi tramite interfaccia I2C e contiene 56 byte di memoria. Contiene un orologio e un calendario fino al 2100. Il microcircuito dell'orologio in tempo reale fornisce ad altri dispositivi informazioni sul momento presente: secondi, minuti, ore, giorno della settimana, data. Il numero di giorni in ogni mese viene conteggiato automaticamente. C'è una funzione di compensazione per gli anni bisestili. C'è un flag per definire se l'orologio funziona in modalità 24 ore o in modalità 12 ore. Per il funzionamento in modalità 12 ore, il microcircuito ha un bit da cui vengono letti i dati per la trasmissione per un periodo di tempo: prima o dopo pranzo.

Chip di memoria a lungo termine

Immagine del modulo orologio in tempo reale DS1307 dal lato batteria con il sensore di temperatura U1 installato.

Batteria

Il supporto sul retro della scheda contiene una batteria a disco al litio CR2032. È disponibile da una varietà di produttori, come quello prodotto da GP, che fornisce una corrente di scarica di 3,6 V e 210 mAh. La batteria viene ricaricata durante l'accensione, con questa modalità di funzionamento di una batteria al litio che incontriamo su scheda madre computer.

Ricaricare la batteria

Software

Affinché il modulo funzioni come parte di Arduino, è abbastanza adatta una libreria obsoleta dal sito Web Adafruit chiamata RTCLib. Lo schizzo si chiama DS1307.pde. C'è una versione aggiornata. Scarica l'archivio, scompattalo, rinomina e copia la libreria nella directory della libreria Arduino.

Connessione ad Arduino Mega

Per fare ciò, usa gli schizzi.
SetRTC imposta l'ora in ore in base all'ora mostrata nello schizzo.
GetRTC visualizza l'ora.
Entrambi gli sketch richiedono la libreria Wire e definiscono un indirizzo I2C. Per impostare l'indirizzo dell'orologio sul bus I2C, utilizzare questo scanner I2C.

Collegamento Arduino Mega.

Collegare SCL e SDA ai corrispondenti pin 21 e 20 sull'Arduino Mega 2560. Collegare l'alimentazione.

Connessione Arduino Uno


Imposta l'ora nello schizzo SetRTC e carica su Arduino. Quindi premere il pulsante di ripristino per impostare l'orologio. Ora scarica lo schizzo GetRTC. Apri il monitor seriale e guarda. C'è una biblioteca speciale del tempo. lei ha molto diverse funzioni che può essere utile a seconda della situazione. Per impostare l'ora utilizzando la libreria è necessario scaricare. Quando si utilizza uno schizzo, è possibile sincronizzare l'orologio in tempo reale con l'orologio del personal computer.

Quindi, l'orologio in tempo reale. Questa piccola cosa utile risolve la maggior parte delle attività utili associate al tempo. Diciamo il controllo dell'irrigazione alle 5 del mattino in campagna. O accendendo e spegnendo le luci in un certo momento... Per data, puoi iniziare a riscaldare in qualsiasi casa. La cosa è piuttosto interessante e utile. E più nello specifico? Esamineremo l'orologio in tempo reale DS1302 per la popolare piattaforma Arduino.

In questo articolo imparerai:

Buon giorno, cari lettori del blocco kip-world! Come va? Scrivi nei commenti, sei appassionato di robotica? Cosa significa per te questo argomento?

Il pensiero di questo non mi lascia mai per un minuto. Dormo e vedo quando finalmente arriviamo al punto che tutti possono permettersi di acquistare un robot personale - assistente. Non importa quello che fa, pulire la spazzatura, falciare i prati, lavare la macchina.

Immagino solo quanto complessi algoritmi debbano contenere nei loro "cervelli".

Dopotutto, arriveremo al fatto che lampeggeremo il software allo stesso modo di quando è acceso computer personale... Scarica anche programmi applicativi... Cucire braccia, gambe, cambiare artigli, manipolatori.

Guarda i film "Io sono un robot", " Intelligenza artificiale"," Star Warriors ".

I giapponesi hanno introdotto i loro sviluppi per molto tempo. Perché siamo peggio?? Abbiamo una popolarità molto bassa. Conosco pochi sviluppatori. Conta sulle dita. Stiamo facendo qualcos'altro. Siamo rivenditori. Compriamo solo set già pronti, robot, giocattoli e ogni sorta di spazzatura.

Perché non sviluppiamo questo:

O questo:

Finii le mie riflessioni ad alta voce. Parliamo della connessione del Real Time Clock Timer DS1302 ad Arduino.

Orologio in tempo reale DS1302

Il controller Arduino non ha un proprio orologio. Pertanto, se necessario, è necessario integrare uno speciale microcircuito DS1302.

Per l'alimentazione, queste schede possono utilizzare la propria batteria o essere alimentate direttamente dalla scheda Arduino.

Pinout tabella:

Schema di collegamento con Arduino UNO:


Metodo di programmazione Arduino per lavorare con DS1302

Assicurati di scaricare una libreria valida da fonti attendibili.

La libreria consente di leggere e scrivere parametri in tempo reale. Piccola descrizione Cito di seguito:

#includere // Collega la libreria.
iarduino_RTC UN OGGETTO ( NOME [, OUTPUT_RST [, OUTPUT_CLK [, OUTPUT_DAT]]] ); // Crea un oggetto.

Funzione inizio ();// Inizializzazione del funzionamento del modulo RTC.

Funzione tempo impostato ( SEC [, MIN [, ORA [, GIORNO [, MESE [, ANNO [, GIORNO]]]]]] ); // Imposta l'ora.

Funzione prendi tempo ([ LINEA ] ); // Tempo per leggere.

funzione tempo di lampeggiamento ( PARAMETRO [FREQUENZA] ); // Fa in modo che la funzione gettime lampeggi il parametro time specificato.

funzione periodo ( MINUTI ); // Indica il periodo minimo di accesso al modulo in minuti.

Variabile secondi// Restituisce i secondi da 0 a 59.

Variabile minuti// Restituisce i minuti da 0 a 59.

Variabile ore// Restituisce le ore da 1 a 12.

Variabile Ore// Restituisce le ore da 0 a 23.

Variabile mezzogiorno// Restituisce mezzogiorno 0 o 1 (0:00, 13:00).

Variabile giorno// Restituisce il giorno del mese da 1 a 31.

Variabile nei giorni feriali// Restituisce il giorno della settimana da 0 a 6 (0 è domenica, 6 è sabato).

Variabile mese// Restituisce il mese da 1 a 12.

Variabile anno// Restituisce l'anno da 0 a 99.

Stiamo scrivendo un semplice programma. Impostazione dell'ora corrente nel modulo RTC (DS1302):

Arduino

#includere iarduino_RTC tempo (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 ore, 27 ottobre 2015, martedì) void loop () (if (millis ()% 1000 == 0) (// se è trascorso 1 secondo Serial.println (time.gettime ("dmY, H: i: s , D ")); // visualizza il ritardo temporale (1); // fa una pausa di 1 ms in modo da non visualizzare il tempo più volte in 1 ms))

#includere

iarduino _RTCtime (RTC_DS1302, 6, 7, 8);

configurazione nulla () (

ritardo (300);

Seriale. iniziare (9600);

tempo. inizio ();

tempo. settime (0, 51, 21, 27, 10, 15, 2); // 0 sec, 51 min, 21 h, 27 ottobre 2015, martedì

ciclo vuoto () (

se (millimetri ()% 1000 == 0) ( // se è passato 1 secondo

Seriale. println (time. gettime ("d-m-Y, H: i: s, D")); // mostra l'ora

ritardo (1); // Pausa per 1 ms, in modo da non visualizzare l'ora più volte in 1 ms

Leggiamo l'ora corrente dal modulo RTC (DS1302) e la emettiamo alla "Porta seriale":

#includere iarduino_RTC tempo (RTC_DS1302,6,7,8); void setup () (delay (300); Serial.begin (9600); time.begin ();) void loop () (if (millis ()% 1000 == 0) (// se è trascorso 1 secondo Serial. println (time.gettime ("dmY, H: i: s, D")); // visualizza il ritardo temporale (1); // fa una pausa di 1 ms in modo da non visualizzare l'ora più volte in 1 ms))

Modulo orologio in tempo reale DS1307
Piccolo modulo RTC I2C 24C32 memoria DS1307 clock

Un piccolo modulo che svolge le funzioni di un orologio in tempo reale. Si basa sul microcircuito DS1307ZN +. La temporizzazione continua è dovuta all'alimentazione autonoma dalla batteria installata nel modulo. Il modulo contiene anche una memoria EEPROM da 32 Kbyte, che conserva le informazioni quando tutti i tipi di alimentazione sono spenti. La memoria e l'orologio sono collegati da un bus di interfaccia I2C comune. I segnali del bus I2C vengono emessi ai contatti del modulo. Quando viene collegata un'alimentazione esterna, la batteria viene ricaricata tramite un primitivo circuito di ricarica. Sulla scheda è presente lo spazio per il montaggio di un sensore di temperatura digitale DS18B20. Non è incluso nel pacchetto.
L'uso di questo dispositivo si verifica quando si misurano intervalli di tempo nell'arco di una settimana con dispositivi basati su un microcontrollore. È ingiustificato e spesso impossibile utilizzare le risorse proprie del MK per questo scopo. È costoso fornire un'alimentazione ininterrotta per lungo tempo; è impossibile installare una batteria per alimentare il MK a causa del notevole consumo di corrente. È qui che il modulo orologio in tempo reale DS1307 viene in soccorso.
Inoltre, il modulo orologio in tempo reale DS1307, grazie alla propria memoria, consente di registrare i dati di eventi che si verificano più volte al giorno, ad esempio le misurazioni della temperatura. Il registro eventi viene quindi letto dalla memoria del modulo. Queste capacità consentono di utilizzare il modulo come parte di una stazione meteorologica automatica autonoma o per studi climatici in luoghi difficili da raggiungere: grotte, cime rocciose. Diventa possibile registrare i parametri tenso delle strutture architettoniche, ad esempio, supporti per ponti e altri. Quando si dota il dispositivo di comunicazione radio, è sufficiente installarlo nell'area rilevata.

Specifiche

Tensione di alimentazione 5 V
Dimensioni 27 x 28 x 8,4 mm

Schema elettrico

Il dispositivo comunica con l'elettronica del dispositivo utilizzando segnali SCL e SDA. IC2 è un orologio in tempo reale. I condensatori C1 e C2 riducono il livello di rumore sulla linea di alimentazione VCC. I resistori R2 e R3 assicurano che i segnali SCL e SDA siano al livello corretto. Il pin 7 di IC2 emette un segnale ad onda quadra SQ di 1 Hz. Viene utilizzato per testare la funzionalità di MS IC2. I componenti R4, R5, R6, VD1 provvedono alla ricarica della batteria BAT1. Per l'archiviazione dei dati, il modulo orologio in tempo reale DS1307 contiene IC1, una memoria non volatile. US1 - sensore di temperatura. I segnali del modulo e delle linee di alimentazione vengono indirizzati ai connettori JP1 e P1.

Bus dati

I2C è un'interfaccia seriale standard con due linee di segnale SCL, SDA e un filo comune. Le linee di interfaccia formano un bus. Alle linee di interfaccia I2C possono essere collegati diversi microcircuiti, non solo i microcircuiti del modulo. Identificare il microcircuito sul bus, vale a dire scrivere i dati sulla MS richiesta e determinare da quale MS provengono i dati. Ogni microcircuito ha un indirizzo univoco per il bus posato. DS1307 ha l'indirizzo 0x68. È registrato in fabbrica. Il chip di memoria ha un indirizzo 0x50. Il software Arduino include una libreria software che fornisce supporto I2C.

Microcircuito orologio in tempo reale

DS1307 ha un basso consumo energetico, comunica con altri dispositivi tramite interfaccia I2C e contiene 56 byte di memoria. Contiene un orologio e un calendario fino al 2100. Il microcircuito dell'orologio in tempo reale fornisce ad altri dispositivi informazioni sul momento presente: secondi, minuti, ore, giorno della settimana, data. Il numero di giorni in ogni mese viene conteggiato automaticamente. C'è una funzione di compensazione per gli anni bisestili. C'è un flag per definire se l'orologio funziona in modalità 24 ore o in modalità 12 ore. Per il funzionamento in modalità 12 ore, il microcircuito ha un bit da cui vengono letti i dati per la trasmissione per un periodo di tempo: prima o dopo pranzo.

Chip di memoria a lungo termine

Immagine del modulo orologio in tempo reale DS1307 dal lato batteria con il sensore di temperatura U1 installato.

Batteria

Il supporto sul retro della scheda contiene una batteria a disco al litio CR2032. È disponibile da una varietà di produttori, come quello prodotto da GP, che fornisce una corrente di scarica di 3,6 V e 210 mAh. La batteria viene ricaricata all'accensione; questa è la modalità di funzionamento di una batteria al litio che incontriamo sulla scheda madre di un computer.

Ricaricare la batteria

Software

Affinché il modulo funzioni come parte di Arduino, è abbastanza adatta una libreria obsoleta dal sito Web Adafruit chiamata RTCLib. Lo schizzo si chiama DS1307.pde. C'è una versione aggiornata. Scarica l'archivio, scompattalo, rinomina e copia la libreria nella directory della libreria Arduino.

Connessione ad Arduino Mega

Per fare ciò, usa gli schizzi.
SetRTC imposta l'ora in ore in base all'ora mostrata nello schizzo.
GetRTC visualizza l'ora.
Entrambi gli sketch richiedono la libreria Wire e definiscono un indirizzo I2C. Per impostare l'indirizzo dell'orologio sul bus I2C, utilizzare questo scanner I2C.

Collegamento Arduino Mega.

Collegare SCL e SDA ai corrispondenti pin 21 e 20 sull'Arduino Mega 2560. Collegare l'alimentazione.

Connessione Arduino Uno


Imposta l'ora nello schizzo SetRTC e carica su Arduino. Quindi premere il pulsante di ripristino per impostare l'orologio. Ora scarica lo schizzo GetRTC. Apri il monitor seriale e guarda. C'è una biblioteca speciale del tempo. Ha molte funzioni diverse che possono essere utili a seconda della situazione. Per impostare l'ora utilizzando la libreria è necessario scaricare. Quando si utilizza uno schizzo, è possibile sincronizzare l'orologio in tempo reale con l'orologio del personal computer.

LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere La Campana?
Niente spam