Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 6

Ethernet термометр на основе Arduino

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

Что нам понадобится:
  • Arduino Duemilanove (Freeduino 2009)
  • Ethernet Shield v2
  • цифровой датчик температуры — DS18B20
  • вентилятор для корпуса (120 мм)
  • банка от водоэмульсионки или клея ПВА (2 литра)
  • светодиод
  • витая пара
Задачи

Опрашивать датчик температуры по шине 1-Wire и каждые 3 секунды самостоятельно отправлять результаты на Web-сервер, на котором они будут храниться.

Алгоритм работы устройства:
  1. присваиваем нашему Ethernet Shield`у MAC адрес и ip-адрес
  2. инициализируем соединение с сервером на 80 порт
  3. получаем данные с цифрового датчика температуры, по 1-Wire шине
  4. формируем GET запрос
  5. отправляем GET запрос
  6. разрываем соединение
Исходный код скетча:

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

<font>include <font>// Библиотеки ниже нет в стандартной поставке среды разработки Arduino.</font> <font>// придётся её скопировать.</font> include <dallastemont>// MAC-адрес нашего устройства</dallastemont></font> <font>byte</font> mac[] = { 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC }; <font>// ip-адрес устройства</font> <font>byte</font> ip[] = { 192, 168, 1, 156 }; <font>// ip-адрес удалённого сервера</font> <font>byte</font> server[] = { 79, 140, 28, 20 }; <font>// измените на свой</font> <font>char</font> temp[6]; <font>byte</font> isdata=0; Client client(server, 80); <font>// 80-порт.</font> DallasTemperature tempSensor; <font>void</font> setup() {  Ethernet.begin(mac, ip); <font>// Инициализируем Ethernet Shield</font>  tempSensor.begin(7); <font>// Датчик температуры на 7-й пин</font>  Serial.begin(9600); <font>// Скорость консольного порта 9600 (пригодится для отладки)</font> } <font>void</font> loop() {   delay(3000); <font>// задержка в 3 сек.</font>   <font>// Соединяемся</font>   <font>if</font> (client.connect()) {   Serial.println(<font>"connecting..."</font>); <font>// Serial.println для отладки. Лучше его оставить, на всякий случай, потом будет легче понять, в чём проблема.</font>   <font>// Обработчик ошибок датчика</font>   <font>switch</font>(tempSensor.isValid())    {      <font>case</font> 1:        Serial.println(<font>"Invalid CRC"</font>); <font>// ошибка контрольной суммы</font>        tempSensor.reset(); <font>// сбросить девайс</font>        <font>return</font>;      <font>case</font> 2:        Serial.println(<font>"Invalid device"</font>); <font>// какой-то "левый" датчик :)</font>        tempSensor.reset(); <font>// сбросить девайс</font>        <font>return</font>;    }      Serial.println(<font>"connected"</font>);    <font>char</font> buf[80];    <font>float</font> f=tempSensor.getTemperature(); <font>// получаем температуру</font>    Serial.println(tempSensor.getTemperature());       <font>// Ниже извращения с отделением дробной части и целой. Почему-то Arduino не хочет работать с float.</font>    <font>// Вместо числа вставляет вопросик. Наверное, виной тому отсутствие аппаратной поддержки работы с</font>    <font>// числами с плавающей запятой в Arduino. Буду рад увидеть более красивое решение в комментариях.</font>    <font>int</font> temp1 = (f - (<font>int</font>)f) * 100; <font>// выделяем дробную часть</font>    <font>// Составляем GET запрос. Переменная code нужна для того, чтобы вражеский термометр не слал какие попало значения.</font>    <font>// проверяется на стороне Web-сервера.</font>    sprintf(buf, <font>"GET /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0"</font>, (<font>int</font>)f, abs(temp1));      Serial.println(buf);    client.println(buf); <font>// Отправляем GET запрос</font>    client.println(<font>"Host: opck.info"</font>); <font>// Указываем, какой конкретно host на данном ip нас интересует.</font>    client.println();      } <font>else</font> {    Serial.println(<font>"connection failed"</font>);   }  <font>while</font> (client.available()) {   isdata=1;   <font>char</font> c = client.read(); <font>// Читаем, что нам ответил Web-сервер</font>   Serial.print(c);     }    <font>if</font> (!client.connected()) {   isdata=0;   Serial.println();   Serial.println(<font>"disconnecting."</font>);   client.stop(); <font>// Завершаем соединение</font>  } }

Сборка устройства:
  1. первую «ногу» датчика цепляем на «минус» GND
  2. вторую «ногу» (DQ) на 7-й пин
  3. третью на «плюс»
  4. вторую и третью нужно соединить резистором на ~ 4,7 К. Но я заменил резистор на светодиод и получил индикатор обращения к шине датчика (ВНИМАНИЕ! Без резистора или светодиода работать ничего не будет. Не забудьте!)

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

Делаем корпус для датчика

Подходящей по размеру оказалась банка от водоэмульсионной краски (такие же бывают из-под клея ПВА, объёмом 2-3 литра). В нижней части банки делаем отверстие под вентилятор. И прикрепляем его к банке. В центре банки размещаем площадку под датчики, диаметром немного меньшим самой банки, чтобы воздух мог циркулировать.Несколько фото:Банка от водоэмульсионкиДетали и банка с проделанным отвестиемУстановка датчика в корпусДатчик в корпусе, вид сверху Как вы помните, резистор я заменил светодиодом, поэтому делаем и для него отверстие, чтобы всегда было видно работу устройства.Корпус, вид сбоку Крышка от банки нам не нужна, вместо неё нужен навес, такой, чтобы и воздух пропускал, и чтобы атмосферные осадки не попадали внутрь (датчик-то будет расположен на улице). Корпус для Arduino я сделал из пластмассовой коробки от mp3-плеера Explay C360.Arduino

Backend, принимающий данные:

На стороне сервера работает скрипт, к которому обращается термометр. Скрипт проверяет правильность секретного кода, чтобы показания нельзя было подменить. А затем добавляет новую запись в таблицу MySql. Потом эти данные можно выводить как угодно. При этом каждую минуту данные за прошедшую минуту усредняются и добавляются в другую таблицу.Нужно это для того, чтобы: 1. проще было делать выборки в базе (не правда ли, удобнее указать конкретную минуту и получить результат) 2. выборки были быстрее (за год ~500 000 записей вместо 10 000 000) Во время длительной работы датчика обнаружилась проблема, иногда он самопроизвольно (раз в 3-4 часа) выдаёт рандомное значение. Поэтому я добавил проверку на изменение температуры больше чем на 1 градус в течении 15 секунд. Такие значения игнорируются.

Что из этого всего вышло:

На своём сайте я разместил страничку с термометром и добавил график температуры за последние сутки. Посмотреть можно тут: Ethernet термометр.

Недостатки:

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

Планы на будущее:
  • датчик влажности
  • датчик давления
  • датчик скорости ветра
  • датчик освещённости
  • поставить несколько таких в городе и делать свои прогнозы погоды
  • питать Arduino по Power over Ethernet
  • автоматизировать включение и частоту вращения вентилятора в зависимости от освещения
  • удалённое управление
  • сброс данных на случай отсутствия связи (для меня это критично)
Известные мне недостатки:

— высокая цена — 2180 руб. (Freeduino 2009 (800 р.) + Ethernet Shield v2 (1300 р.) + 1 датчик (80 р.)) — если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик. Он не должен сдувать, а лишь проталкивать воздух.

Ссылки по теме:

Блог Arduino на ХабреОнлайн-термометрDS18B20 Datasheet PS: статья целиком и полностью принаддежит — все вопросы к немуMP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIYMP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIYУ нас Вы можете купить Мастер Кит MP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом: цена, фото, DIY, своими руками, технические характеристики и комплектация, отзывы, обзор, инструкция, драйвер, программы, схемаМастер Кит, MP719 Laurent-T, Многоканальный интернет термометр с WEB интерфейсом, цена, описание, фото, купить, DIY, своими руками, отзывы, обзор, инструкция, доставка, драйвер, программы, схемаhttps://masterkit.ru/shop/2283876Готовый модульMP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом»>MP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом»>MP719 Laurent-T — Многоканальный интернет термометр с WEB интерфейсом»>

Умный дом: Ethernet, WiFi, ESP8266 / Домашняя автоматика

Датчики / Домашняя автоматика

Идеальное решение для централизованного сбора показаний цифровых датчиков температуры удаленно через сеть Ethernet!

Предлагаемый блок в собранном виде позволяет реализовать принцип: купил – подключил. Блок позволит получить многоканальный цифровой термометр, подключаемый по локальной сети к Хабу (Hub), свитчу (switch) или роутеру (router) c последующим контролем температуры в браузере. Устройство будет полезно для применения в быту, дома, на даче, в бане. С его помощью можно производить измерения температуры окружающей среды, контролировать рабочую температуру морозильников и холодильных установок, протоколировать измеренную температуру через встроенный WEB-интерфейс.

Рекомендованный датчик температуры MP18B20. Рекомендуемый источник питания — PW1245.

+ 190бонусов на счет

Предлагаемый блок в собранном виде позволяет реализовать принцип: купил – подключил. Блок позволит получить многоканальный цифровой термометр, подключаемый по локальной сети к Хабу (Hub), свитчу (switch) или роутеру (router) c последующим контролем температуры в браузере. Устройство будет полезно для применения в быту, дома, на даче, в бане. С его помощью можно производить измерения температуры окружающей среды, контролировать рабочую температуру морозильников и холодильных установок, протоколировать измеренную температуру через встроенный WEB-интерфейс.

Рекомендованный датчик температуры MP18B20. Рекомендуемый источник питания — PW1245.

Напряжение питания (В) 6 … 24
Тип питания постоянный
Диапазон измерения температуры, град.С –25 … +125
Точность показаний (С) 0,1
Количество подключаемых датчиков DS18B20 (шт) 20
Потребляемый ток, не более (мА) 50
Количество входов LAN (шт) 1
Рекомендованная температура эксплуатации (°С) -30…70
Габариты модуля (мм) 85 х 50 х 20
Вес, не более (г) 100
Вес 62
  • Возможность управления модулем через встроенную Web-страницу
  • Возможность управления прямыми HTTP запросами
  • Возможность управления набором текстовых команд управления (Ke-команды) через TCP (открытый API)
  • Возможность работы с JSON запросами или через TCP порт (командная строка)
  • Возможность назначения и хранения текстовых имен датчиков по их идентификационному номеру
  • Встроенный фильтр и возможность сглаживание показаний датчиков на случай кратковременных сбоев в работе (воздействие внешних помех на длинной линии)
  • В случае неполадок на линии, производит автоматически ресет шины 1-Wire путем размыкания контактов встроенного электромагнитного реле.
  • Разработан специально для длительной и устойчивой работать в удаленном режиме

MP220R, BOX-BM8037

MP712 Laurent-2

Интернет реле +…

MP18B20

Модуль цифрового термодатчика DS18B20+, удаленное подключение

MP8037R

Цифровой термометр/термостат до 4кВт (20А)

PW1245

AC/DC Импульсный источник питания 12В / 0.5А

УЗМ-51М УХЛ4

Реле контроля напряжения 220В / 63А

MP8036

12-ти канальный таймер, термостат, АЦП, часы, v1,95а

MP8036multi

Логический модуль (таймер, термостат, часы, ацп, шим)

SN18B20

Герметичный датчик температуры DS18B20+

NM0101

Набор для сборки оконечного усилителя НЧ 100Вт (моно)

MP700

Тестер параметров и исправности электронных компонентов (R/L/C, N/P/M, ESR)

BM4511

Регулятор яркости ламп накаливания 12-24В / 50A

BM8020

USB осциллограф

NS180

Новогодняя ёлка (набор для пайки)

NM0607

Набор для сборки стабилизированного блока питания 2,5…27В, 10А

MP718 Laurent-2G

Интернет реле + GSM

Предзаказ  

MK080

Отпугиватель кротов Антикрот

ПризнакиПрограммирование</li>Датчики температуры</li>Умный дом</li>ХарактеристикиИнструкцииСхемыКомплектацияСборкаНастройкаЭксплуатацияВопросы и ответыКомментарииАналогичныеСопутствующиеВам может пригодитсяCopyright www.maxx-marketing.netРазделы—> Ethernet датчики влажностиEthernet датчики давленияEthernet датчики температурыИнтернет барометрыИнтернет гигрометрыИнтернет гигростатыИнтернет термометрыСортировать по:РейтингуЦенеДешевыеДорогиеСо скидкойНа странице:Вид:

Хит продажНаличие: 2 шт.Интернет термостат/гигростат c 2-мя релейными каналами и логическими входами/выходами RODOS-16 Устройство сертифицировано СЕРТИФИКАТ   Интернет термостат RODOS-16 – это современное устройство для поддержания микроклимата и коммутации нагрузок в производственных помещениях и частных домах через интернет соединение.   Одним из достоинств данного устро..4 100 рубПодробнееID Товара: 148TE-Monitor%20v4-4-260x260.pngСкидкаНаличие: 29 шт.Интернет термометр TE-MONITOR V.4 с датчиком температуры длиной 3 метра Данное устройство применяется для контроля температуры.   Особенностью данного устройства в том, что к нему не нужно какое либо дополнительное программное обеспечение. Достаточно любого браузера. Также показания можно считать по SNMP или по telnet.  ..3 500 руб2 900 рубПодробнееID Товара: 139board-260x260.jpgИнтернет термометр TE-MONITOR V.2 Данное устройство применяется для контроля температуры. Особенностью данного устройства в том, что к нему не нужно какое либо дополнительное программное обеспечение. Достаточно любого браузера. Также показания можно считать по SNMP или по telnet.   Параметры определяются применён..2 600 рубПодробнееID Товара: 125SMALL%20METEO%20v4-260x260.pngИнтернет термометр, барометр, гигрометр SMALL METEO V.4 с датчиком температуры/влажности длиной 3 метра   Легендарое продолжение устройства SMALL METEO v.2 в корпусном исполнении.   Данное устройство применяется для контроля температуры, влажности, атмосферного давления.   Особенностью данного устройства в том, что к нему не нужно какое либо дополни..3 500 рубПодробнееID Товара: 124TE-Monitor_V6_promo_2-260x260.jpgНаличие: 5 шт.Интернет термометр, барометр, гигрометр TE-MONITOR V.6 TE_MONITOR_V6 – контроллер для подключения датчиков температуры, влажности и атмосферного давления, выполненный в прочном компактном корпусе из ABS пластика. Встроенный web-интерфейс позволяет просматривать показания датчиков через интернет-браузер с любого компьютера либо смар..3 700 рубПодробнееID Товара: 207Используемые источники:

  • https://habr.com/post/110610/
  • https://masterkit.ru/shop/2283876
  • https://silines.ru/ethernet/ethrnet-sensors/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации