Работа с датчиком температуры DS18b20

Опубликовано: 15.08.2008
Автор: Krik99
Рубрики: Обучалка

Вот решил написать статью про работу с температурным датчиком DS18b20. Тут познакомимся с небольшими кусками кода. Я писал под CodeVision AVR, и использовал библиотеку ds18b20. Хотя многие скажут глупо использовать готовую библиотеку, так как там много ненужного, и можно написать и по луче, но для начинающих в самый раз. Есть особенность, при работе с шиной 1Wire надо останавливать прерывания, так как нельзя рвать пакеты импульсов. Контролёр можно брать любо, только бы памяти хватило в МК. Весь код можно сгенерировать в CodeVision AVR. Датчик работает по интерфейсу 1Wire. Ну наверное всё, теперь перейдём прямо к коду. Ну для начала создадим проект и выбурим тип МК, и частоту контролера 4мгц. ну и всё такое, теперь выбираем вкладку 1Wire, выбираем порт к которому хотим подключить DS18b20 , и выбираем пин к которому подключим датчик. После этого, если конечно нам больше нечего не надо выставлять, жмём создать проект. Ну теперь удаляем комментарии, и всё что не нужно. Теперь посмотрим что получилось, и так всё по порядку. Лично я генерировал код для ATmega8, и подключал датчик к PORTD к пину 3. И так смотрим код, вот код который объявляет, куда подключён датчик, а точнее, куда подключена шина 1Wire.
Вот собственно этот код:
#asm
.equ __w1_port=0×12 ;PORTD
.equ __w1_bit=3
#endasm

Строкой #include <1wire.h>объявляем библиотеку для работы с интерфейсом 1Wire. Дальше нам надо объявить библиотеку для работы с самим датчиком DS18b20, пишем такой код #include <ds18b20.h> Ну и теперь в самой программе пишем devices=w1_init(); этой строкой ищем устройства 1Wire, которые подключены к МК, а число найденных устройств запишется в переменную devices Теперь, если переменная devices больше нуля, то МК знает что есть подключенный датчик, а может и не один. Теперь нам надо спросить датчик о измеряемой им температуре, это делаем так, temp=ds18b20_temperature(0); при этом данные о температуре приходят в переменную temp Эти запросы нужно повторять довольно часто. Ну вот собственно и всё. Да, чуть не забыл особенность DS18b20 , в отличие от DS18S20 , это то что при минусовой температуре DS18b20 начинает посылать непонятную температуру , и чтобы узнать правильную температуру надо, от переменной с температурой отнять 4096, но это только при минусовой температуре.
Это я сделал вот таким кодом:

if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак “минус”
}

Ну теперь вроде всё. Работа с датчиком DS18S20 приблизительно такая же, только надо объявить библиотеку #include <ds1820.h> и запрос на температуру будет выглядеть вот так temp=ds1820_temperatur_10(0)/10; при этом надо, надо ещё делить принятую температуру на 10. Ну и при минусе температура будет приходить просто со знаком минуса. Если что-то не понятно пишите на форум.

Продолжение к статье…

По просьбам трудящихся, решил написать продолжение к статье про роботу с несколькими датчиками DS18B20 на одном МК. К нашей схеме надо добавить несколько датчиков и кнопку.

Сильно углубляться в программу не буду, сами посмотрите исходник в конце статьи. Как всегда добавляем библиотеку 1wire.h и библиотеку ds18b20.h

Объявляем, к каким пинам подключена линия 1wire.

#asm
.equ __w1_port=0×12 ;PORTD
.equ __w1_bit=3
#endasm

Теперь нам надо найти все датчики, подключенные к шине 1wire и записать их адрес в массив rom_code, и заодно записать в переменную devices сколько мы нашли датчиков.

devices=w1_search(0xf0,rom_code);

Далее пишем небольшой код чтобы выбирать кнопкой номер датчика.

if(!PINC.0){ //Если нажата кнопка
i++; //Увиличиваем переменную “i” на 1
delay_ms(300); //Ждём 300мс для “анти-дребезга”
}
if(i>=devices){ //Если “i” больше или равно найденым датчикам
i=0; //тогда “i” равно нулю
}

Теперь надо прочитать температуру с датчика, с определённым адресом с массива rom_code. Вообще пишем такое:

temp=ds18b20_temperature(&rom_code[i][0]); //загоняем в переменную temp данные принятые с датчика с номером зависящим от переменной “i”

Всё-таки у нас датчик ds18b20, тогда пишем код для минусовой температуры:

if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак “минус”
}

А теперь осталось вывести переменную temp на экран, и повторить весь цикл заново…

Вот исходник, надеюсь там всё понятно

Вот в архиве предлагаю два исходника (Первый о работе с датчиком ds18b20, второй для работы с несколькими датчиками одновременно) небольшого термометр с отображением на LCD с датчиком DS18b20, ну и конечно с проектом Протеуса.
termometr_ds18b20

Удачи!

Оставить комментарий

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.


Управление

Свежие записи

Разделы