- Необходими компоненти: -
- DS18B20 Температурен сензор:
- Електрическа схема: -
- Стъпки или поток на код: -
- Обяснение на кода:
- Получаване на данни от температурния сензор DS18B20:
Като цяло температурният сензор LM35 се използва с микроконтролери за измерване на температурата, защото е евтин и лесно достъпен. Но LM35 дава аналогови стойности и трябва да ги преобразуваме в цифрови с помощта на ADC (Analog to Digital Converter). Но днес използваме температурен сензор DS18B20, в който не се нуждаем от преобразуване ADC, за да получим температурата. Тук ще използваме PIC микроконтролер с DS18B20 за измерване на температурата.
И така, тук изграждаме термометър със следната спецификация, използвайки микроконтролерен модул PIC16F877A от микрочип.
- Той ще показва пълен диапазон от температури от -55 градуса до +125 градуса.
- Той ще покаже температурата само ако температурата се промени + / -.2 градуса.
Необходими компоненти: -
- Pic16F877A - пакет PDIP40
- Дъска за хляб
- Pickit-3
- 5V адаптер
- LCD JHD162A
- DS18b20 температурен сензор
- Кабели за свързване на периферни устройства.
- 4.7k резистори - 2бр
- 10к пот
- 20mHz кристал
- 2 бр. 33pF керамични кондензатори
DS18B20 Температурен сензор:
DS18B20 е отличен сензор за точно отчитане на температурата. Този сензор осигурява 9-битова до 12-битова резолюция при засичане на температурата. Този сензор комуникира само с един проводник и не се нуждае от ADC, за да придобие аналогови температури и да ги преобразува цифрово.
Спецификацията на сензора е: -
- Измерва температури от -55 ° C до + 125 ° C (-67 ° F до + 257 ° F)
- ± 0,5 ° C Точност от -10 ° C до + 85 ° C
- Програмируема разделителна способност от 9 бита до 12 бита
- Не са необходими външни компоненти
- Сензорът използва 1-Wire® интерфейс
Ако погледнем горното изображение на пиновете от листа с данни, можем да видим, че сензорът изглежда точно по същия начин като BC547 или BC557, TO-92. Първият щифт е Ground, вторият пин е DQ или данните, а третият щифт е VCC.
По-долу е дадена електрическата спецификация от листа с данни, която ще е необходима за нашия дизайн. Номиналното захранващо напрежение за сензора е от + 3.0V до + 5.5V. Също така трябва да изтеглите захранващото напрежение, което е същото като посоченото по-горе захранващо напрежение.
Също така, има граница на точност, която е + -0,5 градуса по Целзий за диапазона от -10 градуса С до +85 градуса по Целзий, а точността се променя за пълния диапазон, който е + -2 градуса за -55 градуса до + Диапазон от 125 градуса.
Ако отново разгледаме листа с данни, ще видим спецификацията за свързване на сензора. Можем да свържем сензора в режим на паразитно захранване, където са необходими два проводника, DATA и GND, или да свържем сензора с помощта на външно захранване, където са необходими три отделни проводника. Ще използваме втората конфигурация.
Тъй като вече сме запознати с рейтингите на мощността на сензора и свързаните с тях области, сега можем да се концентрираме върху изготвянето на схемата.
Електрическа схема: -
Ако видим електрическата схема, ще видим, че:
LCD с 16x2 символа е свързан през микроконтролера PIC16F877A, в който RB0, RB1, RB2 са свързани към LCD щифт RS, R / W и E. И RB4, RB5, RB6 и RB7 са свързани през 4-пиновите D4, D5, D6 на LCD, D7. LCD дисплеят е свързан в 4-битов режим или режим на хапване.
Кристален осцилатор от 20MHz с два керамични кондензатора от 33pF е свързан през OSC1 и OSC2 щифт. Той ще осигури постоянна тактова честота от 20 MHz на микроконтролера.
DS18B20 също е свързан според конфигурацията на пина и с 4.7k издърпващ резистор, както беше обсъдено по-горе. Всичко това съм го свързал в макет.
Ако сте нов в PIC Microcontroller, следвайте нашите уроци по PIC Microcontroller, посочвайки с Първи стъпки с PIC Microcontroller.
Стъпки или поток на код: -
- Задайте конфигурациите на микроконтролера, които включват конфигурация на осцилатора.
- Задайте желания порт за LCD, включително TRIS регистър.
- Всеки цикъл със сензор ds18b20 започва с нулиране, така че ще нулираме ds18b20 и ще изчакаме импулса за присъствие.
- Напишете скречпада и задайте разделителната способност на сензора 12bit.
- Пропуснете четенето на ROM, последвано от нулиращ импулс.
- Изпратете команда за преобразуване на температурата.
- Отчетете температурата от четката.
- Проверете дали температурата е отрицателна или положителна.
- Отпечатайте температурата на 16x2 LCD.
- Изчакайте температурните промени за +/-. 20 градуса по Целзий.
Обяснение на кода:
Пълният код за този цифров термометър е даден в края на този урок с демонстрационно видео. За да стартирате тази програма, ще ви трябват някои заглавни файлове, които можете да изтеглите от тук.
Първо трябва да зададем конфигурационните битове в микроконтролера pic и след това да започнем с void main function.
След това под четири реда се използват за включване на заглавния файл на библиотеката, lcd.h и ds18b20.h . И xc.h е за заглавния файл на микроконтролера.
#include
Тези дефиниции се използват за изпращане на команда към температурния сензор. Командите са изброени в листа с данни на сензора.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Тази таблица 3 от листа с данни на сензора показва всички команди, където макросите се използват за изпращане на съответни команди.
Температурата ще се покаже на екрана само ако температурата се промени +/- .20 градуса. Можем да променим тази температурна разлика между този макрос temp_gap . Чрез промяна на стойността в този макрос, спецификацията ще бъде променена.
Други две плаващи променливи, използвани за съхраняване на показаните данни за температурата и разграничаването им с температурната разлика
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Във функцията void main () функцията lcd_init () ; е функция за инициализиране на LCD. Тази функция lcd_init () се извиква от библиотеката lcd.h.
TRIS регистрите се използват за избор на I / O щифтове като вход или изход. Две неподписани къси променливи TempL и TempH се използват за съхраняване на данните за 12- битова резолюция от температурния сензор.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; неподписан кратък TempL, TempH; неподписан int t, t2; плаваща разлика1 = 0, разлика2 = 0; lcd_init ();
Нека видим цикъла while, тук разбиваме цикъла while (1) на малки парчета.
Тези линии се използват за усещане, че температурният сензор е свързан или не.
докато (ow_reset ()) {lcd_com (0x80); lcd_puts ("Моля, свържете се"); lcd_com (0xC0); lcd_puts ("Temp-Sense Sonde"); }
Използвайки този сегмент от код, ние инициализираме сензора и изпращаме команда за преобразуване на температурата.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); запис_байт (резолюция_12бита); // 12-битова резолюция ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Този код е за съхраняване на 12-битовите данни за температурата в две неподписани кратки променливи.
докато (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
След това, ако проверите пълния код по-долу, ние създаваме условие if-else, за да разберем температурния знак дали е положителен или отрицателен.
Използвайки кода на оператора If , ние манипулираме данните и виждаме дали температурата е отрицателна или не и установяваме, че температурните промени са в диапазон +/-.20 градуса или не. И в друга част проверихме дали температурата е положителна или не и откриването на температурните промени.
код
Получаване на данни от температурния сензор DS18B20:
Нека видим интервала от време на 1-Wire® Interface. Използваме 20Mhz Crystal. Ако погледнем във файла ds18b20.c, ще видим
#define _XTAL_FREQ 20000000
Тази дефиниция се използва за рутинно забавяне на компилатора XC8. 20Mhz е зададена като кристална честота.
Направихме пет функции
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Протоколът 1-Wire ® се нуждае от строго свързани с времето слотове, за да комуникира. Вътре в листа с данни ще получим перфектна информация, свързана с времеви интервал.
Вътре в функцията по-долу създадохме точния интервал от време. Важно е да се създаде точното закъснение за задържане и освобождаване и контрол на бита TRIS на порта на съответния сензор.
неподписан char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (изход) DQ = 0; // задаваме pin # на low (0) __delay_us (480); // 1 проводник изисква забавяне във времето DQ_TRIS = 1; // Tris = 1 (вход) __delay_us (60); // 1 проводник изисква закъснение във времето, ако (DQ == 0) // ако има присъствие pluse {__delay_us (480); връщане 0; // връщаме 0 (1-жицата е присъствие)} else {__delay_us (480); връщане 1; // връщаме 1 (1-проводник НЕ присъства)}} // 0 = присъствие, 1 = няма част
Сега съгласно описанието на времевия интервал, използвано в Четене и Писане, ние създадохме функцията за четене и запис, съответно.
неподписан char read_bit (void) {неподписан char i; DQ_TRIS = 1; DQ = 0; // издърпайте DQ ниско, за да стартирате времеви интервал DQ_TRIS = 1; DQ = 1; // след това връщаме високо за (i = 0; i <3; i ++); // забавяне 15us от началото на връщане на времеви интервал (DQ); // връща стойност на DQ линия} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // издърпайте DQ ниско, за да стартирате времеви интервал, ако (bitval == 1) DQ = 1; // връщаме DQ високо, ако пишем 1 __delay_us (5); // задържа стойност за остатъка от времеви интервал DQ_TRIS = 1; DQ = 1; } // Закъснението осигурява 16us на цикъл, плюс 24us. Следователно забавяне (5) = 104us
По-нататък проверете всички свързани заглавни и.c файлове тук.
Така че можем да използваме сензор DS18B20, за да измерваме температурата с PIC микроконтролер.
Ако искате да изградите обикновен цифров термометър с LM35, направете плащане по-долу проекти с други микроконтролери:
- Измерване на стайна температура с Raspberry Pi
- Цифров термометър, използващ Arduino и LM35
- Цифров термометър, използващ LM35 и 8051
- Измерване на температурата с помощта на LM35 и AVR микроконтролер