Пятница, 26.04.2024, 05:01
Главная
Приветствую Вас, Гость
Статистика



Онлайн лист

Онлайн всего: 1
Гостей: 1
Пользователей: 0



Реклама



Главная » Статьи » Микроконтроллеры

Наверх


Термометр Atmega16 + DS18В20 + 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; //читаем температуру

sprintf(lcd_buffer,"t=%i.%u\xdfC",temp/10,temp%10); //запись в буфер текста и значений температуры в подготовленном виде
lcd_clear(); //очистка дисплея
lcd_puts(lcd_buffer); //вывод содержимого буфера на LCD
pause; //задержка в 500мс (необходимо чтобы термометр заново измерил температуру)
};
}




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

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


Нравится
Категория: Микроконтроллеры | Добавил: Naprisar (09.04.2012)
Просмотров: 26571 | Комментарии: 14 | Теги: LCD, микроконтроллер, ATmega16, HD44780, термометр, DS18B20
Всего комментариев: 14
13 Владимир  
0
Проверил в железе все работает.Не смог проверить минусовую температуру.Датчик запаян в отладочную плату.

14 Naprisar  
0
Рад что все заработало)

12 Владимир  
0
Спасибо.Убрал ка Вы советовали. В протеусе все работает правильно, даже температура минус,после запятой показания правильные.Напомню у меня подключенно два датчик DS1820 к одному порту. Правда изменил строки

devices=w1_search(0xf0,rom_codes);
temper1=ds1820_temperature_10(&rom_codes[0][0]);
sprintf(lcd_buf1,"T1=%.1f\xdfC",temper1/10);

Завтра попробую в железе.

9 Владимир  
0
ПРоверил прошивку термрметра в железе.Глюк с температурой выше 100 градусов такой же как и в протеусе.

10 Naprisar  
0
Поковырял немного, и эту проблемку решил. Надо просто убрать эу часть кода:
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
Без этого он нормально отображает температуу выше 100 градусов.
Он и так нормально выдает отрицательную температуру, единственный нюанс теперь только то что он при отрицательной температуре выдает корявое значание после запятой, с этим тоже попробую разобраться на досуге.

Буду благодарен за проверку в железе, так как под рукой этих датчиков сейчас у меня тен.

7 Владимир  
0
В чем может быть ошибка.Выставляю в протеусе на датчике температуру+101 градус показывает минус -300 с копейками.От -25 до +100 показывает правильно, как только больше ста градусов.Показывает ерунду.Датчик DS18S20.

8 Naprisar  
0
Попробую у себя посмотреть. Сам датчик должен корректно работать до +12 градусов, хотя в полне возможно что в модели в протеусе глюк. Посмотрю у себя отпишусь.

6 Alexey  
0
показывает 2698.6 C
все заработало при частоте 1mhz, при большей 2698.6
поменуто увеличиваеся время между сигналами 1-wire при увеличении частоты.

.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=0 ;
CodeWizard прописывает зти строчки сам в asm файле 1-wire, поэтому их писать нужно ток если не используете CodeWizard :)

11 Naprisar  
0
2698.6 C выводится на экране при несоответствии частот. В протеусе, в свойствах микроконтроллера,  в строке Clock Frenquency нужно выставить туже частоту что была выбрана при настройке микроконтроллера в CodeVision

5 Дима  
0
Здравствуйте. У меня проблема со схемой. Вроде бы все сделал так, но при любом значении на датчике на LCD показывает 2698.6 C. Плюс на LCD ножки RS и RW по нулям. Помогите исправить
Либо, выложите свой поект

3 евгениц  
0
нашел.
я просто никогда не работал с этим компилятором.

.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=0 ;
в этом месте надо убрать лишний "_", перед "w1" два "_", а нужен один

4 Naprisar  
0
.equ __w1_port=0x12 ;PORTD  
.equ __w1_bit=0 ;  
Это код который генерирует CodeWizard в CodeVision, при настройке 1 Wire. И он ставит именно два "_".  У меня все работает в таком виде.

2 евгениц  
0
у меня ошибка пи компиляции кода

1 kil1970  
0
можно ли по весить на мегу еще к примеру датчика 4 и вывести все это на экран ЛСД

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Наверх