Простейший термометр на PIC 16F628A
Доброго времени суток уважаемые читатели. Как видно из названия статьи , речь в ней пойдет о термометре собранном на PIC. Итак. Почему и как всё начиналось?!
Понадобилась мне схема простейшего термометра для подвала гаража. Начал искать подходящую схему в Интернете. Важным критерием было применение минимального количества элементов в схеме. Сразу скажу, что таких схем термометров в сети навалом. Но! Чаще всего они выполнены на AVR с которыми я к глубокому своему сожалению не дружу. Поэтому стал искать схему на PIC. Но и тут меня ожидало разочарование. Схемы термометров на PIC есть. Но там применяют, то транзисторы для индикаторов, то внешний кварц, либо еще что то, что усложняло схему и было неприемлемо в моем случае. Наконец, после долгих поисков, подходящая мне схема была найдена тут:
http://www.labkit.ru/html/show_meter?id=38
И была успешно повторена неоднократно. Всё прекрасно работает. (на сайте автора этой схемы есть и прошивка и печатная плата для повторения данного термометра). Время шло. И в одно прекрасное время во первых выяснились недочеты данной схемы и еще мне понадобилось применить индикатор с Общим Катодом (на сайте автора прошивка была только под Общий Анод). Теперь о недочете схемы в первоисточнике. Изначально в схеме автора нет резистора подтяжки у датчика температуры. Тоесть резистор на 4,7К в схеме отсутствует. Да действительно при таком исполнении схемы термометр может работать, но только при условии, если датчик температуры впаян сразу в плату, либо длина провода на котором находится датчик не должен превышать длины провода метр, полтора метра. Не более. В противном случае индикатор начинает показывать какую- то ерунду, а не температуру.
Эта проблема решилась очень просто и быстро, именно установкой подтягивающего резистора 4,7К на датчике. После чего датчик стал работать стабильно при любой длине провода. Но как быть, если у меня есть индикаторы только с общим катодом! А прошивка сделана под анод… Вот тут мне и помог Станислав Дмитриев. За что ему огромнейшее спасибо. Он не только написал прошивку под общий анод. Но так же и под общий катод и под разные типы датчиков температуры (DS18S20 или DS18B20). Что позволило еще более унифицировать данную схему. И рекомендовать её к повторению. Также можно применить в схеме как четырех разрядные семисегментники так и трех разрядные семисегментники. Что является не большим, но все, же плюсом.
Как вы видите, схема не отличается от той, что представлена, была на сайте http://www.labkit.ru
Так и было задумано изначально. Единственное изменение в схеме это установка дополнительного резистора. Схему я не стал перерисовывать с нуля. Просто добавил недостающий элемент схемы. По сути если Вы хотите еще более упростить схему и у вас есть стабильный источник питания 5В, то Вы можете исключить из схемы и линейный стабилизатор. И запитать МК сразу от 5В.
Теперь поговорим немного о том, как самому настроить прошивку под нужный вам индикатор или датчик. Тут всё просто.
Загрузив файл прошивки в программатор, Вы сами: исходя из того, что вам нужно и смотря на данный скриншот, прописываете нужные вам параметры в файл прошивки в разделе EPROM. После чего можете прошивать контролер.
В моём варианте печатной платы в плате предусмотрено место не только для линейного стабилизатора, но и для диодного моста (что позволит запитывать схему напряжением от 7,5В до 12В. А так же на плате предусмотрено место для установки клемника, который позволяет не впаивать датчик температуры в плату, а зажать его зажимами. Это удобно при смене датчика, либо при установке датчика на длинный провод. Позволяет быстро сменить провод.
Рисунок платы
Как Вы можете видеть термометр собран на двух платах. На одной устанавливается семисегментный индикатор (трех или четырех разрядный). На второй плате устанавливаются все остальные элементы схемы. Платы между собой соединяются, по средствам гребенки, либо как в моем случае проводами..
В конце фото моего готового термометра.
Подводя итог скажу.
Благодаря трудам, проделанным Станиславом Дмитриевым, в данной схеме стало возможным применять;
Датчики температуры DS18S20 или DS18B20
Семисигментные индикаторы, как с общим анодом, так и с общим катодом.
Бонусы:
Отображение на дисплее информации без десятых долей, либо с десятыми долями градуса.
При неисправности датчика пишет «Err»
Обновление индикации 122 Гц
Опрос датчика 1,5 секунды
Диапазон измерения -40..+99оС
Сайт автора данной прошивки http://ucprog.ucoz.ru
Автор статьи Кулибин.
Архив с прошивкой и платой
Термометр с точностью измерения 0,1 градус на PIC16F628A и DS18B20 » RADIOSHEM.NET
Термометр с точностью измерения 0,1 градус на PIC16F628A и DS18B20
Девайс предназначен для измерения температуры во всем диапазоне датчика DS18B20 (от -55 до +125 градусов), с точностью до 0,1 градуса. Точность 0,1 является весьма условной, т.к. заявленная производителем точность самого датчика DS18B20 — 0,5 градуса. Тем не менее, ко мне очень часто обращались люди с предложением сделать термометр с индикацией до 0,1 градуса, что я и сделал.
Термометр измеряет температуру и индицирует ее на 4-х разрядном светодиодном индикаторе. Разные диапазоны температур индицируются по разному:
-55,0…-10,0 — в формате -ХХ.Х без символа градуса
-9,9…0,1 — в формате -Х.Х и символ градуса
0,0…9,9 — в формате Х.Х и символ градуса
10,0…99,9 — ХХ.Х и символ градуса
100,0…125,0 — ХХХ.Х без символа градуса
Кроме того в термометре реализована функции приглушения яркости индикаторов. Яркость выбирается кнопкой S. Пока кнопка нажата — яркость высокая, если не нажата — яркость низкая. Вместо кнопки можно подключить датчик освещенности, чтобы яркость менялась автоматически в зависимости от времени суток (точнее освещенности).
Термометр будет правильно работать только с датчиком DS18B20, датчики DS1820, DS18S20 и т.п. для данного термометра не пригодны! Для питания прибора подойдет любой стабилизированный или не стабилизированный блок питания выдающий постоянное напряжение 7…12 вольт. Например, можно использовать не нужное зарядное устройство для мобильника. Если выходное напряжение блока питания не превышает 8 вольт, то вместо стабилизатор 7805 можно применить и 78L05, но если будет сильный его нагрев, придеться увеличить сопротивления в катодах индикатора до 220 ом.
Термометр на PIC16F628A | Полезный изобретения на микроконтроллерах
В данной статье будет описан цифровой термометр на микроконтроллере PIC16F628A с функцией памяти максимальной и минимальной измеренных температур.
Интернет пестрит всевозможными предложениями различных цифровых
Особенности принципиальной схемы цифрового термометра на микроконтроллере:
- Проста в повторении;
- Малое количество деталей;
- Надежность при длительном использовании и при воздействии возможных помех.
Принципиальная схема термометра показана на рисунке 1
Рисунок 1 — Схема принципиальная
Важная деталь — принципиальная схема запоминающего термометра на микроконтроллере разрабатывалась параллельно с печатной платой, так как микроконтроллер вещь универсальная (каждый пин любого из портов можно настроить как на вход, так и на выход). Отсюда – разводим сначала печатную плату, так как нам удобно, а после рисуем принципиальную схему. Это очень удобная методика! Признаюсь не моя, подглядел на каком-то из форумов! Автору респект!!!
Теперь немного подробнее рассмотрим особенности отдельных узлов принципиальной схемы запоминающего термометра на микроконтроллере PIC16F628A
Сердцем термометра является микроконтроллер PIC16F628A фирмы Microchip. Это довольно распространенный и не дорогой микроконтроллер. Немало важным достоинством, которого является наличие энергонезависимой памяти и внутренней RC цепочки, которую можно использовать в качестве тактового генератора с фиксированной частотой 4МГц. Такое решение позволяет исключить из схемы обычный кварцевый резонатор и два конденсатора. Вдобавок освобождаются еще и два пина микроконтроллера. Сброс осуществляется при подаче питания, внешняя цепочка сброса исключена, тем самым уменьшилось общее количество деталей, и освободился еще один пин мк.
В качестве датчика температуры был выбран широко распространенный цифровой датчик
Информация выводится на 3-х разрядный семисегментный индикатор с общим катодом (ОК). Резисторы R5-R12 – токоограничивающие, катоды индикатора включены через транзисторы, это сделано для того чтобы не нагружать отдельные пины микроконтроллера. Кнопка SB1 нужна для отображения максимальной и минимальной измеренной температуры, а также для сброса этих величин. Кнопка SA1 переключает датчики(дом, улица).
В процессе разработки цифрового термометра на микроконтроллере была создана его упрощенная виртуальная модель в программе протеус см. рисунок 2
Печатная плата цифрового термометра, показанная на рисунке 3-4, была разработана в программе Sprint-Layout 5. Если программы нет, тогда можно воспользоваться PDF файлами печатной платы термометра, которые подготовлены в масштабе 1:1. Сам ими пользуюсь. В архиве также есть платы в зеркале. Текстолит выбран двухсторонний.
Рисунок 3 — Плата печатная вид снизу
Рисунок 4 — Плата печатная вид сверху
Плату разрабатывал, учитывая воздействие возможных помех. Для этого в схему были добавлены барьерные резисторы R1, R3, R14-R15. А также два конденсатора С1-С2. Термометр на микроконтроллере PIC16F628A, собранный из заведомо рабочих деталей, не требует наладки и начинает работать сразу после включения.
Рабочая программа для микроконтроллера была написана на языке ассемблер и отлажена в MPLab v 8.8. В результате получился вот какой термометр рисунки 5-7.
Рисунок 5 — Внешний вид термометра
Рисунок 6 — Внешний вид термометра(плюсовая температура)
Рисунок 7 — Внешний вид термометра(минусовая температура)
Рассмотрим что умеет делать термометр.При первом подключении цифрового термометра к источнику питания напряжением +5В. Однако в битах конфигурации микроконтроллера отключен детектор снижения напряжения, так что можно падавать и меньшее напряжение. На индикаторе на некоторое время высветятся три прочерка, это стартовая заставка, далее будет отображаться текущая температура датчика. Температура выводится на индикатор в диапазоне от -9,9 до 99°С с точностью до 0,1°С, в диапазоне от -55 до -10 и от 100 до 125 °С с точностью до 1°С. Незначащий первый разряд по необходимости гаситься. При первом запуске пороговые температуры обязательно перезапишутся во временной памяти, а после 5 минут и в энергонезависимой, при последующих запусках перезапись происходит только если выполняется условие превышения пороговых температур(максимальной или минимальной). Почему энергонезависимая память перезапишется не сразу, а через 5 минут??? Это специальный прием, который задает щадящий режим работы энергонезависимой памяти. За первые пять минут температура может измениться несколько раз, а запишется все равно самая максимальная/минимальная.О том, что происходит запись в энергонезависимую память, свидетельствуют три нижних квадрата, которые высвечиваются на некоторое время. Замечу, что в диапазоне температур, когда точность отображения 0,1°С сравнение порогов происходит с учетом десятых, в другом диапазоне десятые не учитываются. Температура измеряется где-то раз в 780 мс.
Если кратковременно нажать на кнопку SB1, то на индикатор будут поочередно выведены максимальная и минимальная измеренные температуры(и две заставки одна для максимальной -П- и одна для минимальной -U-), если кнопку нажать и удерживать до появлений трех прочерков, то произойдет сброс пороговых температур.
Термометр на PIC16F628A автоматически определяет наличие и исправность датчика DS18B20, исправность линии связи датчика DS18B20 с термометром. При отсутствии и обрыве датчика DS18B20, коротком замыкании плюсового провода с проводом информации, при переполюсовке плюсового и минусового проводов линии связи датчика DS18B20 с термометром на индикаторе появится сообщение Er1. Каждую секунду происходит повторная проверка датчика DS18B20 и линии связи. Если причина аварии будет устранена, термометр вернется к основному циклу. При коротком замыкании минусового провода линии связи с информационным проводом на индикаторе появиться сообщение Er2.
Готовую плату термометра разместил в китайском будильнике, предварительно выкинув от туда все не нужное. Вот что из этого получилось(рисунки 8, 9).
Рисунок 8 — Плата термометра в китайском будильнике
Рисунок 9 — Плата термометра в китайском будильнике
Технические характеристики:
- Диапазон измеряемых температур———————————————от -55 до +125 С
- Разрешающая способность измерения и отображения
- от-50 до -10 и от +100 до +120 С————————————————————1 С
- от-9,9 до+99,9—————————————————————————0,1 С
- Точность измерения температуры DS18B20 прибор высокой точности имеющий заводскую калибровку.
- Напряжение питания———————————————————————-5 Вольт
И так подведем итоги…. У нас получился термометр на микроконтроллере PIC16F628A с энергонезависимой памятью, которую, по желанию, можно сбросить. Выбран щадящий режим записи в энергонезависимую память. Есть возможность просмотреть самую минимальную и самую максимальную измеренную температуру одним нажатием на кнопку. Принципиальная схема термометра проста и не содержит дефицитных деталей. В схеме применяются микроконтроллер PIC16F628A и датчик температуры DS18B20. Печатная плата проработана с учетом воздействия возможных помех, размеры платы 70х42. Термометр способен работать от трех батареек типоразмера АА. Средний ток потребления 25мА. Исходный файл прошивки микроконтроллера может пригодится новичкам в программировании.
Посмотрите также:
Термометр на микроконтроллере PIC16F628A и DS18B20(DS18S20)Файлы к статье:
Архив с платами в формате PDF
Архив с проектом
Внимание! Архив с проектом был перезалит. Устранена одна ошибка неверной записи в энергонезависимую память. Все проверено в железе. Отдельное спасибо Михаилу Маруфенко за выявление ошибки!!!
Удачи всем! И пусть детали будут только исправные!
Простой термостат на PIC16F628A и DS18B20
Термометр позволяет измерять температуру в диапазоне от -55 до +125 градусов, а также осуществлять функции термостата во всем диапазоне температур, с любым гистерезисом. Реализована и функция контроля ошибок датчика. Кроме того, я постарался сделать его максимально универсальным, поэтому здесь размещено две схемы, одна под индикатор с общим анодом (ОА), другая под индикатор с общим катодом (ОК). Также есть возможность применять датчики DS18B20 и DS18S20.Управление осуществляется 2-мя кнопками. Нажатием кнопки +1 активируется режим настройки температуры ВКЛЮЧЕНИЯ реле. Кратковременно выскакивает надпись On и далее мигают цифры установленной температуры включени. Кнопками +1 и -1 можно изменять это значение от -55 до +125 градусов. После установки температуры нужно подождать несколько секунд, на дисплее кратковременно мигнут три тире (—), новые данные будут записаны в EEPROM и прибор перейдет в основной режим отображения температуры. Аналогично, нажав кнопку -1 на дисплее появится надпись OFF и начнет мигать значение температуры ОТКЛЮЧЕНИЯ реле. Точно так же после паузы в несколько секунд появятся три тире и произойдет сохранение в EEPROM температуры отключения реле.
Обратите внимание, что термостат понимает любые ситуации. Температура отключения меньше или больше температуры включения, от этого будет зависить как сработает реле. А в случае если заданные температуры равны, то реле вообще не сработает, прибор будет работать как обычный термометр. Так же важно, что запись в EEPROM происходит именно в момент, когда появляются три тире. По этому до записи данных не отключайте питание.
Для включения режима настроек типа индикации и типа датчика нужно удерживая кнопку +1 подать питание. Так же этот режим автоматически включается при первом включении устройства, после прошивки микроконтроллера. В этом режиме сначала поочередно на несколько секунд будут отображаться цифры 123 то под общий АНОД, то под общий КАТОД. В момент когда цифры отображаются правильно нужно нажать любую кнопку, режим индикации будет запомнен. Далее на дислее будет мигать надпись или (-S-) или (-b-). Кнопками можно выбрать тип датчика, 18S20 или 18B20 — -S- и -b- соответственно. А не нажимая кнопки несколько секунд выбранный датчик будет запомнен и все настройки сохранятся в EEPROM. Термостат перейдет в основной режим работы.
В случае получения ошибочных данных с датчика на дисплее появляется надпись (Err) — ошибка. Ошибка появляется только в том случае, если ошибочные данные получены с датчика 3 раза подряд (защита от случайных сбоев). При ошибке функции термостата будут выключены, реле отключено.
Простой универсальный термостат на микроконтроллере PIC16F628A и датчике DS18B20 (вер.2)
Термометр позволяет измерять температуру в диапазоне от -55 до +125 градусов, а также осуществлять функции термостата во всем диапазоне температур, с любым гистерезисом. Реализована и функция контроля ошибок датчика. Кроме того, я постарался сделать его максимально универсальным, поэтому здесь размещено две схемы, одна под индикатор с общим анодом (ОА), другая под индикатор с общим катодом (ОК). Также есть возможность применять датчики DS18B20 и DS18S20. Схемы остались прежними, изменилась только прошивка.
Управление осуществляется 2-мя кнопками. Нажатием кнопки +1 активируется режим настройки температуры ВКЛЮЧЕНИЯ реле. Кратковременно выскакивает надпись On и далее мигают цифры установленной температуры включени. Кнопками +1 и -1 можно изменять это значение от -55 до +125 градусов. После установки температуры нужно подождать несколько секунд, на дисплее кратковременно мигнут три тире (—), новые данные будут записаны в EEPROM и прибор перейдет в основной режим отображения температуры. Аналогично, нажав кнопку -1 на дисплее появится надпись OFF и начнет мигать значение температуры ОТКЛЮЧЕНИЯ реле. Точно так же после паузы в несколько секунд появятся три тире и произойдет сохранение в EEPROM температуры отключения реле.
Обратите внимание, что термостат понимает любые ситуации. Температура отключения меньше или больше температуры включения, от этого будет зависить как сработает реле. А в случае если заданные температуры равны, то реле вообще не сработает, прибор будет работать как обычный термометр. Так же важно, что запись в EEPROM происходит именно в момент, когда появляются три тире. По этому до записи данных не отключайте питание.
Для включения режима настроек типа индикации и типа датчика нужно удерживая кнопку +1 подать питание. Так же этот режим автоматически включается при первом включении устройства, после прошивки микроконтроллера. В этом режиме сначала поочередно на несколько секунд будут отображаться цифры 123 то под общий АНОД, то под общий КАТОД. В момент когда цифры отображаются правильно нужно нажать любую кнопку, режим индикации будет запомнен. Далее на дислее будет мигать надпись или (-S-) или (-b-). Кнопками можно выбрать тип датчика, 18S20 или 18B20 — -S- и -b- соответственно. А не нажимая кнопки несколько секунд выбранный датчик будет запомнен и все настройки сохранятся в EEPROM. Термостат перейдет в основной режим работы.
В случае получения ошибочных данных с датчика на дисплее появляется надпись (Err) — ошибка. Ошибка появляется только в том случае, если ошибочные данные получены с датчика 3 раза подряд (защита от случайных сбоев). При ошибке функции термостата будут выключены, реле отключено.
На видео (автора) показана работа старой версии
В термостате применен 3-х разрядный светодиодный индикатор с общим анодом (или общим катодом). Индикация температуры осуществляется так: температура ниже -9 градусов, отображается знак минус и 2 цифры. От -9 до +99 добавляется символ градуса в 3-м знакоместе, при плюсовой температуре знак + естественно не отображается. Температура выше 100 градусов также отображается без символа градуса. В качестве датчика температуры использован ходовой, можно сказать классический датчик — DS18B20 или DS18S20 (DS1820). Хоть термостат и может работать на температурах до 125 градусов, длительная эксплуатация его в таких режимах не рекомендуется, датчик долго не проживет. Оптимальная макс.температура 80…90 градусов.
Прошивки и платы
Еще записи по теме
Термометр на микроконтроллере PIC16F628A и цифровом датчике DS1620. Контроль через Интернет — Меандр — занимательная электроника
Отображение на ЖК-дисплее:
- температуры окружающей среды
- минимальной температуры
- максимальной температуры
Связь с компьютером (через порт RS232C)
- Наблюдение за температурой в раскрывающемся графике
- Сохранение измерений в файле
- Программируемый термостат
- Контроль температуры через интернет на базе данных MySQL
- Контроль температуры через интернет с помощью протокола FTP
1. Ознакомление
Это электронный термометр с выводом температуры на ЖК-дисплей.
Температура окружающей среды измеряется каждые 840 мс при помощи цифрового датчика DS1620, фирмы Dallas Semiconductor.
Одна из кнопок позволяет переключить экран, на котором отображается максимальная и минимальная температура:
Вторая кнопка сбрасывает значения температуры мин./макс.Как вариант, можно подключить устройство к компьютеру (через RS232). Температура передается на компьютер с устройства, управляемого микроконтроллером 16F628A. Приложение, установленное на компьютере, показывает температуру в реальном времени и выводит её на график. С другой стороны, приложение позволяет запрограммировать два предельных значения температуры термостата DS1620.
2. Принципиальная схема:
Версия № 1: без интерфейса RS232;
Версия № 2: с помощью RS232
ПРИМЕЧАНИЕ: Прошивка для микроконтроллера одна и таже для обоих вариантов.
3. Обзор датчика температуры DS1620
4. Принцип работы ЖК-дисплея (параллельный интерфейс)
5. Принцип работы устройства
5-1. Без интерфейса RS232;
После подачи напряжения, микроконтроллер 16F628A опрашивает датчик температуры DS1620 (команда Write Config с CPU = 1 и 1SHOT = 0, затем команда Start Convert T) и настраивает ЖК-дисплей (команда Set Function для использования в режиме интерфейса 4 бита). Модуль Timer1 (16 бит) микроконтроллера 16F628A активируется, что приводит к прерыванию приблизительно каждые 105 мс. При каждом прерывании модуля Timer1, опрашивается состояние кнопки SELECTION ECRAN и кнопки RESET MIN/MAX. Каждые 8 прерываний (около 840 мс) происходит чтение температуры и информация на ЖК-дисплее обновляется:
5-2. Через порт RS232
Относительно работы без интерфейса RS232, добавляются два прерывания:
- Прерывание приема UART (сообщает микроконтроллеру, что он получил данные от компьютера через RS232)
- Прерывание передачи UART (сообщает микроконтроллеру, что UART собирается передать данные на компьютер)
5-2-1. Кабель связи между компьютером и устройством.
Конечно же нужен компьютер, который имеет COM-порт (разъем SUB-D, 9 контактов «папа»). Нужно подключить нуль-модемный кабель (кабель с перекрёстным соединением) между компьютером и устройством. Если у вас его нет, вы можете легко его сделать (нужно 3 провода и 2 разъема SUB-D, 9 контактов «мама»).
5-2-2. Протокол связи между компьютером и устройством.
Компьютер посылает команду. Микроконтроллер отвечает.
Компьютер посылает 3 байта (через RS232):
Команда DS1620 | 1-ый байт (код команды) | 2-ой байт (данные) | 3-ий байт (данные) |
Read Temperature (каждые 1000 мс) | 0хАА | 0х00 (не используется) | 0х00 (не используется) |
Read TH (чтение высокой температуры термостата) | 0хА1 | 0х00 (не используется) | 0х00 (не используется) |
Read TL (чтение низкой температуры термостата) | 0хА2 | 0х00 (не используется) | 0х00 (не используется) |
Write TH (запись высокой температуры термостата) | 0х01 | (0000000 D8) | (D7 … D0) |
Write TL (запись низкой температуры термостата) | 0х02 | (0000000 D8) | (D7 … D0) |
Получив же их, микроконтроллер передает команду датчику DS1620 (через 3-проводной последовательный порт, синхронный). В случае команды чтения (Read Temperature, TH Read, Read TL), термометр DS1620 отправляет данные в микроконтроллер (температура в виде двоичного числа 9 бит, закодированных в дополнение в 2). Это число передается без изменений на компьютер в виде 2-х байт:
1-й байт: (0000000 D8)
2-й байт: (D7 … D0)
D0 = бит
Для других команд, микроконтроллер посылает компьютеру два байта 0x00 (через RS232).
Команда DS1620 | 1-ый байт (данные) | 2-ой байт (данные) |
Read Temperature (каждые 1000 мс) | (0000000 D8) | (D7 … D0) |
Read TH (чтение высокой температуры термостата) | (0000000 D8) | (D7 … D0) |
Read TL (чтение низкой температуры термостата) | (0000000 D8) | (D7 … D0) |
Write TH (запись высокой температуры термостата) | 0х00 (не используется) | 0х00 (не используется) |
Write TL (запись низкой температуры термостата) | 0х00 (не используется) | 0х00 (не используется) |
Пример осциллограммы: команда Read Temperature
Связь между компьютером и PIC (RS232) :
0xAA = код команды Read Temperature
0x00 0x2D = 0 0010 1101 = 45 = +22,5 °C
Связь между PIC и DS1620 (последовательный порт, синхронный) :
10101010 = 0xAA = код команды Read Temperature
0 00101101 = 0x2D = 45 = +22,5 °C
6. Приложение DS1620_104.exe для Windows
Предисловие
Это приложение было написано на C++ Borland Builder 5. Приложение работает на Windows NT4 и Windows XP (на Windows Vista не тестировалось).
Примечание: для управления устройством через порт RS232 требуется установка компонента TComPort (версии 2.64 достаточно):
Скачать
Процедура установки
Учебник
Процедура использования:
- Соединить компьютер и устройство нуль-модемным кабелем (в выключенном состоянии)
- Подключить питание
- Открыть приложение
- Настроить параметры соединения с RS232C :
9600 бит/сек
8 бит данных
бит чётности-нет
1 стопбит
контроль потока-нет - Открыть порт
Должна появиться реальная температура (с обновлением каждые 1000 мс). Имеется возможность сохранения данных в текстовый файл:
Этот файл затем может быть использован с Excel, Matlab …
Скачать приложение DS1620_104.exe для Windows 797 кб
Скачать исходный код приложения DS1620_104.exe 224 кб
7. Приложения для связи RS232 с LabVIEW
Вот два приложения, которые я написал для LabVIEW 5 :
ds1620_011.vi
ds1620_thermostat_004.vi
Обратите внимание, что эти приложения также работают с версией 6 LabVIEW.
Скачать ds1620_011.vi 223 кб
Скачать ds1620_thermostat_004.vi 223 кб
8. Установка соединения RS232 на языке Python
Версия Python: 2.7
Протестировано на Windows XP и Linux/Ubuntu
Этот сценарий требует наличия пакета pyserial (загрузка и процесс установки здесь).
Исходный код:
# (C) Фабрис Сэнсэр
# python 2.7
# соединение RS232 с цифровым термометром на цифровом датчике DS1620
#http://fabrice.sincere.pagespersoorange.fr/cm_электроника/проект_pic/ЖК термометр_DS1620htm/ЖК термометр_DS1620.htm
# тест: OK (linux/ubuntu + winXP)
import time
import serial # внешняя библиотека pyserial
print ‘Связь с COM-портом’
filename = ‘температура.txt’
print ‘\nФайл резервного копирования : ‘+filename
File = open(filename,’a’)
# библиотека pyserial :
# http://pyserial.sourceforge.net/shortintro.html
# http://pyserial.sourceforge.net/pyserial_api.html
Port = serial.Serial()
Port.baudrate = 9600
Port.bytesize=8
Port.parities=0
Port.stopbits=1
Port.xonxoff=0
Port.rtscts=0
Port.timeout=0.1 # в секундах
print «»»
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
«»»
nomport = raw_input(‘Имя COM-порта ? ‘)
try:
int(nomport)
Port.port = int(nomport)
except:
Port.port = nomport
print (‘Port ->’, Port.portstr,’\n’
Port.open()
try:
while True:
# запись
Port.write(‘\xAA\x00\x00’)
# чтение
MSB = Port.read() # старший байт
LSB = Port.read() # младший байт
if (MSB !=» and LSB != «):
temperature = ord(LSB) + 256* ord(MSB)
if temperature >= 256:
temperature = temperature — 512
temperature *= 0.5
affichage = «time».strftime(‘%H:%M:%S’,time.localtime()) + ‘ ‘+ str(temperature) +’ °C’
print affichage
Fichier.write(affichage +’\n’)
# пауза в 1 секунду
time.sleep(1.0)
except KeyboardInterrupt:
# CTRL + C
print «\nCTRL+C\nЗакрытие порта», Port.portstr
Port.close()
Fichier.close()
Выполнение сценария :
>>>
Связь с COM-портом
Файл резервной копии : температура.txt
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
Имя COM-порта ? 0
Порт -> COM1
09:15:28 19.5 °C
09:15:29 19.5 °C
09:15:30 19.5 °C
09:15:31 19.5 °C
09:15:32 19.5 °C
09:15:33 19.5 °C
09:15:34 20.0 °C
09:15:35 20.0 °C
09:15:36 20.0 °C
09:15:37 20.0 °C
09:15:38 20.0 °C
09:15:39 20.0 °C
CTRL+C
Закрытие порта COM1
>>>
Скачать сценарий Python
9. Проверка температуры через интернет с помощью CGI-скрипта на Python
Тестировалось у меня на Linux/Ubuntu на Livebox (автор является клиентом Orange), со следующими настройками сети:
- частный IP-адрес: 192.168.1.10
- публичный: 90.14.148.96
Установка:
Помимо Python 2.7 и пакета pyserial, нужно установить на компьютер Веб-сервер Apache (здесь с XAMPP).Сценарии Python cgi_чтение температуры.py , cgi_сборник установок.py и cgi_обработка сборника установок.py должны быть помещены в каталог /opt/lampp/cgi-bin/
Внимание на установки: Свойства -> Разрешения -> Разрешить выполнение файла как программы
Что касается сценариев CGI в Python:
Первая линия сценариев должна быть:
#! /usr/bin/python
Первый выход должен быть (header) :
print «Content-Type: text/html\n\n»
Настройка Livebox:
Путь — Преобразование сетевых адресов -> Добавить службу http(протокол TCP, порт 80, IP-адрес сервера 192.168.1.10)
Настройка брандмауэра:
разрешить входящие соединения на порт 80 (TCP)
Запуск Веб-сервера :
В Linux набрать команду :
sudo /opt/lampp/lampp start
Если сценарий cgi_ чтение температуры.py выдаёт ошибку типа:
Permission denied: ‘/dev/ttyS0’
тогда в Linux введите команду:
sudo chmod 666 /dev/ttyS0
Эти сценарии также работают в Windows (тестировалось на XP и Wampserver).
#! /usr/bin/python
#-*- coding:utf-8 -*-
# сценарий cgi_чтение температуры.py
# (C) Фабрис Сэнсэр
# python 2.7
# сценарий cgi
# соединение RS232 с цифровым термометром на цифровом датчике DS1620
# http://fabrice.sincere.pagesperso orange.fr/cm_электроника/проект_pic/ЖК термометр_DS1620htm/ЖК термометр_DS1620.htm
# тест: ОК (linux/ubuntu 11.10 + xampp 1.7.7)
import cgitb # отладка программы cgi
cgitb.enable()
import serial # внешняя библиотека pyserial
# Библиотека pyserial :
# http://pyserial.sourceforge.net/shortintro.html
# http://pyserial.sourceforge.net/pyserial_api.html
import time
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»fr»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Mesure de température</title>
<meta http-equiv=»Refresh» content=»10″/>
<meta name=»Author» content=»Фабрис Sincère»/>
</head>
<body>»»»
print ‘<p>Соединение с COM-портом</p>’
# предварительно, нужно создать реестр /opt/lampp/htdocs/температура
filename = ‘/opt/lampp/htdocs/ температура / температура.txt’
filename0 = ‘../ температура температура.txt’
print «<p><a href=’»+filename0+»‘>Файл резервной копии</a></p>»
Fichier = open(filename,’a’)
Port = serial.Serial()
Port.baudrate = 9600
Port.bytesize=8
Port.parities=0
Port.stopbits=1
Port.xonxoff=0
Port.rtscts=0
Port.timeout=0.1 # в секундах
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# внимание : разрешение 666
# > sudo chmod 666 /dev/ttyS0
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
nomport = 0
try:
int(nomport)
Port.port = int(nomport)
exept:
Port.port = nomport
print ‘<p>Открытие порта», Port.portstr,'</p>’
Port.open()
# чтение температуры
Port.write(‘\xAA\x00\x00’)
# чтение
MSB = Port.read() # старший байт
LSB = Port.read() # младший байт
if (MSB !=» and LSB != «):
temperature = ord(LSB) + 256* ord(MSB)
if temperature >= 256:
temperature = temperature — 512
temperature *= 0.5
affichage = «time».strftime(‘%H:%M:%S’,time.localtime()) + ‘ —-> ‘+ str(temperature) +’ °C’
print ‘<p>’+ affichage +'</p>’
Fichier.write(affichage +’\n’)
else:
print ‘<div style=»color:red;»>Устройство не понимает!</p>’
# чтение низкой температуры термостата
Port.write(‘\xA2\x00\x00′)
MSB = Port.read() # старший байт
LSB = Port.read() # младший байт
if (MSB !=» and LSB != «):
temperature = ord(LSB) + 256* ord(MSB)
if temperature >= 256:
temperature = temperature — 512
temperature *= 0.5
affichage = str(temperature) +’ °C’
print ‘<p>’+’Thermostat : TLow —>’+ affichage +'</p>’
# воспроизведение высокой температуры термостата
Port.write(‘\xA1\x00\x00′)
MSB = Port.read() # старший байт
LSB = Port.read() # младший байт
if (MSB !=» and LSB != «):
temperature = ord(LSB) + 256* ord(MSB)
if temperature >= 256:
temperature = temperature — 512
temperature *= 0.5
affichage = str(temperature) +’ °C’
print ‘<p>’+’ Thermostat : Thigh —>’+ affichage +'</p>’
print «<p>Закрытие порта, Port.portstr,'</p>’
Port.close()
Fichier.close()
print «</body></html>»
Чтение температуры (обновляется каждые 10 секунд):
Файл резервной копии:
#! /usr/bin/python
# -*- coding: utf-8 -*-
# сценарий cgi_сборник установок.py
# Просмотр HTML-формы
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»ru»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Измерение температуры</title>
<meta name=».Автор» content=»Фабрис Сэнсэр»/>
</head>
<body>
<p>Установка температуры (в °C) термостата:</p>
<p>например: 54.5</p>
<form action=»cgi_обработка сборника установок.py» method=»post»>
<p>
Tlow : <input type=»text» name=»tlow» /><br/><br/>
Thigh : <input type=»text» name=»thigh» /><br/><br/>
<input value=»СОХРАНИТЬ» type=»submit» name=»отправить»/>
</p>
</form>
</body>
</html>»»»
#! /usr/bin/python
# -*- coding: utf-8 -*-
# (C) Фабрис Сэнсэр
# сценарий cgi_обработка сборника установок.py
# Обработка данных, переданных через HTML-форму
import serial
import cgi
form = «cgi».FieldStorage()
def байт(температура):
temperature =int(temperature*2)
if temperature < 0:
температура += 256
MSB = 1
LSB = temperature
else:
MSB = 0
LSB = temperature
return [MSB,LSB]
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»ru»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Измерение температуры</title>
<meta name=»Автор» content=»Фабрис Сэнсэр»/>
</head>
<body>»»»
Port = serial.Serial()
Port.baudrate = 9600
Port.bytesize=8
Port.parities=0
Port.stopbits=1
Port.xonxoff=0
Port.rtscts=0
Port.timeout=0.1 # в секунду
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# внимание : разрешение 666
# > chmod 666 /dev/ttyS0
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
nomport = 0
try:
int(nomport)
Port.port = int(nomport)
except:
Port.port = nomport
print ‘<p>Открытие порта, ‘Port.portstr,'</p>’
Port.open()
if form.has_key(«tlow»):
Tlow = form[«tlow»].value
try:
Tlow = float(Tlow)
Port.write(‘\x02’+chr(байт(Tlow)[0])+chr(байт(Tlow)[1]))
Port.read()
Port read()
print ‘<p>Tlow : сохранённое значение</p>’
except:
print ‘<p>Tlow : недопустимое Значение</p>’
if form.has_key(«thigh»):
Thigh = form[«thigh»].value
try:
Thigh = float(Thigh)
Port.write(‘\x01’+chr(байт(Thigh)[0])+chr(байт(Thigh)[1]))
Port.read()
Port.read()
print ‘<p>Thigh : сохраненное значение</p>’
except:
print ‘<p>Thigh : недопустимое Значение</p>’
print «<p>Закрытие порта, Port.portstr,'</p>’
Port.close()
print «</body></html>»
10. Приложения для связи RS232 с LINUX
Связь между платой с микроконтроллером и компьютером (оснащенного операционной системой Linux) может установиться просто с консоли команд (командный процессор Linux).Для этого мы будем использовать два сценария bash :
- DS1620_reception.sh (выполняется первым)
- DS1620_emission.sh
Эти сценарии были успешно протестированы на многих системах Linux : Ubuntu, Mandriva и Puppy.
Эти сценарии являются базовыми: можно сделать гораздо более мощные!
1 bash-сценарий (файл DS1620_reception.sh) :
#!/bin/bash
# bash-сценарий для Linux
# (C) Фабрис Сэнсэр ; Версия 1.0.1
# Связь RS232 (COM-порт) между компьютером и микроконтроллером PIC
clear
# обнаружение COM-портов компьютера
message=’Команда : dmesg | grep tty’
echo-e «$message\n»
dmesg | grep tty
# настройка порта COM1 :
# 9600 бит/с
# 8 битов данных
# бит четности-нет
# 1 стоп-бит
# управление потоком-нет
message=’Commande: stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon cread clocal-crtscts-icanon’
echo-e «\n$message\n»
stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon cread clocal-crtscts-icanon
# отображает все параметры порта COM1
message=’ Commande: stty-a-F /dev/ttyS0′
echo-e «$message\n»
stty-a-F /dev/ttyS0
message=’Во второй консоли, запустить сценарий DS1620_emission.sh’
echo-e «\n*****************************************************************»
echo-e «$message»
echo-e»*****************************************************************\n»
# данные, полученные с компьютера, сохраняются в режиме реального времени в файл
message=’ Commande: cat /dev/ttyS0 > temperature.dat’
echo-e «$message\n»
cat /dev/ttyS0 > temperature.dat
В консоли, выполнение этого сценария bash даёт:
fabrice@imedia2089:~$ ./DS1620_reception.sh
Commande: dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 0.573305] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 0.573406] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 0.573739] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 0.573872] 00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
Commande: stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon кред помощью clocal-crtscts-icanon
Commande: stty-a-F /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; флеш = ^O; min = 1; time = 0;
-parenb-parodd cs8-hupcl-cstopb cread clocal-crtscts
-ignbrk-brkint-ignpar-parmrk-inpck-istrip-inlcr-igncr-icrnl-ixon-ixoff
-iuclc-ixany-imaxbel-iutf8
-opost-olcuc-ocrnl-onlcr-onocr-onlret-ofill-ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig-icanon iexten echo-echoe-echok-echonl-noflsh-xcase-tostop-echoprt
echoctl echoke
*****************************************************************
Во второй консоли, выполняется сценарий DS1620_emission.sh
*****************************************************************
Commande: cat /dev/ttyS0 > temperature.dat
2 bash-сценарий (файл DS1620_emission.sh) :
#!/bin/bash
# bash-сценарий для Linux
# (C) Фабрис Сэнсэр; Версия 1.0.1
# Связь RS232 (COM-порт) между компьютером и микроконтроллером PIC
clear
message=’В другой консоли, запуск первого сценария DS1620_reception.sh’
echo-e «\n**************************************************************************»
echo-e «$message»
echo-e»**************************************************************************\n»
# бесконечный цикл
# посылает 3 байта (0xAA 0x00 0x00) = ПИК
# повторяет операцию каждые 5 секунд
while [ 1 ]
do
message=’Emission : echo-e-n «\xAA\x00\x00» > /dev/ttyS0′
echo «$message»
echo-e-n «\xAA\x00\x00» > /dev/ttyS0
sleep 5s
# вывод содержимого файла данных, полученного с помощью компьютера (в шестнадцатеричном формате)
echo-e «Прием»
od-t x1 temperature.dat
done
В консоли, выполнение этого сценария bash дает :
fabrice@imedia2089:~$ ./DS1620_emission.sh
**************************************************************************
В другой консоли, исполнение первого сценария DS1620_reception.sh
**************************************************************************
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32
0000002
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32
0000004
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32 00 32
0000006
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32 00 32 00 33
0000010
…
…
…
Два последних полученных байта — 0x33 0x00, соответствующих температуре +25,5 °C.
11. Проверка температуры через интернет с MySQL
Вам нужен Интернет-хостинг с PHP и базой данных MySQL.У автора статьи хостинг Olympe Network (бесплатный и без рекламы).
11-1. Локальная установка web_temperature.exe
Это приложение запускается на локальном компьютере, куда подключено устройство для сбора данных о температуре (через порт RS232).
Оно позволяет :
- просматривать температуру (обновление: 1 секунда)
- каждые 5 минут, температура сохраняется во внешней базе данных MySQL (через сеть интернет). Для этого используются 3 запроса SQL:
- CREATE TABLE IF NOT EXISTS web_temperature1 (ID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,date date NOT NULL,time time NOT NULL,temperature varchar(20) collate latin1_general_ci NOT NULL) ENGINE = MYISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
- INSERT INTO web_temperature1(ID,date,time,temperature) VALUES (NULL,CURDATE(), CURTIME(), ‘21,5’)
- SELECT date,time,temperature FROM web_temperature1 ORDER BY ID DESC LIMIT 0,1
Приложение состоит из двух файлов :
- web_temperature.exe
- libmysql.dll
Скачать web_temperature.exe (263 кб)
Скачать libmysql.dll (1,0 Мб)
Исходный код приложения
Это приложение было написано на C++ Borland Builder 5.
Скачать исходный код (222 кб)
Примечание: Для связи с COM-портом (RS232), необходимо установить компонент TComPort (о котором я уже говорил выше).Для связи с базой данных MySQL необходима библиотека C libmysql, которую вы можете свободно скачать с официального сайта www.mysql.com:
Раздел: Downloads
-> mysql-connector-c-noinstall-6.0.2-win32.zip
Чтобы использовать эту библиотеку в C++ Borland Builder 5, вот внешняя ссылка:
Учебник: Использование API MySQL в Borland C++ Builder
Небольшое упущение в этом учебнике: нужно добавить libmysql.lib в проект (Проект -> Добавить в проект -> libmysql.lib)
Полезная ссылка: http://fabrice.sincere.pagesperso-orange.fr/application_builder5/client_mysql/mysql_client_builder.html
11-2. Чтение температуры через интернет: сценарий PHP
В вашем любимом веб-браузере, температура доступна в режиме реального времени на веб-странице в php. Сценарий PHP подключается к базе данных MySQL (через сеть интернет).Он считывает и отображает информацию, ранее записанную локальным приложением (обновление каждые 5 минут).
Скачать исходный код сценария PHP
12. Проверка температуры через интернет с FTP
Вам нужен интернет-хостинг .
12-1. Локальная установка web_temperature_ftp.exe
Это приложение запускается на локальном компьютере, куда подключается устройство для сбора данных о температуре (через порт RS232).
Оно позволяет :
- просматривать температуру (обновление: 1 секунда)
- каждые 5 минут, локальный файл (который содержит информацию о дате, времени и температуре), передаётся на веб-сайт по FTP-протоколу (File Transfer Protocol).
Скачать web_temperature_ftp.exe (292 кб)
Это приложение было написано на C++ Borland Builder 5.
Скачать исходный код (15 кб)
12-2. Чтение температуры через интернет
В вашем любимом веб-браузере, температура доступна в реальном времени в URL:
http://fabrice.sincere.pagesperso-orange.fr/web_temperature.txt
13. Список оборудования и деталей
- программатор для прошивки микроконтроллера PIC 16F628A
Без интерфейса RS232 :
- 1 буквенно-цифровой ЖК дисплей 2 × 16 с параллельным интерфейсом
- 3 резистора 10 кОм
- 1 подстроечный резистор 2,2 кОм ( для регулировки контраста дисплея)
- 1 цифровой датчик температуры DS1620 (Dallas Semiconductor)
Примечание : Вы можете заказать бесплатные образцы у фирмы Dallas - 1 микроконтроллер PIC 16F628A (корпус PDIP)
Примечание: Вы можете заказать бесплатные образцы у компании Microchip - 1 кварц на 20 МГц (20 МГц обязательно)
- 1 электролитический конденсатор 100 мкФ (фильтр)
- 1 электролитический конденсатор 10 мкФ (фильтр)
- 5 конденсаторов 100 нФ (фильтр)
- 2 конденсатора по 22 пФ
- 1 источник непрерывного питания +12 в (или батарейки 9 В)
- 1 микросхема регулятора напряжения 7805 (корпус ТО220)
- 2 кнопки (действующих на замыкание)
С интерфейсом RS232: дополнительные компоненты
- 1 инегральная микросхема MAX233A (интерфейс RS232C <-> TTL/CMOS)
Примечание: Вы можете заказать бесплатные образцы у компании Maxim - 1 разъем SubD, 9 контактов «папа»
- 1 электролитический конденсатор 1 мкф (фильтр)
- 1 нуль-модемный кабель («мама» / «мама»)
- 1 компьютер с COM-портом
14. Печатная плата
Размеры: 62 x 100 мм
Односторонняя.
web_temperature_ftp_code_source
Скачать фотошаблон
Примечание: Не забудьте 9–контактный разъём (припаяйте в первую очередь).
15. Прошивка для PIC 16F628A
Исходный код был написан на ассемблере в бесплатной среде MPLAB IDE от Microchip.
Скачать прошивку (.hex) исходный код на ассемблере (.asm)
Перевод Павла Блинкова (grayling3000) по заказу сайта Меандр
Оригинал статьи
Электронный термометр с беспроводным датчиком | RadioLaba.ru
Решил я сделать двухканальный термометр, только не обычный, а с беспроводным датчиком для улицы. Идея конечно не новая, на рынке уже имеются подобные термометры промышленного производства. Так как у меня были наработки по подключению радиомодулей к микроконтроллеру, я начал разрабатывать свой вариант беспроводного термометра.
Для измерения температуры я использовал распространенные датчики 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 см (четверть длины волны несущей частоты).
Последние записи:
Двухточечный термометр на DS18B20 и микроконтроллере PIC16F84 (A)
РадиоКот >Лаборатория >Цифровые устройства >Двухточечный термометр на DS18B20 и микроконтроллере PIC16F84 (A)
Подобных схем радиолюбителями было разработано немало, но мне захотелось собрать компактный термометр на батарейном питании, включающийся только тогда, когда надо узнать температуру. На батарейном питании потому, что не очень люблю постоянно включенные в сеть устройства, особенно, если в этом нет необходимости. Ведь температуру подходишь смотреть несколько раз в день.
Посмотрим на схему термометра:
Основой термометра является микроконтроллер PIC16F84, который осуществляет опрос интегральных термодатчиков DS18B20 и отображение информации на дисплее. Информация отображается на 10-разрядном 7-сегментном дисплее MT10T7-7T со встроенным контроллером производства компании «МЭЛТ». Подробное описание дисплея можно найти на сайте компании: https://www.melt.aha.ru.
Микросхема DS18B20 это термометр с цифровым вводом/выводом, работающий с точностью +0.5°C. Данные считываются через 1-проводную последовательную шину в дополнительном от 9 до 12 битном (программируется пользователем) коде с ценой младшего разряда от 0.5°C до 0.0625°C.
Устройство выглядит следующим образом:
На индикаторе символ «d» обозначает «дом», символ «u» — улица. В свободном на снимке разряде между символом «u» и значением температуры появляется знак «—» при отрицательных значениях температуры.
Внутренности градусника:
А так размещен датчик на улице:
Датчик, измеряющий температуру в комнате находится внутри корпуса устройства. В корпусе просверлено несколько отверстий в месте расположения датчика. Датчик, измеряющий уличную температуру, помещен в подходящий пластмассовый корпус, наполненный теплопроводной пастой КПТ-8 и заизолирован от влаги герметиком. Для более правильного измерения температуры датчик вынесен на штанге подальше от стены дома. И, конечно, датчик надо бы закрыть от прямых солнечных лучей экраном, например из картона. Но мне его не было необходимости делать, так как солнце с той стороны дома, где находится датчик, появляется после 19.30, а температурой, как правило, интересуешься больше утром, перед выходом на работу.
Файлы:
Прошивка — 01.rar
Плата — 02.rar
Все вопросы — сюда.
Как вам эта статья? | Заработало ли это устройство у вас? |
Эти статьи вам тоже могут пригодиться: