Простой измеритель температуры с жк дисплеем на мк

Цифровой измеритель температуры

Источник: http://radioskot.ru/publ/izmeriteli/cifrovoj_izmeritel_temperatury/15-1-0-717

Урок 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кОм. Теперь перейдем непосредственно к прошивке.

   Итак уважаемые товарищи, пляски с бубном над микроконтроллерами продолжаются. Удалось мне раздобыть датчик температуры именуемый как ds18b20 в корпусе ТО-92. Интерфейс у него 1-wire. Можно сказать, что к микроконтроллеру он подключается одним проводом.

Выделена только одна ножка микроконтроллера и еще плюс две для питания. Еще нужен один резистор на 4,7 килоома. На одну ножку МК можно повесить сразу несколько датчиков. В программе можно присвоить им разные номера и опрашивать по очереди.

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

Электронный измеритель температуры на микроконтроллере (уменьшенная схема)

   В общем поставил перед собой задачу написать программу комнатного термометра. Еще чтоб отображалась минимальная и максимальная температура. В качестве индикатора – ЖК дисплей от Nokia1202.

Контроллер – Atmega8. Создал новый проект в CodeVision. Частоту камня поставил 4 Мгц. В CodeVision есть уже готовые библиотеки для интерфейса 1-wire и датчика температуры ds18b20.

   В мастере по созданию проекта настроил 1-wire на ножку PD5 микроконтроллера. На самом деле можно указать любую свободную ножку. После в сам проект нужно подключить библиотеку 1-wire, датчика температуры, и, естественно, нашего дисплея.

#include #include

#include<\p>   После все это наше добро нужно инициализировать. Делаем это так:w1_init();lcd_init();delay_ms(200);

lcd_init();

   Почему дважды lcd_init() ? Для надежности. Если конденсатор возле дисплея не успеет зарядится и команды инициализации пройдут мимо, то после паузи в 200 миллисекунд они повторяться вновь.

А почему мы не инициализировали датчик? Здесь решил немного схитрить и поставить проверку. В случае если датчик не подключен, или не исправен, то на экране высветится надпись «Датчик не найден».

Если проверка пройдет успешно и датчик инициализируется будет надпись «Найден датчик ds18b20». Выглядит это так:

if(ds18b20_init(0,0,50,DS18B20_12BIT_RES)){print_string(“Найден датчик”,10,0);print_string(“DS18B20”,20,1);delay_ms(2000);lcd_clear();}else{print_string(“Датчик не найден”,0,0);delay_ms(9000);lcd_clear();

};

   Как понятно из выше написаного сама функция инициализации только вот эта строка:

ds18b20_init(0,0,50,DS18B20_12BIT_RES)

   Первая цифра в скобках это номер датчика. Как я писал выше изменяя этот номер можно на одну линию повесить до несколько датчиков. Вторая цифра – это минимальная температура измерения. Там стоит “0”. Поскольку термометр комнатный, то минусовые температуры нам измерять не надо.

Да и сам дисплей не очень будет дружить с минусовыми температурами. Замерзнет и не будет показывать. Третья цифра – это максимальная температура измерения. Такое интересное слово как DS18B20_12BIT_RES означает, что датчик работает в 12-битном режиме.

Дальше считываем показания термодатчика и помещаем в переменную temper:

temper=ds18b20_temperature(0);

   После вычисляем десятки и остаток деления от десяти и выводим на дисплей. Как выводить цифры на дисплей описывать не буду, так как в предыдущих статьях все описано. На счет вывода минимальной и максимальной температуры тоже все просто. Сравниваем наш temper с другими двумя переменными, и если больше или меньше, то просто их заменяем. В конце ставим задержку на 1,5 секунды. Ну вроде и все.

   Еще пару слов на счет измерения минусовых температур. Как пишут более опытные коллеги, при минусовой температуре данные на дисплее будут отображаться не корректно. Нужно добавить такое условие:if (temper>1000) { temper=4096-temper;

 }

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

Видео работы электронного измерителя температуры

   Минимум удалось охладить датчик до 7 градусов Цельсия. Не совать же всю отладочную плату в морозильник:) Выкладываю также исходники проекта. Всем спасибо за внимание. Над датчиком издевался Бухарь.

   Форум по работе с Atmega8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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); }; }

#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); }; }

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

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

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

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

1
2
#include
#include

#include #include<\p>

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

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

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 битный режим. Показано лишь для того, чтобы вы могли самостоятельно изменить режим измерения, если это понадобится.

1
2
3
4
5
6
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_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 и шести сегментов + бонус видео устройства

Источник: http://avr-start.ru/?p=796

Термометр на ATmega8 и датчике DS18B20

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»

Схема термометра на ATmega8 и DS18B20
Микроконтроллер ATmega8
Цифровой термометр DS18B20
Семисегментный светодиодный индикатор
Алгоритм программы термометра
Программа цифрового термометра на DS18B20

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

Но дело в том, что эта конструкция — основа для дальнейшего развития проекта с использованием цифрового датчика температуры DS18B20.

В следующей статье будет опубликована конструкция другого термометра — на двух датчиках DS18B20, что позволит измерять температуру не только в комнате, но и «за бортом». Естественно, будет добавлена возможность измерять и отрицательные температуру.

В дальнейшем в конструкцию будет добавлена функция термостата, часы, возможность работы с различными нагрузками, что позволит уже собрать несложную конструкцию — основу «умного дома». Ну а сегодня первая статья из этой серии.

Схема термометра на ATmega8 и датчике температуры DS18B20

Давайте посмотрим на схему термометра:

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

Напряжение питания конструкции — 5 вольт.

Если вы примените микроконтроллер с низковольтным питанием (линейка микроконтроллеров ATmega), то можно и понизить питающее напряжение конструкции, но в этом случае, возможно придется уменьшить номинал гасящих сопротивлений в сегментах индикатора. Приблизительно номиналы сопротивлений можно брать: — при питании 5 вольт — 200-300 Ом — при питании 2,7 — 3 вольта — 100-150 Ом

(здесь вы можете ознакомиться с расчетом гасящих сопротивлений для семисегментных индикаторов)

(здесь вы можете ознакомиться с маркировкой микроконтроллеров)
Транзисторы — любые, маломощные, структуры NPN.
Датчик температуры — DS18B20 (ознакомиться с датчиком температуры DS18B20)
Семисегментный индикатор — любой трехразрядный с общим катодом. Если вы захотите применить другие, с общим анодом, тогда придется заменить транзисторы на PNP и внести изменения в программу (заменить массив двоичных кодов для вывода цифр на индикатор). Я применил индикатор красного цвета свечения, и заодно, для следующей схемы, приготовил такой-же, но голубого цвета свечения.

Источник: https://microkontroller.ru/shemyi-konstruktsii-na-mikrokontrollerah/termometr-na-atmega8-i-datchike-ds18b20/

Цифровой термометр на Atmega8 с пределами измерений 0-250 °С

» Схемы » Измерения · Применение микроконтроллеров

25-03-2014

Захаров Денис, Украина

В Интернете можно найти немало схем, позволяющих измерять температуру и отображать ее в цифровой или аналоговой форме.

Часто для этого используется популярный датчик температуры DS18B20 или его аналоги. Приборы имеют хорошую точность, помехоустойчивость, и, по сравнению с аналоговыми решениями, значительно упрощают схему. Пределы измеряемых подобными датчиками температур, как правило, ограничены диапазоном от –55 до 125 ºС.

Что же делать, если нужно измерить температуру выше 125 °С? Очевидно, нужно использовать аналоговые датчики, температурный диапазон которых может достигать +300 °С. Надо отметить, что в этом случае точность измерений снизится.

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

Для нормальной работы устройства в температуре 0 … 250 °С, был выбран аналоговый датчик KTY84_130, рабочий диапазон которого составляет –40 + 300 °С. Его параметры идеально подходят под выбранный температурный диапазон.

За обработку данных отвечает микроконтроллер (МК) Atmega8. Конечно, годится и любой другой, но автору этот МК представляется одним их самых доступных и популярных. Фьюз биты оставлены заводские. При решении задачи критерии точного измерения были отложены на второй план.

Погрешность в пределах нескольких градусов вполне устраивала.

Цифровая индикация результатов измерений

Для цифрового отображения данных используются LCD дисплей. При желании устройство можно модернизировать, доработав код программы. Свободных портов ввода-вывода для этого достаточно. LCD дисплей подключен по 4-битной шине (Рисунок 1).

Старшие разряды индикатора D4 – D7 подключены к младшим разрядам D0 – D4 микроконтроллера. Поскольку точных временных привязок в этом устройстве нет, то нет и необходимости во внешнем задающем кварцевом резонаторе. К портам PB6 и PB7 подключены управляющие выводы дисплея.

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

Рисунок 1. Принципиальная схема устройства.

 Вычисление значения температуры

Из Рисунка 1 видно, что аналоговый датчик температуры подключен прямо к входу АЦП микроконтроллера. При использовании операционного усилителя погрешность измерения была бы меньше. Напряжение на АЦП подается через делитель, образованный терморезистором и переменным резистором. Для лучшей точности настройки переменный резистор выбран многооборотным.

Таблица 1. Зависимость сопротивления от температуры.
Температура ºС Сопротивление Ω
-40 359
-30 391
-20 424
-10 460
498
10 538
20 581
30 626
40 672
50 722
60 773
70 826
80 882
90 940
100 1000
110 1062
120 1127
130 1194
140 1262
150 1334
160 1407
170 1482
180 1560
190 1640
200 1722 

Построив на основании Таблицы 1 график в Mathcad (Рисунок 2), можно увидеть зависимость сопротивления аналогового датчика от приложенной температуры. Исходные данные таблицы взяты из технического описания KTY84_130. Функция имеет практически линейный характер, лишь с небольшим отклонением на высоких температурах.

Рисунок 2. График зависимости сопротивления датчика от температуры.

При измеряемой температуре 0 ºС сопротивление терморезистора составляет 498 Ом. Напряжение на выходе делителя равно

где

  • UД – напряжение на датчике температуры относительно земли,
  • UПИТ – напряжение питания,
  • RД – сопротивление датчика температуры,
  • R1 – установленное сопротивление переменного резистора.

При температуре 0 ºС напряжение на входе АЦП должно составлять 0.6 В. Для вычисления значения температуры автор использовал следующую формулу:

 

где

  • АЦП – 10 разрядный цифровой код АЦП, снятый с датчика,
  • UОТС – отсекающее значение (60), равное 0.6 В при 0 ºС.

Диапазону измеряемых температур от 0 ºС до 250 ºС соответствуют поступающие с делителя входные напряжения АЦП от 0.6 до 1.8 В.

Опорное напряжение АЦП составляет 5 В, поэтому при указанных значениях цифровой код будет находится в пределах от 123 до 368. Это число помещается в регистр и конвертируется в три разряда ASCII кода.

Поскольку датчик KTY84_130 рассчитан на максимальную температуру 300 ºС, лучше оставить небольшой запас и ограничится 250 ºС.

На Рисунке 5 показано устройство, собранное на макетной плате. Код программы открытый, и каждый может с легкостью доработать его под собственные задачи.

Рисунок 3. Собранное устройство на макетной плате.

Программное обеспечение МК и виртуальная модель Proteus для LCD 16×2  – скачать

