Термометр Atmega16 + DS18B20 + LCD (HD44780)

article53.jpg

материал взят с данного сайта


 

Термометр Atmega16 + DS18B20 + LCD (HD44780)

Термометр - устройство для измерения температуры. Очень популярное устройство и имеет широкую область применения, чаще всего в радиолюбительской практике используется для контроля комнатной температуры, температуры за окном, в машине или в каком либо своем устройстве.

Ниже я приведу пример, как просто сделать термометр на основе микроконтроллера Atmega16, датчика температуры DS18B20 и LCD (HD44780).

DS18B20 - 1-проводный цифровой термометр, описание читаем тут, работает по интерфейсу 1-
Wire
.

Подключить к микроконтроллеру такой термометр очень просто:

Подключение DS18B20 в корпусе TO-92Подключение DS18B20 в корпусе SOIC



На рисунках показано как подключить к микроконтроллеру термометр, в зависимости от корпуса. Никаких сложностей это вызвать не должно. Теперь приведу полную схему термометра:


Схема термометра DS18B20 + Atmega16 + LCD



На схеме: 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; //читаем температуру if (temp>1000){ //если датчик выдаёт больше 1000 temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp/10,temp%10); //запись в буфер текста и значений температуры в подготовленном виде lcd_clear(); //очистка дисплея lcd_puts(lcd_buffer); //вывод содержимого буфера на LCD pause; //задержка в 500мс (необходимо чтобы термометр заново измерил температуру) }; }

 

 

 

 

 

 

 

 

 

 

 

 


 

По большому счету после генератора нам потребовалось задать пару переменных необходимых для работы, запустить инициализацию датчика w1_init(); и написать небольшой и нехитрый код для обработки значения температуры и вывода его на экран.

При условии исправности всех деталей, устройство должно запустится сразу и не требует каких либо дополнительных настроек.


P.S. Пробуя схему на плате PINBoard II, я поменял порт ЖКИ и назначил PORTA.

Переделанный проект  в Codevision

Комментарии (0)

Нет комментариев. Ваш будет первым!