Sommario:

Display di tempo e meteo Arduino 3-in-1: 11 passaggi
Display di tempo e meteo Arduino 3-in-1: 11 passaggi

Video: Display di tempo e meteo Arduino 3-in-1: 11 passaggi

Video: Display di tempo e meteo Arduino 3-in-1: 11 passaggi
Video: Sensore di temperatura e umidità DHT11 (Sensori con Arduino) 2024, Dicembre
Anonim

Di Boomer48Follow Altro dell'autore:

Utilizzando ATtiny85
Utilizzando ATtiny85
Utilizzando ATtiny85
Utilizzando ATtiny85
Partizionamento della torta e strumento di potatura poligonale Pi Powered
Partizionamento della torta e strumento di potatura poligonale Pi Powered
Partizionamento della torta e strumento di potatura poligonale Pi Powered
Partizionamento della torta e strumento di potatura poligonale Pi Powered
Controlli digitali per un amplificatore audio manuale
Controlli digitali per un amplificatore audio manuale
Controlli digitali per un amplificatore audio manuale
Controlli digitali per un amplificatore audio manuale

Mi piacciono i microcontrollori PIC e mi piace programmare in linguaggio assembly. In effetti, negli ultimi due anni, ho pubblicato circa 40 progetti sul mio sito Web basati su quella combinazione. Recentemente stavo ordinando alcune parti da uno dei miei fornitori statunitensi preferiti e ho notato un Arduino Nano, con un cavo di programmazione, per soli $ 1,20 in più rispetto a un semplice chip del processore ATMEGA328. Così ne ho comprati un paio. Quindi ho scaricato l'IDE Arduino e rispolverato la mia memoria della programmazione "C++".

Questo progetto è un mash-up di un orologio che utilizza il GPS per il cronometraggio e un ricevitore RF che decodifica i messaggi meteorologici da un comune sensore AcuRite. Il risultato è una visualizzazione su piccola scala del tempo e della temperatura. L'orologio GPS e le routine meteo sono impostate come file include separati, quindi è facile entrare nella routine principale e configurarla per eseguire solo la funzione orologio o solo la funzione meteo. Decommenta semplicemente l'appropriato "#define" nella parte superiore della routine principale se desideri solo una delle funzioni.

Se vengono utilizzate entrambe le funzioni, la riga superiore del display LCD visualizza l'ora locale e la riga inferiore del display LCD visualizza l'umidità e la temperatura sia in gradi Celsius che Fahrenheit. Se viene utilizzata solo la funzione orologio, la riga superiore visualizza l'ora locale e la riga inferiore visualizza l'UTC. Se viene utilizzata solo la funzione meteo, la riga superiore visualizza il primo sensore ricevuto e la riga inferiore visualizza qualsiasi altro sensore ricevuto. Ho aggiunto questa funzionalità perché ho due sensori meteorologici.

Passaggio 1: sensore meteorologico

Sensore meteorologico
Sensore meteorologico
Sensore meteorologico
Sensore meteorologico
Sensore meteorologico
Sensore meteorologico

Il sensore meteorologico AcuRite utilizzato qui invia informazioni su temperatura e umidità ogni 16 secondi. Sul retro mostra un numero di modello di 000592TXR ma è generalmente pubblicizzato come modello 06002M. Questo sensore è utilizzato da molti diversi modelli di stazioni meteorologiche, quindi è facile da trovare e sono stato in grado di acquistarli su eBay per meno di $ 20. AcuRite vende sensori dall'aspetto simile per alcune delle sue stazioni meteorologiche, ma possono o meno aderire allo stesso protocollo di comunicazione. C'è qualche indicazione sul web che il sensore di sola temperatura 00606 utilizza lo stesso formato di messaggio ma con un byte di umidità non valido.

Come si vede nella prima forma d'onda mostrata sopra, i messaggi meteo vengono inviati a raffica con un intervallo di 2 ms tra i messaggi successivi. La seconda forma d'onda mostrata sopra espande parte di un messaggio per vedere le durate ei modelli dei bit. Ci sono quattro bit di sincronizzazione che sono alti circa 600us seguiti da 600us bassi. I bit di dati sono rappresentati da 400us alto seguito da 200us basso (1) o 200us alto seguito da 400us basso (0).

