- Erforderliche Komponenten: -
- DS18B20 Temperatursensor:
- Schaltplan:-
- Schritte oder Code-Fluss: -
- Code Erläuterung:
- Abrufen von Daten vom DS18B20-Temperatursensor:
Im Allgemeinen wird der Temperatursensor LM35 mit Mikrocontrollern verwendet, um die Temperatur zu messen, da er billig und leicht verfügbar ist. Aber LM35 liefert analoge Werte und wir müssen sie mit ADC (Analog to Digital Converter) in digitale konvertieren. Aber heute verwenden wir den Temperatursensor DS18B20, bei dem wir keine ADC-Konvertierung benötigen, um die Temperatur zu ermitteln. Hier verwenden wir den PIC-Mikrocontroller mit DS18B20, um die Temperatur zu messen.
Hier bauen wir also ein Thermometer mit der folgenden Spezifikation unter Verwendung der Mikrocontrollereinheit PIC16F877A von microchip.
- Es wird der gesamte Temperaturbereich von -55 Grad bis +125 Grad angezeigt.
- Die Temperatur wird nur angezeigt, wenn sich die Temperatur um +/- 0,2 Grad ändert.
Erforderliche Komponenten: -
- Pic16F877A - PDIP40-Paket
- Brotbrett
- Pickit-3
- 5V Adapter
- LCD JHD162A
- Temperatursensor DS18b20
- Kabel zum Anschließen von Peripheriegeräten.
- 4,7k Widerstände - 2St
- 10k Topf
- 20 MHz Kristall
- 2 Stk. 33pF Keramikkondensatoren
DS18B20 Temperatursensor:
DS18B20 ist ein ausgezeichneter Sensor zur genauen Erfassung der Temperatur. Dieser Sensor bietet eine Auflösung von 9 bis 12 Bit bei der Temperaturerfassung. Dieser Sensor kommuniziert mit nur einem Draht und benötigt keinen ADC, um analoge Temperaturen zu erfassen und digital umzuwandeln.
Die Spezifikation des Sensors lautet: -
- Misst Temperaturen von -55 ° C bis + 125 ° C (-67 ° F bis + 257 ° F)
- ± 0,5 ° C Genauigkeit von -10 ° C bis + 85 ° C.
- Programmierbare Auflösung von 9 Bit bis 12 Bit
- Keine externen Komponenten erforderlich
- Der Sensor verwendet eine 1-Wire®-Schnittstelle
Wenn wir uns das obige Pinbelegungsbild aus dem Datenblatt ansehen, können wir sehen, dass der Sensor genauso aussieht wie das BC547- oder BC557-Paket TO-92. Der erste Pin ist Masse, der zweite Pin ist DQ oder die Daten und der dritte Pin ist VCC.
Nachfolgend finden Sie die elektrischen Spezifikationen aus dem Datenblatt, die für unser Design benötigt werden. Die Nennversorgungsspannung für den Sensor beträgt + 3,0 V bis + 5,5 V. Es muss auch eine Versorgungsspannung hochgezogen werden, die der oben angegebenen Versorgungsspannung entspricht.
Es gibt auch einen Genauigkeitsbereich von + -0,5 Grad Celsius für den Bereich von -10 Grad C bis +85 Grad Celsius und die Genauigkeitsänderung für den gesamten Bereich, der + -2 Grad für -55 Grad bis + beträgt 125 Grad Bereich.
Wenn wir uns das Datenblatt noch einmal ansehen, sehen wir die Verbindungsspezifikation des Sensors. Wir können den Sensor im parasitären Stromversorgungsmodus anschließen, wenn zwei Drähte benötigt werden, DATA und GND, oder wir können den Sensor über eine externe Stromversorgung anschließen, wo drei separate Drähte benötigt werden. Wir werden die zweite Konfiguration verwenden.
Da wir jetzt mit den Nennleistungen des Sensors und den verbindungsbezogenen Bereichen vertraut sind, können wir uns jetzt auf die Erstellung des Schaltplans konzentrieren.
Schaltplan:-
Wenn wir den Schaltplan sehen, werden wir Folgendes sehen:
Das 16x2-Zeichen-LCD ist über den PIC16F877A-Mikrocontroller angeschlossen, wobei RB0, RB1, RB2 mit den LCD-Pins RS, R / W und E verbunden sind. D7. Das LCD ist im 4-Bit-Modus oder im Nibble-Modus angeschlossen.
Ein Quarzoszillator von 20 MHz mit zwei Keramikkondensatoren von 33 pF ist über den OSC1- und OSC2-Pin angeschlossen. Der Mikrocontroller erhält eine konstante Taktfrequenz von 20 MHz.
Der DS18B20 ist ebenfalls gemäß Pin-Konfiguration und mit einem 4,7-k-Pull-up-Widerstand verbunden, wie zuvor erläutert. Ich habe das alles im Steckbrett verbunden.
Wenn Sie mit PIC Microcontroller noch nicht vertraut sind, befolgen Sie unsere PIC Microcontroller-Tutorials unter Erste Schritte mit PIC Microcontroller.
Schritte oder Code-Fluss: -
- Stellen Sie die Konfigurationen des Mikrocontrollers ein, die die Oszillatorkonfiguration enthalten.
- Stellen Sie den gewünschten Anschluss für LCD einschließlich TRIS-Register ein.
- Jeder Zyklus mit dem Sensor ds18b20 beginnt mit dem Zurücksetzen, daher setzen wir den ds18b20 zurück und warten auf den Anwesenheitsimpuls.
- Schreiben Sie das Notizbuch und stellen Sie die Auflösung des Sensors auf 12 Bit ein.
- Überspringen Sie den ROM-Lesevorgang, gefolgt von einem Rücksetzimpuls.
- Senden Sie den Befehl zum Konvertieren der Temperatur.
- Lesen Sie die Temperatur vom Notizblock ab.
- Überprüfen Sie den Temperaturwert, ob negativ oder positiv.
- Drucken Sie die Temperatur auf einem 16x2 LCD.
- Warten Sie auf Temperaturänderungen von +/- 20 Grad Celsius.
Code Erläuterung:
Der vollständige Code für dieses digitale Thermometer wird am Ende dieses Tutorials mit einem Demonstrationsvideo angegeben. Zum Ausführen dieses Programms benötigen Sie einige Header-Dateien, die Sie hier herunterladen können.
Zuerst müssen wir die Konfigurationsbits im pic-Mikrocontroller setzen und dann mit der void- Hauptfunktion beginnen.
Dann unter vier Linien werden für verwendet einschließlich Bibliothek Header - Datei, lcd.h und ds18b20.h . Und xc.h ist für die Mikrocontroller-Header-Datei.
#einschließen
Diese Definitionen werden zum Senden eines Befehls an den Temperatursensor verwendet. Die Befehle sind im Datenblatt des Sensors aufgeführt.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define solution_12bit 0x7F #define read_scratchpad 0xBE
Diese Tabelle 3 aus dem Datenblatt des Sensors zeigt alle Befehle, bei denen Makros zum Senden der jeweiligen Befehle verwendet werden.
Die Temperatur wird nur auf dem Bildschirm angezeigt, wenn sich die Temperatur um +/- 0,20 Grad ändert. Wir können diese Temperaturlücke über dieses temp_gap- Makro ändern . Durch Ändern des Werts in diesem Makro wird die Spezifikation geändert.
Weitere zwei Float-Variablen, mit denen die angezeigten Temperaturdaten gespeichert und mit der Temperaturlücke unterschieden werden
#define temp_gap 20 float pre_val = 0, aft_val = 0;
In der Funktion void main () wird lcd_init () ; ist eine Funktion zum Initialisieren des LCD. Diese Funktion lcd_init () wird aus der Bibliothek lcd.h aufgerufen.
TRIS-Register werden verwendet, um E / A-Pins als Eingang oder Ausgang auszuwählen. Zwei vorzeichenlose Kurzvariablen TempL und TempH werden zum Speichern der 12-Bit-Auflösungsdaten vom Temperatursensor verwendet.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; vorzeichenloses kurzes TempL, TempH; vorzeichenloses int t, t2; float Differenz1 = 0, Differenz2 = 0; lcd_init ();
Lassen Sie uns die while-Schleife sehen, hier brechen wir die while (1) -Schleife in kleine Stücke.
Diese Leitungen werden verwendet, um zu erfassen, ob der Temperatursensor angeschlossen ist oder nicht.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Bitte verbinden"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }}
Mit diesem Codesegment initialisieren wir den Sensor und senden einen Befehl zum Konvertieren der Temperatur.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (Auflösung_12bit); // 12bit Auflösung ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Dieser Code dient zum Speichern der 12-Bit-Temperaturdaten in zwei vorzeichenlosen Kurzvariablen.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Wenn Sie dann den vollständigen Code unten überprüfen, haben wir eine if-else-Bedingung erstellt, um herauszufinden, ob das Temperaturzeichen positiv oder negativ ist.
Mithilfe des If- Anweisungscodes bearbeiten wir die Daten und prüfen, ob die Temperatur negativ ist oder nicht. Die Temperaturänderungen liegen im Bereich von +/- 0,20 Grad oder nicht. Und in einem anderen Teil haben wir überprüft, ob die Temperatur positiv ist oder nicht, und die Temperaturänderung erkannt.
Code
Abrufen von Daten vom DS18B20-Temperatursensor:
Sehen wir uns die Zeitlücke der 1-Wire®-Schnittstelle an. Wir verwenden 20 MHz Kristall. Wenn wir in die Datei ds18b20.c schauen, werden wir sehen
#define _XTAL_FREQ 20000000
Diese Definition wird für die XC8-Compiler-Verzögerungsroutine verwendet. Als Kristallfrequenz wird 20 MHz eingestellt.
Wir haben fünf Funktionen gemacht
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Das 1-Wire ® -Protokoll benötigt für die Kommunikation strenge zeitbezogene Steckplätze. Innerhalb des Datenblattes erhalten wir perfekte Informationen zum Zeitfenster.
Innerhalb der folgenden Funktion haben wir das genaue Zeitfenster erstellt. Es ist wichtig, die genaue Verzögerung für das Halten und Freigeben zu erstellen und das TRIS-Bit des jeweiligen Sensorports zu steuern.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (Ausgabe) DQ = 0; // Pin # auf low setzen (0) __delay_us (480); // 1 Draht benötigt Zeitverzögerung DQ_TRIS = 1; // Tris = 1 (Eingabe) __delay_us (60); // 1 Draht benötigt Zeitverzögerung, wenn (DQ == 0) // wenn ein Anwesenheitspluse vorhanden ist {__delay_us (480); return 0; // 0 zurückgeben (1-Draht ist vorhanden)} else {__delay_us (480); return 1; // 1 zurückgeben (1-Draht ist NICHT vorhanden)}} // 0 = Anwesenheit, 1 = kein Teil
Gemäß der folgenden Beschreibung des Zeitfensters, die in Lesen und Schreiben verwendet wird, haben wir die Lese- bzw. Schreibfunktion erstellt .
vorzeichenloses Zeichen read_bit (void) {vorzeichenloses Zeichen i; DQ_TRIS = 1; DQ = 0; // DQ nach unten ziehen, um den Zeitschlitz zu starten DQ_TRIS = 1; DQ = 1; // dann hoch zurückgeben für (i = 0; i <3; i ++); // Verzögerung 15us vom Beginn der Zeitschlitzrückgabe (DQ); // Rückgabewert der DQ-Zeile} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // DQ nach unten ziehen, um den Zeitschlitz zu starten, wenn (bitval == 1) DQ = 1; // DQ hoch zurückgeben, wenn 1 __delay_us (5) geschrieben wird; // Wert für den Rest des Zeitschlitzes halten DQ_TRIS = 1; DQ = 1; } // Verzögerung bietet 16us pro Schleife plus 24us. Daher Verzögerung (5) = 104us
Weitere Überprüfen Sie alle damit verbundenen Kopf- und.c Dateien hier.
Auf diese Weise können wir den DS18B20-Sensor verwenden, um die Temperatur mit dem PIC-Mikrocontroller zu ermitteln.
Wenn Sie ein einfaches digitales Thermometer mit LM35 bauen möchten, sehen Sie sich die folgenden Projekte mit anderen Mikrocontrollern an:
- Raumtemperaturmessung mit Raspberry Pi
- Digitales Thermometer mit Arduino und LM35
- Digitales Thermometer mit LM35 und 8051
- Temperaturmessung mit LM35 und AVR Microcontroller