Cuprins:

Termometru de înregistrare DIY cu 2 senzori: 3 pași (cu imagini)
Termometru de înregistrare DIY cu 2 senzori: 3 pași (cu imagini)

Video: Termometru de înregistrare DIY cu 2 senzori: 3 pași (cu imagini)

Video: Termometru de înregistrare DIY cu 2 senzori: 3 pași (cu imagini)
Video: Cel mai IEFTIN și mai ”POPULAR” SMARTWATCH din ROMÂNIA 2024, Iulie
Anonim
Termometru DIY pentru logare cu 2 senzori
Termometru DIY pentru logare cu 2 senzori
Termometru de înregistrare DIY cu 2 senzori
Termometru de înregistrare DIY cu 2 senzori

Acest proiect este o îmbunătățire a proiectului meu anterior „DIY Logging Thermometer”. Înregistrează măsurătorile de temperatură pe un card micro SD.

Schimbări hardware

Am adăugat un senzor de temperatură DS18B20 la modulul de ceas în timp real, unde există dispoziții pe placa de circuit imprimat pentru acest dispozitiv; și a adăugat firul corespunzător de la pinul "DS" al RTC la D2 al Arduino.

Schimbări de software

Apoi am adăugat și modificat software-ul. Principalele modificări sunt:

Afișajul LCD arată două temperaturi „In” și „Out”.

Fișierele jurnal înregistrate pe cardul SD au două câmpuri de temperatură, „temperature In” și „temperature Out”.

Datorită înregistrării mai lungi pe cardul SD, tampoanele de lucru pentru EEPROM erau mai mari și, ca urmare, am început să am probleme de conflict de memorie. Am făcut o serie de modificări menite să reducă utilizarea memoriei dinamice, inclusiv utilizarea matricelor de caractere pentru toate șirurile în loc de obiectul String.

Partea software-ului care primește temperaturi are modificări majore, dintre care multe sunt legate de identificarea sondei care este „înăuntru” și care este „în afara”. Această identificare este în mare parte automată. Dacă dintr-un anumit motiv sondele sunt schimbate, acesta poate fi corectat deconectând sonda „out” și apoi conectându-l din nou. Nu am experimentat eu această inversare. Programatorul sau utilizatorul nu trebuie să introducă adresele senzorului, software-ul descoperă singur adresele senzorului de temperatură.

Conform testelor pe care le-am făcut, identificarea sondelor de temperatură și răspunsul la îndepărtarea și înlocuirea cardului SD, funcționează în continuare fără probleme.

Pasul 1: Dezvoltare software

Acest pas vă oferă software-ul complet pentru proiectul finalizat. L-am compilat folosind Arduino IDE 1.6.12. Folosește 21, 400 de octeți de memorie de program (69%) și 1, 278 de octeți de memorie dinamică (62%).

Am pus comentarii în cod, în speranța că va clarifica ce se întâmplă.

Pasul 2: Lucrul cu doi senzori de temperatură - Detalii

Acest software folosește biblioteca „OneWire”. Nu folosește nicio „DallasTemperature” sau biblioteci similare. În schimb, comenzile către și datele de la senzorii de temperatură sunt realizate de schiță și pot fi văzute și înțelese destul de ușor. Am găsit o listă utilă a comenzilor bibliotecii OneWire la

www.pjrc.com/teensy/td_libs_OneWire.html

Atunci când există doi (sau mai mulți) senzori de temperatură, devine necesar să se identifice care este care.

Am numit cei doi senzori ai mei „in” și „out”, care este tipic unităților comerciale care au un senzor în modulul de afișare care este în mod normal „în interior”, iar celălalt senzor de pe un cablu, astfel încât să poată fi pus pe cealaltă parte a unui perete exterior și astfel să fie „în afara”.

Abordarea obișnuită a identificării diferitelor sonde este de a descoperi adresele dispozitivului și de a le introduce în software împreună cu o etichetă de identificare. Toate celelalte proiecte pe care le-am văzut folosesc această abordare, indiferent dacă folosesc sau nu biblioteca DallasTemperature.

Intenția mea a fost ca software-ul să identifice automat senzorii și să-i aloce corect la „in” și „out”. Acest lucru este suficient de ușor de făcut, punându-le pe ace Arduino separate. În acest proiect, A0 la A3 și A6 și A7 sunt toate neutilizate, așa că una dintre acestea ar fi putut fi folosită în acest caz. Cu toate acestea, am reușit să am identificarea automată cu senzorii pe ambele pe același autobuz OneWire.

Funcționează așa.

Biblioteca OneWire are comanda „OneWireObject.search (address)” unde „address” este o matrice de 8 octeți și „OneWireObject” este numele unei instanțe a obiectului OneWire care a fost creat anterior. Poate avea orice nume doriți. Al meu se numește „ds”. Când lansați această comandă „căutare”, biblioteca OneWire efectuează unele semnalizări pe magistrala cu un singur fir. Dacă găsește un senzor care răspunde, returnează o valoare booleană „TRUE” și completează matricea „adresă” cu identificatorul unic de 8 octeți al senzorului. Acest identificator include un cod de familie (la început) și o sumă de verificare (la sfârșit). Între acestea se află 6 octeți care identifică în mod unic senzorul din familia sa.