Программное обеспечение МК и виртуальная модель Proteus для LCD  8×2   – скачать

Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Фрагменты обсуждения: Полный вариант обсуждения »
  • Я благодарю автора за хорошую статью, но у меня есть один вопрос. вместо дисплеев 16×1 монтировать 8×2. и что я должен сделать. заранее спасибо
  • Добавили версию с прошивкой LCD 8*2 Скачать можно тут или по ссылке в конце статьи
  • Нормальная статья. Как раз нужно было замерить температуру движка ДВС
  • RV2 – это получается сам температурный датчик?
  • Это обыкновенная термопара KTY84. В нете легко можно ее найти. http://www.rlocman.ru/datasheet/search.html?q=KTY84_130 http://www.kosmodrom.com.ua/prodlist…=KTY84/130.153
  • Ребят, подскажите или дайте ссыль, как залить прогу на МК? Какие именно файлы из архива? Имеется ардуин уно
  • Если у Вас Arduino Uno на мк Atmega8 (сейчас в основном версии на mega328), то вам потребуется .hex файл прошивки (автор статьи его предоставляет) и внутрисхемный программатор. Но учите, что после прошивки ваша Arduino останется без загрузчика (bootloader), который при наличии того же внутрисхемного программатора можно будет восстановить. Помимо этого возможно потребуется изменить конфигурацию Fuse-битов мк. Есть еще один вариант, при котором возможно получится проще и удобнее: использовать внешнюю программу Arduino загрузчика, например XLoader (Arduino HEX uploader).
  • Вообщем, прога залилась, схема собрана, питание подаю, загорается верхняя строчка лсиди и ничего не происходит, смотрел в программе “ардуино”, мк выдает значение напряжения, тока, емкости… Вопрос :реально ли зашита именно этот hex, или там до этого мог быть защит какой либо проект (ардуино был юзаный уже, но когда я зашивал данный hex через arp uploader, командная строка показывала процесс загрузки и закрылась, ошибок не выдала)
  • По-моему просто не выставлена контрастность… покрути потенциометром в меньшую сторону
  • Когда кручу резистор, контрасность меняется, загораются квадратики целые, клетка вообщем загорается полностью
  • Я сейчас попробовал в макетке просто включить питание на дисплей без МК, так тоже загорелись сегменты на 1 строке. Вывод – не залита прошивка
  • Здравствуйте, можно ли получить исходник программы с объяснениями ?
  • а что кто-то не дает его получить по ссылкам в статье? в исходнике комментариев мало,или нужно как людям с ограниченными возможностями каждую строчку комментировать? так ни вАпрос , расчетный счет для перечисления ганарара из расчета 10уе лист формата А4 подсказать? думаю в 200-300енотов уложится 🙂
Полный вариант обсуждения »

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Источник: https://www.rlocman.ru/shem/schematics.html?di=151518

Измерение температуры на AVR. Термометр на AVR на DS18B20. Урок avr 11

Источник: http://articles.greenchip.com.ua/1-0-19.html

Электронный термометр с беспроводным датчиком

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

Для измерения температуры я использовал распространенные датчики DS18B20, для отображения показаний применил не менее популярный ЖК дисплей Nokia 5110. Радиомодули и алгоритм передачи данных я рассматривал ранее в статье про передатчик и приемник на 433 МГц

Ниже представлена схема беспроводного датчика на микроконтроллере PIC12F675.

После подачи питания микроконтроллер считывает значение температуры с датчика BK1 и отправляет эти данные на радиопередатчик A1, после чего происходит переход в спящий режим.

Пробуждение микроконтроллера происходит по прерыванию, которое генерируется изменением уровня на линии GP0. К этой линии подключена RC цепочка на элементах R2 и C4, которая выполняют функцию таймера. При выходе из спящего режима на линии GP0 устанавливается низкий логический уровень, тем самым конденсатор C4 разряжается.

Перед уходом в “сон” линия настраивается на вход, конденсатор начинает заряжаться через резистор R4, при достижении порогового напряжения (около 1,2В) происходит прерывание и пробуждение микроконтроллера. При указанных на схеме номиналах R2, C4 период пробуждения составляет примерно 5 минут. Установив перемычку JP1, можно сократить период до 5,5 секунд.

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

Значение температуры по радиоканалу передается в виде пакета из 3-х байт, последний байт представляет собой контрольную сумму первых 2-х байт. Алгоритм передачи данных, который я использую, в принципе позволяет обходиться без контрольной суммы, вероятность приема неправильных данных низкая. Скорость передачи составляет 3,3 Кбит/сек.

Каждый раз после измерения температуры отсылается 3 пакета байтов, пауза между пакетами составляет 10 мс, такой вариант передачи я применил для увеличения надежности получения данных приемником. Это связано с тем, что приемная сторона прерывает прием сигнала на 4-5 мс, во время измерения температуры с внутреннего (домашнего) датчика.

В качестве питания используется батарея 6F22 на 9В (“Крона”), модуль радиопередатчика A1 питается напрямую от батареи.

Для питания микроконтроллера используется микромощный стабилизатор напряжения DA1 (MCP1702) на 5В, собственный ток потребления стабилизатора составляет всего 1-2 мкА, максимальный ток нагрузки до 250 мА. Стабилизатор MCP1702 можно заменить на LP2950, ток потребления которого выше и составляет 75 мкА.

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

Ток потребления устройства в спящем режиме меняется с течением времени по мере заряда конденсатора С4, первые 2,5 минуты потребление составляет 10 мкА, последующие 2,5 минуты ток плавно увеличивается, до момента выхода из спящего режима. Данное явление возникает из-за наличия токов переключения входного буфера микроконтроллера.

Хочу отметить, что при низких температурах емкость батареек уменьшается быстрее, не все типы батареек можно использовать в таких условиях. Лучшими показателями при отрицательных температурах обладают литиевые батарейки, далее следуют Ni-Mh аккумуляторы, щелочные батарейки занимают третью позицию, солевые элементы не пригодны для таких условий.

