Cuprins:

Afișare timp și vreme 3-în-1 Arduino: 11 pași
Afișare timp și vreme 3-în-1 Arduino: 11 pași

Video: Afișare timp și vreme 3-în-1 Arduino: 11 pași

Video: Afișare timp și vreme 3-în-1 Arduino: 11 pași
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Noiembrie
Anonim

De Boomer48 Urmărește mai multe de la autor:

Folosind ATtiny85
Folosind ATtiny85
Folosind ATtiny85
Folosind ATtiny85
Instrument de partiționare a plăcilor și de tăiere a poligonului
Instrument de partiționare a plăcilor și de tăiere a poligonului
Instrument de partiționare și tăiere a poligonului cu alimentare cu pi
Instrument de partiționare și tăiere a poligonului cu alimentare cu pi
Comenzi digitale pentru un amplificator audio manual
Comenzi digitale pentru un amplificator audio manual
Comenzi digitale pentru un amplificator audio manual
Comenzi digitale pentru un amplificator audio manual

Îmi plac microcontrolerele PIC și îmi place programarea în limbaj de asamblare. De fapt, în ultimii doi ani, am postat aproximativ 40 de proiecte pe site-ul meu pe baza acestei combinații. Recent, comandam câteva piese de la unul dintre furnizorii mei preferați din SUA și am văzut un Arduino Nano, cu un cablu de programare, cu doar 1,20 USD mai mult decât un cip de procesor ATMEGA328 gol. Așa că am cumpărat câteva dintre ele. Apoi am descărcat Arduino IDE și mi-am scos praful de memorie de programare ‘C ++’.

Acest proiect este un amestec de ceas care utilizează GPS pentru sincronizare și un receptor RF care decodează mesajele meteo de la un senzor comun AcuRite. Rezultatul este o afișare a timpului și temperaturii la scară mică. Ceasurile GPS și rutinele meteo sunt configurate ca fișiere separate, astfel încât este ușor să intrați în rutina principală și să o configurați pentru a face doar funcția ceas sau doar funcția meteo. Descomentați doar „#define” corespunzător în partea de sus a rutinei principale, dacă doriți doar una dintre funcții.

Dacă sunt utilizate ambele funcții, atunci linia de sus a ecranului LCD afișează ora locală, iar linia de jos a ecranului LCD afișează umiditatea și temperatura atât în grade Celsius, cât și în grade Fahrenheit. Dacă este utilizată doar funcția de ceas, atunci linia de sus afișează ora locală, iar linia de jos afișează UTC. Dacă este utilizată doar funcția meteo, atunci linia de sus afișează primul senzor primit și linia de jos afișează orice alt senzor primit. Am adăugat această capacitate pentru că am doi senzori de vreme.

Pasul 1: Senzor meteo

Senzor de vreme
Senzor de vreme
Senzor de vreme
Senzor de vreme
Senzor de vreme
Senzor de vreme

Senzorul meteorologic AcuRite utilizat aici trimite informații despre temperatură și umiditate la fiecare 16 secunde. Pe spate este afișat un număr de model 000592TXR, dar este publicat de obicei ca model 06002M. Acest senzor este utilizat de o mulțime de modele diferite de stații meteo, așa că este ușor de găsit și le-am putut obține pe eBay pentru sub 20 USD. AcuRite vinde senzori similari pentru unele dintre stațiile meteo, dar pot sau nu să adere la același protocol de comunicare. Există unele indicații pe web că senzorul de temperatură 00606 utilizează același format de mesaj, dar cu un octet de umiditate nevalid.

Așa cum se vede în prima formă de undă prezentată mai sus, mesajele meteo sunt trimise în rafale cu un decalaj de 2 ms între mesajele succesive. A doua formă de undă prezentată mai sus extinde o parte a unui mesaj pentru a vedea duratele și tiparele de biți. Există patru biți de sincronizare cu o înălțime de aproximativ 600us, urmat de un nivel scăzut de 600us. Biții de date sunt reprezentați de 400us înalt urmat de 200us scăzut (1) sau 200us înalt urmat de 400us scăzut (0).

