Работа с датчиком температуры ds18b20 в bascom-avr

AVR Урок 20. Подключаем датчик температуры DS18B20. Часть 1

Урок 20

Подключаем датчик температуры DS18B20

Продолжаем изучать датчики компании DALLAS.

И сегодняшним представителем будет DS18B20, который является датчиком температуры.

Измеряет температуру данный датчик в градусах по цельсию. Измерения могут быть как 9-битной дискретности, так и 12-битной.

Распределяются данные биты следующим образом.

Мы будем измерять температуру в 12-битном виде и самые младшие 4 бита будут хранить показания долей градуса, а остальные старшие 8 – сами градусы.

Подключается данный датчик по однопроводной технологии (1-wire).

Диапазон измерений – от -55 0 C до +125 0 C, но наивысшая точность показаний достигается в диапазоне от -10 0 C до +85 0 C/

Погрешность данного датчика – 0,5 градуса, поэтому нам нет смысла использовать все младшие биты и мы их будем просто отсекать.

Режим 1-wire у нас не организован аппаратно в контроллере, поэтому мы будем весь протокол программировать.

Чем удобен для нас данный датчик? Удобен он тем, что мы можем его в часовой модуль, использованный на прошлых занятиях просто впаять и использовать. Для этого на модуле выведен отдельный контакт. У датчика всего 3 ножки. 2 из них ножки питания и одна – ножка данных.

Данный датчик существует в двух видах корпуса – Dip и TO-92. Мы будем использовать второй тип.

Таких датчиков, как пишут, на 1 провод можно повесить несколько, но я не пробовал.

В связи с этим у каждого датчика есть уникальный 64-битный код, записанный в его ROM, записанного постредством лазерных технологий.

Но, так как мы будем использовать только один датчик, то мы будем к нему обращаться другим способом, не используя ROM.

Мы подаём на датчик команду 44h последовательным кодом, тем самым заставляя датчик конвертировать температуру.

Посмотрим регистры, в которых хранится значение температуры после преобразования

В четырех младших битах младшего регистра хранятся доли градусов, в четырех старших, а также в трех младших битах старшего регистра – целые значения градусов.

В остальных битах – знак. Если 0, то плюс, если 1 – то минус.

Также в технической документации написано, что нужно обязательно подтянуть резистор на информационную ножку датчика к питанию.

Также написан ряд временных и других характеристик, которые мы уже будем рассматривать по мере того, как будем писать код.

Проект был создан новый и назван My1820LCD, все файлы проекта прошлого занятия MyClock1307LCD были вставлены в проект, а код главного модуля также был скопирован в главный модуль нового проекта. Всё это сделано потому, что мы работаем с тем же модулем, просто мы также впаяли туда датчик температуры, а время мы считывать не перестанем, пусть часы также ходят.

Добавим ещё файлы DS18B20.c и DS18B20.h для созадния библиотеки работы именно с датчиком температуры и заголовочный файл также подключим в main.h по нашему обыкновению, ну и его же подключим в одноименный c-файл.

Сначала создадим функцию конвертирования температуры в файле DS18B20.c. Надобность данной функции обусловлена тем, что датчик нам передаёт показания в двух байтах в определённом виде, рассмотренном нами выше, который без преобразования будет непонятен

//функция преобразования показаний датчика в температуру

int dt_check ( void )

Создадим две переменных, которые нам пригодятся в дальнейшем в теле нашей функции

int dt_check ( void )

unsigned char bt ; //переменная для считывания байта

unsigned int tt =0;

Сразу сделаем прототип нашей функции в заголовочном файле

int dt_check ( void ); //функция преобразования показаний датчика в температуру

Чтобы нам дальше писать тело функции, нам будет нужна ещё функция. Напишем её выше, чтобы не создавать прототип. Данная функция будет узнавать, есть ли датчик на шине

//функция определения датчика на шине

char dt_testdevice ( void ) //dt – digital termomether | определим, есть ли устройство на шине

Теперь, прежде чем писать тело данной функции, самое время посмотреть схему подключения датчика к контроллера. Посмотрим опять же упрощённый вариант в протеусе (нажмите на картинку для увеличения изображения)