Ниже представлена схема термометра на микроконтроллере PIC16F628A.

Дисплей HG1, датчик BK1 и микроконтроллер питаются напряжением 3,3В от стабилизатора DA2.

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

Модуль приемника A1 питается от стабилизатора DA1, с выходным напряжением 5В. Резисторы R6, R7 установлены для согласования уровней напряжения.

Микроконтроллер DD1 считывает значение температуры с датчика BK1 каждые 2 секунды, параллельно принимает сигнал с приемника, при получении пакета байтов от передатчика вспыхивает светодиод HL1.

В верхней части дисплея отображается надпись “Дом”, под которой выводится значение температуры с внутреннего (домашнего) датчика, ниже отображается надпись “Улица” и температура, полученная от беспроводного датчика.

После приема данных по радиоканалу, микроконтроллер запускает таймер, который ведет отсчет времени для контроля получения данных. Если данные не были получены за период отсчета таймера, вместо показаний температуры, на дисплее высвечивается символы тире “- — — — -”.

Время отсчета можно задать в пределах 1-15 минут с шагом в одну минуту. Для этого, перед программированием микроконтроллера, необходимо записать число от 1 до 15 в ячейку EEPROM с адресом 0x00. По умолчанию устанавливается период в 7 минут.

При неисправности датчиков BK1, для обоих устройств, вместо значения соответствующей температуры, выводится надпись “ERROR”. Кнопка SB1 управляет подсветкой дисплея, по умолчанию подсветка включена. Кнопка SB2 предназначена для регулировки контрастности дисплея, так как у разных экземпляров она может отличаться.

Для питания устройства подойдет нестабилизированный источник питания с выходным напряжением 8-12В. Оба устройства размещены в пластиковых корпусах. Антенна для радиомодулей выполнена в виде отрезка одножильного провода длиной 17 см (четверть длины волны несущей частоты).

Последние записи:

Источник: http://radiolaba.ru/microcotrollers/termometr-s-besprovodnyim-datchikom.html

BM8037Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей)

BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей) купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей) купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

У нас Вы можете купить Мастер Кит BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей): цена, фото, DIY, своими руками, технические характеристики и комплектация, отзывы, обзор, инструкция, драйвер, программы, схема

Мастер Кит, BM8037, Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей), цена, описание, фото, купить, DIY, своими руками, отзывы, обзор, инструкция, доставка, драйвер, программы, схема

https://masterkit.ru/shop/161898

Готовый модуль

Для дома и дачи / Гаджеты

о поступлении на склад

Опубликовано 2010-09-20 15:21:28 автором Ruslan

В устройствах автоматики очень часто нужно контролировать какой-либо параметр окружающей среды: температуру, влажность, освещенность, давление и т.д. Для этого существуют датчики – устройства, которые преобразуют одну физическую величину в другую.

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

Сегодня я покажу, как цифровой датчик температуры DS18B20 подружится с микроконтроллером avr atmega8.

  1. GND – минус питания.
  2. DQ – линия вводавывода данных.
  3. Vdd – плюс питания.

Датчик температуры DS18B20 – микросхема с тремя выводами, DS18B20 обменивается данными по шине 1-Wire. На одной шине может быть оооочень много датчиков, это достигается за счет того, что каждый DS18B20 имеет свой уникальный код, и микроконтроллер таким образом инициализирует передачу данных с определенным датчиком на шине.
Диапазон измеряемых температур от –55°C до +125°C и точностью 0.5°C. Разрешающая способность по умолчанию установлена 12-бит, но может быть изменена пользователем на 9, 10, или 11 бит. Еще одна особенность DS18B20 – это возможность работать без внешнего питания, он может питаться от линии данных (“parasite power”), при отсутствии внешнего источника. Эта способность реализуется за счет того что внутри датчика есть конденсатор, который заряжается через подтягивающий резистор от высокого уровня на линии данных. Этот метод часто называют «Паразитным питанием».
Давайте соберем простой термометр на DS18B20 и микроконтроллере atmega8. Цифровой термометр должен измерять температуру и выводить ее на lcd дисплей. Схема термометра выглядит следующим образомВ CodeVision есть специальная библиотека для работы с DS18B20. В ней находятся все необходимые функции для работы с ним. Для того, чтобы использовать данный датчик в своих конструкциях, необходимо выполнить ряд несложных процедур по подключению датчика. На физическом уровне датчик подключается к одному из выводов любого порта. Вывод GND соединяется с общим проводом, вывод Vdd подключается к +5 В, а вывод DQ к линии выбранного порта. При этом на вывод DQ относится подтягивающий резистор (обычно 4,7 к), второй вывод которого подключается к +5 В. Программа выглядит так
#include
#include // 1 Wire Bus functions //указываем, куда подключен датчик #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include //библиотека для работы с датчиком ds18b20 // Alphanumeric LCD Module functions //указываем, куда подключён экран #asm .equ __lcd_port=0x12 ;PORTD #endasm #include //библиотека для LCD #include // библиотека, в которой живет функция sprintf char lcd_buf[16]; // масив, в котором формируются данные для вывода на lcd float temperature; // переменная, в которой будет храниться значение температуры void main(void) { lcd_init(16); // инициализация LCD на 16 символов w1_init(); // // инициализация шины 1 wire while(1) { temperature = ds18b20_temperature(0); //получаем температуру от датчика 0 sprintf(lcd_buf,”t=%.1fxdfC”,temperature); // формируем строку для вывода lcd_clear(); // чистим дисплей lcd_puts(lcd_buf); // выводим содержимое массива lcd_buf на дисплей delay_ms(1000); // делаем задержку в 1 секунду }; }

