- Необхідні компоненти: -
- Датчик температури DS18B20:
- Кругова діаграма:-
- Кроки або потік коду: -
- Пояснення коду:
- Отримання даних з датчика температури DS18B20:
Як правило, датчик температури LM35 використовується з мікроконтролерами для вимірювання температури, оскільки він дешевий і легко доступний. Але LM35 дає аналогові значення, і нам потрібно перетворити їх в цифрові за допомогою АЦП (аналого-цифровий перетворювач). Але сьогодні ми використовуємо датчик температури DS18B20, в якому нам не потрібно перетворення АЦП для отримання температури. Тут ми будемо використовувати мікроконтролер PIC з DS18B20 для вимірювання температури.
Отже, тут ми будуємо термометр з наступними характеристиками з використанням мікроконтролера PIC16F877A від мікрочіпу.
- Він покаже повний діапазон температур від -55 градусів до +125 градусів.
- Він буде відображати температуру, лише якщо температура змінюється + / -.2 градуси.
Необхідні компоненти: -
- Pic16F877A - пакет PDIP40
- Хлібна дошка
- Пікіт-3
- Адаптер 5 В
- РК-дисплей JHD162A
- Датчик температури DS18b20
- Провід для підключення периферії.
- 4.7k резистори - 2шт
- 10к горщик
- Кристал 20 мГц
- 2 шт. Керамічні конденсатори 33pF
Датчик температури DS18B20:
DS18B20 - чудовий датчик для точного визначення температури. Цей датчик забезпечує роздільну здатність від 9 до 12 біт при зондуванні температури. Цей датчик взаємодіє лише з одним проводом, і йому не потрібен будь-який АЦП для отримання аналогових температур і перетворення їх у цифровий формат.
Специфікація датчика:
- Вимірює температури від -55 ° C до + 125 ° C (-67 ° F до + 257 ° F)
- ± 0,5 ° C Точність від -10 ° C до + 85 ° C
- Програмована роздільна здатність від 9 до 12 біт
- Зовнішні компоненти не потрібні
- Датчик використовує 1-Wire® інтерфейс
Якщо ми подивимося на вищерозташоване зображення з таблиці, ми можемо побачити, що датчик виглядає точно так само, як пакет BC547 або BC557, TO-92. Перший контакт - заземлений, другий - DQ або дані, а третій - VCC.
Нижче наведено електричні специфікації з технічного листа, які будуть потрібні для нашого проектування. Номінальна напруга живлення для датчика становить від + 3,0 В до + 5,5 В. Також потрібно підтягнути напругу живлення, яка така ж, як зазначена вище напруга живлення.
Крім того, існує межа точності, який становить + -0,5 градуса Цельсія для діапазону від -10 градусів С до +85 градусів Цельсія, а точність змінюється для повного діапазону, який становить + -2 градусів для -55 градусів Цельсія Діапазон 125 градусів.
Якщо ми ще раз подивимось на таблицю даних, ми побачимо специфікацію підключення датчика. Ми можемо підключити датчик у паразитному режимі живлення, де потрібні два дроти, DATA та GND, або можна підключити датчик за допомогою зовнішнього джерела живлення, де потрібні три окремі дроти. Ми використаємо другу конфігурацію.
Оскільки ми зараз знайомі з рейтингами потужності датчика та областями, пов’язаними з підключенням, тепер ми можемо зосередитися на складанні схеми.
Кругова діаграма:-
Якщо ми побачимо принципову схему, ми побачимо, що: -
РК-дисплей розміром 16x2 підключений через мікроконтролер PIC16F877A, в якому RB0, RB1, RB2 підключені до РК-виводу RS, R / W та E. D7. РК-дисплей підключається в 4-бітному режимі або режимі гризти.
Кристалічний генератор 20 МГц з двома керамічними конденсаторами 33pF підключений через штифт OSC1 та OSC2. Він забезпечить мікроконтролеру постійну тактову частоту 20 МГц.
DS18B20 також підключений відповідно до конфігурації штифтів і з підтягуючим резистором 4,7 к, як обговорювалося раніше. Я все це пов’язав у макет.
Якщо ви новачок у мікроконтролері PIC, дотримуйтесь наших посібників із мікроконтролера PIC, де вказано Початок роботи з мікроконтролером PIC.
Кроки або потік коду: -
- Встановіть конфігурації мікроконтролера, які включають конфігурацію осцилятора.
- Встановіть бажаний порт для РК-дисплея, включаючи реєстр TRIS.
- Кожен цикл з датчиком ds18b20 починається зі скидання, тому ми скидаємо ds18b20 і чекаємо імпульсу присутності.
- Напишіть блокнот і встановіть роздільну здатність датчика 12 біт.
- Пропустити читання ПЗУ з наступним імпульсом скидання.
- Надішліть команду перетворення температури.
- Зчитуйте температуру з блокнота.
- Перевірте значення температури, негативне чи позитивне.
- Роздрукуйте температуру на РК-дисплеї 16x2.
- Дочекайтеся зміни температури для +/-. 20 градусів Цельсія.
Пояснення коду:
Повний код цього цифрового термометра наведено в кінці цього посібника з демонстраційним відео. Для запуску цієї програми вам знадобляться деякі заголовкові файли, які можна завантажити звідси.
Спочатку нам потрібно встановити біти конфігурації в мікроконтролері pic, а потім розпочати з головною функцією void .
Далі нижче чотири рядки використовуються для включення файлу заголовка бібліотеки, lcd.h та ds18b20.h . А xc.h - це файл заголовка мікроконтролера.
#включати
Ці визначення використовуються для надсилання команди датчику температури. Команди вказані в таблиці даних датчика.
#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_init () викликається з бібліотеки lcd.h.
Регістри TRIS використовуються для вибору контактів вводу-виводу як вхідних чи вихідних даних. Дві неподписані короткі змінні 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) на невеликі шматки.
Ці лінії використовуються для відчуття, що датчик температури підключений чи ні.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Будь ласка, підключіться"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Використовуючи цей сегмент коду, ми ініціалізуємо датчик і відправляємо команду на перетворення температури.
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-бітових даних температури у двох коротких змінних без знака.
while (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®. Ми використовуємо кристал 20 МГц. Якщо ми заглянемо всередину файлу ds18b20.c, то побачимо
#define _XTAL_FREQ 20000000
Це визначення використовується для процедури затримки компілятора XC8. 20 МГц встановлюється як частота кристала.
Ми зробили п’ять функцій
- ow_reset
- read_bit
- прочитаний_байт
- write_bit
- write_byte
Протокол 1-Wire ® потребує суворих часових інтервалів для зв'язку. Всередині таблиці ми отримаємо ідеальну інформацію, пов’язану з часовими інтервалами.
Всередині наведеної нижче функції ми створили точний часовий інтервал. Важливо створити точну затримку для утримання та відпускання та управління бітом TRIS відповідного порту датчика.
без підпису char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (вихід) DQ = 0; // встановити pin # на низький (0) __delay_us (480); // 1 провід вимагає затримки часу DQ_TRIS = 1; // Tris = 1 (вхід) __delay_us (60); // 1 провід вимагає затримки часу, якщо (DQ == 0) // якщо є присутність плюса {__delay_us (480); повернути 0; // повертаємо 0 (1-провід - це присутність)} else {__delay_us (480); повернути 1; // повертаємо 1 (1-провід НЕ присутній)}} // 0 = наявність, 1 = немає частини
Тепер, згідно з наведеним нижче описом часового інтервалу, що використовується в режимі читання та запису, ми створили функцію читання та запису відповідно.
непідписаний символ 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