Мы видим, что датчик своим информационным портом подключен к ножке порта МК PD1, также мы видим подтягивающее сопротивление на 4,7 килоом с данного провода на шину питания.

И вот теперь на данной ножке мы должны как-то иммитировать определённые имплуьсы. То есть мы как-то должны инициализировать то ноль, то единицу. Делать мы это сможем благодаря тому, что у нас есть подтягивающий резистор. Мы будем её то отпускать от общей шины, то притягивать к ней. Соответственно, когда мы её отпустим, то через резистор на ней окажется высокий уровень, а когда подтянем к земле, то низкий.

Теперь вопрос, как это всё сделать. А сделать это можно вполне с помощью определённого бита регистра DDRB, который отвечает, как мы знаем, за направление работы определённых ножек порта. Но мы воспользуемся тем, что когда мы объявляем ножку на выход, она у нас притягивается к земле, понятно что при условии, что соответствующий бит регистра PORTD будет также нулём. А если мы уже в соответствующий бит регистра DDRB записываем значение, при котором соответствующая этому биту ножка объявится на вход, то, соответственно, от общей шины она. ясное дело отпустится, иначе как контроллер определит её состояние. Ну и, как и было написано выше, на этой ножке засчет подтягивающего резистора установится высокий логический уровень.

Также, начиная процесс обмена с датчиком, мы должны запретить прерывания, чтобы не получить искаженных данных. Также, прежде чем запретить прерывания, нам необходимо сохранить регистр статуса контроллера, или стек. Это регистр SREG. Поэтому в самом начале тела нашей функции проверки присутствии датчика на шине мы это и сделаем, сохранив его в определённую переменную, ну и затем уже запретим прерывания

char dt_testdevice ( void ) //dt – digital termomether | определим, есть ли устройство на шине

char stektemp =SREG; // сохраним значение стека

cli (); //запрещаем прерывания

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

Программатор, датчик температуры DS18B20 на плате и дисплей можно приобрести здесь:

Смотреть ВИДЕОУРОК (нажмите на картинку)

Работа с датчиком температуры ds18b20 в bascom-avr

Каждому устройству протокола 1-wire при производстве присваивается уникальный идентификационный код, который позволяет определять устройство на шине. В едущее устройство (микроконтроллер в нашем случае) при сканировании шины записывает номера найденных устройств и при опросе начинает опрос в порядке очереди начиная с наименьшего адреса устройства.

В Bascom-AVR поиск устройств ведется по командам

Dsid1 ( 1 ) = 1wsearchfirst ()
Dsid2 ( 1 ) = 1wsearchnext ()
Dsid3 ( 1 ) = 1wsearchnext ()

Переменным Dsid1, Dsid2, Dsid3 присвоятся значения адреса найденных устройств. Затем по этим адресам будут опрашиваться устройства.

$regfile = «m8def.dat»
$crystal = 1000000

Config Lcdpin = Pin , Rs = Portb . 7 , E = Portb . 6 , Db4 = Portb . 5 , Db5 = Portb . 4 , Db6 = Portb . 3 , Db7 = Portb . 2
Config Lcd = 16 * 2
Cursor Off
Cls

Читайте также  Светодиодный диммер с токовым управлением

Config 1wire = Portc . 2

Dim Ss As String * 6
Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim Dsid1 ( 8 ) As Byte
Dim Dsid2 ( 8 ) As Byte
Dim Dsid3 ( 8 ) As Byte
Dim Dsid4 ( 8 ) As Byte

Deflcdchar 0 , 232 , 244 , 232 , 227 , 228 , 228 , 227 , 224 ‘градус Цельсия
Deflcdchar 1 , 31 , 27 , 19 , 27 , 27 , 27 , 17 , 31 ‘символ 1
Deflcdchar 2 , 31 , 17 , 21 , 29 , 27 , 23 , 17 , 31 ‘символ 2
Deflcdchar 3 , 31 , 17 , 29 , 25 , 29 , 29 , 17 , 31 ‘символ 3
Deflcdchar 4 , 31 , 23 , 21 , 21 , 17 , 29 , 29 , 31 ‘символ 4

