- Необходимые компоненты: -
- Датчик температуры DS18B20:
- Принципиальная электрическая схема:-
- Шаги или поток кода: -
- Пояснение к коду:
- Получение данных от датчика температуры DS18B20:
Обычно датчик температуры LM35 используется с микроконтроллерами для измерения температуры, поскольку он дешев и легко доступен. Но LM35 дает аналоговые значения, и нам нужно преобразовать их в цифровые с помощью АЦП (аналого-цифровой преобразователь). Но сегодня мы используем датчик температуры DS18B20, в котором нам не нужно преобразование АЦП для измерения температуры. Здесь мы будем использовать микроконтроллер PIC с DS18B20 для измерения температуры.
Итак, здесь мы создаем термометр со следующей спецификацией, используя микроконтроллер PIC16F877A от микрочипа.
- Он покажет полный диапазон температуры от -55 градусов до +125 градусов.
- Он будет отображать температуру только при изменении температуры на +/- 0,2 градуса.
Необходимые компоненты: -
- Pic16F877A - корпус PDIP40
- Хлебная доска
- Пикит-3
- Адаптер 5V
- ЖК-дисплей JHD162A
- Датчик температуры DS18b20
- Провода для подключения периферии.
- Резисторы 4,7к - 2шт
- 10к банк
- Кристалл 20 МГц
- 2 керамических конденсатора 33 пФ
Датчик температуры 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. ЖК-дисплея, а RB4, RB5, RB6 и RB7 подключены к 4 контактам ЖК-дисплея D4, D5, D6, D7. ЖК-дисплей подключен в 4-битном режиме или режиме полубайта.
Кварцевый генератор с частотой 20 МГц с двумя керамическими конденсаторами по 33 пФ подключен к выводам OSC1 и OSC2. Он будет обеспечивать микроконтроллер постоянной тактовой частотой 20 МГц.
DS18B20 также подключен согласно конфигурации контактов и с подтягивающим резистором 4,7 кОм, как обсуждалось ранее. Все это я соединил в макете.
Если вы новичок в использовании микроконтроллера PIC, следуйте нашим руководствам по микроконтроллеру PIC, в которых говорится в разделе «Начало работы с микроконтроллером PIC».
Шаги или поток кода: -
- Установите конфигурации микроконтроллера, которые включают конфигурацию осциллятора.
- Установите желаемый порт для ЖК-дисплея, включая регистр TRIS.
- Каждый цикл с датчиком ds18b20 начинается со сброса, поэтому мы сбросим ds18b20 и дождемся импульса присутствия.
- Напишите блокнот и установите разрешение датчика 12 бит.
- Пропустить чтение ПЗУ с последующим импульсом сброса.
- Подайте команду преобразования температуры.
- Считайте температуру в блокноте.
- Проверьте значение температуры, отрицательное или положительное.
- Распечатайте температуру на ЖК-дисплее 16x2.
- Подождите, пока температура изменится на +/-. 20 градусов Цельсия.
Пояснение к коду:
Полный код для этого цифрового термометра приведен в конце этого руководства с демонстрационным видео. Для запуска этой программы вам потребуются файлы заголовков, которые можно скачать отсюда.
Сначала нам нужно установить биты конфигурации в микроконтроллере pic, а затем начать с функции void main .
Затем ниже четыре строки используются для включения файла заголовка библиотеки, 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;
В пустом главном () функции, то 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) на небольшие части.
Эти линии используются для определения того, подключен ли датчик температуры.
а (ow_reset ()) {lcd_com (0x80); lcd_puts («Пожалуйста, подключитесь»); lcd_com (0xC0); lcd_puts («Датчик температуры»); }
Используя этот сегмент кода, мы инициализируем датчик и отправляем команду для преобразования температуры.
lcd_puts (""); ow_reset (); write_byte (записать блокнот); write_byte (0); write_byte (0); write_byte (разрешение_12bit); // 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 (читать блокнот); TempL = read_byte (); TempH = read_byte ();
Затем, если вы проверите полный код ниже, мы создадим условие if-else, чтобы узнать знак температуры, является ли он положительным или отрицательным.
Используя код оператора If , мы манипулируем данными и смотрим, является ли температура отрицательной или нет, и определяем, что изменения температуры находятся в диапазоне +/- 0,20 градусов или нет. А в остальной части мы проверили, является ли температура положительной или нет, и обнаружили изменения температуры.
код
Получение данных от датчика температуры DS18B20:
Давайте посмотрим на временной интервал интерфейса 1-Wire®. Мы используем кристалл 20 МГц. Если мы заглянем внутрь файла ds18b20.c, мы увидим
#define _XTAL_FREQ 20000000
Это определение используется для процедуры задержки компилятора XC8. Частота кристалла составляет 20 МГц.
Мы сделали пять функций
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Протокол 1-Wire ® требует для связи слотов со строгими временными привязками. Внутри таблицы мы получим точную информацию о временных интервалах.
Внутри функции ниже мы создали точный временной интервал. Важно создать точную задержку для удержания и отпускания и управления битом TRIS порта соответствующего датчика.
беззнаковый символ ow_reset (недействительный) {DQ_TRIS = 0; // Tris = 0 (вывод) DQ = 0; // устанавливаем контакт # на низкий уровень (0) __delay_us (480); // 1 провод требует задержки времени DQ_TRIS = 1; // Tris = 1 (ввод) __delay_us (60); // 1 провод требует выдержки времени if (DQ == 0) // если присутствует плюс {__delay_us (480); возврат 0; // возврат 0 (1-провод - присутствие)} else {__delay_us (480); возврат 1; // возврат 1 (1-провод НЕ является присутствием)}} // 0 = присутствие, 1 = нет части
Теперь, согласно приведенному ниже описанию временного интервала, используемому в Read и Write, мы создали функции чтения и записи соответственно.
беззнаковый символ read_bit (void) {беззнаковый символ i; DQ_TRIS = 1; DQ = 0; // опускаем DQ на минимум для начала временного интервала DQ_TRIS = 1; DQ = 1; // затем возвращаем максимум for (i = 0; i <3; i ++); // задержка 15 мкс с начала временного интервала return (DQ); // возвращаемое значение строки DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // опускаем DQ на минимум, чтобы начать временной интервал if (bitval == 1) DQ = 1; // вернуть высокий уровень DQ, если запись 1 __delay_us (5); // удерживаем значение для оставшейся части временного интервала DQ_TRIS = 1; DQ = 1; } // Задержка обеспечивает 16 мксек на цикл плюс 24 мксек. Следовательно, delay (5) = 104us
Далее проверьте все связанные файлы заголовков и.c здесь.
Вот как мы можем использовать датчик DS18B20 для измерения температуры с помощью микроконтроллера PIC.
Если вы хотите построить простой цифровой термометр с LM35, ознакомьтесь с проектами с другими микроконтроллерами ниже:
- Измерение комнатной температуры с помощью Raspberry Pi
- Цифровой термометр с использованием Arduino и LM35
- Цифровой термометр с использованием LM35 и 8051
- Измерение температуры с помощью микроконтроллера LM35 и AVR