Formatul mesajului este format din 7 octeți de date. Primii doi octeți sunt ID-ul senzorului și acestea nu se modifică (de exemplu: nu folosește un cod de rulare). Ultimul octet este o sumă de control aditivă simplă a primilor șase octeți. Al treilea octet este un indicator al nivelului bateriei și ar trebui să aibă întotdeauna 44 hex dacă bateria este bună. Al patrulea octet este umiditatea și este o valoare nedescalată între 0 și 99. Este important să rețineți că cel mai semnificativ bit de octeți 4, 5 și 6 este un bit de paritate și nu face parte din măsurare valori. Octetii 5 și 6 sunt temperatura scalată (Celsius), cei 4 biți inferiori ai octetului 5 fiind concatenați cu cei 7 biți inferiori ai octetului 6 pentru a forma o valoare de 11 biți. Temperatura este întotdeauna reprezentată ca un număr pozitiv și devine negativă numai atunci când se aplică scalarea. Scalarea este (C / 10) - 100. Împărțirea la 10 este necesară deoarece rezoluția temperaturii este în zecimi de grad. Scăderea este necesară deoarece 100 este adăugat de senzor pentru a menține valoarea transmisă pozitivă.

Pasul 2: receptor RF

Receptor RF
Receptor RF
Receptor RF
Receptor RF

Modulul RF pe care îl folosesc pentru acest proiect este RXB6. Este un receptor super heterodin spre deosebire de receptorii super regenerativi mai puțin de dorit. Dacă vă uitați la modulele RF ieftine de acolo, veți găsi că plăcile emițătorului și receptorului sunt adesea grupate împreună. Majoritatea acestor receptoare incluse sunt tipuri super regenerative, astfel încât tind să aibă caracteristici de performanță mult mai mici (inclusiv intervalul) decât receptoarele super heterodine. Avem nevoie doar de modulul receptor pentru acest proiect, deoarece vom primi semnale de la un transmițător cu senzor meteo.

Pasul 3: Antene RF

Antene RF
Antene RF

RXB6 nu vine cu o antenă. Puteți cumpăra unele elicoidale destul de ieftin, dar este, de asemenea, ușor să vă creați propria antenă. De fapt, un cablu jumper pentru panou poate fi strecurat pe știftul antenei modulului dacă nu doriți să fiți prea fantezi. În mod ideal, o antenă cu sârmă dreaptă ar avea o lungime de undă de 1/4, care funcționează la aproximativ 6,8 inci. Am făcut inițial treaba cu sârmă și nu am avut nicio problemă să-mi ridic senzorul exterior, chiar dacă atelierul meu de electronice se află în subsolul meu.

O altă posibilitate este să-ți faci propria antenă elicoidală. Există o varietate de planuri pentru asta pe web, dar cel prezentat în imaginea de mai sus este ceea ce am făcut. Am folosit niște fire de miez solid dintr-o bucată de cablu Ethernet și l-am înfășurat în jurul tijei netede a burghiului de 5/32 inch. Lăsați izolația activă, cu excepția vârfului care se lipeste pe placa RF. Veți avea nevoie de 20 de ture. De asemenea, puteți utiliza un burghiu de 7/32 inch și înfășurați în schimb 17 ture. Oricare dintre acestea va funcționa probabil foarte bine pentru intervalele pe care este probabil să le aveți pentru senzorii dvs. Adevărata cheie este să ai un receptor RF bun pentru început. Senzorii AcuRite au, de asemenea, emițătoare destul de puternice.

Pasul 4: Protocol de comunicare RF

Există câteva tehnici de modulare diferite pentru transmiterea datelor, dar acești senzori folosesc cel mai simplu, care este OOK (pornire-oprire-tastare) sau ASK (amplitudine-schimbare-tastare). Deoarece avem de-a face cu biți de date 0/1 în acest exemplu, amplitudinea este completă sau completă. Deci, în scopurile noastre, OOK și ASK sunt aceleași, deoarece OOK înseamnă că operatorul RF este complet pornit sau complet oprit. Formatul mesajului este în general definit de producătorul dispozitivului de transmisie și poate utiliza aproape orice viteză de transmisie, orice stil de formatare a biților și orice lungime a mesajului. Banda de 433 MHz este plină de transmisii pentru lucruri precum contoare inteligente etc., astfel încât software-ul trebuie să fie reglat pentru a filtra doar formatul de mesaj pe care dorim să îl folosim.

Pasul 5: Date de timp

Date de timp
Date de timp