По программе вроде все понятно, единственное только – надо в свойствах проекта указать (s)printf features float и частоту мк выставить на 1 mhz, для этого переходим Project->Configure-> C Compiler и выставляем все как на скриншотеКомпилируем и получаем термометрКак видите, подключить датчик температуры к мк не составляет никакого труда, 20 минут и термометр на lcd готов.

Сейчас мы сделаем еще один термометр но с выводом температуры на Led (семисегментный индикатор). C термометром на семисегментнике не все так просто, как кажется на первый взгляд. Дело в том что функция ds18b20_temperature блокирует выполнение основного потока, пока датчик не пришлет значение температуры, а это около одной секунды. Вот исходный код функции
float ds18b20_temperature(unsigned char *addr) { unsigned char resolution; if (ds18b20_read_spd(addr)==0) return -9999; resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3; if (ds18b20_select(addr)==0) return -9999; w1_write(0x44); delay_ms(conv_delay[resolution]); вот на этом delay_ms главный поток и останавливается if (ds18b20_read_spd(addr)==0) return -9999; w1_init(); return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625; }

а у нас-то индикация на семисегментнике динамическая, это значит что семисегментник будет зависать на период измерения температуры. Чтобы решить эту проблему, нам придется вручную посылать команды DS18B20.

Алгоритм такой: послали команду на измерение температуры, и дальше занимаемся своими делами

через полторы секунды спросили у датчика, измерил ли он температуру, если да, то получаем данные и выводим их на семисегментник. Посылать команды датчику мы будем с помощью функции w1_write. Давайте приступим к написанию кода

Вывод значения температуры на дисплей состоит из следующих шагов:

  1. Определяем знак температуры и отражаем его на дисплее
  2. Если температура отрицательная, превратим ее в положительную.
  3. Выделяем с помощью битовых масок целую часть температуры, переводим в символы и отражаем на дисплее.

    Чтобы перевести оцифрованное значение температуры в градусы, нужно это значение умножить на вес младшего разряда. Для целой части температуры вес младшего разряда (BIT4) равен 1 градусу Целься, а значит умножать ничего не нужно.

  4. Выделяем дробную часть, преобразуем дробную часть в целую, переводим в символы и отражаем на дисплее.
Диапазон напряжений питания (B) 7…12
Диапазон измерения температуры, град.С –55…125
Тип питания постоянный
Потребляемый ток, не более (мА) 150
Количество выходов (шт) 1
Рекомендованная температура эксплуатации (°С) -15…+60
Длина (мм) 87
Ширина (мм) 55
Высота (мм) 18
Вес, не более (г) 150
Количество линий 1-wire (шт) 1
Рекомендованные датчики температуры DS18B20
Количество датчиков на каждую линию 1wire (шт) 16
Вес 86

Инструкции

  • Устройство поставляется в корпусе {item:id=BOX-BM8037,link=y}
  • Цифры дисплея имеют красное свечение.

Центральная часть устройства – микроконтроллер AT89C4051, работающий на частоте 12 МГц и тактируется от керамического резонатора ZTT. Датчики подключаются через разъем XS2 параллельно друг другу. Напряжение питания подключается к разъему XS1.

При включении питания происходит инициализация датчиков и индикация на 1 секунду количества датчиков на шине. Максимально допустимое гарантированное количество датчиков – 16. Датчики могут быть MP18B20, DS18B20, DS18B20+. После инициализация датчиков система начинает показывать максимальные и минимальные температуры, которые регистрировал каждый датчик во время работы.

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

После выдачи температуры последнего датчика все начинает повторяться сначала (происходит выход на показание температуры первого датчика).В устройстве имеется 2 кнопки. Первая (левая) кнопка отвечает за сброс статистики максимальных и минимальных значений: при нажатии на данную кнопку в рабочем режиме сбрасываются записанные значения минимума и максимума текущего датчика.

Вторая (правая) кнопка отвечает за быстрое переключение на следующий датчик: при кратковременном нажатии на данную кнопку произойдет переключение на следующий датчик.

При необходимости вызвать статистику максимальных и минимальных температур следует удерживать эту кнопку в течение нескольких секунд – после чего произойдет выход на показание статистических значений (максимумов и минимумов как при старте программы). Чтобы из режима статистики оперативно переключиться на рабочий режим следует кратковременно нажать вторую кнопку.

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

Чтобы вернуться в рабочий режим следует кратковременно нажать вторую кнопку. Особенности:- нумерация датчиков происходит автоматически соответственно тому уникальному серийному номеру, который был присвоен на заводе каждому датчику.Специальные возможности:- датчики могут подключаться и отключаться «на горячую» – то есть во время рабочего режима. Однако нумерация датчиков может претерпеть существенные изменения. Готовый термометр не требует настройки.

Конструкция устройства

Конструктивно цифровой термометр выполнен на двусторонней печатной плате из фольгированного стеклотекстолита, установленный в корпус BOX-KC01. Для удобства подключения питающего напряжения и датчиков температуры, предусмотрены разъемы на плате XS1 и XS2.

Статьи

  • Термометр BM8037 для сауны

Комплект поставки

  • Цифровой термометр в сборе – 1 шт.
  • Штекер NP-107 (стерео) – 1 шт.
  • Штекер NP-117 – 1 шт.
  • Датчик температуры DS18B20 – 2 шт.

Что потребуется для сборки

  • Для подключения понадобится: провод, паяльник, бокорезы.

Подготовка к эксплуатации

  • Проверка:
  • Подпаяйте к штекеру идущий в комплекте термодатчик, согласно инструкции.
  • Подключите штекер к блоку.
  • Подайте питание 12В на устройство. Соблюдая полярность.
  • Дождитесь показания температуры на дисплее.
  • Проверка завершена. Приятной эксплуатации.

Условия эксплуатации

  • Температура -30С до +50С.
  • Относительная влажность 20-80% без образования конденсата.

Меры предосторожности

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

Вопросы и ответы

  • Здравствуйте! Приобрел этот прибор в августе 14-го, а вот подключал только сейчас. Проблема – нет показаний индикатора. Питание 9,5 вольт от стабилизатора на КРЕН19-КТ815. Напряжение на DS18B20 4,97 вольт ( на выводе 3, – на выводе 1)

Copyright www.maxx-marketing.net

Источник: https://masterkit.ru/shop/161898

Цифровой ампервольтметр с дисплеем от nokia-1202

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

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

Надо конечно было начинать с другого, но как уже есть. Поскольку понемногу занимаюсь программированием то решил сам разработать показометр. В качестве экрана стоит дисплей от Nokia-1202.

Наверно я уже всех замучал с этим дисплеем, но он в 3 раза дешевле, чем 2×16 HD44780 (по крайней мере у нас). Вполне паябельный разъем и вообще неплохие характеристики. Короче – хороший вариант для измерителя напряжения и тока.

Электрическая схема цифрового ампервольтметра для БП

Рисунок платы цифрового ампервольтметра  

 В первой и второй строчке отображается усредненное значение напряжения и тока из 300 замеров АЦП. Это сделано для большей точности измерения. В третьей строчке выводится сопротивление нагрузки, рассчитанное по закону Ома.

Хотел сперва сделать, чтоб выводилась потребляемая мощность, но сделал сопротивление. Может позже переделаю на мощность. В четвертой строчке выводится температура измеряемая датчиком DS18B20. Он запрограммирован измерять температуру от 0 до 99 градусов Цельсия.

Его надо установить на радиатор выходного транзистора, или на какой нибудь другой элемент схемы, где есть сильный нагрев.

   К микроконтроллеру можно так же подключить кулер для охлаждения радиатора транзистора. Он будет изменять свои обороты при изменении температуры измеряемой датчиком DS18B20. На ножке PB3 присутствует ШИМ сигнал. Кулер подключается к этому выводу через силовой ключ.

В качестве силового ключа лучше всего использовать MOSFET транзистор. При температуре в 90 градусов у вентилятора будут максимальные обороты. Датчик температуры можно и не устанавливать. В этом случае в четвертой строчке просто высветится надпись OFF. Кулер подключаем на прямую.

На выходе PB3 будет 0.

   В архиве есть два варианта прошивки. Одна на максимально измеряемый ток в 5 ампер, а вторая до 10 ампер. Максимально измеряемое напряжение – 30 вольт. Коэффициент усиления ОУ LM358 по расчетам выбран 10.

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

Ними можно подкорректировать показания измерений.

   Там-же в архиве есть и печатная плата. Есть небольшие различия на фото – там она немножко подправленная. Удалена одна перемычка и размер меньше по высоте на 5 мм. Стабильность показаний ампервольтметра высокая. Иногда плавает только на сотые доли. Хотя сравнивал всего лишь с моим китайским тестером. Для меня этого вполне хватит.

Фузы

 Всем спасибо за внимание.

АРХИВ:

Модернизированый вариант

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

АРХИВ:

Добавил только отображение еще и десятой части мощности.

АРХИВ:

5 ампер

АРХИВ:

Вот переделал для измерения до 50А. Шунт 0,01 ом. Коэффициент усиления ОУ примерно от 6 до 7. Нужно будет пересчитать резисторы. Фьюзы те же, что и раньше.

АРХИВ:

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

  В схему так же добавилось несколько деталей. С органов управления – одна кнопка и переменный резистор номиналом от 10 килоом до 47 килоом. Его сопротивление не критично для схемы, и как видно может варьироваться в довольно широких пределах. Немножко изменился и внешний вид на экране. Добавил отображение мощности и ампер*часов.  

 Переменная тока отключения сохраняется в EEPROM. По этому после выключения не нужно будет все настраивать заново. Для того, чтоб зайти в меню установки тока нужно нажать на кнопку. Поворачивая ручкой переменного резистора надо установить ток, при котором произойдет отключение реле. Оно подключено через ключ на транзисторе к выводу PB5 микроконтроллера Atmega8.

   В момент отключения на дисплее высветиться надпись о том, что максимальный установленный ток был превышен. После нажатия на кнопку мы перейдем снова в меню установки максимального тока. Нужно еще раз нажать на кнопку, чтоб перейти в режим измерения. На выход PB5 микроконтроллера подастся лог 1 и при этом включится реле. Такое слежение за током имеет и свои минусы.

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

Изменения будут не значительны.

   По всем возникшим вопросам обращаемся на форум. Спасибо за внимание. Ампервольтметр допилил Бухарь.

АРХИВ:
Форум http://radioskot.ru/forum/11-2770-1

Источник: http://cxema.my1.ru/publ/instrumenty/izmeritelnaja_tekhnika/cifrovoj_ampervoltmetr_na_s_displeem_ot_nokia_1202/47-1-0-5785

Простой цифровой термометр своими руками с датчиком на LM35

Для изготовления этого простого цифрового термометра необходим температурный датчик LM35, цифровой вольтметр (любой недорогой китайский цифровой мультиметр), два маломощных диода, один резистор и несколько батареек (либо элемент типа «Крона»). Из этих компонентов можно быстро собрать простой цифровой многофункциональный термометр с диапазоном температур от -40 до +150 градусов Цельсия. Для измерения только положительных температур диоды и резистор не нужны.

Точность измерения температуры 0,1 градуса Цельсия, т.е. термодатчик для многих применений можно назвать прецизионным.

Для этого универсального цифрового термометра использованы полупроводниковые датчики температуры LM35DZ/NOPB для температуры от 0 до +100°C и LM35CZ/NOPB для температуры от -40 до +110°С в корпусах TO-92.

В datasheets некоторых производителей LM35 указана верхняя измеряемая температура +150 градусов Цельсия.

Термометр для измерения положительных температур

