Arduino și senzor digital DS18B20. Instrucțiuni pentru utilizarea senzorului de temperatură DS18B20 Senzor de temperatură DS18B20

Trebuie să măsurați temperatura în mediul nefavorabil pentru cip?

Senzorul DS18B20 vă va ajuta să măsurați temperatura apei în acvariu sau în ceainic. Puteți să-l utilizați pentru a măsura temperatura de pe stradă și, în același timp să nu vă fie frică că senzorul va ploua. DachNips va aprecia oportunitatea de a măsura temperatura solului în seră și pe site.

În memoria permanentă DS18B20, puteți salva valorile temperaturii limită, când ieșiți din senzor va comuta la modul de alarmă. Pe anvelopa totală a multor senzori, microcontrolerul poate afla care dintre ele au trecut la acest mod. Astfel, devine ușor de determinat zona problema în mediul controlat.

Rezoluția citirilor este configurată și poate fi de la 9 la 12 biți. Mai puțină rezoluție - deasupra ratei de transformare.

Conexiune

Senzorul de etanșare bazat pe cipul DS18B20 poate fi conectat în două moduri:

Pentru trei fire: alimente (roșu), sol (negru) și semnal (alb).

Pentru două fire: Pământ și semnal. În acest caz, senzorul ocazional poate furniza citiri incorecte care sunt ușor de excludere din rezultatul final prin filtrare.

Indiferent de metoda de conectare, firul de semnal trebuie conectat la putere printr-un rezistor de 4,7 com. Când este conectat un singur senzor, un rezistor este de 10 com.

Pentru a conecta senzorul la Arduino sau la bordul lotului, acesta va fi convenabil să utilizați o bară de terminale de împingere.

Pentru a conecta dispozitive de 1 fire la Arduino, există o bibliotecă finalizată și este de la DS18B20 pentru a lucra cu DS18B20. Există o superstructură de bibliotecă de la Miles Burton.

Caracteristici:
  • Alimentare: 3.0..5.5 în
  • Intervalul de temperatură: -55 ° C .. + 125 ° C
  • Precizia citirilor de temperatură: 0,5 ° C
  • Pasul mărturiei: 0.0625 ° С
  • Interfață: 1-sârmă
  • Sârmă lungă: 1 metru
  • Consumul curent: 1ma

Un senzor a apărut în sortimentul magazinului nostru temperaturile Dallas 18B20 în carcasa rezistentă la umiditate cu o gamă largă de temperaturi măsurate de la -55 la + 125 ° C. Datele privind protecția la umiditate și temperatura maximă în +125 grade au acționat imediat pe gânduri privind testarea extremă în apa clocotită. Ne vom ocupa de asta.

Componente pentru repetiție (cumpărare în China):

Acest senzor funcționează pe magistrala de 1 fire.

Fiecare astfel de dispozitiv conține un cod unic de 64 de biți, constând din 8 biți care definesc codul seriei, 48 de biți de un număr unic și 8 biți de cod CRC rezistent la zgomot.

Informațiile privind temperatura măsurată sunt stocate în memoria operațională a senzorului, care constă din 9 octeți.

1 și 2 Bytes stochează informații despre temperatura.

3 și 4 Bytes sunt stocate în funcție de limitele de temperatură superioară și inferioară.

5 și 6 Bytes sunt rezervate.

7 și 8 Bytes sunt utilizate pentru măsurarea temperaturii ultra-măsura.

9 Byte stochează codul CRC rezistent la zgomot din 8 octeți anteriori.

Principalele comenzi utilizate la lucrul cu biblioteca:

căutați (AdresaRray)

Căutări pentru următorul dispozitiv cu 1 fire, dacă dispozitivul este găsit, apoi în matricea de 8 octeți a adreselor, codul său ROM este înregistrat, altfel returnează FALSE.

resetare_search ()

Efectuează o nouă căutare de la primul dispozitiv.

resetare ()

Efectuează resetarea anvelopei, este necesar înainte de a vă conecta la senzor.

selectați (AdresaRray)

Efectuează o gamă de dispozitiv după resetare, codul dispozitivului ROM este trecut.

scrieți (Byte)

Transmite informații de informații la dispozitiv

scrieți (Byte, 1)

citit ()

Citește Byte de informații de pe dispozitiv

cRC8 (DataRay, Lungime)

Calculează codul byte CRC din matricea DataRay, lungime lungă

Folosind comanda de scriere, putem transfera comenzile de control la senzorul de localizare sub formă de octeți, ia în considerare principalul lor:

0x44. - efectuați măsurarea temperaturii și scrierea datelor către RAM

0x4e. - înregistrați 3 octeți în 3, 4 și 5 octeți de memorie RAM

0x48. - copiați octeții 3 și 4 ai RAM în EEPROM

0xb8. - copiați datele de la EEPROM la 3 și 4Y Bytes RAM

Conectați-vă la Arduino.

Trei fire ies din senzor:

Roșu: Puterea "+".

Negrul:"-" Putere

Alb: Ieșire de ieșire

Conectarea senzorului:

Roșu: La + 5 volți Arduino.

Negrul Pe oricare dintre Pins GND --- Arduino.

alb Pe orice intrare digitală Arduino (în exemplul D10).

Pentru a lucra senzorul, este necesar să se conecteze firul de semnal cu firul de alimentare cu un rezistor cu o valoare nominală de 4,7 com.

Pentru a începe, luați în considerare cele mai multe exemplu util Pentru a lucra cu senzorul, citirile temperaturii de ieșire în monitorul portului.

Programul de probă de probă

#Include. Onewire DS (10); // conectat la 10 pini (rezistor la 4.7k necesar) Setupul VOID (VOID) (Serial.Bel (9600);) buclă void (Byte I, Byte Prezent \u003d 0; Byte Type_s; Byte Data; Byte Addr; Float Celsius, Fahrenheit; dacă (nu mai căutați ("nu mai sunt adrese"); serial.println (); ds.reset_search (); întârziere (250); retur;) Serial. Imprimare ("ROM \u003d"); pentru (i \u003d 0; i< 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // начало коммуникации delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); // читаем значение Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // смотрим 9 байтов data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Преобразуем получненный данные в температуру // Используем int16_t тип, т.к. он равен 16 битам // даже при компиляции под 32-х битный процессор int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; if (data == 0x10) { raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }

Dallas18b20 Testarea extremă

După cum sa menționat deja, am decis să organizăm testarea extremă a senzorului, dar pur și simplu omiterea senzorului în apa clocotită nu este interesantă. Poziționați senzorul în sticlă și fierbeți. Pentru claritate în monitorul portului, vor fi afișate valorile temperaturii. Pe videoclipul atașat mai jos, se poate observa o creștere netedă a temperaturii. Vreau să menționez Că temperatura apei la o presiune atmosferică normală nu poate fi mai mare de 100 ° C. La testarea senzorului în apă clocotită, temperatura acumulată de noi a fost de 99,87 ° C. Testul poate fi considerat de succes.

Schema a fost adăugată la releu, pentru a opri automat boilerul la o temperatură de 99,5 ° C. Pentru a nu tăia firele de pe cazan, conectați-vă prin priza, în interiorul căruia se află releul de mai sus.

Important

Senzorul de temperatură este în carcasa metalică, tranziția de la metal la cablu este izolată cu un tub de contracție. Pe metal, tubul se potrivește foarte strâns, cablul este mai slab, prin acest loc poate, cel puțin probabilitatea și micul, apa este scursă. Pentru a evita această situație, recomandăm să nu scufundați senzorul în toată apa. Dacă aveți încă o astfel de nevoie, vă recomandăm să expuneți mai atent acest complot.

Exemplu de cod.

#Include. Onewire DS (10); // conectat la 10 pyuse (rezistor la 4.7k necesar) Setupul VOID (VOID) (Serial.Bel (9600); Pinmode (3, ieșire); // Porniți boilerul digital (3, scăzut);) buclă void (void ) (Byte I; Byte Prezent \u003d 0; Byte Type_s; Date de byte; Byte Addr; Float Celsius, Fahrenheit; dacă (! DS.Search (addr)) (serial.println ("nu mai multe adrese"); Serial.println (); ds.reset_search (); întârziere (250); retur;) serial.print ("rom \u003d"); pentru (i \u003d 0; i< 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // начало коммуникации delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); // читаем значение Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // смотрим 9 байтов data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Преобразуем получненный данные в температуру // Используем int16_t тип, т.к. он равен 16 битам // даже при компиляции под 32-х битный процессор int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; if (data == 0x10) { raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); // Если температура достигает температуры кипения (с погрешностью), отключаем кипятильник if (celsius > 99.5) (digital (3, mare);))

#Include.

Onewire DS (10); // Conectați senzorul la 10 pin digital

vOID SETUP (VOID) (
Serial.Bel (9600);
Pinmode (3, ieșire);
// întoarceți un cazan
Digitalwrite (3, scăzut);
}

buclă void (void) (
Byte I;
Byte Type_s;
Date de byte;
Byte Addr;
Float Celsius, Fahrenheit;

// căutăm senzor alres
Dacă (ds.search (addr)) (
Serial.println ("nu mai multe adrese");
Serial.println ();
ds.reset_search ();
Întârzierea (250);
Întoarcere;
}

// verificarea dacă nu a fost transmisă nicio interferență
Dacă (Onewire :: CRC8 (AddR, 7)! \u003d AddR) (
Serial.println ("CRC nu este valid!");
Întoarcere;
}
Serial.println ();

// Determinați seria senzorilor
Comutator (addr) (
Caz 0x10:
Serial.println ("Chip \u003d DS18S20");
TYPE_S \u003d 1;
Pauză;
Caz 0x28:
Serial.println ("chip \u003d ds18b20");
Type_s \u003d 0;
Pauză;
Caz 0x22:
Serial.println ("chip \u003d DS1822");
Type_s \u003d 0;
Pauză;
Mod implicit:
Serial.println ("dispozitivul nu este un dispozitiv de familie DS18x20.");
Întoarcere;
}

dS.Reset ();
ds.Select (addr);
ds.write (0xbe); // citiți memoria operațională a senzorului

pentru (i \u003d 0; i< 9; i++) {
Date [i] \u003d ds.read (); // completați o serie de date citite
}

// datele de temperatură sunt conținute în primii doi octeți, traduceți-le la o valoare și convertimăm într-un număr hexazecimal
Int16_t crud \u003d (date<< 8) | data;
Dacă (Type_s) (
Brut \u003d brut.<< 3;
dacă (date \u003d\u003d 0x10) (
Brut \u003d (brut & 0xFFF0) + 12 - date;
}
}
Altfel (
Byte cfg \u003d (date & 0x60);
dacă (cfg \u003d\u003d 0x00) RAW \u003d RAW & ~ 7;
Altfel dacă (cfg \u003d\u003d 0x20) brut \u003d brut & ~ 3;
Altfel dacă (cfg \u003d\u003d 0x40) brut \u003d brut & ~ 1;
}
Celsius \u003d (float) brut / 16.0;
Fahrenheit \u003d Celsius * 1.8 + 32.0;
Serial.print ("temp \u003d");
Serial.print (Celsius);
Serial.print ("c");
Serial.print (Fahrenheit);
Serial.println ("f");

// Dacă temperatura atinge punctul de fierbere (cu eroarea), opriți boilerul
Dacă (Celsius\u003e 99.5)
{
Digital (3, mare);
}
}

Cumpărați în Rusia

Senzorul de temperatură din Arduino este unul dintre cele mai frecvente tipuri de senzori. Dezvoltatorul proiectelor cu termometre pe Arduino este disponibil în multe opțiuni diferite, care diferă în principiul acțiunii, exactității, execuției constructive. Senzorul digital DS18B20 este unul dintre cei mai populari senzori de temperatură, este adesea folosit într-un caz impermeabil pentru măsurarea temperaturii apei sau a altor lichide. În acest articol, veți găsi o descriere a senzorului DS18B20 în limba rusă, vom lua în considerare caracteristicile de conectare la Arduino, principiul funcționării senzorului, descrierea bibliotecilor și schițele.

DS18B20 este un senzor de temperatură digitală cu o varietate de caracteristici utile. În esență, DS18B20 este un microcontroler întreg care poate stoca valoarea măsurării, semnalează ieșirea de temperatură pentru frontierele stabilite (limitele în sine pot fi instalate și modificări), modificați precizia măsurătorilor, metoda de interacțiune cu controlerul și mult Mai Mult. Toate acestea se află într-o clădire foarte mică, care, pe lângă acestea, este disponibilă în performanțe impermeabile.

Senzorul de temperatură DS18B20 are o varietate de tipuri de locuințe. Puteți alege unul din cele trei - 8-pini, astfel (150 de milii), 8-pin μSop și 3-PIN la-92. Acesta din urmă este cel mai frecvent și fabricat într-un caz special de protecție a umidității, astfel încât să poată fi în siguranță sub apă. Fiecare senzor are 3 contacte. Pentru cazul TO-92, trebuie să vă uitați la culoarea firelor: negru - pământ roșu și alb / negru / albastru - semnal. În magazinele online puteți cumpăra un modul DS18B20 gata.

Unde să cumpărați un senzor

În mod natural, DS18B20 este mai ieftin să cumpere mai ieftin pe Aliexpress, deși este vândut în orice magazine online de specialitate online cu Arduino. Iată câteva linkuri, de exemplu:

Memoria senzorului este formată din două tipuri: operaționale și non-volatile - SRAM și EEPROM. Ultimele înregistrări ale registrelor și registrelor de configurare, TL, care pot fi utilizate ca registre de uz general, dacă nu sunt utilizate pentru a specifica gama de valori de temperatură admise.

Sarcina principală a DS18B20 este de a determina temperatura și transformarea rezultatului obținut într-o vizualizare digitală. Putem stabili în mod independent permisiunea necesară prin stabilirea cantității de biți de precizie - 9, 10, 11 și 12. În aceste cazuri, rezoluția va fi egală cu 0,5 ° C, 0,25С, 0,125С și 0,0625С.

Măsurătorile de temperatură rezultate sunt salvate în senzorul SRAM. 1 și 2 octeți păstrează valoarea temperaturii rezultată, 3 și 4 Salvați limitele de măsurare, 5 și 6 rezervate, 7 și 8 sunt utilizate pentru determinarea temperaturii de înaltă precizie, ultimele 9 octeți stochează codul CRC rezistent la cod.

Conexiune DS18B20 la Arduino

DS18B20 este un senzor digital. Senzorii digitali transmit valoarea temperaturii măsurate sub forma unui cod binar specific, care intră în știfturile digitale sau analogice ale lui Arduino și apoi este decodificat. Codurile pot fi cele mai diferite, DS18B20 funcționează prin protocol de date cu 1 fir. Nu vom intra în detaliile acestui protocol digital, indicăm doar minimul necesar pentru înțelegerea principiilor interacțiunii.

Schimbul de informații în 1 fir se datorează următoarelor operații:

  • Inițializare - definiția unei secvențe de semnale de la care începe măsurarea și alte operații. Maestrul aplică un impuls de resetare, după care senzorul trebuie să prezinte un impuls de prezență care raportează disponibilitatea de a efectua operația.
  • Înregistrarea datelor - Byte de date este transmisă senzorului.
  • Citirea datelor - octetul preia de la senzor.

Pentru a lucra cu senzorul, vom avea nevoie de software:

  • Arduino IDE;
  • Biblioteca Onewire Dacă mai mulți senzori sunt utilizați în autobuz, puteți utiliza biblioteca Dallastmperature. Va lucra pe partea de sus a Onewire.

Din echipamentul de care aveți nevoie:

  • Unul sau mai mulți senzori DS18B20;
  • Arduino Microcontroler;
  • Conectori;
  • Rezistor cu 4,7 kΩ (în cazul conectării unui senzor, un rezistor va fi dimensionat de la 4 la 10k);
  • Placă de circuit;
  • Cablu USB pentru conectarea la un computer.

Pentru panoul Arduino, senzorul se conectează pur și simplu: GND de la senzorul termic este atașat la Arduino GND, VDD este conectat la 5V, date pe orice știft digital.

Cea mai simplă diagramă a conectării senzorului digital DS18B20 este prezentată în figură.

Algoritmul de obținere a informațiilor despre temperatura în schiță constă în următorii pași:

  • Definiția adresei senzorului, verificați conexiunea acestuia.
  • Senzorul servește ca o cerință de a citi temperatura și de a stabili valoarea măsurată în registru. Procedura durează mai mult decât restul, este nevoie de aproximativ 750 ms.
  • O comandă este servită pentru a citi informații din registru și trimiterea valorii la "Monitorul portului",
  • Dacă este necesar, acesta este convertit în grade Celsius / Fahrenheit.

Exemplu de schiță simplă pentru DS18B20

Cea mai simplă schiță pentru lucrul cu un senzor digital este după cum urmează. (În schiță folosim biblioteca Onewire, care va fi discutată mai mult decât puțin mai târziu).