Un rezultat (adresa și returnarea TRUE) este obținut de fiecare dată când este dată această comandă, parcurgând toate dispozitivele de pe magistrala OneWire. Odată ce fiecare dispozitiv a răspuns, data viitoare când este emisă „căutare”, returnarea este „FALSĂ”, indicând că fiecare dispozitiv din autobuz a răspuns deja. Dacă „căutarea” este emisă din nou, primul dispozitiv răspunde din nou - și așa mai departe la nesfârșit. Dispozitivele răspund întotdeauna în aceeași ordine. Ordinea răspunsurilor se bazează pe identificatorii dispozitivelor de pe magistrala OneWire. Se pare că este o căutare binară începând de la cei mai puțin semnificativi biți din identificatorii dispozitivului. Protocolul utilizat pentru a găsi acești identificatori este destul de complex și este descris în paginile 51 - 54 din documentul „Cartea standardelor iButton”, care este un document pdf la https://pdfserv.maximintegrated.com/en/an/AN937.pd …

Am testat acest proces de căutare cu 1 până la 11 senzori pe o singură magistrală și am găsit că ordinea de răspuns pentru un anumit set de dispozitive a fost întotdeauna aceeași, dar când am adăugat un dispozitiv nou la sfârșitul magistralei, nu a existat nicio cale Aș putea prezice unde va apărea în ordinea de căutare. De exemplu, cel de-al 11-lea senzor pe care l-am adăugat a intrat în poziția nr.5; iar primul senzor pe care l-am pus în autobuz a fost ultimul în ordinea de căutare.

În acest proiect cu doi senzori, unul dintre ei este lipit în loc pe modulul RTC; cealaltă este conectată folosind un antet masculin pe placă și un antet feminin pe cablu. Poate fi ușor detașat.

Când senzorul de pe cablu (senzorul „out”) este detașat, comanda „search” produce alternativ „TRUE” și „FALSE”.

Când senzorul de pe cablu este atașat, comanda „căutare” produce un ciclu în 3 trepte, cu două „TRUE” și unul „FALSE”.

Procedura mea este de a emite 1, 2 sau 3 comenzi „căutare”, până când se returnează un rezultat FALS. Apoi mai emit 2 comenzi de „căutare”. Dacă al doilea eșuează (adică FALS) știu că există un singur senzor pe autobuz și că este senzorul „in”. Identitatea dispozitivului este înregistrată și alocată senzorului „in”.

Mai târziu, dacă atât prima, cât și a doua revenire sunt ADEVĂRATE, știu că există doi senzori pe autobuz. Verific care dintre ele are o identitate egală cu senzorul „in” și îl aloc pe celălalt ca senzor „out”.

Celălalt punct minor este că strângerea rezultatelor de la cei doi senzori se face prin trimiterea „conversiei inițiale” prin ceea ce este cunoscut sub numele de comanda „sări peste ROM”. Avem opțiunea de a trimite comenzi către un singur dispozitiv (folosind identificatorul său unic) sau către toate dispozitivele de pe magistrală (săriți ROM). Codul arată astfel:

ds.reset (); //

// trimite comanda „sari peste ROM” (deci următoarea comandă funcționează în ambii senzori) ds.write (0xCC); // Omiteți comanda ROM ds.write (0x44, 0); // începe conversia în ambele sonde state_temperatura = wait_convert; // mergeți la starea de întârziere

Când timpul de întârziere necesar a trecut, temperaturile sunt primite de la fiecare senzor individual. Iată codul pentru al doilea senzor (adică senzorul OUT).

if (flag2) {

prezent = ds.reset (); ds.select (DS18B20_addr_out); ds.write (0xBE); // Citiți Scratchpad-ul datelor de sondă „out” [0] = ds.read (); date [1] = ds.read (); temperature_out = (date [1] << 8) + date [0]; temperature_out = (6 * temperature_out) + temperature_out / 4; // multiplicați cu 6,25} else {// not flag2 - ie Senzor de ieșire neconectat temperature_out = 30000; // fixați la 300,00 C dacă senzorul de temperatură nu funcționează} // sfârșitul lui if (flag2)

Am dezvoltat majoritatea acestui software într-o schiță de sine stătătoare care pur și simplu avea senzorii de temperatură, fără complicațiile suportului pentru cardurile LCD, RTC și SD. Această schiță de dezvoltare se află în fișierul de mai jos.

Pasul 3: Rezultate preliminare

Rezultate preliminare
Rezultate preliminare

Această diagramă este o combinație a primelor două zile parțiale de lecturi.

Recomandat: