- Vereiste componenten: -
- DS18B20 temperatuursensor:
- Schakelschema:-
- Stappen of codestroom: -
- Code Verklaring:
- Gegevens ophalen van DS18B20-temperatuursensor:
Over het algemeen wordt de LM35-temperatuursensor gebruikt met microcontrollers om de temperatuur te meten, omdat deze goedkoop en gemakkelijk verkrijgbaar is. Maar LM35 geeft analoge waarden en we moeten ze naar digitaal converteren met behulp van ADC (Analog to Digital Converter). Maar vandaag gebruiken we een DS18B20-temperatuursensor waarin we geen ADC-conversie nodig hebben om de temperatuur te krijgen. Hier zullen we PIC Microcontroller met DS18B20 gebruiken om de temperatuur te meten.
Dus hier bouwen we een thermometer met de volgende specificatie met behulp van de PIC16F877A microcontroller- eenheid van microchip.
- Het toont het volledige temperatuurbereik van -55 graden tot +125 graden.
- Het zal alleen de temperatuur weergeven als de temperatuur + / -.2 graden verandert.
Vereiste componenten: -
- Pic16F877A - PDIP40-pakket
- Broodplank
- Pickit-3
- 5V adapter
- LCD JHD162A
- DS18b20 temperatuursensor
- Draden om randapparatuur aan te sluiten.
- 4.7k weerstanden - 2st
- 10k pot
- 20 MHz Kristal
- 2 stuks 33pF keramische condensatoren
DS18B20 temperatuursensor:
DS18B20 is een uitstekende sensor om de temperatuur nauwkeurig te meten. Deze sensor biedt een resolutie van 9 bit tot 12 bit bij temperatuurdetectie. Deze sensor communiceert met slechts één draad en heeft geen ADC nodig om analoge temperaturen op te nemen en digitaal om te zetten.
De specificatie van de sensor is: -
- Meet temperaturen van -55 ° C tot + 125 ° C (-67 ° F tot + 257 ° F)
- ± 0,5 ° C Nauwkeurigheid van -10 ° C tot + 85 ° C
- Programmeerbare resolutie van 9 bits tot 12 bits
- Geen externe componenten vereist
- De sensor maakt gebruik van een 1-Wire®-interface
Als we de bovenstaande pinout-afbeelding van de datasheet bekijken, kunnen we zien dat de sensor er precies hetzelfde uitziet als het BC547- of BC557-pakket, TO-92. De eerste pin is Ground, de tweede pin is DQ of de gegevens en de derde pin is VCC.
Hieronder vindt u de elektrische specificatie van het gegevensblad die nodig is voor ons ontwerp. De nominale voedingsspanning voor de sensor is + 3,0 V tot + 5,5 V. Het moet ook de voedingsspanning verhogen die hetzelfde is als de voedingsspanning hierboven vermeld.
Er is ook een nauwkeurigheidsmarge die + -0,5 graden Celsius is voor het bereik van -10 graden C tot +85 graden Celsius, en de nauwkeurigheid verandert voor de volledige bereikmarge, die + -2 graden is voor -55 graden tot + 125 graden bereik.
Als we nogmaals naar de datasheet kijken, zien we de aansluitspecificatie van de sensor. We kunnen de sensor aansluiten in parasitaire voedingsmodus waar twee draden nodig zijn, DATA en GND, of we kunnen de sensor aansluiten met behulp van een externe voeding, waar drie afzonderlijke draden nodig zijn. We zullen de tweede configuratie gebruiken.
Omdat we nu bekend zijn met de vermogens van de sensor en de aansluitgerelateerde gebieden, kunnen we ons nu concentreren op het maken van het schema.
Schakelschema:-
Als we het schakelschema zien, zullen we zien dat: -
LCD-scherm van 16x2 tekens is verbonden met de PIC16F877A-microcontroller, waarin RB0, RB1, RB2 zijn verbonden met LCD-pen RS, R / W en E. D7. Het LCD-scherm is aangesloten in 4bit-modus of nibble-modus.
Een kristaloscillator van 20 MHz met twee keramische condensatoren van 33pF is verbonden over OSC1 en OSC2 pin. Het levert een constante klokfrequentie van 20 MHz aan de microcontroller.
DS18B20 is ook aangesloten volgens de pinconfiguratie en met een 4.7k pull-up-weerstand zoals eerder besproken. Ik heb dit allemaal in het breadboard aangesloten.
Als u nieuw bent bij PIC Microcontroller, volg dan onze PIC Microcontroller Tutorials met de vermelding Aan de slag met PIC Microcontroller.
Stappen of codestroom: -
- Stel de configuraties van de microcontroller in, waaronder de oscillatorconfiguratie.
- Stel de gewenste poort in voor LCD inclusief TRIS-register.
- Elke cyclus met ds18b20 sensor begint met reset, dus we zullen de ds18b20 resetten en wachten op de aanwezigheidspuls.
- Schrijf het kladblok en stel de resolutie van de sensor 12bit in.
- Sla het lezen van het ROM over, gevolgd door een resetpuls.
- Dien de opdracht om de temperatuur te converteren in.
- Lees de temperatuur van het kladblok.
- Controleer de temperatuurwaarde negatief of positief.
- Druk de temperatuur af op 16x2 LCD.
- Wacht tot de temperatuurveranderingen +/-. 20 graden Celsius zijn.
Code Verklaring:
De volledige code voor deze digitale thermometer wordt aan het einde van deze tutorial gegeven met een demonstratievideo. U heeft enkele headerbestanden nodig om dit programma uit te voeren, die u vanaf hier kunt downloaden.
Eerst moeten we de configuratiebits in de pic-microcontroller instellen en dan beginnen met de hoofdfunctie ongeldig .
De onderstaande vier regels worden gebruikt voor het opnemen van bibliotheekkopbestand, lcd.h en ds18b20.h . En xc.h is voor het header-bestand van de microcontroller.
# omvatten
Deze definities worden gebruikt voor het verzenden van een commando naar de temperatuursensor. De opdrachten staan vermeld in het gegevensblad van de sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Deze tabel 3 uit het gegevensblad van de sensor toont alle opdrachten waarbij macro's worden gebruikt om de respectieve opdrachten te verzenden.
De temperatuur wordt alleen op het scherm weergegeven als de temperatuur +/- .20 graden verandert. We kunnen deze temperatuurkloof wijzigen vanuit deze temp_gap- macro. Door de waarde bij deze macro te wijzigen, wordt de specificatie gewijzigd.
Andere twee float-variabelen die worden gebruikt om de weergegeven temperatuurgegevens op te slaan en ze te onderscheiden met het temperatuurverschil
#define temp_gap 20 float pre_val = 0, aft_val = 0;
In void main () functie, de lcd_init () ; is een functie om LCD te initialiseren. Deze lcd_init () functie wordt aangeroepen vanuit de lcd.h bibliotheek.
TRIS-registers worden gebruikt om I / O-pinnen als invoer of uitvoer te selecteren. Twee niet-ondertekende korte variabele TempL en TempH worden gebruikt voor het opslaan van de 12-bits resolutiegegevens van de temperatuursensor.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; niet-ondertekende korte TempL, TempH; unsigned int t, t2; float verschil1 = 0, verschil2 = 0; lcd_init ();
Laten we eens kijken naar de while-lus, hier breken we de while (1) -lus in kleine stukjes.
Die lijnen worden gebruikt om te voelen of de temperatuursensor is aangesloten of niet.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Maak verbinding"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Door dit codesegment te gebruiken, initialiseren we de sensor en sturen we een commando om de temperatuur om te zetten.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolutie_12bit); // 12bit resolutie ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Deze code is voor het opslaan van de 12-bits temperatuurgegevens in twee niet-ondertekende korte variabelen.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Als u vervolgens de volledige code hieronder controleert, hebben we een if-else-voorwaarde om erachter te komen of het temperatuurteken positief of negatief is.
Door de If- instructiecode te gebruiken, manipuleren we de gegevens en zien we of de temperatuur negatief is of niet, en bepalen we dat de temperatuurveranderingen in het bereik van +/-.20 graden liggen of niet. En voor de rest hebben we gecontroleerd of de temperatuur positief is of niet en temperatuurveranderingen detectie.
code
Gegevens ophalen van DS18B20-temperatuursensor:
Laten we eens kijken naar het tijdsverschil van 1-Wire® Interface. We gebruiken 20Mhz Crystal. Als we in het bestand ds18b20.c kijken, zullen we zien
# definiëren _XTAL_FREQ 20000000
Deze definitie wordt gebruikt voor de vertragingsroutine van de XC8-compiler. 20Mhz is ingesteld als de kristalfrequentie.
We hebben vijf functies gemaakt
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Het 1-Wire ® -protocol heeft strikte timinggerelateerde slots nodig om te communiceren. In het gegevensblad krijgen we perfecte informatie over het tijdvak.
Binnen de onderstaande functie hebben we het exacte tijdslot gemaakt. Het is belangrijk om de exacte vertraging voor vasthouden en loslaten te creëren en het TRIS-bit van de respectieve sensorpoort te besturen.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (uitvoer) DQ = 0; // zet pin # op laag (0) __delay_us (480); // 1 draad vereist vertraging DQ_TRIS = 1; // Tris = 1 (invoer) __delay_us (60); // 1 draad vereist vertraging als (DQ == 0) // als er een aanwezigheidspluus is {__delay_us (480); retourneer 0; // return 0 (1-wire is presence)} else {__delay_us (480); terugkeer 1; // retour 1 (1-draads is GEEN aanwezigheid)}} // 0 = aanwezigheid, 1 = geen onderdeel
Nu volgens de onderstaande tijdslotbeschrijving die wordt gebruikt in Lezen en Schrijven, hebben we respectievelijk de lees- en schrijffunctie gemaakt .
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // trek DQ laag om tijdslot DQ_TRIS = 1 te starten; DQ = 1; // retourneer dan hoog voor (i = 0; i <3; i ++); // vertraging 15us vanaf het begin van de tijdslotretour (DQ); // retourwaarde van DQ-regel} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // trek DQ laag om tijdslot te starten if (bitval == 1) DQ = 1; // retourneer DQ hoog als schrijf 1 __delay_us (5); // hold waarde voor rest van tijdslot DQ_TRIS = 1; DQ = 1; } // Delay biedt 16 us per lus, plus 24 us. Daarom vertraging (5) = 104us
Verdere controle alle bijbehorende header en.c bestanden hier.
Dit is dus hoe we de DS18B20-sensor kunnen gebruiken om de temperatuur te krijgen met PIC Microcontroller.
Als je een eenvoudige digitale thermometer met LM35 wilt bouwen, bekijk dan onderstaande projecten met andere microcontrollers:
- Kamertemperatuurmeting met Raspberry Pi
- Digitale thermometer met Arduino en LM35
- Digitale thermometer met LM35 en 8051
- Temperatuurmeting met behulp van LM35 en AVR Microcontroller