Sari la conținut
ELFORUM - Forumul electronistilor

DS18B20 interpretare temperaturi negative


XAN77

Postări Recomandate

Sunt într-o dilemă. Nici nu am mai programat de ceva timp și nu văd încă problema.

Datele problemei sunt următoarele:

Am un esp01 cu senzori 18b20 care transmit MQTT la un broker temperaturile sub forma:

client.publish("foisor/esp8266/ds18b20/exterior", String(exterior,1).c_str(), true) ;

unde exterior este de tip float

 

La un client care folosește acea informație, un ceas ce afișează temperatura pe o matrice led de 4x8 cu 7219 citesc datele cu:

if (topic == "foisor/esp8266/ds18b20/exterior") ti   = ( payload[0] - 48 ) * 10  +  ( payload[1] - 48 );

unde ti este de tip int

 

Am aflat că nu e ok acum că a venit frigul. Mă așteptam eu să am probleme la negative dar dacă am programat ceasu ăsta vara am zis na, e timp :D Am impresia că și sub +10 grade îmi afișa eronat, doar la temperaturi pozitive și peste 9.9 afisa ok, eu afisand doar grade intregi fara zecimale.

După ce verific dacă ti e mai mic ca 0 ca să afișez ”-” în față, afisarea o fac cu:

  matrix.drawChar(8,0, ti/10+48, HIGH,LOW,1);
  matrix.drawChar(14,0, ti%10+48, HIGH,LOW,1);

Acum sunt -3,2 grade și mie îmi arată -.)

Un sfat o părere ?

Link spre comentariu
  • Răspunsuri 27
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • zvonacfirst

    8

  • nico_2010

    6

  • XAN77

    4

  • hixpp02

    3

Top autori în acest subiect

Imagini postate

Trebuie transformat inainte de afisare temperatura negativa asa cum o transmite DS (cu 1 in fata - semnul -) in pozitiva

Ceva asa am facut eu.

if (bitRead(t_rea, 15)) { // daca e negativ
        int_temp = t_rea >> 4;
        int_temp = int_temp | 0xF000;
        for(int i = 0; i <= 15; i++) {
           bitWrite(int_temp, i, !bitRead(int_temp, i));
        } 
        tsgn = 16;
        if (!fr_temp ) {
             int_temp = int_temp + 1;
        }
     }
     else {
        int_temp = t_rea;
        tsgn = 10;
     }

 

Editat de Kreator
Link spre comentariu

Gata am rezolvat vă mulțumesc. La subscribe la citire pun datele într-un char array iar la afișare afișez fiecare caracter, biblioteca matricei de leduri are funcție de drawchar.

Editat de XAN77
Link spre comentariu
  • 1 an mai târziu...

Postarea mea este legata tot de senzorul DS18B20. Postez aici pentru a nu deschide un topic nou. Daca initiatorul acestui topic va fi deranjat, am sa rog adminul sa stearga postarea mea.
Despre ce este vorba: am un lot de vreo 15 senzori DS18B20, cumparati toti odata cu vreo doi ani in urma de la un magazin de incredere, pe care nu i-am folosit pana recent. Eu prefer senzorii analogici LM35.

Acum, nemaiavand LM35, am trecut la cei digitali. Ma asteptam, pentru ca asa am citit, sa fie calibrati din fabrica. Am ramas surprins de faptul ca trebuie sa aplic un offset de -3 grade pentru a afisa temperatura corecta. Biblioteca utilizata este DallasTemperature.h versiunea 3.9.0, adica ultima.
Multumesc pentru eventuale sugestii.

 

sensors.requestTemperatures();
float tempCelsius = sensors.getTempCByIndex(0);
tempC = (float)tempCelsius -3;

 

Link spre comentariu

Eu la 18b20 n-am observat pana acum sa aiba un decalaj asa de mare, max 1 grad, dar si ala foarte rar. Ciudat, daca sunt originali 100% 3 grade este mult. Eu odata n-am fost atent si am montat un 18b20p in loc de 18b20...si ma miram ce nu merge. Oricum ar fi bine sa fiti sigur ca sunt originali, o verificare nu strica.

Link spre comentariu
Acum 33 minute, hixpp02 a spus:

Oricum ar fi bine sa fiti sigur ca sunt originali, o verificare nu strica.

Luati de la TME.

 

Acum 5 minute, nico_2010 a spus:

Schimba senzorul.

Am scris ca am vreo 15 buc luati in aceeasi comanda. I-am testat pe toti.

Solutia este sa imi incerc norocul pe Maica Domnului. Ca sa am cu ce compara.

Link spre comentariu
Acum 7 ore, nico_2010 a spus:

La ce distanta este senzorul fata de placa Arduino?

Este WEMOS pe un breadboard iar senzorul este relativ aproape, cam la o lungime de fir de conexiune din cel scurt.

 

Acum 47 minute, antemir a spus:

Daca faci 10 citiri la interval de 100 ms (să zicem) ce valori ai ?

Acelasi lucru. Nu variaza de la o secunda la alta. Acum, ca sa emimin balbaiala afisarii cand este la limita dintre doua grade, am ales sa am doua citiri pe minut la interval se 30 secunde (tot la 30 de secunde este afisata) si temperatura este cvasi  constanta, fiind intr-o camera. Variaza ± 1 grad comparata cu sonda k a multimetrului si un alt termometru din camera.

Se pare ca nu am eu noroc cu senzorii de tempeatura. Am cumparat in doua randuri LM35 de pe AE si toti au fost fake. Astia digitali sunt de pe TME. Mai fac o comanda, sa vedem ce iese.

Link spre comentariu

Citeste adresa interna a senzorului, majoritatea celor fake au acelasi adresa pentru ca nu se chinuie Chinezul sa le schimbe. Poti incerca tot asa sa scrii si sa citesti memoria EEPROM, cele fake rare ori au memoria EEPROM prezenta si la citire iti da inapoi blank ( 0xFF ).

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări