- Komponenter som krävs: -
- DS18B20 Temperatursensor:
- Kretsschema: -
- Steg eller kodflöde: -
- Kodförklaring:
- Hämta data från DS18B20 temperatursensor:
Generellt används LM35-temperatursensorn med mikrokontroller för att mäta temperaturen eftersom den är billig och lätt tillgänglig. Men LM35 ger analoga värden och vi måste konvertera dem till digitala med ADC (Analog till Digital Converter). Men idag använder vi DS18B20 temperatursensor där vi inte behöver en ADC-omvandling för att få temperaturen. Här kommer vi att använda PIC Microcontroller med DS18B20 för att mäta temperaturen.
Så här bygger vi en termometer med följande specifikation med hjälp av PIC16F877A mikrokontroller från mikrochip.
- Den visar hela temperaturområdet från -55 grader till +125 grader.
- Den visar endast temperaturen om temperaturen ändras + / -.2 grader.
Komponenter som krävs: -
- Pic16F877A - PDIP40-paket
- Brödbräda
- Pickit-3
- 5V-adapter
- LCD JHD162A
- DS18b20 temperatursensor
- Ledningar för att ansluta kringutrustning.
- 4.7k motstånd - 2st
- 10k kruka
- 20 mHz kristall
- 2 st 33pF keramiska kondensatorer
DS18B20 Temperatursensor:
DS18B20 är en utmärkt sensor för att exakt känna av temperaturen. Denna sensor ger upplösning på 9 bitar till 12 bitars temperaturavkänning. Denna sensor kommunicerar med endast en ledning och behöver ingen ADC för att få analoga temperaturer och konvertera dem in digitalt.
Specifikationen för sensorn är: -
- Mäter temperaturer från -55 ° C till + 125 ° C (-67 ° F till + 257 ° F)
- ± 0,5 ° C Noggrannhet från -10 ° C till + 85 ° C
- Programmerbar upplösning från 9 bitar till 12 bitar
- Inga externa komponenter krävs
- Sensorn använder 1-Wire®-gränssnitt
Om vi tittar på ovanstående pinout-bild från databladet kan vi se att sensorn ser exakt ut som BC547- eller BC557-paketet, TO-92. Den första stiftet är marken, den andra stiftet är DQ eller data och den tredje stiftet är VCC.
Nedan finns den elektriska specifikationen från databladet som kommer att behövas för vår design. Den nominella matningsspänningen för sensorn är + 3.0V till + 5.5V. Det behöver också dra upp matningsspänningen som är densamma som den ovan angivna matningsspänningen.
Det finns också en noggrannhetsmarginal som är + -0,5 grader Celsius för området -10 grader C till +85 grader Celsius, och noggrannheten ändras för hela områdesmarginalen, vilket är + -2 grader för -55 grader till + 125 graders räckvidd.
Om vi återigen tittar på databladet kommer vi att se sensorns anslutningsspecifikation. Vi kan ansluta sensorn i parasitiskt strömläge där två ledningar behövs, DATA och GND, eller så kan vi ansluta sensorn med extern strömförsörjning, där tre separata ledningar behövs. Vi använder den andra konfigurationen.
Eftersom vi nu är bekanta med sensorns och anslutningsrelaterade områdenas effektvärden kan vi nu koncentrera oss på att göra schemat.
Kretsschema: -
Om vi ser kretsschemat ser vi att: -
16x2 tecken LCD är ansluten över PIC16F877A mikrokontroller, där RB0, RB1, RB2 är anslutna till LCD-stift RS, R / W och E. Och RB4, RB5, RB6 och RB7 är anslutna över LCD: s 4-stift D4, D5, D6, D7. LCD-skärmen är ansluten i 4bit-läge eller nibble-läge.
En kristalloscillator på 20 MHz med två keramiska kondensatorer på 33 pF är ansluten över OSC1 och OSC2-stift. Det kommer att ge konstant 20 MHz klockfrekvens till mikrokontrollern.
DS18B20 är också ansluten enligt stiftkonfigurationen och med ett 4,7 k uppdragningsmotstånd som diskuterats tidigare. Jag har anslutit allt detta i panelen.
Om du är nybörjare i PIC Microcontroller än att följa våra PIC Microcontroller Tutorials som anger med Komma igång med PIC Microcontroller.
Steg eller kodflöde: -
- Ställ in mikrokontrollerns konfigurationer som inkluderar Oscillatorkonfiguration.
- Ställ in önskad port för LCD inklusive TRIS-register.
- Varje cykel med ds18b20-sensor börjar med återställning, så vi återställer ds18b20 och väntar på närvaropulsen.
- Skriv skrapblocket och ställ in upplösningen på sensorn 12bit.
- Hoppa över läst ROM följt av en återställningspuls.
- Skicka konvertera temperaturkommando.
- Läs temperaturen från skrapblocket.
- Kontrollera temperaturvärdet, antingen negativt eller positivt.
- Skriv ut temperaturen på 16x2 LCD.
- Vänta på temperaturförändringarna i +/-. 20 grader Celsius.
Kodförklaring:
Fullständig kod för denna digitala termometer ges i slutet av denna handledning med en demonstrationsvideo. Du kommer att behöva några rubrikfiler för att köra programmet som kan laddas ner härifrån.
Först måste vi ställa in konfigurationsbitarna i pic-mikrokontrollern och sedan börja med ogiltig huvudfunktion.
Därefter används fyra rader för att inkludera bibliotekets rubrikfil , lcd.h och ds18b20.h . Och xc.h är för mikrokontrollerhuvudfil.
#omfatta
Dessa definitioner används för att skicka kommando till temperaturgivaren. Kommandona listas i sensorns datablad.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Denna tabell 3 från sensorns datablad visar alla kommandon där makron används för att skicka respektive kommandon.
Temperaturen visas bara på skärmen om temperaturen ändras +/- .20 grader. Vi kan ändra detta temperaturgap från detta temp_gap- makro. Genom att ändra värdet vid detta makro kommer specifikationen att ändras.
Andra två flottörvariabler som används för att lagra de visade temperaturdata och differentiera dem med temperaturgapet
#define temp_gap 20 float pre_val = 0, aft_val = 0;
I ogiltig huvudfunktion () , lcd_init () ; är en funktion för att initiera LCD. Denna lcd_init () -funktion anropas från biblioteket lcd.h.
TRIS-register används för att välja I / O-stift som ingång eller utgång. Två osignerade kortvariabla TempL och TempH används för att lagra 12-bitars upplösningsdata från temperatursensorn.
ogiltigt huvud (ogiltigt) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; osignerad kort TempL, TempH; osignerad int t, t2; flottörskillnad1 = 0, skillnad2 = 0; lcd_init ();
Låt oss se while-slingan, här bryter vi while- slingan i små bitar.
Dessa linjer används för att känna av att temperaturgivaren är ansluten eller inte.
medan (ow_reset ()) {lcd_com (0x80); lcd_puts ("Please Connect"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Genom att använda detta kodsegment initialiserar vi sensorn och skickar kommandot för att konvertera temperaturen.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); skriv_byte (0); skriv_byte (0); skriv_byte (upplösning_12bit); // 12-bitars upplösning ow_reset (); write_byte (skip_rom); skriv_byte (convert_temp);
Den här koden är för att lagra 12-bitars temperaturdata i två osignerade kortvariabler.
medan (read_byte () == 0xff); __fördröja_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Om du kontrollerar hela koden nedan har vi skapat if-else-villkor för att ta reda på temperaturskylten om den är positiv eller negativ.
Genom att använda If- satskoden manipulerar vi data och ser om temperaturen är negativ eller inte och bestämmer temperaturförändringarna inom +/-.20 graders intervall eller inte. Och i en annan del kontrollerade vi om temperaturen är positiv eller inte och temperaturförändringsdetekteringen.
koda
Hämta data från DS18B20 temperatursensor:
Låt oss se tidsgapet för 1-Wire®-gränssnittet. Vi använder 20Mhz Crystal. Om vi tittar inuti filen ds18b20.c kommer vi att se
#define _XTAL_FREQ 20000000
Denna definition används för XC8-kompilatorfördröjningsrutin. 20Mhz ställs in som kristallfrekvens.
Vi gjorde fem funktioner
- ow_reset
- read_bit
- läs_byte
- skriv_bit
- skriv_byte
1-Wire ® -protokollet behöver stränga tidsrelaterade platser för att kommunicera. Inne i databladet får vi perfekt information om tidsluckan.
Inuti funktionen nedan skapade vi den exakta tidsluckan. Det är viktigt att skapa den exakta fördröjningen för att hålla och släppa och styra TRIS-biten i respektive sensorport.
osignerad char ow_reset (ogiltig) {DQ_TRIS = 0; // Tris = 0 (utgång) DQ = 0; // ställa in pin # till låg (0) __delay_us (480); // 1 tråd kräver tidsfördröjning DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 tråd kräver tidsfördröjning om (DQ == 0) // om det finns en närvaropluss {__fördröjning_us (480); returnera 0; // returnera 0 (1-tråd är närvaro)} annat {__delay_us (480); retur 1; // return 1 (1-tråd är INTE närvaro)}} // 0 = närvaro, 1 = ingen del
Nu enligt nedan tidslucka beskrivning som används i läsa och skriva, skapade vi läs- och skrivfunktionen respektive.
osignerad char read_bit (ogiltig) {unsigned char i; DQ_TRIS = 1; DQ = 0; // dra DQ lågt för att starta tidslucka DQ_TRIS = 1; DQ = 1; // returnera sedan högt för (i = 0; i <3; i ++); // fördröjning 15us från start av tidslucka (DQ); // returvärde för DQ-rad} ogiltig skrivbit (char bitval) {DQ_TRIS = 0; DQ = 0; // dra DQ lågt för att starta tidslucka om (bitval == 1) DQ = 1; // returnera DQ högt om skriv 1 __fördröj_us (5); // håll värde för återstoden av tidslucka DQ_TRIS = 1; DQ = 1; } // Delay ger 16us per loop, plus 24us. Därför fördröjning (5) = 104us
Ytterligare kontroll alla tillhörande huvudet och.c filer här.
Så detta är hur vi kan använda DS18B20-sensorn för att få temperaturen med PIC Microcontroller.
Om du vill bygga en enkel digital termometer med LM35, kolla nedan projekt med andra mikrokontroller:
- Rumstemperaturmätning med Raspberry Pi
- Digital termometer med Arduino och LM35
- Digital termometer med LM35 och 8051
- Temperaturmätning med LM35 och AVR Microcontroller