#Include. / * * Descrierea interacțiunii cu senzorul digital DS18B20 * Conectarea DS18B20 la Arduino prin Pin 8 * / OneWire DS (8); // Creați un obiect Onewire pentru autobuzul cu 1 fir, cu care veți lucra cu senzorul de configurare VOID (Serial.Bel (9600);) () (// determină temperatura de la senzorul de date DS18b20 Byte ; // loc pentru DS.Reset () Valoarea temperaturii; // Începem interacțiunea cu resetarea tuturor comenzilor anterioare și a parametrilor DS.WRITE (0xcc); // Oferim comanda DS18B20 pentru a sări peste adresa adresei. În Cazul nostru, doar un firmware ds.write (0x44); // dați senzorului DS18B20 pentru a măsura temperatura. Valoarea temperaturii în sine nu este încă încă - senzorul îl va pune în memoria internă a întârzierii (1000); // Microcircitarul măsoară temperatura și așteptăm. DS.Reset (); // Acum vă pregătiți să obțineți valoarea temperaturii DS -WRITE măsurat (0xcc); ds.write (0xbe); // vă rugăm să transferați Valoarea registrelor cu valoarea de temperatură // obțineți și citiți datele \u003d ds.read () Răspuns (); // citiți valoarea temperaturii de date mai tânără \u003d ds.read (); // Acum senior // formează Valoarea finală I: // - prima valoare "lipici", // - apoi multiplicați-l pe coeficientul corespunzător rezoluției (pentru 12 biți în mod implicit - aceasta este 0.0625) Temperatura flotă \u003d ((date<< 8) | data) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println(temperature); }

Schiță pentru lucrul cu senzorul DS18B20 fără întârziere

Puteți complica un mic program pentru DS18B20 pentru a scăpa de frânarea performanței schiței.

#Include. Onewire DS (8); // Object Onewire Int Temperatura \u003d 0; // Valoarea temperaturii variabile la nivel global din senzorul DS18B20 LastUpdateTime \u003d 0; // variabilă pentru stocarea ultimului timp de citire de la senzorul const int temp_update_time \u003d 1000; // Determinați frecvența de configurare a vidului (Serial.Bel (9600);) buclă () (detecttemperature (); // determinarea temperaturii de la senzorul DS18B20 serial.println (temperatura); // afișează rezultatul Temperatura // t. ; dacă (Millis () - LastUpdateTime\u003e Temp_updateTime \u003d Millis (); DS.Reset (); ds.write (0xcccc); ds.write (0xbe); date \u003d ds.read (); date \u003d ds.read () ; // formarea unei temperaturi de valoare \u003d (date<< 8) + data; temperature = temperature >> 4; } }

Dallastemperature și biblioteca DS18B20

În schițele dvs., putem folosi biblioteca de dallastmperatură care simplifică unele aspecte de lucru cu senzorul DS18B20 la 1 fir. Exemplu de schiță:

#Include. // Numărul de Pina Arduino cu un #define PIN_DS18B20 8 // Crearea unui obiect Onewire Onewire (PIN_DS18B20); // Creați un obiect dallastmperatură pentru a lucra cu senzorii, după ce a transferat-o un link către obiect pentru a lucra cu 1 fir. Dallastemperatura Dallassensors (& Onewire); // obiect special pentru stocarea dispozitivului de adresă dispozitive disprețuitor; Loopul Void (VOID) (// Cerere de măsurare a senzorului de temperatură Serial.Print ("Măsurați temperatura ..."); Dallassensors.Requesttemperature (); // cerem DS18B20 să colecteze date serial.println ("executat" ); adresa (pentru (pentru (pentru (uint8_t i \u003d 0; i< 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

Onewire Bibliotecă pentru lucrul cu DS18B20

DS18B20 utilizează protocolul cu 1 fir pentru a face schimb de informații cu Arduino, pentru care o bibliotecă excelentă a fost deja scrisă. Puteți și trebuie să utilizați acest lucru pentru a nu implementa manual toate funcțiile. . Pentru a instala biblioteca, descărcați arhiva, despachetați directorul ARDUINO în dosarul bibliotecii. Biblioteca se conectează utilizând comanda #include

Toți senzorii DS18B20 sunt conectați în paralel, pentru toate rezistența suficientă. Folosind biblioteca Onewire, puteți citi simultan toate datele de la toți senzorii. Dacă numărul senzorilor conectați este mai mare de 10, trebuie să selectați un rezistor cu o rezistență de cel mult 1,6 com. De asemenea, pentru măsurarea mai precisă a temperaturii, trebuie să puneți un rezistor suplimentar la 100 ... 120 ohmi între ieșirea de date de pe arduino și placa de date pe fiecare senzor. Puteți afla din ce senzor sau această valoare este obținută utilizând un cod unic de 64 de biți unic, care va fi emis ca urmare a executării programului.

Pentru a conecta senzorii de temperatură în modul normal, trebuie să utilizați schema prezentată în figură.

Concluzii

Microcircuitul Dallas DS18B20 este un dispozitiv foarte interesant. Senzorii de temperatură și termometrele, create pe bază, sunt potrivite pentru cele mai multe sarcini cu caracteristici dezvoltate de funcțional, relativ nu drum. Un senzor special de popularitate DS18B20 a scăzut ca un dispozitiv rezistent la umiditate pentru măsurarea temperaturii fluidului.

Pentru oportunități suplimentare, este necesar să plătiți dificultatea relativă de a lucra cu senzorul. Pentru a conecta DS18B20, vom avea nevoie în mod necesar un rezistor cu o valoare par de aproximativ 5k. Pentru a lucra cu senzorul din schițele Arduino, trebuie să instalați o bibliotecă suplimentară și să obțineți anumite abilități pentru a lucra cu acesta - totul nu este destul de trivial acolo. Cu toate acestea, puteți cumpăra un modul deja gata, și pentru schiță în majoritatea cazurilor, există suficiente exemple simple date în acest articol.

În procesul de studiere a microcontrolerelor, este mai devreme sau mai târziu, este nevoie să se măsoare un astfel de parametru meteorologic al mediului, ca temperatură. Piața componentelor electronice globale moderne oferă o gamă largă de senzori de temperatură. Principalele diferențe dintre ele constau în intervalul de temperatură măsurată, tensiunea de alimentare, domeniul de aplicare, dimensiunile globale, metodele de conversie a temperaturii, interfața pentru a interacționa cu sistemul de control al utilizatorului. Atât de istoric, sa întâmplat că, în momentul de față unul dintre cei mai populari senzori de temperatură este senzorul DS18.B20.corporația Dallas Semiconductor. Despre el următoarea narațiune.

DS18.B20.- senzor de temperatură digitală cu rezoluție de conversie programabilă.

Trăsături distinctive:

1) utilizând autobuzul de interfață de date cu 1 fir pentru a interacționa cu sistemul de control;
2) prezența unui cod de identificare secvențial unic pe 64 de biți situat în memoria ROM intern și destinată sistemelor multipoactive în care trebuie să fie abordat senzorul specific;
3) Tensiunea de alimentare este de 3-5,5V, ceea ce îi permite nu numai în sisteme de 5 volți, ci și 3,3 (majoritatea microcontrolerelor);
4) Intervalul temperaturii măsurate este de -55 ... + 125 ° C;
5) precizia de ± 0,5 o C, deși este adevărat numai pentru intervalul -10 ... + 85 o C;
6) Rezoluția de conversie este determinată de utilizator și este de 9 ... 12 biți;
7) are declanșatoare interne ale pragurilor de declanșare superioare și inferioare, cu alarmă de alarmă de alarmă pentru sistemele care utilizează logica de lucru termostatică;
8) Acești senzori sunt compatibili programatici cu DS1822. Și utilizate pe scară largă în regulatori termostatici industriali, sisteme industriale, în electronică de consum și alte sisteme sensibile la termoizolare.

Descrierea și principiul funcționării dispozitivului:

În articolul meu, voi descrie un exemplu de lucru cu senzorul realizat în carcasa TO-92.

Se pare așa:

În interior, acest lucru este aranjat foarte simplu, aruncați o privire:

Luați în considerare mai detaliat această diagramă bloc.

Cu toate acestea, hrănirea în acest mod face unele restricții asupra parametrilor de timp ai senzorului. Deținerea liniei de date de ceva timp discută condensatorul, ceea ce va duce la de-energiația liniei VDD interne și, respectiv, senzorul ca un întreg. Prin urmare, un nivel logic ridicat ar trebui menținut în timpul neutilizat pe linia DQ. Trebuie remarcat o remarcă importantă. La conversia temperaturii și copierea datelor de la scratchpad în EEPROM (într-unul din registre), curentul curent consumat de curentul actual VDD poate ajunge la 1.5, ceea ce este o infirmitate a condensatorului intern și va exista o scădere de tensiune mare Pe rezistorul de suspensie, care va afecta inacceptabil funcționarea dispozitivului în general. Pentru a face acest lucru, este necesar să se organizeze o schemă de linie DQ a unui suspendat puternic implementat de acest sistem:

După emiterea unei echipe Convertit.T. sau Copie.Carnet pentru notițe. Trebuie să activați o linie puternică de ridicare MOSFET-TRANSISISTOR DQ nu mai târziu de 10 mx (max.), În funcție de dezvoltatorii senzorilor, după care timpul de conversie (TCONV) sau timpul de transfer de date (TWR \u003d 10 MC) și la acel moment Nu există nicio acțiune cu un suspend puternic pe linia DQ nu ar trebui să fie!

Despre alimentele standard Trebuie să spui puțin, pentru că totul este simplu, iar chiar și MOSFET nu este deloc necesar:

Subsistemul "64-biți ROM și 1-Wire Port" conține un cod de identificare serial unic de 64 de biți situat în memoria non-volatile ROM, de asemenea, în acest nod există o interfață de interacțiune cu sistemul de control cu \u200b\u200b1 fire. Subsistemul logic de control al memoriei transmite date între interfața cu 1 sârmă și memoria de scratchpad, care, la rândul său, are acces la registrele senzorului de temperatură, alarma superioară și inferioară, registrul de configurare și înregistrarea generatorului de control 8 pentru a proteja sistemul de la date incorecte.

Când alimentarea este activată în mod implicit, senzorul are o rezoluție de conversie a 12 biți și introduce imediat modul de alimentare redus. Pentru a iniția convertirea, comandantul trebuie să treacă comanda Convertit.T. . După conversia temperaturii la codul digital, acest cod este amplasat în memoria Scratchpad sub forma unui cuvânt dublu-octet, iar senzorul se întoarce la modul de economisire a energiei.

Conversia temperaturii.

Acum ne vom imagina cum este converti temperatura din senzor. De fapt, ADC este situat în interiorul senzorului de temperatură, iar ieșirea, situată în registrul de temperatură, este transferată în memoria Scratchpad. Datele privind temperatura au următorul format:

Steagul de pictograme S este utilizat pentru a indica numărul de numere (S \u003d 0 - numărul conținut în biți 10-0 pozitiv și s \u003d 1, dacă numărul conținut în aceleași biți este negativ, adică în acest caz, temperatura Pare într-un cod suplimentar (cod supliment până la două)).

Când configurați rezoluția de conversie a 12 biți, toți cei 12 biți (biți 11-biți 0) sunt implicați și conțin date fiabile. La configurarea rezoluției 11 biți, conținutul biți 0 nu trebuie luat în considerare, atunci când setarea a 10 biți nu trebuie luată în considerare 0 și 1 etc.

Alarma este funcția termostatului.

Aceasta oferă 2 registre pe 8 biți, TH și TL. Valoarea pragului superior de temperatură și, respectiv, TL, cea inferioară. Dacă temperatura de deasupra valorii lui sau sub TL este setată la steagul de alarmă. Acest steag de alarmă este detectat de dispozitivul principal prin emiterea unei comenzi. Căutare de alarmă. pe linia DQ. Steagul de alarmă este actualizat la fiecare operație de conversie a temperaturii. Apropo, numai biți de la 11 la cel de-al patrulea registru de temperatură sunt utilizați în comparație cu registrul TH sau TL, rezultă că funcția termostatului funcționează numai pentru valorile temperaturii întregi. Registrele sunt EEPROM fizic cu memoria, astfel încât ei păstrează valorile atunci când alimentarea este oprită. Registrele în sine sunt similare cu registrul de temperatură, doar fiind 8 biți, pavilionul S este absolut aceeași valoare ca în cazul precedent:

Acest cod, după cum sa menționat mai devreme, este necesar pentru a identifica fiecare dispozitiv pe linie în sistemele de măsurare a temperaturii multipoactive.

Formatul acestei memorii este:

Cei mai tineri 8 biți sunt descărcați pentru a desemna familia și conțin valoarea de 0x28. Următorii 48 de biți conțin un număr de serie unic al dispozitivului. Cea mai veche octet conține valoarea controlului CRC, calculată pentru cei mai tineri 56 de biți ai memoriei ROM.

Organizația de memorie.

Memoria senzorului constă dintr-un spațiu de memorie Notepad (Scratchpad) și memorie EEPROM pentru stocarea datelor de configurare și a valorilor registrelor de praguri de alarmă superioară și inferioară.

Când alimentarea este oprită, datele de byte 2, 3 și 4 își salvează valoarea către EEPROM. Ei bine, când este pornit, valoarea din ele rămân neschimbate. Byte 0 și 1 conține valoarea temperaturii convertite, octeți 5, 6, 7 sunt rezervate pentru uz intern și nu pot fi accesibile utilizatorului pentru nevoile sale.

Cea de-a 8-a octet conține valoarea generată de logica încorporată a formării codului CRC pentru octeți de la 0 la 7, care minimizează posibilitatea determinării de temperatură eronată în cele din urmă.

Trebuie remarcat faptul că dacă funcția termostatului nu este utilizată, atunci registrele TH și TL pot fi folosite ca o memorie cu scop general - puteți stoca orice informație în ele.

Datele sunt înregistrate în Bytes 2, 3 și 4 începând cu bitul mai mic 2 utilizând comanda Scratchpad.. Pentru a verifica integritatea datelor înregistrate, le puteți citi, pentru care este necesar să treceți comanda la senzor Citiți scratchpad.După care Maestrul trebuie să primească date de la micul byte 0.

Pentru a salva datele senior, registrul termostatului junior, precum și registrul de configurare în memoria EEPROM, Maestrul trebuie să treacă comanda la comandă Copiați scratchpad..

După cum sa menționat mai devreme, datele deja înregistrate în EEPROM, când alimentarea este dezactivată, este salvată. Dar când alimentarea este pornită din celulele EEPROM corespunzătoare, valorile sunt descărcate automat la registrele de memorie de scratpad corespunzătoare. Convenabil, nu-i așa? :)

În plus, datele înregistrate în EEPROM pot fi în orice moment suprascrise în memoria Scratchpad. Acest lucru este necesar, de exemplu, când ați schimbat configurația în acest proces și apoi trebuie să vă ridicați pe "modul standard de funcționare", adică Întoarceți-vă configurația lucrării care a fost înainte de a schimba conținutul registrelor de memorie alcorării. Iată de fapt, dispozitivul de conducere trebuie să treacă comanda la senzor. Recall E.2 .

În registrul de configurare, se pot determina numai 2 biți: R0 și R1. Aceste biți determină rezoluția conversiei temperaturii și, în mod implicit, este setată la 1, care determină setarea inițială la o rezoluție de conversie pe 12 biți.

Toate configurațiile posibile ale acestor biți și permisiunile corespunzătoare sunt prezentate în tabelul de mai jos. Trebuie remarcat faptul că cu atât este mai mare rezoluția convertiției, mai mult timp de conversie, de exemplu, pentru o rezoluție pe 12 biți, timpul de conversie este de 750ms (maxim).

Interacțiunea cu sistemul de control.

DS18B20, după cum sa menționat mai devreme, pentru a comunica cu dispozitivul condus, utilizați magistrala de date de interfață cu 1 fire. Prin urmare, pentru a le conecta, sistemul de control trebuie să furnizeze o ieșire de ieșire sau cu starea liniei Hi-Z.

Configurația interfeței senzorilor interne este prezentată mai jos:

Într-o stare inactivă (în stare inactiv), linia DQ este trasă în rezistor la putere "+". Astfel, această linie ar trebui să fie întotdeauna păstrată în această stare între tranzacții (transmisii de date de date). Dacă din orice motiv, tranzacția trebuie suspendată, linia DQ ar trebui păstrată într-un nivel logic ridicat dacă această transmisie continuă în continuare. În procesul de oprire a tranzacției, putem păstra linia DQ pentru o lungă perioadă de timp într-un nivel logic ridicat, începând cu 1 SCS. Dar, dacă autobuzul de date este păstrat la nivelul logic scăzut mai lung de 480μs, va apărea o resetare completă a întregului senzor prezentă în acest autobuz.