Folosesc o unitate GPS ieftină pentru a obține date de timp exacte care vor reporni automat după o pană de curent. Am mai multe unități GPS (fără afișaje) care emit propozițiile standard NMEA, dar cea mai mică și cea mai ieftină dintre unitățile pe care le am este NEO-6M. Modulul NEO-6M este ușor de interfațat cu Arduino, deoarece folosește un port serial la nivel TTL. Singura diferență reală este că standardul NMEA specifică o rată de transmisie în serie de 4800, dar NEO-6M este implicit la 9600 de baud. Puteți rula programul gratuit „u-center” pentru a modifica rata de transmisie, dar tocmai l-am lăsat la valoarea implicită din fabrică. Există, de asemenea, un program utilitar gratuit numit GPSInfo (lansat de Globalsat), care este foarte util pentru vizualizarea informațiilor GPS pe computer. Puteți conecta unitatea GPS la un cablu USB-TTL standard pentru verificare sau configurare cu ajutorul unui computer. Rețineți că cipul GPS de pe modul funcționează de fapt la 3,3 volți (printr-un regulator de tensiune integrat), deci dacă doriți să vă conectați la portul RXD, ar trebui să treceți de la 5 volți la nivel. Portul TXD se poate conecta direct la Arduino sau PC.

Pasul 6: Fusele orare

Afișarea timpului GPS este un lucru ușor de făcut, atâta timp cât doriți doar să afișați UTC (Universal Time Coordinated). Frazele NMEA sunt compuse din caractere ASCII care pot fi transmise direct pe ecranul LCD. Porțiunea de timp este în formatul HHMMSS. FF (ore, minute, secunde și secunde fracționate). Pentru ceasul nostru partea fracțională nu este utilă, așa că tot ce trebuie să avem este de șase caractere. Problema este că trebuie să vă convertiți la ora locală și la un format AM / PM de 12 ore, dacă doriți acest lucru. Dar, uneori, problemele fac viața interesantă, deci este vorba despre acea porțiune a software-ului.

În ceea ce privește fusurile orare, ați putea crede că ar fi pur și simplu 24 dintre ele, 12 dintre ele la est de locația UTC (+ zone) și 12 dintre ele la vest de locația UTC (- zone). De fapt, există câteva oddball care sunt ore fracționate și un cuplu care depășește „limita” de 12 ore. Dacă se întâmplă să locuiți într-una din acele zone, îmi cer scuze deoarece software-ul meu reprezintă doar cele 24 de zone întregi. Există, de asemenea, unii dintre noi care folosesc ora de vară o parte a anului, dar acest lucru nu este contabilizat automat în software. Acest lucru ar necesita un tabel de căutare cu date viitoare, o complexitate suplimentară în software și necesitatea de a actualiza software-ul în cazul în care săptămânile din an pentru trecerea la schimbare. În schimb, hardware-ul folosește un comutator de contact momentan pentru a permite setarea ușoară a fusului orar (decalaj UTC).

Pasul 7: Schematic

Schematic
Schematic

Schema este prezentată mai sus și include conexiunile pentru o interfață LCD 1602 pe 4 biți. Datele seriale de la receptorul RF sunt la niveluri logice digitale, deci sunt conectate direct la unul dintre pinii de intrare de date Arduino. Pinul este configurat în software pentru a efectua o funcție de întrerupere la schimbare, astfel încât să putem măsura lățimile impulsurilor. Ieșirea GPS TXD este conectată direct la intrarea Arduino RX.

Există două comutatoare utilizate. După cum sa menționat mai devreme, un comutator de contact momentan permite setarea decalajului UTC. Comutatorul poate fi apăsat în orice moment pentru a intra în modul setat. Inițial, afișajul va afișa un offset UTC nevalid de „+77”. Consultați secțiunea „Software ceas” pentru instrucțiuni de setare a decalajului UTC.

Al doilea comutator este un comutator simplu de pornire / oprire. În poziția „oprit”, ora va fi afișată în format de 12 ore (AM / PM), iar în poziția „pornit”, ora va fi afișată în format de 24 de ore. Acest comutator poate fi schimbat în orice moment pentru a comuta între formate.

Dacă se dorește doar funcția de ceas, atunci modulul receptorului RF nu trebuie conectat. Dacă se dorește doar funcția meteo, GPS-ul și cele două comutatoare nu trebuie conectate.

Pasul 8: Software LCD

Tind să folosesc unul dintre cele două tipuri de interfețe LCD. Una este interfața standard pe 4 biți, iar cealaltă este o interfață cu 3 fire care utilizează un registru de schimbare. Am proiectat acea interfață când lucram cu microcontrolere PIC mici care aveau un număr limitat de pini I / O. Am folosit interfața de 4 biți pentru acest proiect, dar am propriul meu fișier LCD include în loc să folosesc biblioteca generică Arduino LCD. Aceasta reduce consumul de memorie și complexitatea codului și îmi permite, de asemenea, să modific codul pentru proiecte specifice ca acesta.

