Термометр - устройство для измерения температуры. Очень популярное устройство и имеет широкую область применения, чаще всего в радиолюбительской практике используется для контроля комнатной температуры, температуры за окном, в машине или в каком либо своем устройстве.
Ниже я приведу пример, как просто сделать термометр на основе микроконтроллера Atmega16, датчика температуры DS18B20 и LCD (HD44780).
DS18B20 - 1-проводный цифровой термометр, работает по интерфейсу 1-Wire.
Подключить к микроконтроллеру такой термометр очень просто:
Подключение DS18B20 в корпусе TO-92Подключение DS18B20 в корпусе SOIC
На рисунках показано как подключить к микроконтроллеру термометр, в зависимости от корпуса. Никаких сложностей это вызвать не должно. Теперь приведу полную схему термометра:
На схеме: Atmega16,наш управляющий микроконтроллер, LCD и сам термометр. Но просто собрать все детали в кучу и спаять как мы знаем мало, нужно написать программу в микроконтроллер. в одной из предыдущих статей я писал как работать с таким дисплеем, а сейчас покажу как снимать показания с термометра DS18S20. Приступим. Открываем CodeVisionAVR и запускаем генератор начального кода, во вкладке Chip, как обычно выбираем микроконтроллер и частоту,во вкладке LCD настраиваем подключение дисплея и переходим во вкладку 1 Wire:
Как видно из схемы термометр я подключил к ножке PD0 микроконтроллера, поэтому в строке 1 Wire PORT выбрал PORTD,а в строке Data Bit - 0. И обязательно нужно поставить галочку напротив Enabled,галочка напротив Multiple Device нужна в том случае если будет подключаться несколько датчиков на эту линию, чего я сейчас не планирую, поэтому и оставил пустым. С настройкой закончили, выбираем Ganerate Save and Exit и сохраняем наш проект. Теперь перейдем непосредственно к коду.
#include <mega16.h> #include <delay.h> #include <stdio.h> // 1 Wire Bus functions #asm .equ __w1_port=0x12 ;PORTD .equ __w1_bit=0 #endasm #include <1wire.h> // DS1820 Temperature Sensor functions #include <ds18b20.h> #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #define pause delay_ms(500) // Объявляем переменную pause, которая будет осуществлять задержку char lcd_buffer[33]; //Буфер для хранения данных для вывода на дисплей int temp; //Переменная для хранения значения температуры void avr_init(void){ PORTA=0x00; DDRA=0x00; PORTB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; ACSR=0x80; SFIOR=0x00; }; void main(void) { avr_init(); w1_init(); //инициализация датчика lcd_init(16); //инициилизация LCD while(1) //бесконечный цикл измерения температуры { temp=ds18b20_temperature(0)*10; //читаем температуру sprintf(lcd_buffer,"t=%i.%u\xdfC",temp/10,temp%10); //запись в буфер текста и значений температуры в подготовленном виде lcd_clear(); //очистка дисплея lcd_puts(lcd_buffer); //вывод содержимого буфера на LCD pause; //задержка в 500мс (необходимо чтобы термометр заново измерил температуру) }; }
По большому счету после генератора нам потребовалось задать пару переменных необходимых для работы, запустить инициализацию датчика w1_init(); и написать небольшой и нехитрый код для обработки значения температуры и вывода его на экран.
При условии исправности всех деталей, устройство должно запустится сразу и не требует каких либо дополнительных настроек.
|