‘считываем адреса устройств на шине 1-Wire
Dsid1 ( 1 ) = 1wsearchfirst ()
Dsid2 ( 1 ) = 1wsearchnext ()
Dsid3 ( 1 ) = 1wsearchnext ()
Dsid4 ( 1 ) = 1wsearchnext ()

Do
1wreset ‘запускаем опрос всех датчиков
1wwrite & HCC
1wwrite & H44

Waitms 750

‘после ожидания начинаем считывать датчики
‘———————————
1wreset
1wwrite & H55
1wverify Dsid1 ( 1 ) ‘адрес первого датчика
1wwrite & HBE
I1 = 1wread ( 2 )
‘———————————
1wreset
1wwrite & H55
1wverify Dsid2 ( 1 ) ‘адрес второго датчика
1wwrite & HBE
I2 = 1wread ( 2 )
‘——————————
1wreset
1wwrite & H55
1wverify Dsid3 ( 1 ) ‘адрес третьего датчика
1wwrite & HBE
I3 = 1wread ( 2 )
‘———————————
1wreset
1wwrite & H55
1wverify Dsid4 ( 1 ) ‘адрес четвертого датчика
1wwrite & HBE
I4 = 1wread ( 2 )

Gosub conversion

Cls
Locate 1 , 1
Lcd Chr ( 1 ) ; Ss ; Chr ( 0 )

Gosub Conversion

Locate 2 , 1
Lcd Chr ( 2 ) ; Ss ; Chr ( 0 )

Gosub Conversion

Locate 1 , 9
Lcd Chr ( 3 ) ; Ss ; Chr ( 0 )

Gosub Conversion

Locate 2 , 9
Lcd Chr ( 4 ) ; Ss ; Chr ( 0 )

Conversion :
I1 = I1 * 10
I1 = I1 16
Ss = Str ( i1 )
Ss = Format ( ss , «0.0» )
Return

Очередь по которой будут сканироваться датчики и выводится показания, зависят только от уникального номера устройства. Но если потребуется опрашивать датчики только в определенном порядке, тогда нужно будет узнать уникальные номера, и отправлять их в нужном порядке.

А здесь представляем вашему вниманию двухканальный термометр с возможностью фиксировать максимумы/минимумы температур, которым с нами поделился товарищ 4ester.

Урок 12. Измерение температуры при помощи AVR. Простой термометр на AVR.

Продолжаем осваивать периферию, на очереди измерение температуры. Рассмотрим вариант измерения, при помощи датчика температуры DS18b20.

Характеристики датчика: диапазон измерения от -55 до +125°С. Точность измерения ±0,5°С гарантируется в диапазоне от -10 до +85°С. Возможность измерения с разрешением 9, 10, 11 и 12 бит, т.е. с шагом 0,5; 0,25; 0,125; 0,0625°С. Для обмена информацией с AVR микроконтроллером используется 1-Wire протокол. Каждый датчик имеет свой уникальный адрес, поэтому имеется возможность посадить на шину сразу несколько датчиков.

Для сборки схемы понадобится жк дисплей, датчик и резистор на 4,7кОм. Теперь перейдем непосредственно к прошивке.

#include #include // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include #include char lcd_buf[17]; void main(void) < float temper; lcd_init(16); w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES); while(1) < temper=ds18b20_temperature(0); sprintf(lcd_buf,"t=%.1fxdfC",temper); lcd_clear(); lcd_puts(lcd_buf); delay_ms(1500); >; >

Теперь обо всем по порядку:

#asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm

Данный код означает, что датчик подключен к порту В, PB2 ножке

Используется протокол 1wire, тип датчика ds18b20

float temper; w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

Переменная temper (с плавающей точкой) используется для хранения температуры,
w1_init(); — ищем датчик,
ds18b20_init(0,-20,50,DS18B20_12BIT_RES); — настройка датчика: 0-номер датчика, -20 -нижний предел измерения, 50 — верхний предел измерения,
DS18B20_12BIT_RES используется 12 битный режим(с шагом 0,0625°С). В принципе настройку можно не производить, по умолчанию выставлен 12 битный режим. Показано лишь для того, чтобы вы могли самостоятельно изменить режим измерения, если это понадобится.

temper=ds18b20_temperature(0); sprintf(lcd_buf,»t=%.1fxdfC»,temper); lcd_clear(); lcd_puts(lcd_buf); delay_ms(1500);

