- Požadované komponenty: -
- Snímač teploty DS18B20:
- Kruhový diagram:-
- Kroky nebo tok kódu: -
- Vysvětlení kódu:
- Získání dat ze snímače teploty DS18B20:
Teplotní senzor LM35 se obecně používá k měření teploty s mikrokontroléry, protože je levný a snadno dostupný. Ale LM35 dává analogové hodnoty a musíme je převést na digitální pomocí ADC (Analog to Digital Converter). Ale dnes používáme teplotní senzor DS18B20, ve kterém pro získání teploty nepotřebujeme převod ADC. Zde budeme k měření teploty používat mikrokontrolér PIC s DS18B20.
Tady tedy stavíme teploměr s následující specifikací pomocí mikrokontrolérové jednotky PIC16F877A od mikročipu.
- Ukáže plný rozsah teplot od -55 stupňů do +125 stupňů.
- Teplotu zobrazí, pouze pokud se teplota změní o +/- 0,2 stupně.
Požadované komponenty: -
- Pic16F877A - balíček PDIP40
- Chlebová deska
- Pickit-3
- 5V adaptér
- LCD JHD162A
- Teplotní senzor DS18b20
- Dráty pro připojení periferních zařízení.
- 4,7k rezistory - 2ks
- 10k hrnec
- 20mHz krystal
- 2 ks keramických kondenzátorů 33pF
Snímač teploty DS18B20:
DS18B20 je vynikající senzor pro přesné snímání teploty. Tento snímač poskytuje 9bitové až 12bitové rozlišení při snímání teploty. Tento senzor komunikuje pouze s jedním vodičem a pro získání analogových teplot a jejich digitální převod nepotřebuje žádný ADC.
Specifikace snímače je: -
- Měří teploty od -55 ° C do + 125 ° C (-67 ° F do + 257 ° F)
- ± 0,5 ° C Přesnost od -10 ° C do + 85 ° C
- Programovatelné rozlišení od 9 bitů do 12 bitů
- Nevyžadují se žádné externí komponenty
- Senzor používá rozhraní 1-Wire®
Podíváme-li se na výše uvedený pinoutový obrázek z datového listu, můžeme vidět, že senzor vypadá úplně stejně jako balíček BC547 nebo BC557, TO-92. První pin je Ground, druhý pin je DQ nebo data a třetí pin je VCC.
Níže je uvedena elektrická specifikace z datového listu, která bude potřebná pro náš návrh. Jmenovité napájecí napětí snímače je + 3,0 V až + 5,5 V. Je také potřeba vytáhnout napájecí napětí, které je stejné jako výše uvedené napájecí napětí.
Existuje také přesnost, která je + -0,5 stupně Celsia pro rozsah -10 stupňů C až +85 stupňů Celsia, a změny přesnosti pro celou oblast, která je + -2 stupně pro -55 stupňů až + Rozsah 125 stupňů.
Pokud se znovu podíváme na datový list, uvidíme specifikaci připojení senzoru. Můžeme připojit senzor v parazitním napájecím režimu, kde jsou potřeba dva vodiče, DATA a GND, nebo můžeme senzor připojit pomocí externího napájecího zdroje, kde jsou potřeba tři samostatné vodiče. Použijeme druhou konfiguraci.
Jelikož jsme nyní obeznámeni s hodnotami výkonu senzorů a oblastí souvisejících s připojením, můžeme se nyní soustředit na vytvoření schématu.
Kruhový diagram:-
Pokud uvidíme schéma zapojení, uvidíme, že: -
16x2 znakový LCD je připojen přes mikrokontrolér PIC16F877A, ve kterém jsou RB0, RB1, RB2 připojeny k LCD pinům RS, R / W a E. A RB4, RB5, RB6 a RB7 jsou připojeny přes 4 pinový LCD D4, D5, D6, D7. Displej LCD je připojen v režimu 4bit nebo nibble.
Krystalový oscilátor 20MHz se dvěma keramickými kondenzátory 33pF je připojen přes pin OSC1 a OSC2. Mikrokontroléru poskytne konstantní hodinovou frekvenci 20 MHz.
DS18B20 je také připojen podle konfigurace kolíků a s 4,7k pull up rezistorem, jak bylo popsáno výše. To vše jsem propojil na prkénku.
Pokud s mikrokontrolérem PIC jste nováčkem, postupujte podle našich výukových programů mikrokontroléru PIC s pokyny Začínáme s mikrokontrolérem PIC.
Kroky nebo tok kódu: -
- Nastavte konfigurace mikrokontroléru, které zahrnují konfiguraci oscilátoru.
- Nastavte požadovaný port pro LCD včetně registru TRIS.
- Každý cyklus se senzorem ds18b20 začíná resetováním, takže resetujeme ds18b20 a počkáme na přítomnost pulzu.
- Napište zápisník a nastavte rozlišení senzoru na 12 bitů.
- Přeskočte čtení ROM a následně resetovací puls.
- Odeslat příkaz převést teplotu.
- Odečtěte teplotu ze zápisníku.
- Zkontrolujte hodnotu teploty, zda negativní nebo pozitivní.
- Tiskněte teplotu na 16x2 LCD.
- Počkejte, až se teplota změní na +/- 20 stupňů Celsia.
Vysvětlení kódu:
Celý kód tohoto digitálního teploměru je uveden na konci tohoto tutoriálu s ukázkovým videem. Ke spuštění tohoto programu budete potřebovat několik hlavičkových souborů, které si můžete stáhnout zde.
Nejprve musíme nastavit konfigurační bity v mikrokontroléru pic a poté začít s hlavní funkcí void .
Potom se používají čtyři řádky pro zahrnutí hlavičkového souboru knihovny, lcd.h a ds18b20.h . A xc.h je pro záhlaví souboru mikrokontroléru.
#zahrnout
Tyto definice se používají pro odeslání příkazu teplotnímu senzoru. Příkazy jsou uvedeny v datovém listu senzoru.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Tato tabulka 3 z datového listu senzoru zobrazuje všechny příkazy, kde se makra používají k odesílání příslušných příkazů.
Teplota se na obrazovce zobrazí, pouze pokud se teplota změní o +/- 0,20 stupně. Tuto teplotní mezeru můžeme změnit z tohoto makra temp_gap . Změnou hodnoty v tomto makru se změní specifikace.
Další dvě plovoucí proměnné slouží k ukládání zobrazených údajů o teplotě a odlišují je teplotní mezerou
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Ve funkci void main () je lcd_init () ; je funkce pro inicializaci LCD. Tato funkce lcd_init () se volá z knihovny lcd.h.
Registry TRIS se používají k výběru I / O pinů jako vstupu nebo výstupu. Pro ukládání dat 12bitového rozlišení z teplotního senzoru se používají dvě nepodepsané krátké proměnné TempL a TempH .
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; nepodepsaný krátký TempL, TempH; unsigned int t, t2; plovoucí rozdíl1 = 0, rozdíl2 = 0; lcd_init ();
Podívejme se na smyčku while, zde rozdělujeme smyčku while (1) na malé kousky.
Tyto linky se používají ke snímání, zda je čidlo teploty připojeno nebo ne.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Připojte se prosím"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Použitím tohoto segmentu kódu inicializujeme senzor a odešleme příkaz k převodu teploty.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (rozlišení_12 bitů); // 12bitové rozlišení ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Tento kód slouží k ukládání 12bitových teplotních dat ve dvou nepodepsaných krátkých proměnných.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Pokud zkontrolujete níže uvedený kompletní kód, vytvoříme podmínku if-else, abychom zjistili teplotní znaménko, zda je kladné nebo záporné.
Pomocí kódu příkazu If manipulujeme s daty a sledujeme, zda je teplota záporná nebo ne, a určujeme, zda jsou změny teploty v rozsahu +/- 0,20 stupně. A v jiné části jsme zkontrolovali, zda je teplota kladná nebo ne, a detekce teplotních změn.
kód
Získání dat ze snímače teploty DS18B20:
Podívejme se na časový odstup rozhraní 1-Wire®. Používáme 20MHz Crystal. Pokud se podíváme do souboru ds18b20.c, uvidíme
#define _XTAL_FREQ 20000000
Tato definice se používá pro rutinu zpoždění kompilátoru XC8. 20Mhz je nastavena jako frekvence krystalu.
Vytvořili jsme pět funkcí
- o_reset
- read_bit
- read_byte
- write_bit
- write_byte
Protokol 1-Wire ® potřebuje ke komunikaci přísné sloty související s časováním. V datovém listu získáme perfektní informace týkající se časových úseků.
Uvnitř níže uvedené funkce jsme vytvořili přesný časový úsek. Je důležité vytvořit přesné zpoždění pro podržení a uvolnění a řídit bit TRIS portu příslušného senzoru.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (výstup) DQ = 0; // nastavit pin # na low (0) __delay_us (480); // 1 vodič vyžaduje časové zpoždění DQ_TRIS = 1; // Tris = 1 (vstup) __delay_us (60); // 1 vodič vyžaduje časové zpoždění if (DQ == 0) // pokud existuje přítomnost plus {__delay_us (480); návrat 0; // návrat 0 (1-vodič je přítomnost)} else {__delay_us (480); návrat 1; // návrat 1 (1-vodič NENÍ přítomnost)}} // 0 = přítomnost, 1 = žádná součást
Nyní podle níže uvedeného popisu časového slotu použitého v režimu čtení a zápisu jsme vytvořili funkci čtení a zápisu .
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // vytáhnout DQ nízko pro spuštění timeslot DQ_TRIS = 1; DQ = 1; // potom se vrací high for (i = 0; i <3; i ++); // zpoždění 15us od začátku návratu timeslotu (DQ); // návratová hodnota řádku DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // vytáhnout DQ nízko pro spuštění timeslot if (bitval == 1) DQ = 1; // vrací DQ na vysokou hodnotu, pokud zapisuje 1 __delay_us (5); // pozdržení hodnoty pro zbytek časového úseku DQ_TRIS = 1; DQ = 1; } // Zpoždění poskytuje 16us na smyčku plus 24us. Proto delay (5) = 104us
Dále zkontrolujte všechny související soubory záhlaví a.c zde.
Takto můžeme použít snímač DS18B20 k získání teploty pomocí mikrokontroléru PIC.
Pokud chcete vytvořit jednoduchý digitální teploměr s LM35, podívejte se níže na projekty s dalšími mikrokontroléry:
- Měření teploty v místnosti s Raspberry Pi
- Digitální teploměr využívající Arduino a LM35
- Digitální teploměr využívající LM35 a 8051
- Měření teploty pomocí LM35 a mikrokontroléru AVR