Secvența operațiunilor pentru schimb.

De fiecare dată când sistemul de control este accesat la senzor, trebuie urmată următoarea secvență de acțiuni:

1) inițializarea;
2) comanda ROM (urmată de partajarea de date necesară);
3) Comanda funcțională a senzorului (urmată de partajarea de date necesară).

Dacă nu există nici un pas atunci când accesați senzorul lipsește - senzorul nu va răspunde. Excepția este echipa Căutare.rom [ F.0 h.] și Alarma.Căutare. [ Ech.] , după executarea lor, maestrul trebuie să revină la prima etapă a secvenței de control.

Asa de. Toate tranzacțiile încep cu inițializarea. Această operațiune este însoțită de dezvoltarea unui dispozitiv de resetare a impulsului la care dispozitivele acționate (în acest caz, senzorul (senzor)) transmit prezența impulsului de prezență pe care senzorii sunt conectați și gata de lucru.

În general, magistrala de interfață cu 1 fire, implementată în senzor, determină mai multe tipuri de semnale pe linia de date: Reset Pulse, Pulse de prezență, înregistrare 0, înregistrare 1, Citire 0, Citire 1. Toate aceste operații implementează dispozitivul principal , cu excepția prezenței pulsului. Se formează numai senzorul (senzorilor).

Deci, pentru început, dispozitivul principal trece la modul transmițător și stabilește linia DQ la 0 pentru o perioadă de cel puțin 480μs (evidențiată în negru îndrăzneț). Se resetează senzorul. Apoi, linia trebuie eliberată și traduceți dispozitivul principal în modul receptor, în timp ce rezistența de tragere va seta linia de date într-un nivel logic ridicat (evidențiată în culoarea subțire neagră). După ce senzorul onorează frontul în creștere, senzorul va aștepta la 15-60μs și va reseta linia de date la 0 și va fi păstrată pentru 60-240μs. După acest timp, senzorul eliberează linia și va fi instalat în nivelul logic 1 timp de cel puțin 480μs după detectarea senzorului pulsului de evacuare.

Acum, să vorbim despre modul în care se efectuează procesul de transfer de date. În general, biți. Cazul este următorul. Un segment de timp este luat și, în acest timp, maestrul arată că avem pe linie acolo, să spunem că 1 - înseamnă că au înregistrat 1, dacă 0 înseamnă că a fost înregistrată zero. Dar aceasta este doar o explicație abstractă. De fapt, există unele nuanțe asociate cu cadrul temporar al tuturor cazurilor.

Urmăriți imagini:

Totul începe cu faptul că prezentatorul ar trebui să omite linia dată unui nivel logic scăzut și din acest punct, slotul de înregistrare / citire 1/0, care este de la 60 la 120 mx. Între sloturile de înregistrare / citire, linia de date trebuie instalată la 1 la un moment dat, nu mai puțin timp de recuperare (1μs). Pentru a organiza un slot de înregistrare 0, este necesar să păstrați linia de date în 0 tot timpul slotului, dar dacă trebuie să scrieți la senzorul 1, atunci primim prima dată linia de date la 0, atunci așteptăm cel puțin 1 MX și eliberați linia în 1, în timpul slotului de înregistrare 1 (60-1 120μs) vor fi înregistrate 1 la senzor (vezi figura din dreapta sus).

De fapt, dacă pentru 15-60 μs, după început, 1 va fi detectat pe linia de date, apoi 1 va fi înregistrată și dacă va fi eliberat pentru 60-240μs.

Citirea datelor este însoțită de un dispozitiv de conducere atunci când resetează linia, așteptând cel puțin 1 mx și se uită la 15 mx că se întâmplă: Dacă rămâne 0, senzorul transmite 0 dacă este comutat la 1, apoi 1.

Echipe.

Echipa ROM.

Aceste comenzi trebuie să urmeze secvența de inițializare și să conțină instrucțiunile de căutare pentru senzorul corespunzător etc. Descărcarea fiecărei comenzi este de 8bit. După executarea comenzii corespunzătoare, puteți transfera comanda funcțională la senzor.

Căutare Rom.

Când sistemul este inițial conectat, acesta trebuie să recunoască toate dispozitivele conectate la magistrală. Pentru aceasta, această echipă. Dar, deoarece avem doar un singur senzor, nu vom folosi această comandă.

Citește Rom.

Această comandă este utilizată numai atunci când există un singur senzor în autobuz. Acest lucru permite dispozitivului de conducere să citească conținutul celor 64 de biți de memorie ROM fără a utiliza comanda de căutare. Și dacă încercați să utilizați această comandă atunci când numărul de senzori este conectat, mai mult de 1, vor începe să treacă conținutul acestei memorii, ceea ce va duce la consecințe nedorite.

Meciul Rom.

Aceasta este o comandă de conformitate Rom. Expertul eliberează 64 de biți de memorie ROM corespunzătoare conectată la magistrala senzorului și se determină deja ce să facă cu aceasta (măsurați temperatura etc.). Alți senzori de pe anvelopă vor aștepta la rândul lor în acest moment.

Skip Rom.

Aceasta este o comandă ROM. Nu ia în considerare adresa unui anumit senzor în autobuz și a apela imediat la toți. După această comandă, puteți da, de exemplu, comanda de conversie a temperaturii și toți senzorii vor începe conversia. Cu toate acestea, pentru a afișa comanda de citire a memoriei după apelarea acestei comenzi va duce la rezultate imprevizibile (deoarece, deodată, toți senzorii vor transmite date). Deci, numai cu un senzor conectat este posibil o astfel de situație.

Căutare de alarmă.

Această comandă este identică cu prima din acest tabel, cu excepția faptului că senzorii caută anvelopa cu steagul de alarmă setat.

Echipe funcționale.

Aceste comenzi efectuează operațiuni funcționale ale oricăror procese, de exemplu, lansarea operațiunii de conversie a temperaturii, copierea memoriei etc. Comenzi totale 6, descărcarea fiecărui 8bit.

Conversia T.

Conversia temperaturii de funcționare. După executarea acestei comenzi, datele de 2 octeți sunt introduse în registrul de temperatură.

Scratchpad.

Înregistrează datele în registrele 2-4 începând cu o secundă, bitoane mai tineri înainte. În timpul transmiterii, datele din trei registre trebuie monitorizate astfel încât expertul să nu scadă senzorii, deoarece pierderile de date este posibilă.

Citiți scratchpad.

Acesta inițiază procesul de transfer de date la toate registrele de memorie de scraturi, începând cu puținul byte 0 și terminând cu bitul mai vechi de octeți 8 (CRC).

Copiați scratchpad.

Această comandă copiază conținutul registrelor octeților 2, 3 și 4 la celulele EEPROM corespunzătoare.

Recall E.2

Această comandă copiază datele de la EEPROM în locurile potrivite din notele de scraturi. După cum sa menționat mai devreme, când porniți puterea, această operație are loc automat.

Citiți alimentarea cu energie

Aici, de fapt, toată înțelepciunea de a lucra cu senzorul de temperatură DS18B20. Pentru informații mai detaliate, atragem la datashet (). Acum este necesar să se implementeze toate aceste activități în hardware.

Schema dispozitivului:

Desenul de asamblare al plăcii de circuite imprimate (îmi cer scuze pentru calitatea, tocmai aș fi lucrat, pentru depanare):

Nu uitați să modificați taxa

Din moment ce acesta este un mock, l-am scos din vechiul proiect, așa că la bord, care este deasupra - puțin nu ceea ce am (pe mine am scos totul prea mult și a devenit exact ca în desenele de mai sus) .

Asta mi sa întâmplat:

Sa dovedit un fel de sandwich

Codul sursă al programului a fost scris în mediul de dezvoltare. Nu am încercat să folosesc maximul de biblioteci compilatoare AVR-GCC gata, dar am scris totul așa cum spun ei, "cu mâna". Scopul meu nu este de a demonstra posesia virtuozo a Si, ci doar un exemplu scris într-o oră capabilă să ofere nou-veniți la prezentarea generală privind lucrul cu senzorul.
Dispozitivul este destinat utilizării în cameră, prin urmare nu prevede măsurarea temperaturilor negative.

Descărcați sursa și puneți PCB de mai jos

Toate întrebările suplimentare, dorește să aștepte la adresa: [E-mail protejat]

Totuși, compania "Dallas Semiconductor" taxiuri. Producem multe piese unice și ieftine. Unul dintre ele este un senzor digital DS18B20. Dracu 'un os mai mic de cires cu trei concluzii. Prima concluzie este Power + 5 Volți, al doilea este un comun (zero), dar al treilea este alarmă, codul serial este îndepărtat din temperatura proporțională. Senzorul asigură măsurarea temperaturii în intervalul (-55 ... +125) ° C cu eroare de măsurare ± 0,5 ° C pe intervalul (-10 ... +85) ° C. Toate procesele de pe anvelopă sunt controlate de microprocesorul central. În interior - o schemă complexă cu senzor, ADC, ROM, registre de stocare și un sistem de ieșire secvențială.

Principalele caracteristici ale DS18B20 sunt convertorul său de temperatură. Rezoluția traductorului de temperatură poate fi schimbată de utilizator și este de 9, 10, 11 sau 12 biți, corespunzătoare creșterilor de 0,5 ° C, 0,25 ° C, 0,125 ° C și, respectiv, 0,0625 ° C. Capacitatea implicită permisivă este de 12 biți.

M-am culcat în jur de cinci controlori PIC16F628 și cumva a descoperit cumva că am avut toate termometrele sau mercurul sau alcoolul, care a fost considerat o tulburare clară. Prin urmare, sa decis colectarea mai multor scheme pe acest senzor, pentru a măsura temperatura pe stradă, temperatura în apartament, voi face încă o mini-opțiune pentru măsurarea temperaturii unei persoane și apoi a acestor grade electronice Sunt fără îndoială! Ei bine, un alt sistem de măsurare a temperaturii va avea nevoie pentru un robot, deci în orice caz va fi necesar ca un test.

Din defectele observate:

1. Rezistența termică ridicată a cazului. Adică, este imposibil să se măsoare rapid. Este imposibil să se măsoare modificări rapide. Pe videoclipul se poate vedea.

2. Interba de temperatură -55 - +125 nu este în mod clar industrială, iar în general, să spunem, premiile din minele Oymyakne sau subteran de niobiu pe Taimyr (și acolo -50-60 și chiar -70 se întâmplă) el nu arată temperatura. Aceasta este, nici măcar întreaga gamă acoperă.

Taxa crescută pe o parte. A permis o pereche de jambiere atunci când cablarea va fi corectată în versiunile ulterioare.

Vedere de mai sus. Descărcarea dezactivată - minus temperaturi.

Teste. A început să sufle uscătorul de păr pentru uscarea părului, apoi oprită. Rămâne chiar și în cazul în care să se aranjeze. Costul dispozitivului este de 6 USD de alimentare - de la vechiul mobil.

Se poate face o opțiune experimentală cu alimentarea din bateria solară pe indicatorii LCD să nu se deranjeze deloc cu putere. Glit pe fereastră și lăsați-vă să lucrați pentru totdeauna! Apropo, cine are nevoie de un firmware, scrie, știu corect.

P.S. Astăzi a comparat mărturia cu un alt dispozitiv în care senzorul este termistorul. După cum vedem - totul coincide.