Такой электронный измеритель температуры можно быстро сделать своими руками. Достаточно подключить Крону (или три пальчиковые батарейки, соединенные последовательно) к датчику, а датчик к вольтметру, как показано на рисунке – и термометр готов. Датчик потребляет от источника питания ток не более 10 мкА, поэтому батарейку можно не отключать длительное время.

Схема подключения LM35 для измерения плюсовой температуры и «распиновка» датчика

Диапазон использования такого цифрового датчика очень широк: – термометр комнатный – термометр уличный – термометр для воды и других жидкостей – термометр для инкубатора – термометр для бани и сауны – термометр для аквариума -термометр для холодильника – термометр для автомобиля

– цифровой многоканальный термометр и т.д.

Термометр уличный электронный

Схема цифрового термометра для измерения температуры от минус 40 до плюс 110 градусов Цельсия с однополярным источником питания. Диоды маломощные кремниевые – КД509, КД521 и т.д. Диапазон измерения тестера надо устанавливать на 2 вольта (2000 мВ), последняя цифра будет показывать десятые доли градуса, ее следует отделить точкой.

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

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

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

Схема электронного термометра с двумя датчиками

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

Этот прибор показывает уличную температуру, датчик висит за закрытой форточкой. Время на сборку заняло 30-40 минут.

Так выглядит прибор сзади. Собран градусник по схеме с одним источником питания, двумя диодами и резистором. Поскольку отрицательное смещение на диодах составляет порядка 2-х вольт, а минимальное напряжение питания датчика 4 вольта, в качестве БП использованы спаянные последовательно 5 батареек ААА. Датчики припаяны к неэкранированным проводам длиной 2,5 метра.

На этом фото показаны два термометра. Датчик первого размещен в холодильной камере, а второго – в морозильной камере этого же холодильника. Точка на индикаторе мультиметра нарисована черным маркером.

Измерил температуру своего тела – полный порядок. Подключил точно такой же другой прибор (без точки на индикаторе) к этому же датчику и огорчился, прибор «врет» в большую сторону на 0,2 градуса. В кипящей воде не пробовал: не готовы герметичные щупы. Перед замерами батарейки в обоих приборах заменил на одинаковые новые.

На основе этого термодатчика можно сделать простой регулятор температуры, добавив компаратор с регулируемым или фиксированным порогом срабатывания и силовой ключ (оптосимистор, реле …), который будет включать нагреватель. Для построения термостата (инкубатора, например) такая схема не пойдет, LM35 необходимо подключать к устройству с функцией ПИД-регулятора, например, ТРМ210.

  • Напряжение на светодиоде
  • Схема светодиодной лампы на 220в
  • Лампа ЭРА А65 13Вт
  • Как паять светодиодную ленту
  • Светодиодная лента на 220 в
  • Простое зарядное устройство
  • Разрядное устройство для автомобильного аккумулятора
  • Схема драйвера светодиодов на 220
  • Подсветка для кухни из ленты
  • Подсветка рабочей зоны кухни
  • LED лампа Selecta g9 220v 5w
  • Светодиодная лампа ASD LED-A60
  • Общедомовой учет тепла
  • Схема диодной лампы 5 Вт 220в
  • Источник: http://firstelectro.ru/term.html

    Термометр с помощью arduino и датчиков LM35 и DS18B20

    Я писал недавно статью, где подключал к arduino 4-разрядный 7-сегментный индикатор hs420561k-32, тогда упоминал, что хочу сделать градусник с выводом температуры на этот индикатор, только проблема была в отсутствии датчиков.

    И вот наконец-то приехала посылка с недостающими запчастями и можно продолжить проект. Температурных датчиков у меня три штуки – dht11, LM35 и DS18B20.

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

    Температурный датчик LM35. Подключение к arduino

    Первый датчик, который будем использовать – это LM35, использовать его очень просто, тут даже дополнительные библиотеки не требуются, достаточно подключить к нему питание и считать данные на выходе с помощью аналогового пина arduino. LM35 работает с температурами от -55 до 150 градусов Цельсия и если верить даташиту, то погрешность составляет всего плюс-минус 0,25 градуса.

    Хоть датчик и обрабатывает до +150 градусов, но считать ардуиной сможем только до +110, хотя и это более чем достаточно для домашнего градусника. Поскольку этот датчик имеет высокую точность, но находится в корпусе TO92, без какой-либо дополнительной защиты, использовать его будем для измерения температуры в помещении.

    Официальный мануал arduino рекомендует использовать для снятия показаний этого датчика опорное напряжение 1,1 В. Чтобы настроить arduino подобным образом достаточно использовать команду analogReference(INTERNAL) в функции setup. Далее достаточно просто, с нужным интервалом, считывать напряжение с выходной ножки(OUT) датчика.

    LM35 формирует напряжение 10 милливольт на один градус, таким образом имея опорное напряжение в 1,1 В легко обработать, довольно точно, данные.

    void setup() { // меняем опорное напряжение на 1.1 В, относительно которого происходят аналоговые измерения analogReference(INTERNAL); } void loop() { reading = analogRead(A0); // LM35 подключен к пину A0 temperature = (1.1 * reading * 100.0) / 1024; // получаем значение в градусах Цельсия }

    Ниже на картинке показано, какая нога датчика LM35 за что отвечает.

    Температурный датчик DS18B20. Подключение к arduino

    Второй датчик, который будет использован – это цифровой DS18B20. Точность в этом случае не на много ниже — плюс-минус 0,5 градуса, а диапазон измерения температуры практически такой же: от -55 до +125 градусов Цельсия.

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

    Еще из плюсов сюда можно добавить возможность подключение одновременно до 127 датчиков на один пин ардуино, только я даже предположить не могу, где это может пригодиться :).
    Считывать данные с DS18B20 немного сложнее, чем с LM35, для удобства можно воспользоваться библиотекой OneWire.

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

    На картинке ниже показано, как подключать датчик DS18B20. Основным моментом является то, что необходимо использовать резистор сопротивлением 4.7 кОм для соединения провода, передающего данные и плюсовым.

    Проблема вывода температуры на индикаторе hs420561k-32

    Пока я разбирался с каждым датчиком по отдельности, а также когда подключал к arduino 4-х разрядный 7-сегментнтый индикатор, проблем ни каких не было, все прекрасно работало. Но стоило мне собрать все в кучу, на одну макетную плату и собрать код воедино, как сразу появилась серьезная проблема.

    Я писал в прошлой статье, что для одновременного вывода данных сразу на 4-х разрядах hs420561k-32 необходимо очень быстро по очереди выводить по одному разряду, тогда создается впечатление одновременного вывода четырех цифр, глаз не успевает уловить смену разрядов.

    В связи с таким способом вывода возникла сложность с одновременной работой датчика DS18B20, для его опроса требуется чуть больше секунды времени – в двух участках кода используется delay, который заставляет микроконтроллер ждать, 250 и 1000 миллисекунд.

    Сначала я сделал запрос к датчику раз в 30 секунд, но это не решило проблему – два раза в минуту датчик по секунде показывал непонятно что. Поэтому пришлось отказаться от delay и добавить другую аналогичную конструкцию в код, которая будет выполнять определенные куски кода с задержкой, а остальной код будет выполняться без задержек.

    Многопоточности в arduino, как оказалось, нет, но есть псевдомногопоточность, добиться ее можно используя не хитрую конструкцию с таймером, который отмеряет время в миллисекундах от старта работы микроконтроллера. Пример такого кода я приведу ниже:

    bool flag = false; // флаг unsigned long previousMillis = 0; // время последнего срабатывания const long interval = 1000; // интервал срабатывания кода, задержка. void setup() { // } void loop() { // получаем время в миллисекундах, которое прошло // с момента начала работы МК unsigned long currentMillis = millis(); // проверяем сколько прошло врмени if (currentMillis – previousMillis >= interval) { // если прошло нужное количество миллисекунд, // то записываем в переменную количество прошедшего времени previousMillis = currentMillis; // меняем положение флага, // это может быть вкл и выкл светодиода, например flag = !flag; } }

    Что использовалось в проекте:

    Скетч уличного и комнатного термометра на arduino

    Все сложные моменты, с которыми возникали сложности, в процессе создания термометра я описал, теперь остается только написать скетч, его код приведен ниже, а также доступен для скачивания тут: скачать.

    #include // библиотека для работы с датчиком DS18B20 OneWire ds(10); // подключаем уличный датчик к 10 пину //Пин подключен к SH_CP входу 74HC595 int clockPin = 6; //Пин подключен к ST_CP входу 74HC595 int latchPin = 7; //Пин подключен к DS входу 74HC595 int dataPin = 8; int tempHomePin = A0; // градусник в помещении // Пины разрядов цифер int pins_numbers[4] = {2, 3, 4, 5}; // Биты для отображения цифер от 0-9, минуса и символ градуса Цельсия byte numbers_array[22] = { B00111111, B00000110, B01011011, B01001111, // 0 1 2 3 B01100110, B01101101, B01111101, B00000111, // 4 5 6 7 B01111111, B01101111, B01000000, B01100011, // 8 9 – о // цифры с точкой внизу (+12 к индексу элемента) B10111111, B10000110, B11011011, B11001111, // 0 1 2 3 B11100110, B11101101, B11111101, B10000111, // 4 5 6 7 B11111111, B11101111 // 8 9 }; int cel_celsius = 0; // переменная для хранения градусов на улице float tempHome = 0; // переменная для хранения градусов в помещении const long tempInterval = 3000; // интервал запроса актуальной температуры unsigned long previousMillis = 0; // время предыдущего запроса unsigned long previousMillis_delay = 0; // хранения последней даты срабатывания, для второй задержки bool startQuery = false; // флаг, для обозначения начала запроса температуры bool firstQuery = true; // флаг первого запуска, при котором получаем температуру без задержек bool showhome = true; // флаг, который указывают какую температуру показывать – комнату или улицу int sec_show = 5000; // интервал смены отображения погоды unsigned long showhomeMillis_delay = 0; // хранения последней переключения градусников // функция для вывода чисел на индикаторе void showNumber(int numNumber, int number){ // зажигаем нужные сегменты digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numbers_array[number]); digitalWrite(latchPin, HIGH); // включаем нужный разряд(одну из четырех цифр) int num_razryad = pins_numbers[numNumber-1]; for(int i; i= tempInterval) || startQuery || firstQuery) { previousMillis = currentMillis; // читаем данные от датчика на улицы if ( !ds.search(addr)) { ds.reset_search(); //delay(250); return; } // если ни чего не получили или получили не понятные данные if (OneWire::crc8(addr, 7) != addr[7]) { return; } // читаем первый байт и определяем тип датчика switch (addr[0]) { case 0x10: // DS18S20 type_s = 1; break; case 0x28: // DS18B20 type_s = 0; break; case 0x22: // DS1822 type_s = 0; break; default: return; } // делаем запрос на получение данных от датчика ds.reset(); ds.select(addr); ds.write(0x44); // ждем startQuery = true; // delay(1000); if ( currentMillis – previousMillis_delay >= 1000 ) { previousMillis_delay = currentMillis; }else{ return; } startQuery = false; // и получаем ответ present = ds.reset(); ds.select(addr); ds.write(0xBE); // берем только первые 9 байт for ( i = 0; i < 9; i++) { data[i] = ds.read(); } // данные приходят в битах, переводим их в десятичное число int16_t raw = (data[1]

    Источник: https://vk-book.ru/termometr-s-pomoshhyu-arduino-datchikov-lm35-ds18b20/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}