Термометр - устройство для измерения температуры. Очень популярное устройство и имеет широкую область применения, чаще всего в радиолюбительской практике используется для контроля комнатной температуры, температуры за окном, в машине или в каком либо своем устройстве.
Ниже я приведу пример, как просто сделать термометр на основе микроконтроллера Atmega16, датчика температуры DS18B20 и LCD (HD44780).
DS18B20 - 1-проводный цифровой термометр, описание читаем тут, работает по интерфейсу 1- Wire.
Подключить к микроконтроллеру такой термометр очень просто:
На рисунках показано как подключить к микроконтроллеру термометр, в зависимости от корпуса. Никаких сложностей это вызвать не должно. Теперь приведу полную схему термометра:
На схеме: 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(); и написать небольшой и нехитрый код для обработки значения температуры и вывода его на экран.
При условии исправности всех деталей, устройство должно запустится сразу и не требует каких либо дополнительных настроек.
Спасибо.Убрал ка Вы советовали. В протеусе все работает правильно, даже температура минус,после запятой показания правильные.Напомню у меня подключенно два датчик DS1820 к одному порту. Правда изменил строки
Поковырял немного, и эту проблемку решил. Надо просто убрать эу часть кода: if (temp>1000){ //если датчик выдаёт больше 1000 temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } Без этого он нормально отображает температуу выше 100 градусов. Он и так нормально выдает отрицательную температуру, единственный нюанс теперь только то что он при отрицательной температуре выдает корявое значание после запятой, с этим тоже попробую разобраться на досуге.
Буду благодарен за проверку в железе, так как под рукой этих датчиков сейчас у меня тен.
В чем может быть ошибка.Выставляю в протеусе на датчике температуру+101 градус показывает минус -300 с копейками.От -25 до +100 показывает правильно, как только больше ста градусов.Показывает ерунду.Датчик DS18S20.
Попробую у себя посмотреть. Сам датчик должен корректно работать до +12 градусов, хотя в полне возможно что в модели в протеусе глюк. Посмотрю у себя отпишусь.
показывает 2698.6 C все заработало при частоте 1mhz, при большей 2698.6 поменуто увеличиваеся время между сигналами 1-wire при увеличении частоты.
.equ __w1_port=0x12 ;PORTD .equ __w1_bit=0 ; CodeWizard прописывает зти строчки сам в asm файле 1-wire, поэтому их писать нужно ток если не используете CodeWizard :)
2698.6 C выводится на экране при несоответствии частот. В протеусе, в свойствах микроконтроллера, в строке Clock Frenquency нужно выставить туже частоту что была выбрана при настройке микроконтроллера в CodeVision
Здравствуйте. У меня проблема со схемой. Вроде бы все сделал так, но при любом значении на датчике на LCD показывает 2698.6 C. Плюс на LCD ножки RS и RW по нулям. Помогите исправить Либо, выложите свой поект
.equ __w1_port=0x12 ;PORTD .equ __w1_bit=0 ; Это код который генерирует CodeWizard в CodeVision, при настройке 1 Wire. И он ставит именно два "_". У меня все работает в таком виде.