- Nødvendige komponenter: -
- DS18B20 Temperatursensor:
- Kredsløbsdiagram:-
- Trin eller kodeflow: -
- Kode Forklaring:
- Henter data fra DS18B20 temperatursensor:
Generelt bruges LM35-temperatursensoren sammen med mikrokontroller til at måle temperaturen, fordi den er billig og let tilgængelig. Men LM35 giver analoge værdier, og vi er nødt til at konvertere dem til digitale ved hjælp af ADC (Analog til Digital Converter). Men i dag bruger vi DS18B20 temperatursensor, hvor vi ikke har brug for en ADC-konvertering for at få temperaturen. Her vil vi bruge PIC Microcontroller med DS18B20 til at måle temperaturen.
Så her bygger vi et termometer med følgende specifikation ved hjælp af PIC16F877A mikrokontroller enhed fra mikrochip.
- Det viser det fulde temperaturområde fra -55 grader til +125 grader.
- Det viser kun temperaturen, hvis temperaturen ændrer sig + / -.2 grader.
Nødvendige komponenter: -
- Pic16F877A - PDIP40-pakke
- Brødbræt
- Pickit-3
- 5V adapter
- LCD JHD162A
- DS18b20 temperaturføler
- Ledninger til tilslutning af perifert udstyr.
- 4,7 k modstande - 2 stk
- 10 k gryde
- 20 mHz krystal
- 2 stk. 33pF keramiske kondensatorer
DS18B20 Temperatursensor:
DS18B20 er en fremragende sensor til nøjagtig registrering af temperaturen. Denne sensor giver 9bit til 12bit opløsning ved temperaturføling. Denne sensor kommunikerer kun med en ledning og har ikke brug for nogen ADC for at opnå analoge temperaturer og konvertere dem digitalt.
Specifikationen for sensoren er: -
- Måler temperaturer fra -55 ° C til + 125 ° C (-67 ° F til + 257 ° F)
- ± 0,5 ° C Nøjagtighed fra -10 ° C til + 85 ° C
- Programmerbar opløsning fra 9 bit til 12 bit
- Ingen eksterne komponenter påkrævet
- Sensoren bruger 1-Wire®-interface
Hvis vi ser på ovenstående pinout-billede fra databladet, kan vi se, at sensoren ser nøjagtigt ud som BC547- eller BC557-pakken, TO-92. Den første pin er jorden, den anden pin er DQ eller dataene, og den tredje pin er VCC.
Nedenfor er den elektriske specifikation fra databladet, som er nødvendig for vores design. Den nominelle forsyningsspænding for sensoren er + 3.0V til + 5.5V. Det er også nødvendigt at trække forsyningsspænding op, som er den samme som forsyningsspændingen angivet ovenfor.
Der er også en nøjagtighedsmargen, der er + -0,5 grader Celsius for området -10 grader C til +85 grader Celsius, og nøjagtigheden ændres for hele rækkevidden, som er + -2 grader for -55 grader til + 125 graders rækkevidde.
Hvis vi igen ser på databladet, vil vi se sensorens forbindelsesspecifikation. Vi kan forbinde sensoren i parasitisk strømtilstand, hvor der er behov for to ledninger, DATA og GND, eller vi kan tilslutte sensoren ved hjælp af ekstern strømforsyning, hvor der er behov for tre separate ledninger. Vi bruger den anden konfiguration.
Da vi nu er bekendt med effektklassificeringerne for sensoren og forbindelsesrelaterede områder, kan vi nu koncentrere os om at lave skematisk.
Kredsløbsdiagram:-
Hvis vi ser kredsløbsdiagrammet, vil vi se, at: -
16x2 tegn LCD er tilsluttet på tværs af PIC16F877A mikrocontroller, hvor RB0, RB1, RB2 er forbundet til LCD-pin RS, R / W og E. Og RB4, RB5, RB6 og RB7 er forbundet over LCD's 4 pin D4, D5, D6, D7. LCD'et er tilsluttet i 4bit-tilstand eller nibble-tilstand.
En krystaloscillator på 20 MHz med to keramiske kondensatorer på 33 pF er tilsluttet på tværs af OSC1 og OSC2 pin. Det giver konstant 20 MHz-urfrekvens til mikrocontrolleren.
DS18B20 er også forbundet som i pin-konfigurationen og med en 4.7k pull up-modstand som beskrevet tidligere. Jeg har forbundet alt dette i brødbrættet.
Hvis du er ny hos PIC Microcontroller, end følg vores PIC Microcontroller Tutorials med angivelse af Kom godt i gang med PIC Microcontroller.
Trin eller kodeflow: -
- Indstil konfigurationerne af mikrokontrolleren, der inkluderer Oscillator-konfiguration.
- Indstil den ønskede port til LCD inklusive TRIS-register.
- Hver cyklus med ds18b20-sensor starter med reset, så vi nulstiller ds18b20 og venter på tilstedeværelsespulsen.
- Skriv kladepladen, og indstil opløsningen på sensoren 12bit.
- Spring ROM-læsningen over efterfulgt af en nulstillingspuls.
- Indsend konverteringstemperaturkommando.
- Læs temperaturen fra bundpladen.
- Kontroller temperaturværdien, om den er negativ eller positiv.
- Udskriv temperaturen på 16x2 LCD.
- Vent på temperaturændringerne i +/-. 20 grader Celsius.
Kode Forklaring:
Fuld kode til dette digitale termometer er givet i slutningen af denne tutorial med en demonstrationsvideo. Du har brug for nogle headerfiler for at køre dette program, som kan downloades herfra.
Først skal vi indstille konfigurationsbitene i pic-mikrocontrolleren og derefter starte med ugyldig hovedfunktion.
Derefter benyttes fire linjer til at inkludere bibliotekets headerfil, lcd.h og ds18b20.h . Og xc.h er til mikrocontroller header-fil.
#omfatte
Disse definitioner bruges til at sende kommando til temperatursensoren. Kommandoerne er anført i sensorens datablad.
#definer skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Denne tabel 3 fra sensorens datablad viser alle kommandoer, hvor makroer bruges til at sende respektive kommandoer.
Temperaturen vises kun på skærmen, hvis temperaturen ændres +/- .20 grader. Vi kan ændre dette temperaturgab fra denne temp_gap- makro. Ved at ændre værdien på denne makro ændres specifikationen.
Andre to floatvariabler, der bruges til lagring af de viste temperaturdata og differentierer dem med temperaturgabet
#definer temp_gap 20 float pre_val = 0, aft_val = 0;
I ugyldig main () -funktion er lcd_init () ; er en funktion til initialisering af LCD. Denne lcd_init () funktion kaldes fra lcd.h biblioteket.
TRIS-registre bruges til at vælge I / O-ben som input eller output. To usignerede korte variabler TempL og TempH bruges til lagring af 12- bitopløsningsdata fra temperatursensoren.
ugyldigt hoved (ugyldigt) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; usigneret kort TempL, TempH; usigneret int t, t2; flydeforskel1 = 0, forskel2 = 0; lcd_init ();
Lad os se while-løkken, her bryder vi while (1) -sløjfen i små bidder.
Disse linjer bruges til at registrere, at temperatursensoren er tilsluttet eller ej.
mens (ow_reset ()) {lcd_com (0x80); lcd_puts ("Tilslut venligst"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Ved at bruge dette kodesegment initialiserer vi sensoren og sender kommandoen for at konvertere temperaturen.
lcd_puts (""); ow_reset (); skriv_byte (skriv_scratchpad); skriv_byte (0); skriv_byte (0); skriv_byte (opløsning_12bit); // 12bit opløsning ow_reset (); skriv_byte (spring_rom); write_byte (convert_temp);
Denne kode er til lagring af 12bit temperaturdata i to usignerede korte variabler.
mens (read_byte () == 0xff); __forsink_ms (500); ow_reset (); skriv_byte (spring_rom); skriv_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Så hvis du tjekker den komplette kode nedenfor, har vi oprettet if-else-betingelse for at finde ud af temperaturtegnet, om det er positivt eller negativt.
Ved at bruge If- sætningskoden manipulerer vi dataene og ser, om temperaturen er negativ eller ej, og bestemmer, at temperaturændringerne er i +/-.20 graders rækkevidde eller ej. Og i en anden del kontrollerede vi, om temperaturen er positiv eller ej, og at temperaturen ændrer detektionen.
kode
Henter data fra DS18B20 temperatursensor:
Lad os se tidsforskellen i 1-Wire®-interface. Vi bruger 20Mhz Crystal. Hvis vi ser inde i ds18b20.c-filen, ser vi det
#define _XTAL_FREQ 20000000
Denne definition bruges til XC8-kompilatorforsinkelsesrutine. 20Mhz er indstillet som krystalfrekvensen.
Vi lavede fem funktioner
- ow_reset
- read_bit
- read_byte
- skriv_bit
- skriv_byte
1-Wire ® -protokollen har brug for strenge tidsrelaterede slots for at kommunikere. Inde i databladet får vi perfekte oplysninger om tidsslot.
Inde i nedenstående funktion oprettede vi det nøjagtige tidsrum. Det er vigtigt at skabe den nøjagtige forsinkelse for hold og frigivelse og styre TRIS-biten i den respektive sensors port.
usigneret char ow_reset (ugyldigt) {DQ_TRIS = 0; // Tris = 0 (output) DQ = 0; // sæt pin # til lav (0) __delay_us (480); // 1 ledning kræver tidsforsinkelse DQ_TRIS = 1; // Tris = 1 (input) __forsinkelse_us (60); // 1 ledning kræver tidsforsinkelse, hvis (DQ == 0) // hvis der er en tilstedeværelsespluse {__delay_us (480); returnere 0; // returner 0 (1-ledning er tilstedeværelse)} ellers {__delay_us (480); returnere 1; // return 1 (1-ledning er IKKE tilstedeværelse)} // 0 = tilstedeværelse, 1 = ingen del
Nu som beskrevet i nedenstående tidsfeltbeskrivelse, der blev brugt i Læs og Skriv, oprettede vi henholdsvis læse- og skrivefunktionen .
usigneret char read_bit (ugyldigt) {usigneret char i; DQ_TRIS = 1; DQ = 0; // træk DQ lavt for at starte timeslot DQ_TRIS = 1; DQ = 1; // returner derefter højt for (i = 0; i <3; i ++); // forsinkelse 15us fra start af timeslot return (DQ); // returværdi af DQ-linje} ugyldig skriv_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // træk DQ lavt for at starte timeslot hvis (bitval == 1) DQ = 1; // returner DQ højt, hvis skriv 1 __forsink_us (5); // hold værdi for resten af timeslot DQ_TRIS = 1; DQ = 1; } // Delay giver 16us pr. Løkke plus 24us. Derfor forsinkelse (5) = 104us
Tjek yderligere alle relaterede header- og.c-filer her.
Så dette er, hvordan vi kan bruge DS18B20-sensoren til at få temperaturen med PIC Microcontroller.
Hvis du vil bygge et simpelt digitalt termometer med LM35, skal du tjekke nedenstående projekter med andre mikrocontrollere:
- Rumtemperaturmåling med Raspberry Pi
- Digitalt termometer ved hjælp af Arduino og LM35
- Digitalt termometer ved hjælp af LM35 og 8051
- Temperaturmåling ved hjælp af LM35 og AVR Microcontroller