Pasul 9: Software ceas

Unitatea GPS transmite propoziții standard NMEA-0183 care sunt șiruri ASCII care conțin o varietate de informații. Pentru această aplicație am ales propoziția GGA pentru a obține informații despre timp, deoarece aceasta este propoziția pe care am folosit-o pentru un proiect GPS anterior. Câmpurile de informații din propozițiile NMEA sunt separate prin virgule, astfel încât, după detectarea antetului propoziției GGA, software-ul ar număra virgule în mod normal și ar apela la rutina adecvată pentru fiecare câmp dorit de informații GPS. Doar informațiile despre timp sunt necesare aici și acestea sunt în câmp după prima virgulă, deci nu este nevoie de numărare.

Cele șase cifre de timp (HHMMSS) sunt tamponate și apoi procesate după primirea tuturor. GPS-ul poate emite câteva mesaje incomplete din timp, astfel încât rutina de tamponare verifică dacă fiecare caracter este o valoare numerică ASCII. Dacă se primește un caracter rău, mesajul este eliminat. Acest lucru se poate întâmpla și în cazuri rare în timpul funcționării normale, mai ales dacă comunicarea portului serial scade puțin. Am văzut asta o singură dată și tot ce s-a întâmplat este că timpul s-a oprit o secundă și apoi a sărit două secunde în loc de una.

Dacă software-ul este configurat să afișeze numai ora, atunci prima linie a ecranului LCD va afișa ora locală și a doua linie va afișa UTC. Pentru UTC, software-ul trimite doar caracterele ASCII direct la rutina de afișare, cu punctele (:) inserate corespunzător.

Pentru a converti UTC la ora locală, trebuie aplicat decalajul UTC (fusul orar). Deoarece ora UTC de la GPS este în format ASCII, software-ul convertește caracterele orei ASCII în zecimal și apoi adaugă decalajul UTC. Decalajul UTC este stocat ca o valoare BCD pozitivă cu un bit de semn, deci este mai întâi convertit la o valoare întreagă și apoi negat dacă bitul de semn este setat. Odată calculată valoarea orei orei locale, se utilizează un tabel de căutare pentru ao converti în BCD, iar apoi BCD este convertit înapoi în ASCII pentru afișare. Tabelul de căutare trebuie să gestioneze formatul UTC 24 de ore, precum și +/- 12 fusuri orare. Pentru a face acest lucru, orele UTC de la 0000 la 2300 ocupă cele 24 de intrări centrale din tabel cu 12 intrări înainte și 12 intrări după, pentru a ține cont de fusurile orare. Un tabel este în format de 12 ore, așa că am adăugat și un tabel de căutare pentru partea AM / PM a afișajului. Celălalt tabel este în format de 24 de ore. După cum sa menționat mai devreme, un comutator de pornire / oprire permite selectarea formatului de 12 sau 24 de ore.

Fusul orar este recuperat din EEPROM în timpul inițializării și afișat pe scurt. Dacă nu a fost setat măcar o dată, atunci se apelează rutina de setare. Rutina de setare poate fi apelată și în orice moment prin apăsarea comutatorului de contact momentan. Rutina de setare va inițializa afișajul la „UTC OFFSET +77”. O apăsare scurtă a comutatorului va schimba valoarea la „-00”. Dacă este necesar un fus orar pozitiv, atunci o altă apăsare scurtă va schimba valoarea la „+00”. O apăsare lungă (> 1 secundă) va muta modul de setare la pasul următor. În acest moment, fiecare apăsare scurtă va crește valoarea timpului până la maximum 12. După ce atingeți fusul orar dorit, apăsați și țineți apăsat comutatorul mai mult de 1 secundă și apoi eliberați-l. Software-ul va salva apoi valoarea UTC în EEPROM și va afișa pe scurt „OFFSET SAVED”. Dacă faceți o greșeală în timpul intrării, pur și simplu ieșiți și apoi apăsați din nou comutatorul pentru a-l reseta.

NEO-6M nu necesită o corecție bună a poziției pentru a transmite ora, așa că ar trebui să emită mesaje imediat ce primește un satelit. Până atunci, afișajul va citi „FĂRĂ DATE”.

Pasul 10: Software meteo

Microcontrolerul PIC are capacitatea de a porni / dezactiva un temporizator folosind un impuls extern. Același impuls de intrare poate fi folosit și ca întrerupere externă pentru a semnaliza citirea duratei impulsului. Arduino nu are acea capacitate exactă, așa că am folosit funcția de întrerupere la schimbare. Pe o margine a impulsului mesajului RF, timpul curent de microsecundă este salvat de către manipulatorul de întreruperi. Pe marginea opusă, timpul scurs este calculat pentru a determina lățimea impulsului.

Software-ul are o definiție „DEBUG” care permite afișarea formatului de date brute al mesajelor primite. Există, de asemenea, o definiție pentru a specifica pinul de intrare Arduino pentru fluxul serial de la receptorul RF. Software-ul este configurat pentru a calcula setările corespunzătoare ale registrului de întrerupere-schimbare pe baza acestei definiri. Calculul funcționează numai pentru pinii digitali Arduino. În schimb, ar putea fi utilizat un pin analogic, dar care ar necesita o codificare dură a valorilor registrului.

Manipulatorul de întreruperi determină dacă numărul capturat este suficient de lung pentru a fi un impuls de pornire. Așa cum am menționat mai devreme, decalajul dintre mai multe mesaje este de 2 ms, astfel încât software-ul caută. Datorită întregului trafic de 433 MHz, ecranarea inițială din software asigură faptul că timpul măsurat este de cel puțin 1,8 ms, dar nu mai mare de 2,4 ms. După detectarea pornirii, software-ul caută biții de sincronizare (600us) și contează pentru a vă asigura că patru dintre ei sunt primiți. Odată ce aceste teste sunt trecute, software-ul caută timpii de biți corespunzători de 200us și 400us.

Biții primiți sunt formați în octeți și fiecare octet este salvat. După primirea a șapte octeți, suma de verificare a mesajului este verificată înainte de a fi permisă prelucrarea ulterioară. Dacă vor fi scoși octeți bruti (modul de depanare), atunci octeții sunt convertiți în caractere ASCII și trimise pe LCD. Dacă se doresc ieșiri de umiditate și temperatură, atunci se efectuează conversiile corespunzătoare.

Cei doi octeți de date Centigrade din mesajul RF sunt amestecați împreună pentru a forma o valoare de 11 biți. Porțiunea inferioară este deplasată la stânga cu un bit pentru a elimina bitul de paritate și pentru a-l alinia cu biții din porțiunea superioară. Cei doi octeți sunt formați într-o variabilă de cuvânt de 16 biți și apoi întregul lucru este deplasat corect un bit pentru a obține alinierea de biți finală. Cuvântul variabilă este apoi convertit într-o variabilă în virgulă mobilă pentru calculele matematice.

Un mare avantaj al utilizării C ++ pe Arduino versus limbajul de asamblare pe PIC este că simplifică calculele matematice. După cum sa menționat anterior, conversia Centigrade este (C / 10) -100. Rezultatul este convertit într-un șir și trimis pe ecranul LCD pentru afișare. Calculul Fahrenheit este (C * 1,8) + 32. Rezultatul este din nou convertit într-un șir și trimis pe ecranul LCD pentru afișare. În ambele cazuri, conversia șirului include semnul negativ (dacă este cazul) și punctul zecimal. Se verifică punctul zecimal pentru a se asigura că numai un caracter după zecimală este trimis pe afișaj. Această verificare este necesară deoarece șirul poate varia de la 3 la 5 caractere în lungime.

Am doi senzori AcuRite, așa că am adăugat o verificare în software pentru a mă asigura că datele pentru unul nu suprascrie datele pentru celălalt, dacă software-ul este setat să funcționeze doar funcția meteo. Primul senzor primit după pornire este afișat pe linia 1, iar celălalt este afișat pe linia 2. Prin utilizarea modului de depanare, pot vedea care este ID-ul pentru fiecare senzor, așa că aș putea face o verificare simplă în cod dacă doar a vrut să proceseze date de la unul dintre ei.

Software-ul monitorizează starea bateriei (octet3) și afișează un mesaj dacă indică o baterie descărcată. Acest mesaj suprascrie toate celelalte date pentru senzorul respectiv.

Pasul 11: Afișează

Afișează
Afișează
Afișează
Afișează
Afișează
Afișează

Iată câteva exemple de afișare pentru diferitele funcții. Am câteva alte instrumente, dar majoritatea proiectelor mele de microcontroler PIC pot fi găsite pe site-ul meu web la: www.boomerrules.wordpress.com

Recomandat: