Programarea jurnalului de temperatură cu Arduino Uno - Partea 2

În ultima metodă Arduino am construit un afișaj pentru temperatură și umiditate. Acest lucru este acum extins pentru a include stocarea datelor pe un card SD; respectivul moment în timp este, de asemenea, înregistrat pentru fiecare măsurare. Noile adăugiri sunt un scut pentru un card SD și un ceas în timp real. Afișajul poate rămâne pe Grove-Shield. Dacă doriți să utilizați jurnalul de date fără afișaj, îl puteți pur și simplu deconecta.

temperatură

Potrivit pentru: Avansat
Timp cerut: aproximativ 1,5 ore
Buget: cam 30 de euro
De ce ai nevoie: 1x Arduino - ceas Grove în timp real - RTC, 1x Arduino Shield - card SD V4, 1x baterie pentru ceas Grove în timp real, 1x card SD

Poate fi extins cu:-

Ce este cerut: Conexiune la internet, computer cu browser, sursă de alimentare pentru Arduino

Scutul SD

Descriere și instalare

Data loggerul își salvează datele pe un card SD, SDHC sau MicroSD standard (apoi cu un adaptor). Există un scut pentru acest lucru, care este conectat între Arduino și scutul de bază - scutul de bază rămâne sus datorită conectorului.

Bibliotecile necesare pentru scutul SD sunt deja incluse în Arduino Studio, deci nu trebuie instalate separat. Documentația poate fi găsită în referința Arduino:

Scrie date - salut lume

Scriem primele date pe card cu următorul program:

Sunt definite primele două variabile: SELECTED_CHIP specifică ce hardware este utilizat pentru SD-Shield. Valoarea poate fi obținută de la producătorul scutului SD. Numărul variabilelor este utilizat numai pentru a număra procesele de scriere continuă pentru a scrie numărul pe card.

În setup () se stabilește mai întâi o conexiune serială pentru depanare, apoi o conexiune la cardul SD. Metoda SD.begin () returnează dacă conexiunea ar putea fi stabilită cu succes.

Linia este construită în bucla () și este apoi scrisă pe cardul SD cu writeToSD (). Pentru aceasta folosim clasa String, care permite lucrul flexibil cu șiruri. Operatorul + conectează două șiruri, deci numărul variabilelor este mai întâi convertit într-un șir cu Șir (număr). Valoarea numărării este mărită cu unul și în cele din urmă așteptat o secundă.

Scrierea se întâmplă în writeToSD (). Acolo, un fișier este deschis sau creat mai întâi cu SD.open () dacă nu există încă (important: numele fișierului poate să nu depășească 8 caractere). FILE_WRITE indică faptul că fișierul trebuie deschis într-o manieră scriibilă.

Dacă deschiderea a avut succes, fișierul conține un obiect din clasa Fișier, cu care scriem linia compusă în buclă (). Apoi închidem din nou fișierul. Acest lucru asigură faptul că fișierul nu va fi deteriorat dacă cardul este îndepărtat între scrieri sau dacă alimentarea nu funcționează. Pentru depanare, ieșim și valoarea liniei pe interfața serială.

Dacă deschiderea nu a reușit (de exemplu, deoarece cardul SD lipsește), atunci fișierul este gol și un mesaj de eroare este afișat pe interfața serială.

Ceasul în timp real

Descriere și instalare

Spre deosebire de un PC, un Arduino nu are un ceas încorporat, deoarece nu este necesar pentru multe aplicații. Prin urmare, folosim modulul Grove RTC pentru data logger, care conține un cip DS1307 de ceas.

Ceasul în timp real necesită o sursă de tensiune suplimentară sub forma unei celule cu buton de 3V (CR1225), astfel încât timpul setat să fie păstrat chiar dacă Arduino în sine nu are putere. Dimpotrivă, acest lucru înseamnă că ceasul în timp real nu funcționează corect fără o baterie - deci nu puteți face fără el, chiar dacă Arduino rămâne conectat permanent la o sursă de alimentare. Comunicarea are loc prin intermediul sistemului de bus I²C, orice conexiune I²C poate fi utilizată.