Il formato del messaggio è composto da 7 byte di dati. I primi due byte sono l'ID del sensore e questi non cambiano (es.: non usa un rolling code). L'ultimo byte è un semplice checksum additivo dei primi sei byte. Il terzo byte è un indicatore del livello della batteria e dovrebbe essere sempre 44 esadecimale se la batteria è buona. Il quarto byte è l'umidità ed è un valore non scalato compreso tra 0 e 99. È importante tenere presente che il bit più significativo dei byte 4, 5 e 6 è un bit di parità e non fa parte della misurazione valori. I byte 5 e 6 sono la temperatura in scala (Celsius) con i 4 bit inferiori del byte 5 concatenati con i 7 bit inferiori del byte 6 per formare un valore di 11 bit. La temperatura è sempre rappresentata come un numero positivo e diventa negativa solo quando viene applicata la scala. La scala è (C / 10) - 100. La divisione per 10 è necessaria perché la risoluzione della temperatura è in decimi di grado. La sottrazione è necessaria perché 100 viene aggiunto dal sensore per mantenere positivo il valore trasmesso.

Passaggio 2: ricevitore RF

Ricevitore RF
Ricevitore RF
Ricevitore RF
Ricevitore RF

Il modulo RF che utilizzo per questo progetto è l'RXB6. È un ricevitore super eterodina rispetto ai ricevitori super rigenerativi meno desiderabili. Se guardi i moduli RF economici là fuori, scoprirai che le schede trasmettitore e ricevitore sono spesso raggruppate insieme. La maggior parte di questi ricevitori in bundle sono di tipo super rigenerativo, quindi tendono ad avere caratteristiche di prestazione molto inferiori (inclusa la portata) rispetto ai ricevitori super eterodina. Abbiamo solo bisogno del modulo ricevitore per questo progetto perché riceveremo segnali da un trasmettitore del sensore meteorologico.

Passaggio 3: antenne RF

Antenne RF
Antenne RF

L'RXB6 non viene fornito con un'antenna. È possibile acquistare alcuni modelli elicoidali abbastanza economici, ma è anche facile realizzare la propria antenna. In effetti, un cavo jumper per breadboard potrebbe essere fatto scivolare sul pin dell'antenna del modulo se non vuoi essere troppo fantasioso. Idealmente, un'antenna a filo dritto sarebbe di 1/4 di lunghezza d'onda che corrisponde a circa 6,8 pollici. Inizialmente ho fatto la cosa del ponticello e non ho avuto problemi a raccogliere il mio sensore esterno anche se il mio laboratorio di elettronica è nel mio seminterrato.

Un'altra possibilità è quella di creare la propria antenna elicoidale. Ci sono una varietà di piani per questo sul web, ma quello mostrato nell'immagine sopra è quello che ho fatto. Ho usato un filo a nucleo solido da un pezzo di cavo Ethernet di scarto e l'ho avvolto attorno al gambo liscio di una punta da trapano da 5/32 pollici. Lasciare l'isolamento ad eccezione della punta che si salda alla scheda RF. Avrai bisogno di 20 turni. Puoi anche usare una punta da trapano da 7/32 pollici e avvolgere invece 17 giri. Ognuno di questi probabilmente funzionerà bene per gli intervalli che probabilmente avrai per i tuoi sensori. La vera chiave è avere un buon ricevitore RF per cominciare. I sensori AcuRite hanno anche trasmettitori piuttosto potenti.

Passaggio 4: protocollo di comunicazione RF

Esistono diverse tecniche di modulazione per la trasmissione dei dati, ma questi sensori utilizzano la più semplice che è OOK (on-off-keying) o ASK (amplitude-shift-keying). Poiché in questo esempio abbiamo a che fare con bit di dati 0/1, l'ampiezza è completamente attiva o disattivata. Quindi, per i nostri scopi, OOK e ASK sono gli stessi perché OOK significa che la portante RF è piena o completamente spenta. Il formato del messaggio è generalmente definito dal produttore del dispositivo di trasmissione e può utilizzare praticamente qualsiasi velocità di trasmissione, qualsiasi stile di formattazione bit e qualsiasi lunghezza del messaggio. La banda a 433 MHz è piena di trasmissioni per cose come contatori intelligenti, ecc., quindi il software deve essere sintonizzato per filtrare solo il formato del messaggio che vogliamo usare.

Passaggio 5: dati temporali

Dati temporali
Dati temporali

