- Wymagane komponenty: -
- Czujnik temperatury DS18B20:
- Schemat obwodu:-
- Kroki lub przepływ kodu: -
- Objaśnienie kodu:
- Pobieranie danych z czujnika temperatury DS18B20:
Generalnie czujnik temperatury LM35 jest używany z mikrokontrolerami do pomiaru temperatury, ponieważ jest tani i łatwo dostępny. Ale LM35 podaje wartości analogowe i musimy je przekonwertować na cyfrowe za pomocą ADC (Analog to Digital Converter). Ale dzisiaj używamy czujnika temperatury DS18B20, w którym nie potrzebujemy konwersji ADC, aby uzyskać temperaturę. Tutaj użyjemy mikrokontrolera PIC z DS18B20 do pomiaru temperatury.
Więc tutaj budujemy termometr o następującej specyfikacji przy użyciu jednostki mikrokontrolera PIC16F877A firmy microchip.
- Pokaże pełny zakres temperatur od -55 stopni do +125 stopni.
- Wyświetla temperaturę tylko wtedy, gdy temperatura zmieni się o +/- 0,2 stopnia.
Wymagane komponenty: -
- Pic16F877A - pakiet PDIP40
- Deska do chleba
- Pickit-3
- Adapter 5V
- LCD JHD162A
- Czujnik temperatury DS18b20
- Przewody do podłączenia urządzeń peryferyjnych.
- Rezystory 4,7k - 2szt
- Pula 10k
- Kryształ 20 MHz
- 2 sztuki kondensatorów ceramicznych 33pF
Czujnik temperatury DS18B20:
DS18B20 to doskonały czujnik do dokładnego pomiaru temperatury. Ten czujnik zapewnia rozdzielczość od 9 do 12 bitów podczas wykrywania temperatury. Ten czujnik komunikuje się tylko jednym przewodem i nie potrzebuje żadnego ADC, aby uzyskać analogowe temperatury i przetworzyć je cyfrowo.
Specyfikacja czujnika to: -
- Mierzy temperatury od -55 ° C do + 125 ° C (-67 ° F do + 257 ° F)
- ± 0,5 ° C Dokładność od -10 ° C do + 85 ° C
- Programowalna rozdzielczość od 9 do 12 bitów
- Nie są wymagane żadne komponenty zewnętrzne
- Czujnik wykorzystuje interfejs 1-Wire®
Jeśli spojrzymy na powyższy obraz pinoutów z arkusza danych, zobaczymy, że czujnik wygląda dokładnie tak samo, jak pakiet BC547 lub BC557, TO-92. Pierwszy pin to masa, drugi pin to DQ lub dane, a trzeci pin to VCC.
Poniżej znajduje się specyfikacja elektryczna z arkusza danych, która będzie potrzebna do naszego projektu. Znamionowe napięcie zasilania czujnika wynosi od + 3,0 V do + 5,5 V. Konieczne jest również podniesienie napięcia zasilania, które jest takie samo jak napięcie zasilania podane powyżej.
Ponadto istnieje margines dokładności, który wynosi + -0,5 stopnia Celsjusza dla zakresu od -10 stopni C do +85 stopni Celsjusza, a dokładność zmienia się dla pełnego marginesu zakresu, który wynosi + -2 stopnie dla -55 stopni do + Zakres 125 stopni.
Jeśli ponownie spojrzymy na arkusz danych, zobaczymy specyfikację podłączenia czujnika. Możemy podłączyć czujnik w pasożytniczym trybie zasilania, gdzie potrzebne są dwa przewody DATA i GND lub możemy podłączyć czujnik za pomocą zewnętrznego zasilacza, gdzie potrzebne są trzy oddzielne przewody. Użyjemy drugiej konfiguracji.
Ponieważ jesteśmy już zaznajomieni z mocami znamionowymi czujnika i obszarami związanymi z połączeniami, możemy teraz skoncentrować się na tworzeniu schematu.
Schemat obwodu:-
Jeśli zobaczymy schemat obwodu, zobaczymy, że: -
LCD 16x2 jest podłączony przez mikrokontroler PIC16F877A, w którym RB0, RB1, RB2 są podłączone do pinów RS, R / W i E. D7. Wyświetlacz LCD jest podłączony w trybie 4-bitowym lub w trybie półbajtowym.
Oscylator kwarcowy 20 MHz z dwoma ceramicznymi kondensatorami 33 pF jest podłączony przez pin OSC1 i OSC2. Zapewni stałą częstotliwość zegara 20 Mhz do mikrokontrolera.
DS18B20 jest również podłączony zgodnie z konfiguracją pinów i z rezystorem podciągającym 4,7 k, jak omówiono wcześniej. Podłączyłem to wszystko w płytce stykowej.
Jeśli dopiero zaczynasz korzystać z mikrokontrolera PIC, postępuj zgodnie z naszymi samouczkami dotyczącymi mikrokontrolera PIC, które zawierają informacje o rozpoczęciu pracy z mikrokontrolerem PIC.
Kroki lub przepływ kodu: -
- Ustaw konfiguracje mikrokontrolera, które obejmują konfigurację oscylatora.
- Ustaw żądany port dla LCD, w tym rejestru TRIS.
- Każdy cykl z czujnikiem ds18b20 zaczyna się od resetu, więc zresetujemy ds18b20 i czekamy na impuls obecności.
- Napisz notatnik i ustaw rozdzielczość czujnika na 12 bitów.
- Pomiń odczyt ROM, a następnie impuls resetowania.
- Prześlij polecenie konwersji temperatury.
- Odczytaj temperaturę z notatnika.
- Sprawdź wartość temperatury, czy jest ujemna czy dodatnia.
- Wydrukuj temperaturę na wyświetlaczu LCD 16x2.
- Poczekaj na zmianę temperatury o +/- 20 stopni Celsjusza.
Objaśnienie kodu:
Pełny kod tego termometru cyfrowego znajduje się na końcu tego samouczka wraz z filmem demonstracyjnym. Do uruchomienia tego programu potrzebne będą pliki nagłówkowe, które można pobrać stąd.
Najpierw musimy ustawić bity konfiguracyjne w mikrokontrolerze pic, a następnie zacząć od void main function.
Następnie poniżej cztery wiersze są używane do włączenia pliku nagłówkowego biblioteki, lcd.h i ds18b20.h . A xc.h jest dla pliku nagłówkowego mikrokontrolera.
#zawierać
Definicje te są używane do wysyłania polecenia do czujnika temperatury. Polecenia są wymienione w arkuszu danych czujnika.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Ta tabela 3 z arkusza danych czujnika pokazuje wszystkie polecenia, w których makra są używane do wysyłania odpowiednich poleceń.
Temperatura będzie wyświetlana na ekranie tylko wtedy, gdy zmieni się o +/- 0,20 stopnia. Możemy zmienić tę różnicę temperatur z tego makra temp_gap . Zmiana wartości w tym makrze spowoduje zmianę specyfikacji.
Pozostałe dwie zmienne typu float służą do przechowywania wyświetlanych danych temperatury i różnicowania ich według różnicy temperatur
# zdefiniować temp_gap 20 float pre_val = 0, aft_val = 0;
W pustych przestrzeni głównej () funkcji, lcd_init () ; to funkcja inicjalizacji LCD. Ta funkcja lcd_init () jest wywoływana z biblioteki lcd.h.
Rejestry TRIS służą do wyboru pinów I / O jako wejścia lub wyjścia. Dwie krótkie zmienne bez znaku TempL i TempH są używane do przechowywania danych o rozdzielczości 12 bitów z czujnika temperatury.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; unsigned short TempL, TempH; unsigned int t, t2; zmiennoprzecinkowa różnica1 = 0, różnica2 = 0; lcd_init ();
Zobaczmy pętlę while, tutaj dzielimy pętlę while (1) na małe kawałki.
Te linie służą do wykrywania, czy czujnik temperatury jest podłączony, czy nie.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Połącz"); lcd_com (0xC0); lcd_puts ("Sonda czujnika temperatury"); }
Używając tego segmentu kodu, inicjalizujemy czujnik i wysyłamy polecenie konwersji temperatury.
lcd_puts („”); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolution_12bit); // 12-bitowa rozdzielczość ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Ten kod służy do przechowywania 12-bitowych danych temperatury w dwóch krótkich zmiennych bez znaku.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Następnie, jeśli sprawdzisz cały kod poniżej, utworzymy warunek if-else, aby dowiedzieć się, czy znak temperatury jest dodatni czy ujemny.
Używając kodu instrukcji If , manipulujemy danymi i sprawdzamy, czy temperatura jest ujemna, czy nie, i określamy, czy zmiany temperatury są w zakresie +/- 0,20 stopnia, czy nie. A w innej części sprawdziliśmy czy temperatura jest dodatnia czy nie i wykrywanie zmian temperatury.
kod
Pobieranie danych z czujnika temperatury DS18B20:
Zobaczmy lukę czasową interfejsu 1-Wire®. Używamy kryształu 20 MHz. Jeśli zajrzymy do pliku ds18b20.c, zobaczymy
# zdefiniować _XTAL_FREQ 20000000
Ta definicja jest używana w procedurze opóźnienia kompilatora XC8. Jako częstotliwość kryształu ustawiono 20 MHz.
Zrobiliśmy pięć funkcji
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Protokół 1-Wire ® wymaga ściśle określonych gniazd czasowych do komunikacji. W arkuszu danych uzyskamy doskonałe informacje dotyczące przedziałów czasowych.
W poniższej funkcji stworzyliśmy dokładny przedział czasowy. Ważne jest, aby stworzyć dokładne opóźnienie dla zatrzymania i zwolnienia oraz kontrolowania bitu TRIS odpowiedniego portu czujnika.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (wyjście) DQ = 0; // ustaw pin # na niski (0) __delay_us (480); // 1 przewód wymaga opóźnienia czasowego DQ_TRIS = 1; // Tris = 1 (wejście) __delay_us (60); // 1 przewód wymaga opóźnienia czasowego if (DQ == 0) // jeśli występuje pluse obecności {__delay_us (480); return 0; // return 0 (1-wire to obecność)} else {__delay_us (480); powrót 1; // return 1 (1-wire NIE jest obecnością)}} // 0 = obecność, 1 = brak części
Teraz, zgodnie z poniższym opisem przedziału czasowego używanego w odczycie i zapisie , utworzyliśmy odpowiednio funkcję odczytu i zapisu .
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // ściągnij DQ low, aby rozpocząć timelot DQ_TRIS = 1; DQ = 1; // następnie zwróć high for (i = 0; i <3; i ++); // opóźnienie 15us od początku powrotu szczeliny czasowej (DQ); // zwrócenie wartości linii DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // ściągnij DQ nisko, aby uruchomić przedział czasowy if (bitval == 1) DQ = 1; // zwrócenie DQ high if write 1 __delay_us (5); // zatrzymaj wartość dla pozostałej części szczeliny czasowej DQ_TRIS = 1; DQ = 1; } // Opóźnienie zapewnia 16us na pętlę plus 24us. Dlatego opóźnienie (5) = 104us
Dalsza kontrola wszystkich powiązanych nagłówek i pliki.c tutaj.
W ten sposób możemy użyć czujnika DS18B20, aby uzyskać temperaturę za pomocą mikrokontrolera PIC.
Jeśli chcesz zbudować prosty termometr cyfrowy z LM35, sprawdź poniższe projekty z innymi mikrokontrolerami:
- Pomiar temperatury w pomieszczeniu za pomocą Raspberry Pi
- Cyfrowy termometr wykorzystujący Arduino i LM35
- Termometr cyfrowy wykorzystujący LM35 i 8051
- Pomiar temperatury za pomocą mikrokontrolera LM35 i AVR