Trebuie instalată o bibliotecă pentru ceasul în timp real ca și pentru afișaj:

Descărcați bibliotecile, apoi instalați-le prin meniul „Schiță” → „Includeți bibliotecă” → „Adăugați biblioteci .ZIP ...”.

Pentru toate bibliotecile există exemple de programe în „Fișier” → „Exemple”.

Setați și citiți ora

Pentru a seta ora, vom folosi propria schiță în loc de metoda setup () în programul final. În caz contrar, ora ar fi resetată de fiecare dată când este pornit Arduino:

În setup () deschidem mai întâi conexiunea la portul serial pentru a trimite ora către PC pentru verificare. Conexiunea la ceas este apoi deschisă cu clock.begin (), data, ora și ziua săptămânii sunt pregătite și trimise în cele din urmă către ceasul în timp real cu clock.setTime () (înlocuiți valorile cu ora curentă în prealabil;-)).

În bucla (), timpul este primul ieșit și apoi există o perioadă de așteptare de o secundă. În Arduino Studio ieșirea apare sub „Instrumente” → „Monitor serial”.

Important: Trimiterea programului către Arduino durează câteva secunde, deci este dificil să setați exact ora. Aceasta nu este o problemă pentru această aplicație - dacă o valoare măsurată este înregistrată la fiecare câteva minute pentru a înregistra cursul valorilor măsurate pe parcursul zilei, o abatere de câteva secunde nu face nicio diferență.

Programul definitiv de înregistrare a datelor

După ce am testat toate piesele o dată, putem extinde programul din ultimul tutorial:

Ce este nou cu acest program este că există două procese cu rate de ceas diferite. Afișajul trebuie actualizat de mai multe ori pe secundă pentru un afișaj curent și tranziții de culoare netede. Cu toate acestea, un minut este suficient pentru a scrie valorile măsurate pe card. Prin urmare, pauzele simple cu întârziere () nu mai sunt posibile.

Soluția: Funcția millis () poate fi utilizată pentru a interoga milisecundele care au trecut de la începutul Arduino. În lastDisplayUpdate și lastWrite, se salvează ultima dată când ecranul a fost actualizat sau când a fost scris pe cardul SD. Fiecare buclă de timp () este executată, se face o comparație dacă diferența dintre aceste valori și milis () este mai mare decât valorile DISPLAY_UPDATE_INTERVAL sau WRITE_INTERVAL și numai atunci acțiunile respective sunt executate. Variabilele lastWrite și lastDisplayUpdate sunt inițializate cu lungimea intervalului respectiv, astfel încât cele două acțiuni să aibă loc imediat când începe programul.

În cele din urmă, în bucla (), valorile sunt preluate mai întâi de la senzor și verificate. Dacă au apărut probleme la colectarea valorilor, se produce o eroare și executarea buclei () se termină în acest moment și începe din nou de la început (adică valorile sunt preluate din senzor din nou).

Apoi verifică dacă este timpul să actualizați din nou afișajul. Acesta este cazul dacă diferența dintre ora curentă și ultimulDisplayUpdate este mai mare decât DISPLAY_UPDATE_INTERVAL. Apoi, culoarea este determinată din nou și datele sunt trimise pe ecran. Din motive de lizibilitate, există acum metoda updateDisplay (). Apoi lastDisplayUpdate este setat la ora curentă.

La fel se întâmplă și pentru scrierea datelor pe cardul SD. Dacă ora ultimului proces de scriere este mai mare decât WRITE_INTERVAL, ora curentă este determinată de ceasul în timp real, datele sunt scrise pe cardul SD și lastWrite este setat la ora curentă.

Ora este determinată prin metoda getTime (), care interogă ora din ceasul în timp real și creează un șir cu data și ora. Operatorul + = adaugă valoarea șirului din dreapta la cea stângă.

evaluarea datelor

Datele sunt scrise într-un fișier numit datalog.csv și pot fi importate în Excel, LibreOffice Calc sau foi de calcul Google pentru evaluare.

Pur și simplu scoateți cardul SD din Arduino și citiți-l pe computer.