Utilizzo un'unità GPS economica per ottenere dati temporali precisi che si riavvieranno automaticamente dopo un'interruzione di corrente. Ho diverse unità GPS (senza display) che emettono le frasi NMEA standard, ma la più piccola ed economica delle unità che ho è il NEO-6M. Il modulo NEO-6M è facile da interfacciare con Arduino perché utilizza una porta seriale di livello TTL. L'unica vera differenza è che lo standard NMEA specifica una velocità di trasmissione seriale di 4800 ma il NEO-6M ha un valore predefinito di 9600 baud. Puoi eseguire il programma gratuito "u-center" per modificare la velocità di trasmissione, ma l'ho appena lasciato all'impostazione predefinita di fabbrica. C'è anche un programma di utilità gratuito chiamato GPSInfo (prodotto da Globalsat) che è molto utile per visualizzare le informazioni GPS sul PC. È possibile collegare l'unità GPS a un cavo standard da USB a TTL per verificarlo o per configurarlo utilizzando un PC. Tieni presente che il chip GPS sul modulo funziona effettivamente a 3,3 volt (tramite un regolatore di tensione integrato), quindi se vuoi connetterti alla sua porta RXD dovresti abbassare il livello da 5 volt. La porta TXD può connettersi direttamente ad Arduino o al PC.

Passaggio 6: fusi orari

La visualizzazione dell'ora GPS è una cosa facile da fare se vuoi solo visualizzare l'UTC (Universal Time Coordinated). Le frasi NMEA sono composte da caratteri ASCII che possono essere trasmessi direttamente all'LCD. La porzione di tempo è nel formato HHMMSS. FF (ore, minuti, secondi e frazioni di secondo). Per il nostro orologio la parte frazionaria non è utile, quindi tutto ciò che dobbiamo affrontare sono sei caratteri. Il problema è che devi quindi convertire nell'ora locale e in un formato AM/PM di 12 ore se lo desideri. Ma a volte sono i problemi a rendere la vita interessante, quindi questa parte del software è davvero tutta qui.

Per quanto riguarda i fusi orari, potresti pensare che ce ne sarebbero semplicemente 24 di cui 12 a est della posizione UTC (+ zone) e 12 a ovest della posizione UTC (- zone). In effetti, ce ne sono alcuni strani che sono frazioni di ore e un paio che superano il "limite" di 12 ore. Se ti capita di vivere in una di quelle zone, mi scuso perché il mio software tiene conto solo delle 24 zone intere. Ci sono anche alcuni di noi che usano l'ora legale parte dell'anno, ma questo non viene considerato automaticamente nel software. Ciò richiederebbe una tabella di ricerca delle date future, maggiore complessità nel software e la necessità di aggiornare il software se le settimane dell'anno per il passaggio cambiassero. L'hardware utilizza invece un interruttore di contatto momentaneo per consentire una facile impostazione del fuso orario (offset UTC).

Passaggio 7: schema

Schema
Schema

Lo schema è mostrato sopra e include le connessioni per un'interfaccia LCD 1602 a 4 bit. I dati seriali dal ricevitore RF sono a livelli logici digitali, quindi è collegato direttamente a uno dei pin di input dei dati di Arduino. Il pin è configurato nel software per eseguire una funzione di interruzione al cambio in modo da poter misurare le larghezze di impulso. L'uscita GPS TXD è direttamente collegata all'ingresso Arduino RX.

Ci sono due interruttori utilizzati. Come accennato in precedenza, un interruttore di contatto momentaneo consente l'impostazione dell'offset UTC. L'interruttore può essere premuto in qualsiasi momento per accedere alla modalità di impostazione. Inizialmente, il display mostrerà un offset UTC non valido di "+77". Fare riferimento alla sezione "Software dell'orologio" per le istruzioni sull'impostazione dell'offset UTC.

Il secondo interruttore è un semplice interruttore on/off. Nella posizione "off" l'ora verrà visualizzata nel formato 12 ore (AM/PM) e nella posizione "on" l'ora verrà visualizzata nel formato 24 ore. Questo interruttore può essere modificato in qualsiasi momento per passare da un formato all'altro.

Se si desidera solo la funzione orologio, non è necessario collegare il modulo ricevitore RF. Se si desidera solo la funzione meteo, non è necessario collegare il GPS e i due interruttori.

Passaggio 8: software LCD

Tendo a utilizzare uno dei due tipi di interfacce LCD. Uno è l'interfaccia standard a 4 bit e l'altro è un'interfaccia a 3 fili che utilizza un registro a scorrimento. Ho progettato quell'interfaccia quando lavoravo con piccoli microcontrollori PIC che avevano un numero limitato di pin I/O. Ho usato l'interfaccia a 4 bit per questo progetto ma ho il mio file di inclusione LCD invece di utilizzare la libreria LCD Arduino generica. Ciò riduce il consumo di memoria e la complessità del codice e mi consente anche di modificare il codice per progetti specifici come questo.

Passaggio 9: software orologio

L'unità GPS emette frasi NMEA-0183 standard che sono stringhe ASCII che contengono una varietà di informazioni. Per questa applicazione ho scelto la frase GGA per ottenere le informazioni sull'ora perché questa è la frase che ho usato per un precedente progetto GPS. I campi di informazioni nelle frasi NMEA sono separati da virgole, quindi, dopo che l'intestazione della frase GGA è stata rilevata, il software normalmente conterebbe le virgole e richiamerebbe la routine appropriata per ogni campo di informazioni GPS desiderato. Qui sono necessarie solo le informazioni sull'ora e questo è nel campo dopo la prima virgola, quindi non è necessario alcun conteggio.

Le sei cifre dell'ora (HHMMSS) vengono memorizzate nel buffer e quindi elaborate dopo che sono state ricevute tutte. Il GPS potrebbe emettere alcuni messaggi incompleti all'inizio, quindi la routine di buffering verifica che ogni carattere sia un valore numerico ASCII. Se viene ricevuto un carattere errato, il messaggio viene scartato. Ciò può verificarsi anche in rare occasioni durante il normale funzionamento, in particolare se la comunicazione della porta seriale si interrompe leggermente. L'ho visto solo una volta e tutto quello che è successo è che il tempo si è fermato per un secondo e poi è saltato di due secondi invece di uno.

Se il software è configurato per visualizzare solo l'ora, la prima riga del display LCD visualizzerà l'ora locale e la seconda riga visualizzerà l'UTC. Per l'UTC il software invia semplicemente i caratteri ASCII direttamente alla routine di visualizzazione, con i due punti (:) inseriti in modo appropriato.

Per convertire l'ora UTC in ora locale, è necessario applicare l'offset UTC (fuso orario). Poiché l'ora UTC dal GPS è in formato ASCII, il software converte i caratteri dell'ora ASCII in decimale e quindi aggiunge l'offset UTC. L'offset UTC viene memorizzato come valore BCD positivo con un bit di segno, quindi viene prima convertito in un valore intero e quindi negato se il bit di segno è impostato. Una volta calcolato il valore dell'ora locale, viene utilizzata una tabella di ricerca per convertirlo in BCD, quindi il BCD viene riconvertito in ASCII per la visualizzazione. La tabella di ricerca deve gestire il formato UTC 24 ore e +/- 12 fusi orari. Per fare ciò, gli orari UTC da 0000 a 2300 occupano le 24 voci centrali nella tabella con 12 voci prima e 12 voci dopo per tenere conto dei fusi orari. Una tabella è in formato 12 ore, quindi ho anche aggiunto una tabella di ricerca per la parte AM/PM del display. L'altra tabella è in formato 24 ore. Come accennato in precedenza, un interruttore on/off consente di selezionare il formato 12 ore o 24 ore.

Il fuso orario viene recuperato dalla EEPROM durante l'inizializzazione e visualizzato brevemente. Se non è stato impostato almeno una volta, viene chiamata la routine di impostazione. La routine di impostazione può anche essere richiamata in qualsiasi momento premendo l'interruttore a contatto momentaneo. La routine di impostazione inizializzerà il display su "UTC OFFSET +77". Una breve pressione dell'interruttore cambierà il valore in "-00". Se è richiesto un fuso orario positivo, un'altra breve pressione cambierà il valore in "+00". Una pressione prolungata (> 1 secondo) sposterà la modalità di impostazione al passaggio successivo. A questo punto ogni pressione breve farà aumentare il valore dell'ora fino ad un massimo di 12. Dopo aver raggiunto il fuso orario desiderato, tenere premuto l'interruttore per più di 1 secondo e poi rilasciarlo. Il software salverà quindi il valore UTC in EEPROM e visualizzerà brevemente “OFFSET SAVED”. Se si commette un errore durante l'inserimento, è sufficiente uscire e premere nuovamente l'interruttore per ripristinarlo.

Il NEO-6M non richiede una buona correzione della posizione per emettere l'ora, quindi dovrebbe emettere messaggi non appena riceve un satellite. Fino ad allora il display visualizzerà “NESSUN DATO”.

Passaggio 10: software meteo

Il microcontrollore PIC ha la capacità di attivare/disattivare un timer utilizzando un impulso esterno. Lo stesso impulso in ingresso può essere utilizzato anche come interrupt esterno per segnalare una lettura della durata dell'impulso. L'Arduino non ha quella capacità esatta, quindi ho usato la funzione di interrupt-on-change. Su un fronte dell'impulso del messaggio RF il tempo di microsecondi corrente viene salvato dal gestore di interrupt. Sul fronte opposto viene calcolato il tempo trascorso per determinare l'ampiezza dell'impulso.

Il software ha una definizione "DEBUG" che consente la visualizzazione del formato dei dati grezzi dei messaggi ricevuti. C'è anche una definizione per specificare il pin di ingresso Arduino per il flusso seriale dal ricevitore RF. Il software è impostato per calcolare le impostazioni appropriate del registro di interruzione su modifica in base a questa definizione. Il calcolo funziona solo per i pin digitali Arduino. Potrebbe essere utilizzato un pin analogico, ma ciò richiederebbe una codifica rigida dei valori del registro.

Il gestore di interrupt determina se il conteggio acquisito è sufficientemente lungo da essere un impulso di avvio. Come accennato in precedenza, il divario tra più messaggi è di 2 ms, quindi questo è ciò che il software cerca. A causa di tutto il traffico a 433 MHz, lo screening iniziale nel software assicura che il tempo misurato sia di almeno 1,8 ms ma non superiore a 2,4 ms. Dopo che l'avvio è stato rilevato, il software cerca i bit di sincronizzazione (600us) e conta per assicurarsi che ne vengano ricevuti quattro. Una volta superati questi test, il software cerca i tempi di bit corretti di 200us e 400us.

I bit ricevuti vengono formati in byte e ogni byte viene salvato. Dopo la ricezione di sette byte, il checksum del messaggio viene verificato prima che sia consentita un'ulteriore elaborazione. Se devono essere emessi byte grezzi (modalità debug), i byte vengono convertiti in caratteri ASCII e inviati al display LCD. Se si desiderano output di umidità e temperatura, vengono eseguite le conversioni appropriate.

I due byte di dati centigradi nel messaggio RF vengono combinati insieme per formare un valore a 11 bit. La porzione inferiore viene spostata a sinistra di un bit per eliminare il bit di parità e per allinearlo con i bit nella porzione superiore. I due byte vengono formati in una variabile di parola a 16 bit e quindi il tutto viene spostato a destra di un bit per ottenere l'allineamento finale dei bit. La variabile word viene quindi convertita in una variabile a virgola mobile per i calcoli matematici.

Un grande vantaggio dell'utilizzo del C++ su Arduino rispetto al linguaggio assembly sul PIC è che semplifica i calcoli matematici. Come accennato in precedenza, la conversione in gradi centigradi è (C/10) -100. Il risultato viene convertito in una stringa e inviato al display LCD per la visualizzazione. Il calcolo Fahrenheit è (C * 1.8) + 32. Il risultato viene nuovamente convertito in una stringa e inviato al display LCD per la visualizzazione. In entrambi i casi, la conversione String include il segno negativo (se appropriato) e il punto decimale. Viene effettuato un controllo per il punto decimale per garantire che solo un carattere dopo il decimale venga inviato al display. Questo controllo è necessario perché la stringa può avere una lunghezza compresa tra 3 e 5 caratteri.

Ho due sensori AcuRite, quindi ho aggiunto un controllo nel software per assicurarmi che i dati per uno non sovrascrivano i dati per l'altro se il software è impostato per eseguire solo la funzione meteo. Il primo sensore ricevuto dopo l'accensione viene visualizzato sulla riga 1 e l'altro viene visualizzato sulla riga 2. Utilizzando la modalità di debug, posso vedere qual è l'ID per ciascun sensore in modo da poter effettuare un semplice controllo nel codice se solo voleva elaborare i dati di uno di loro.

Il software monitora lo stato della batteria (byte3) e visualizza un messaggio se indica una batteria scarica. Questo messaggio sovrascrive tutti gli altri dati per quel sensore.

Passaggio 11: display

display
display
display
display
display
display

Di seguito sono riportati alcuni esempi di visualizzazione per le varie funzioni. Ho alcuni altri Instructables ma la maggior parte dei miei progetti di microcontrollori PIC possono essere trovati sul mio sito Web all'indirizzo: www.boomerrules.wordpress.com

Consigliato: