- Požadované komponenty: -
- Snímač teploty DS18B20:
- Schéma zapojenia: -
- Kroky alebo tok kódu: -
- Vysvetlenie kódu:
- Získavanie údajov zo snímača teploty DS18B20:
Teplotný snímač LM35 sa všeobecne používa na meranie teploty s mikrokontrolérmi, pretože je lacný a ľahko dostupný. Ale LM35 dáva analógové hodnoty a musíme ich previesť na digitálne pomocou ADC (Analog to Digital Converter). Ale dnes používame teplotný snímač DS18B20, v ktorom na získanie teploty nepotrebujeme prevod ADC. Tu použijeme na meranie teploty mikrokontrolér PIC s DS18B20.
Takže tu staviame teplomer s nasledujúcou špecifikáciou, ktorý používa jednotku mikrokontroléra PIC16F877A z mikročipu.
- Ukáže plný rozsah teplôt od -55 stupňov do +125 stupňov.
- Teplotu zobrazí, iba ak sa teplota zmení o +/- 0,2 stupňa.
Požadované komponenty: -
- Pic16F877A - balík PDIP40
- Chlebová doska
- Pickit-3
- 5V adaptér
- LCD JHD162A
- Snímač teploty DS18b20
- Drôty na pripojenie periférnych zariadení.
- 4,7k rezistory - 2ks
- 10k hrniec
- 20mHz kryštál
- 2 ks keramické kondenzátory 33pF
Snímač teploty DS18B20:
DS18B20 je vynikajúci snímač na presné snímanie teploty. Tento snímač poskytuje rozlíšenie 9 až 12 bitov pri snímaní teploty. Tento snímač komunikuje iba s jedným vodičom a na získanie analógových teplôt a ich digitálnu konverziu nepotrebuje žiadny ADC.
Špecifikácia snímača je: -
- Meria teploty od -55 ° C do + 125 ° C (-67 ° F do + 257 ° F)
- ± 0,5 ° C Presnosť od -10 ° C do + 85 ° C
- Programovateľné rozlíšenie od 9 bitov do 12 bitov
- Nie sú potrebné žiadne externé komponenty
- Snímač používa rozhranie 1-Wire®
Ak sa pozrieme na obrázok vyššie uvedeného pinoutu z údajového listu, môžeme vidieť, že snímač vyzerá úplne rovnako ako balík BC547 alebo BC557, TO-92. Prvý pin je uzemnenie, druhý pin je DQ alebo dáta a tretí pin je VCC.
Ďalej je uvedená elektrická špecifikácia z údajového listu, ktorá bude potrebná pre náš návrh. Menovité napájacie napätie snímača je + 3,0 V až + 5,5 V. Je tiež potrebné vytiahnuť napájacie napätie, ktoré je rovnaké ako napájacie napätie uvedené vyššie.
Existuje tiež hranica presnosti, ktorá je + -0,5 stupňa Celzia pre rozsah -10 stupňov C až +85 stupňov Celzia, a zmeny presnosti pre celú hranicu rozsahu, ktorá je + -2 stupne pre -55 stupňov do + Rozsah 125 stupňov.
Ak sa opäť pozrieme na údajový list, uvidíme špecifikáciu pripojenia snímača. Senzor môžeme pripojiť v režime parazitného napájania, kde sú potrebné dva vodiče, DATA a GND, alebo môžeme senzor pripojiť pomocou externého napájacieho zdroja, kde sú potrebné tri samostatné vodiče. Použijeme druhú konfiguráciu.
Pretože sme teraz oboznámení s hodnotami výkonu snímačov a oblastí súvisiacich s pripojením, môžeme sa teraz sústrediť na vytvorenie schémy.
Schéma zapojenia: -
Ak uvidíme schému zapojenia, uvidíme, že: -
Displej LCD s rozmermi 16 x 2 znakov je pripojený k mikrokontroléru PIC16F877A, v ktorom sú RB0, RB1, RB2 pripojené k pinom LCD RS, R / W a E. A RB4, RB5, RB6 a RB7 sú pripojené k 4 pinom LCD D4, D5, D6, D7. LCD je pripojený v 4bitovom režime alebo v režime nibble.
Krištáľový oscilátor 20 MHz s dvoma keramickými kondenzátormi 33 pF je pripojený cez kolíky OSC1 a OSC2. Mikrokontroléru poskytne konštantnú frekvenciu hodín 20 MHz.
DS18B20 je tiež pripojený podľa konfigurácie kolíkov a s 4,7 000 pull up rezistorom, ako bolo uvedené vyššie. Toto všetko som prepojil v doske.
Ak ste v mikrokontroléri PIC nováčikom, postupujte podľa našich návodov na mikrokontroléry PIC s návodom Začíname s mikrokontrolérom PIC.
Kroky alebo tok kódu: -
- Nastavte konfiguráciu mikrokontroléra, ktorá obsahuje konfiguráciu oscilátora.
- Nastavte požadovaný port pre LCD vrátane registra TRIS.
- Každý cyklus so snímačom ds18b20 začína resetom, takže resetujeme ds18b20 a počkáme na prítomný impulz.
- Napíš zápisník a nastavte rozlíšenie snímača na 12 bitov.
- Vynechajte načítanú ROM a potom resetovací impulz.
- Odošlite príkaz na prevod teploty.
- Odčítajte teplotu zo zápisníka.
- Skontrolujte hodnotu teploty, či už je negatívna alebo pozitívna.
- Vytlačte teplotu na 16 x 2 LCD.
- Počkajte na zmeny teploty +/- 20 stupňov Celzia.
Vysvetlenie kódu:
Celý kód tohto digitálneho teplomeru je uvedený na konci tohto tutoriálu s ukážkovým videom. Na spustenie tohto programu budete potrebovať niekoľko hlavičkových súborov, ktoré si môžete stiahnuť odtiaľto.
Najskôr musíme nastaviť konfiguračné bity v mikrokontroléri pic a potom začať s hlavnou funkciou void .
Potom pod štyri riadky sú určené pre vrátane knižnice súbor hlavičky, lcd.h a ds18b20.h . A xc.h je pre hlavičkový súbor mikrokontroléra.
#include
Tieto definície sa používajú na odoslanie príkazu do teplotného snímača. Príkazy sú uvedené v údajovom liste senzora.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Táto tabuľka 3 z údajového listu senzora zobrazuje všetky príkazy, pri ktorých sa na odosielanie príslušných príkazov používajú makra.
Teplota sa na obrazovke zobrazí, iba ak sa teplota zmení o +/- 0,20 stupňa. Túto teplotnú medzeru môžeme zmeniť z tohto makra temp_gap . Zmenou hodnoty v tomto makre sa zmení špecifikácia.
Ďalšie dve pohyblivé premenné slúžia na ukladanie zobrazených údajov o teplote a diferencujú ich podľa teplotnej medzery
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Vo funkcii void main () je lcd_init () ; je funkcia na inicializáciu LCD. Tento LCD_Init () je funkcia volaná z lcd.h knižnice.
Registre TRIS sa používajú na výber I / O pinov ako vstupu alebo výstupu. Na uloženie údajov s 12- bitovým rozlíšením z teplotného snímača sa používajú dve nepodpísané krátke premenné TempL a TempH .
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; nepodpísaný krátky TempL, TempH; nepodpísané int t, t2; plavákový rozdiel1 = 0, rozdiel2 = 0; lcd_init ();
Pozrime sa na while, tu rozbíjame while (1) na malé kúsky.
Tieto vedenia sa používajú na snímanie, či je alebo nie je pripojený snímač teploty.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Pripojte sa prosím"); lcd_com (0xC0); lcd_puts ("Sonda Temp-Sense"); }
Použitím tohto segmentu kódu inicializujeme snímač a pošleme príkaz na prevod teploty.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (rozlíšenie_12 bitov); // 12bitové rozlíšenie ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Tento kód slúži na ukladanie 12-bitových údajov o teplote do dvoch nepodpísaných krátkych premenných.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Ak potom skontrolujete kompletný kód uvedený nižšie, vytvoríme podmienku typu „if-else“, aby sme zistili teplotný znak, či je pozitívny alebo negatívny.
Pomocou kódu príkazu If manipulujeme s údajmi a zisťujeme, či je teplota záporná alebo nie, a určujeme, či sú zmeny teploty v rozsahu +/- 0,20 stupňa alebo nie. A v inej časti sme skontrolovali, či je teplota kladná alebo nie, a zisťovanie zmien teploty.
kód
Získavanie údajov zo snímača teploty DS18B20:
Pozrime sa na časový odstup rozhrania 1-Wire®. Používame 20MHz Crystal. Ak sa pozrieme do súboru ds18b20.c, uvidíme
#define _XTAL_FREQ 20000000
Táto definícia sa používa pre rutinu oneskorenia kompilátora XC8. 20Mhz je nastavená ako frekvencia kryštálu.
Vytvorili sme päť funkcií
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Protokol 1-Wire ® potrebuje na komunikáciu prísne sloty súvisiace s časovaním. V datasheete dostaneme perfektné informácie týkajúce sa časových úsekov.
Vo vnútri nasledujúcej funkcie sme vytvorili presný časový úsek. Je dôležité vytvoriť presné oneskorenie zadržania a uvoľnenia a riadiť bit TRIS portu príslušného snímača.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (výstup) DQ = 0; // nastav pin # na low (0) __delay_us (480); // 1 vodič vyžaduje časové oneskorenie DQ_TRIS = 1; // Tris = 1 (vstup) __delay_us (60); // 1 vodič vyžaduje časové oneskorenie if (DQ == 0) // ak existuje plus prítomnosti {__delay_us (480); návrat 0; // návrat 0 (1-vodič je prítomný)} else {__delay_us (480); návrat 1; // návrat 1 (1-vodič NIE je prítomný)}} // 0 = prítomnosť, 1 = žiadna časť
Teraz, podľa popisu časového limitu uvedeného nižšie, ktorý sa používa pri čítaní a zápise , sme vytvorili funkciu čítania a zápisu .
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // potiahnutím DQ nízko spustíte timeslot DQ_TRIS = 1; DQ = 1; // potom sa vráti high for (i = 0; i <3; i ++); // oneskorenie 15us od začiatku návratu timeslotu (DQ); // návratová hodnota riadku DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // potiahnutím DQ nízko spustíte timeslot if (bitval == 1) DQ = 1; // vráti DQ na maximum, ak napíše 1 __delay_us (5); // pozdržať hodnotu pre zvyšok časového úseku DQ_TRIS = 1; DQ = 1; } // Oneskorenie poskytuje 16us na slučku, plus 24us. Preto oneskorenie (5) = 104us
Ďalej tu skontrolujte všetky súvisiace súbory hlavičiek a.c.
Takto môžeme použiť snímač DS18B20 na získanie teploty pomocou mikrokontroléra PIC.
Ak chcete vytvoriť jednoduchý digitálny teplomer s LM35, pozrite si nižšie uvedené projekty s ďalšími mikrokontrolérmi:
- Meranie izbovej teploty pomocou Raspberry Pi
- Digitálny teplomer využívajúci Arduino a LM35
- Digitálny teplomer využívajúci LM35 a 8051
- Meranie teploty pomocou mikrokontroléra LM35 a AVR