- Nødvendige komponenter: -
- DS18B20 Temperatursensor:
- Kretsskjema: -
- Trinn eller kodestrøm: -
- Kode Forklaring:
- Få data fra DS18B20 temperatursensor:
Generelt brukes LM35-temperatursensoren sammen med mikrokontrollere for å måle temperaturen fordi den er billig og lett tilgjengelig. Men LM35 gir analoge verdier, og vi må konvertere dem til digitale ved hjelp av ADC (Analog til Digital Converter). Men i dag bruker vi DS18B20 temperatursensor der vi ikke trenger en ADC-konvertering for å få temperaturen. Her vil vi bruke PIC Microcontroller med DS18B20 for å måle temperaturen.
Så her bygger vi et termometer med følgende spesifikasjon ved hjelp av PIC16F877A mikrokontroller fra mikrochip.
- Det vil vise hele temperaturområdet fra -55 grader til +125 grader.
- Den viser bare temperaturen hvis temperaturen endres + / -.2 grader.
Nødvendige komponenter: -
- Pic16F877A - PDIP40-pakke
- Brødtavle
- Pickit-3
- 5V adapter
- LCD JHD162A
- DS18b20 temperatursensor
- Ledninger for å koble til eksterne enheter.
- 4.7k motstander - 2 stk
- 10k pott
- 20mHz krystall
- 2 stk 33pF keramiske kondensatorer
DS18B20 Temperatursensor:
DS18B20 er en utmerket sensor som nøyaktig registrerer temperaturen. Denne sensoren gir 9bit til 12bit oppløsning på temperaturmåling. Denne sensoren kommuniserer med bare en ledning og trenger ingen ADC for å tilegne seg analoge temperaturer og konvertere dem digitalt.
Spesifikasjonen til sensoren er: -
- Måler temperaturer fra -55 ° C til + 125 ° C (-67 ° F til + 257 ° F)
- ± 0,5 ° C Nøyaktighet fra -10 ° C til + 85 ° C
- Programmerbar oppløsning fra 9 bit til 12 bit
- Ingen eksterne komponenter påkrevd
- Sensoren bruker 1-Wire®-grensesnitt
Hvis vi ser på pinout-bildet ovenfor fra databladet, kan vi se at sensoren ser ut akkurat som BC547- eller BC557-pakken, TO-92. Den første pinnen er bakken, den andre pinnen er DQ eller dataene og den tredje pinnen er VCC.
Nedenfor er den elektriske spesifikasjonen fra databladet som vil være nødvendig for vårt design. Nominell forsyningsspenning for sensoren er + 3.0V til + 5.5V. Det trenger også å trekke opp forsyningsspenningen som er den samme som forsyningsspenningen angitt ovenfor.
Det er også en nøyaktighetsmargin som er + -0,5 grader Celsius for området -10 grader C til + 85 grader Celsius, og nøyaktigheten endres for hele områdemargen, som er + -2 grader for -55 grader til + 125 graders rekkevidde.
Hvis vi igjen ser på databladet, vil vi se tilkoblingsspesifikasjonen til sensoren. Vi kan koble sensoren i parasittisk strømmodus der to ledninger er nødvendig, DATA og GND, eller vi kan koble sensoren ved hjelp av ekstern strømforsyning, der det er behov for tre separate ledninger. Vi vil bruke den andre konfigurasjonen.
Ettersom vi nå er kjent med effektvurderingen til sensoren og tilkoblingsrelaterte områder, kan vi nå konsentrere oss om å lage skjematisk.
Kretsskjema: -
Hvis vi ser kretsskjemaet, vil vi se at: -
16x2 tegn LCD er koblet over PIC16F877A mikrokontroller, der RB0, RB1, RB2 er koblet til LCD-pin RS, R / W og E. D7. LCD-skjermen er koblet til i 4bit-modus eller nibble-modus.
En krystalloscillator på 20MHz med to keramiske kondensatorer på 33pF er koblet over OSC1 og OSC2 pin. Det vil gi konstant 20 MHz klokkefrekvens til mikrokontrolleren.
DS18B20 er også koblet i henhold til pinnekonfigurasjonen og med en 4,7 k opptrekksmotstand som diskutert tidligere. Jeg har koblet alt dette til brødplaten.
Hvis du ikke er kjent med PIC Microcontroller enn å følge PIC Microcontroller-veiledningene om hvordan du kommer i gang med PIC Microcontroller.
Trinn eller kodestrøm: -
- Still inn konfigurasjonene til mikrokontrolleren som inkluderer oscillatorkonfigurasjon.
- Still inn ønsket port for LCD inkludert TRIS-register.
- Hver syklus med ds18b20-sensor starter med reset, så vi tilbakestiller ds18b20 og venter på tilstedeværelsespulsen.
- Skriv kladdeplaten og sett oppløsningen til sensoren 12bit.
- Hopp over ROM-lesingen etterfulgt av en tilbakestillingspuls.
- Send kommandoen for konverteringstemperatur.
- Les temperaturen fra kladdeplaten.
- Sjekk temperaturverdien negativ eller positiv.
- Skriv ut temperaturen på 16x2 LCD.
- Vent på temperaturendringene i +/-. 20 grader Celsius.
Kode Forklaring:
Full kode for dette digitale termometeret er gitt på slutten av denne opplæringen med en demonstrasjonsvideo. Du vil trenge noen headerfiler for å kjøre dette programmet, som kan lastes ned herfra.
Først må vi sette konfigurasjonsbitene i pic-mikrokontrolleren og deretter starte med ugyldig hovedfunksjon.
Deretter brukes nedenfor fire linjer for å inkludere bibliotekets headerfil, lcd.h og ds18b20.h . Og xc.h er for mikrokontroller header-fil.
#inkludere
Disse definisjonene brukes for å sende kommando til temperatursensoren. Kommandoene er oppført i sensorens datablad.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Denne tabellen 3 fra sensorens datablad viser alle kommandoer der makroer brukes til å sende respektive kommandoer.
Temperaturen vises bare på skjermen hvis temperaturen endres +/- .20 grader. Vi kan endre dette temperaturgapet fra denne temp_gap- makroen. Ved å endre verdien på denne makroen, vil spesifikasjonen endres.
Andre to flytevariabler som brukes til å lagre de viste temperaturdataene og skille dem med temperaturgapet
#define temp_gap 20 float pre_val = 0, aft_val = 0;
I ugyldig hoved () -funksjon, lcd_init () ; er en funksjon for å initialisere LCD. Denne lcd_init () -funksjonen kalles fra lcd.h- biblioteket.
TRIS-registre brukes til å velge I / O-pinner som inngang eller utgang. To usignerte korte variabler TempL og TempH brukes til å lagre 12-biters oppløsningsdata fra temperatursensoren.
ugyldig hoved (ugyldig) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; usignert kort TempL, TempH; usignert int t, t2; flyteforskjell1 = 0, forskjell2 = 0; lcd_init ();
La oss se mens loop, her bryter vi while (1) loop i små biter.
Disse linjene brukes til å føle at temperatursensoren er koblet til eller ikke.
mens (ow_reset ()) {lcd_com (0x80); lcd_puts ("Please Connect"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Ved å bruke dette kodesegmentet initialiserer vi sensoren og sender kommandoen for å konvertere temperaturen.
lcd_puts (""); ow_reset (); skrive_byte (skrive_skrapeplate); skriv_byte (0); skriv_byte (0); skriv_byte (oppløsning_12bit); // 12-biters oppløsning ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Denne koden er for lagring av 12-biters temperaturdata i to usignerte korte variabler.
mens (read_byte () == 0xff); __forsink_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Så hvis du sjekker den fullstendige koden nedenfor, har vi opprettet if-else-tilstand for å finne ut temperaturtegnet om det er positivt eller negativt.
Ved å bruke If- setningskoden manipulerer vi dataene og ser om temperaturen er negativ eller ikke, og bestemmer at temperaturendringene er i +/-.20 graders område eller ikke. Og i en annen del sjekket vi om temperaturen er positiv eller ikke, og temperaturen endrer deteksjonen.
kode
Få data fra DS18B20 temperatursensor:
La oss se tidsgapet til 1-Wire®-grensesnittet. Vi bruker 20Mhz Crystal. Hvis vi ser inn i filen ds18b20.c, får vi se
#define _XTAL_FREQ 20000000
Denne definisjonen brukes for XC8 kompileringsforsinkelsesrutine. 20Mhz er satt som krystallfrekvens.
Vi laget fem funksjoner
- ow_reset
- read_bit
- read_byte
- skriv_bit
- skriv_byte
1-Wire ® -protokollen trenger strenge tidsrelaterte spor for å kommunisere. Inne i databladet får vi perfekt informasjon om tidsspor.
Inne i funksjonen nedenfor opprettet vi den nøyaktige tidsluken. Det er viktig å lage den eksakte forsinkelsen for å holde og slippe og kontrollere TRIS-biten til den respektive sensorporten.
usignert char ow_reset (ugyldig) {DQ_TRIS = 0; // Tris = 0 (utgang) DQ = 0; // sett pin # til lav (0) __delay_us (480); // 1 ledning krever tidsforsinkelse DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 ledning krever tidsforsinkelse hvis (DQ == 0) // hvis det er en tilstedeværelse pluse {__delay_us (480); retur 0; // returner 0 (1-ledning er tilstedeværelse)} annet {__delay_us (480); retur 1; // retur 1 (1-ledning er IKKE tilstedeværelse)}} // 0 = tilstedeværelse, 1 = ingen del
Nå som per under tidsluke beskrivelse brukes i lese og skrive, skapte vi lese og skrive funksjon hhv.
usignert char read_bit (void) {usignert char i; DQ_TRIS = 1; DQ = 0; // trekk DQ lavt for å starte timeslot DQ_TRIS = 1; DQ = 1; // returner deretter høyt for (i = 0; i <3; i ++); // forsinkelse 15us fra start av timeslot return (DQ); // returverdi av DQ-linje} ugyldig skrive_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // trekk DQ lavt for å starte timeslot hvis (bitval == 1) DQ = 1; // returner DQ høyt hvis skriv 1 __forsink_us (5); // hold verdi for resten av timeslot DQ_TRIS = 1; DQ = 1; } // Delay gir 16us per sløyfe, pluss 24us. Forsink derfor (5) = 104us
Videre sjekk all relatert header og.c filer her.
Så dette er hvordan vi kan bruke DS18B20-sensoren for å få temperaturen med PIC Microcontroller.
Hvis du vil bygge et enkelt digitalt termometer med LM35, kan du sjekke ut prosjekter nedenfor med andre mikrokontrollere:
- Måling av romtemperatur med Raspberry Pi
- Digitalt termometer ved bruk av Arduino og LM35
- Digitalt termometer ved bruk av LM35 og 8051
- Temperaturmåling ved bruk av LM35 og AVR Microcontroller