temper=ds18b20_temperature(0); — читаем значение температуры с датчика
sprintf(lcd_buf,»t=%.1fxdfC»,temper); преобразовываем к понятному для lcd виду %.1f — вывод числа с плавающей точкой 1 знак после запятой, не забываем в свойствах проекта указать (s)printf features float.
xdf — вывод на экран значка градуса.

В результате должно получиться нечто похожее

Отрицательной температуры поблизости не было :D, поэтому попробовал остудить бутылочкой соуса из холодильника, результат что то не сильно впечатлил.

Зато от нагрева рукой, температура довольно быстро повысилась.

Проект доступен тут
Проект для DS18s20
Проект для двух датчиков
Проект для DS18b20 на семисегментниках
Проект Алексея(Alyes)для Atmega16 и шести сегментов + бонус видео устройства

249 комментариев: Урок 12. Измерение температуры при помощи AVR. Простой термометр на AVR.

Здравствуйте! На семисигментниках собрал термометр с отображением до десятых долей градуса.В протеусе все ОК.В железе при вкл на индикаторе отображается ересь-как будто два итображения чисел вместе накладываются Железо вроде ОК ( с программой на два знака(целые значения температуры) все норм работает!Программу тоже пошагово проверял все нормально. Может кто подскажет в чем дело-писал пропеты и посложнее и все получалось , а тут споткнулся…

это нормально попробуйте реже опрашивать для начала.

Здравствуйте Уважаемый Admin! Подскажите пожалуйста как в Codevisionavr 2.05 сделать проект с двумя и более температурными датчиками DS18B20? В конце Вашей статьи есть Проект Алексея(Alyes), выполненный в CVAVR 2.05, но заставить работать его с двумя датчиками никак не могу добиться. Подскажите пожалуйста куда какие стоки нужно добавить?
Спасибо.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

// 1 Wire Bus interface functions
#include

// DS1820 Temperature Sensor functions
#include

void main(void)
<
// Declare your local variables here
float temper;
unsigned int x;

// 1 Wire Bus initialization
// 1 Wire Data port: PORTD
// 1 Wire Data bit: 7
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

// Global enable interrupts
#asm(«sei»)

while (1)
<
temper=ds18b20_temperature(0);
if (temper>1000)
<
temper=4096.0-temper;
minus=1;
>

x=temper*10;
nom4=x%10;//разборка целого числа на отдельный сегмент…
x=x/10;
nom3=x%10;
nom2=x/10;
nom5=10;
nom6=11;
if(minus==0)
<
nom1=12;
>
else
<
nom1=13;
>
>
>

Работа с датчиком температуры ds18b20 в bascom-avr

WildCat, поменяйте Time Slot на 30u. Проблем быть не должно, я уже давно так делаю. Если все тайминги по порядку то 30 — 120 — 480 — 30 — 750 — 10.

И еще, откуда Вы берете вот такое:

Почему именно так? Там же просто все, нулевой байт угоняется на 4 бита ВПРАВО (чтобы убрать десятые и оставить только целые), а первый байт угоняется на 4 бита ВЛЕВО. А у Вас как?

Нижайше кланяюсь — тайм слот сменил и все заработало шоколадно!
Пример со сдвигом на 5 и 3 увидел где то раньше в теме и скопировал просто. Но до его проверки все равно не дошло, застрял на уровне байтов

Пример не открылся, у меня устаревший протеус А код баском глянул — ну ведь одно и то же вроде?

А кто нибудь может рассказать, как брать температуру с повышенной точностью? Т.е. все 12 бит, и округлять до десятых например?

Читайте также  Автоматический выключатель освещения с функцией ночника и плавной регулировки освещения

_________________
Увлекательный ресурс об электронике и не только

_________________
Цапу крутить надо. Ку или не ку?

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Такой сдвиг не будет работать в этом коде, да оно и не удивительно. Зачем что-то придумывать если все и так логично и понятно.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

При замене в современном автомобиле электромеханических реле на интеллектуальные силовые ключи PROFET производства Infineon необходимо учитывать особенности их коммутации по сравнению с «сухими контактами» реле, а также особенности управления с их помощью различными типами нагрузок.

_________________
Увлекательный ресурс об электронике и не только

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

Что именно Вы хотите, я не совсем понял. Мы сейчас забираем целую часть, а Вы хотите учитывать десятые и если 25,6 например то выводить 27? Или Вам надо с десятыми выводить? Да это проще простого.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

_________________
Цапу крутить надо. Ку или не ку?

_________________
Увлекательный ресурс об электронике и не только

_________________
Цапу крутить надо. Ку или не ку?

Игорь, Вы предлагаете в одну переменную все сливать без сдвига? А выводить потом как? Куда проще все так и оставить, просто переменную еще одну взять и в нее забирать десятые. Будет что-то типа:

Там в коде только одну строчку дописать. Или это Вы тоже зарезали переменную после запятой? Я просто привык десятые отдельно сливать потому как чаще всего термометр на LED индикаторе.

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

Там отображаются данные на индикаторе с точностью до десятых долей градуса.
Вывод данных на индикатор

_________________
«Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом». Томас Алва Эдисон

_________________
Все делают ошибки, только мудрецы — новые, а дураки — старые.

А никто не знает, как справиться с проблемами округления? Десятичные доли считываются нормально, но когда суммируются с целыми, получается иррациональная дробь. Например при температуре 1.2 десятичная выводится 2, но в целом температура выводится 1.199999925

If B1 >= 248 Then
B0 = &HFF — B0
B1 = &HFF — B1
Readtemp = -1
Else
Readtemp = 1
End If

Des = B0 And &B00001111 ‘ получаем дробную часть температуры
Des = Des * 10 ‘ расчитываем дробную часть
Des = Des / 16

Shift B0 , Right , 4
Shift B1 , Left , 4
T = Des / 10
Cls
Lcd «des » ; Des
Wait 1

T = T + B0
T = T + B1
Readtemp = Readtemp * T

_________________
Увлекательный ресурс об электронике и не только

Схема

Описание 1-Wire библиотеки

Подключение 1-Wire библиотеки

SRC = $(TARGET).c OWISWBitFunctions.c OWIHighLevelFunctions.c OWIUARTBitFunctions.c common_files/OWIcrc.c

Работа с DS18B20. Получение температуры

unsigned char OWI_DetectPresence(unsigned char pins)

void OWI_SendByte(unsigned char data, unsigned char pin)

unsigned char OWI_ReceiveByte(unsigned char pin)

Работа с DS18B20. Вывод температуры на дисплей

) и прибавить к результату единицу.

Этот код выведет на дисплей один знак после запятой.

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

Файлы

Проект для IAR AVR — работа с одним датчиком DS18B20
Проект для WINAVR
Проект для CodeVision AVR
Проект для AVR Studio 4

С Протеусом у меня возникли некоторые проблемы — проекты для IAR и WINAVR работали только при тактовой частоте микроконтроллера 8МГц. Выкладываю на всякий случай, может кто-нибудь объяснит мне в чем дело.

В железе никаких проблем не было, все работало как часы.

Related items

  • Библиотека для опроса кнопок
  • Работа с SD картой. Воспроизведение wav файла. Ч3
  • Работа с SD картой. Подключение к микроконтроллеру. Ч1
  • AVR315: Использование TWI модуля в качестве ведущего I2C устройства
  • ATtiny10. Самый маленький микроконтроллер AVR

Comments

Спасибо. Буду разбираться.

А как работать с несколькими датчиками?

А можно увидеть код и реализацию?

А можно увидеть код и реализацию?

Дай свое мыло сброшу проект.

А можно увидеть код и реализацию?

Дай свое мыло сброшу проект.

Ух как раз собираюсь делать термометр с датчиком DS18B20 🙂

кстати проверил в протеусе — эмуляция работает на отлично (версия 7.7 sp2)

) и прибавить к результату единицу. tmp =

tmp + 1; Для преобразования отрицательного числа в положительное нужно выполнить операцию логического отрицания.

) и прибавить к результату единицу.

Для преобразования отрицательного числа в положительное нужно выполнить операцию логического отрицания. Для чисел представленных в дополнительном коде эта операция заключается в получении … дополнительного кода числа.

подкючил ЖКИ GDM1601C на процессоре S6A0069

но почему то показывает только восемь первых символов.

в чем может быть проблема?

может необходимо что то переделать в коде под этот ЖКИ?

Получаю на выходе для 1-го датчика: 40 06 35 7 01 00 00 0
где 40 = family code Ds18b20= 0x28h.
запускаю повторно функцию и получаю нули. В чем может быть проблема. Помогите пожалуйста в последовательно сти действий. Если я правильно понял, мне нужно после Init прочитать адреса каждого из датчиков и работать по matchrom последовательно (читать темпер. с датчика вначале дома и потом со второго на улице)? Запутался.

Спасибо, Pashgan. разобрался благодаря твоему примеру!
Подскажи увеличит ли скорость попеременного чтения двух датчиков изменение значения Thermometer Resolution Configuration

0 0 9 93.75ms (tCONV/8)
0 1 10 187.5ms (tCONV/4)
1 0 11 375ms (tCONV/2)
1 1 12 750ms (tCONV)
И как его менять, через OWI_SendByte(DS 18B20_READ_SCRA TCHPAD, BUS); ?

Да, увеличит. Чем меньше разрешение — тем меньше время преобразования
Code:
#define RES_9BIT 0x1f
#define RES_10BIT 0x3f
#define RES_11BIT 0x5f
#define RES_12BIT 0x7f

#define DS18B20_WRITE_SCRATCHPAD 0x4e
.
//подаем команду
OWI_SendByte(DS18B20_WRITE_SCRATCHPAD, BUS);

//передаем Th, Tl и конфигурационный регистр
OWI_SendByte(0, BUS);
OWI_SendByte(0, BUS);
OWI_SendByte(RES_9BIT, BUS);

Читайте также  Блок питания с гасящим конденсатором

а меня бесит немного, когда температура доходит до 35 (при замере темп. тела) а потом по чуть-чуть двигается дальше.

хочется, чтоб сразу показывало температуру 🙂

На страничке «DS18X20 with AVR» от Martin Thomas находится отличная библиотека работы с 1-Wire: http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html
(паразитное питание для 1-Wire устройств работает без 8) вспомогательног о транзистора, прямо с ноги МК!)

Имхо удобней и проще работать чем с библиотекой 1-Wire из аппноута AVR318.

Добрый вечер! Пытаюсь поднять датчик по описанию. Вот код : while (1)
<

OWI_DetectPrese nce(BUS);
OWI_SendByte(DS 18B20_SKIP_ROM ,BUS);
OWI_SendByte(DS 18B20_CONVERT_T ,BUS);

OWI_DetectPrese nce(BUS);
OWI_SendByte(DS 18B20_SKIP_ROM ,BUS);
OWI_SendByte(DS 18B20_READ_SCRA TCHPAD, BUS);

unsigned char OWI_DetectPrese nce(unsigned char pins)
<
unsigned char intState;
unsigned char presenceDetecte d;

// Disable interrupts.
intState = __save_interrupt();
__disable_interrupt();

// Drive bus low and delay.
OWI_PULL_BUS_LOW(pins);
__delay_cycles(OWI_DELAY_H_STD_MODE);

// Release bus and delay.
OWI_RELEASE_BUS(pins);
__delay_cycles(OWI_DELAY_I_STD_MODE);

// Sample bus to detect presence signal and delay.
presenceDetecte d = ((

// Restore interrupts.
__restore_interrupt(intState);

Датчик температуры DS18B20: подключение, распиновка и примеры работы

Цифровой датчик DS18B20 измерит температуру в воде, на земле и даже в космосе.

Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.

Примеры работы для Arduino

Датчик общается с управляющей платой по протоколу 1-wire . Но вы можете не загружать себе голову битами и байтами, а сразу сосредоточиться на проекте. Для этого скачайте и установите две библиотеки OneWire и DallasTemperature через менеджер модулей.

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

Примеры работы для Espruino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Схема подключения

Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Iskra в компактном формфакторе, например Iskra JS Mini, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора с платой Iskra JS, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в консоль Espruino Web IDE.

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.

Схема подключения

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Найдём все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.

Примеры работы для Raspberry Pi

Один датчик

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Схема подключения

Код программы

Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.