MAKSIKI have come to you

На главную | Зависимая от температуры RGB светодиодная подсветка | Датчик температуры на NODEMCU V3.0 | PZEM-004T энергомонитор на NODEMCU V3.0 | Датчики на NODEMCU V3.0

Зависимая от температуры RGB светодиодная подсветка



Эта статья будет полезна для тех, кто ищет пример выполнения зависимой от температуры RGB светодиодной подсветки, но не знает с чего начать. Я осваивал подключения всех используемых устройств и программирование микроконтроллера с нуля, смог я, сможете и вы. От азов до окончания работы потратил примерно полтора месяца, тратя вечернее время после работы. Почему выбор пал именно на программируемый контроллер Ардуино, потому что аналогов я не нашел. Нет готовых устройств или систем в свободной продаже для реализации данного проекта.
Начинать рекомендую с самых простых и банальных примеров – это включение/выключение светодиода от кнопки в разных режимах, например кнопка нажата – светодиод горит, отпустил кнопку – светодиод потух, другой пример с другой программой: при каждом нажатии на кнопку светодиод горит постоянно и следовательно не горит до тех пор пока на не нажать на кнопку еще раз. На таких примерах можно узнать основы написания программ и управления приборами. С каждым своим новым уроком добавляя устройств и расширяя программный код. Писать программу или добавлять компоненты советую с простого: взяли пример в ARDUINO IDE работа с датчиком температуры DS18B20 «DallasTemperature», далее рядом вставили код работы с кнопкой, далее код с работой реле или светодиода (принцип работы одинаков). Если по отдельности всё работает, значит идем дальше и пишем условие через оператор if – если температура в таких-то пределах, то включаем реле такое-то; если кнопка нажата, то выполняем такое-то действие, например задействовать конструкцию switch - case. Далее включаем библиотеку LiquidCrystal_I2C для работы с текстовыми дисплеями, с помощью lcd.print выводим на дисплей нужные значения, для отладки системы можно отправлять нужные вам значения в монитор порта с помощью Serial.print. На этом построили наш каркас программы и далее навешиваем, прикручиваем, отлаживаем.

И так нам понадобятся:
- Контроллер ардуино (в моем случае китайский UNO, в интернете очень много есть материала по данному контроллеру) – 1 шт. (230 руб);
- Troyka Shield – 1 шт (690 руб) – можно без нее, это для удобства;
- ЛСД дисплей с I2C подключением;
- Силовой ключ P-Channel (Troyka-модуль) – 1 шт. (340 руб) – управление «+»;
- Силовой ключ N-Channel v3 (Troyka-модуль) – 3шт. (290 руб) – управление «-»;
- Герметичный датчик температуры DS18B20 в металлическом корпусе (240 руб);
- Датчик температуры DS18B20 – 1 шт. (65 руб);
- Датчик температуры DHT22 – 1 шт. (300 руб);
- Модуль подтяжки (Troyka-модуль) – 1 шт. (160 руб) можно и без него, но там есть встроенные резисторы и винтовые клеммы на 2 устройства;
- Блок питания 7-12В для ардуино – 1 шт. (300 руб);
- Блок питания для светодиодной ленты – характеристики зависят от применяемой светодиодной ленты (в моем случае 12В 40W) – 1 шт. (400 руб);
- RGB светодиодная лента (в моем случае 12B IP68 14W/1метр) – 1,2м (2000 руб за 5 метров);
- Резисторы 4,7 кОм или другого номинала в зависимости от сечения провода и удаленности приборов (3 руб);
- Винтовые клемники;
- Провода сечением 0,5мм – 0,75мм в зависимости от протяженности и наличия и желания.

Описывать программу не буду, в скетче все пояснения есть. Ссылка на скачивание как всегда внизу статьи.
По подключению. В скетче подписаны пины, к которым подключены устройства, хочу дать только небольшие пояснения. Датчики температуры DS18B20 (у меня их 2 шт) посадил на один провод, у каждого из них в программе прописан уникальный адрес. От Ардуино с Shield подключил P-Channel в разрыв цепи от блока питания на плюсовой контакт светодиодной ленты, а N-Channel (3шт) так же в разрыв цепи от блока питания к соответствующим контактам светодиодной ленты RGB. Остальное можно увидеть на фотографиях, видео или задать вопрос в комментариях.

Хотел описать еще не маловажные проблемы при сборке и отладке.
1. Не путайте «+» и «-», за весь проект у меня сгорело 3 ардуино
2. Применяйте millis, оборачивайте им выполнение условия
3. Все прекрасно работает у вас на столе, как только переносите на место постоянного монтажа и длинна проводов значительно увеличивается, начинают творится непонятные вещи, обязательно что-то будет отказываться работать. Не забывайте в таком случае хорошо спаивать провода, проверяйте контакты, чтобы не было обрыва, плохого контакта, утечки, чтобы вдоль ваших проводов не шли провода 220В на большом протяжении (будет наводка), рассчитывайте сопротивление
4. Если дисплей выдает кракозябры, значит что-то не так, или программа написано коряво или с подключенными устройствами проблема или с их подключением (проводами). Дисплей будет как лакмусовая бумага реагировать таким образом на ваши неправильные действия, но сам он будет исправен
5. Проблема с delay. При использовании wifi модуля nodemcu v3.0 я поставил время задержки менее 100 мс на выполнение условия, в итоге никак не мог понять почему на сервер не уходит GET запрос, либо уходит, но в редких случаях. Поставил delay 100; - все заработало
6. Датчик DS18B20 показывал температуру -127,0, пока не дошел до сопротивления в 100-200 Ом

Фото ниже - врезана сенсорная кнопка в дверку из ЛДСП 16мм. На лицевой стороне толщина у меня составляет примерно 4мм, необходимый минимум чтобы сенсор реагировал на палец или ладонь.


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


Видео: отладка на столе


Видео: смонтированно и в рабочем состоянии


Ну вот и сам скетч - скачать

к началу статьи


Датчик температуры на NODEMCU V3.0

Это моя следующая работа после зависимой подсветки в ванне. На мой взгляд в разы труднее.
Здесь применяем полученные ранее навыки плюс работа nodemcu в режиме hardserial. Распиновка отличается от arduino UNO


На этом готовом примере можно понять принцип отправки данных на уделенный сервер и вывод на вебстраницу вашего сайта. Сначала монтируем как показано на фото ниже. Представлено 2 варианта по питанию и 2 разных wifi модуля (второй от амперки)
Питание можно взять от сети через зарядку для телефонов 5В, либо от батареек: (-) на GND (+) на VIN или если батарейки выдают не более 6В можно на пин 5В (в моем случае ничего не сгорело).
Не забываем про резистор на 4,7 кОм для датчика температуры DS18B20 между (+) и линией DATA.
Вот первый вариант






Здесь можно убрать перемычку между пинами D0 и RST. Данная перемычка выполняет функцию сна.

Второй вариант










Далее загружаем скетч в nodemcu.
Про скетч хочу пояснить одно - это как передавать информацию с помощью GET запроса.
client.print("GET /ваша папка/файл.php?"); GET передает информацию после знака вопроса в указанный файл. Далее на стороне сервера мы должны написать код, например на php, который обработает поступившую информацию. Сохраните файл temperature.php у себя на сайте. "t5" это переменная, которая приходит с nodemcu, save_temp5.txt - это файл, который автоматически создается когда поступает переменная, и записывает в него значение переменной. При каждом новом значении файл перезаписывается и у вас на странице по адресу: http://ваш_сайт.ru/папка/otobragenie.php отображается только последнее переданное значение. Вам так же надо закачать на свой сайт файл otobragenie.php, который выводит показания в онлайн режиме без обновления страницы на технологии AJAX, а для его работы также устанавливаем файл jquery.js и еще один файл с выводом данных temperature_v.php
В скетче (файл называется Proekt_esp_Wifi_ds18b20.ino) соответственно правим строки:
1. Бывает так что файл открылся, а текст не возможно прочесть, чтобы его отредактировать. Значит он находится в другой кодировке. Пути решения сменить кодировку с помощью программы notepad++, открыть в обычном блокноте. У меня кодировка utf-8.
2. В строчке #define DS18B20 5 при необходимости меняем число 5 на тот пин, на который хотите посадить вывод DATA.
3. Те строчки где необходимо указать "ваша_сеть", "ваш_пароль" и "ваш_сайт.ru" - ковычки оставляем без изменений. Название сайта должно быть без http:// или https:// или www., например: . На более сложном названии сайта: maksiki.000webhostapp.com, у меня не заработало или хостинг не дал такой возможности.
4. В строчках unsigned long period_time3 = 300000; - укажите желаемое время, через которое будут отсылаться данные.
5. В строчке IPAddress local_IP(192, 168, 0, 111); - укажите IP адрес, который должен назначить роутер при подсоединении к нему NODEMCU. 0 - это выражаясь не профессионально - зона или область, в которой находятся все точки подключения с 100 по 255. Если роутер работает в другой зоне, например 1, то и вы поставьте 1.
6. В строчке IPAddress gateway(192, 168, 0, 1); - оставляем 0 или меняем на то, что у вас значится в роутере
7. В строчке client.print("GET /ваша_папка/temperature.php?"); - указываем название вашей папки в корне сайте (сначала конечно вы ее должны создать, если не было). В строку браузера она будет выглядеть так: /ваша_папка/ или /nodemcu/ , а вней должен находится файл temperature.php. Конечно папку можно и не создавать, а размещать файл temperature.php в корне сайта, но это не комильфо.
8. В скетче есть еще строчка client.print("GET /ваша_папка/temperature5.php?"); - разница в том, что она отправляет данные на страницу temperature5.php - здесь я реализую запись поступивших данных в базу данных mysqli, но об этом в следующей статье
Итак в хорошем варианте у вас в корне сайта должна находится папка с названием например nodemcu, в ней должны быть файлы: jquery.js, otobragenie.php, save_temp5.txt, temperature.php, temperature_v.php.
Для успешной работы в них ничего править не требуется. Значение поступающие с NODEMCU V3.0 вы увидете у себя в браузере в строчке зеленого цвета, частота обновления 4 секунды.



Готовую программу можно - скачать

к началу статьи


PZEM-004T энергомонитор на NODEMCU V3.0









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

к началу статьи


Датчики на NODEMCU V3.0

Это моя следующая работа после зависимой подсветки в ванне. На мой взгляд в разы труднее.
Здесь применяем полученные ранее навыки плюс работа nodemcu в режиме hardserial. Распиновка отличается от arduino UNO


Значит что я подключил к NODEMCU V3.0:
1. Геркон (сухой контакт) открытия закрытия двери и окна по 1 шт. (300 руб)
2. Датчик температуры DS18B20 – 4 шт. (65 руб)
3. Датчик температуры DHT22 – 1 шт. (300 руб)
4. Датчик освещенности - 1 шт. (300 руб)
5. Твердотельное реле 240В 2А и SSR-1 440V 10A - 2 шт. (280 + 400 руб)
6. Датчик протечки или в моем случае два оголенных конца провода
Поясню про твердотельное реле, им можно замыкать/размыкать электрическую цепь, тем самым управлять подключенными приборами, например освещением, розетками или котлами обогрева, нужно подбирать по нагрузке. Я управляю только освещением.

Каждый датчик подключаете по схемам приложенных ниже. Пины указаны в скетче, здесь только для наглядности взяты из интернета.
Подключение DS18B20 на одной шине. Плюс к "+", минус к "-", дата провод один подключаем ко всем датчикам DS18B20 и подтягиваем резистором к "+", выбирая сопротивление в зависимости от длинны кабеля (начните от 4,7кОм и повышайте по необходимости).


Подключение DHT22 происходит так же, только не требуется резистора. Но не все библиотеки подходят, я выбрал <TroykaDHT.h>


Подключение датчика освещенности (фоторезистор на плате) согласно промаркированным выводам, и А0 подключаем к А0 (ADC0) на NODEMCU


Подключение датчика протечки. Принцип подключения как обычной тактовой кнопки с подтягивающим резистором.


Подключение твердотельного реле. Соответствующие выводы должны быть подписаны. Они разные в зависимости от модели по количеству проводов, по подключаемой нагрузке и по управляющему напряжению. Все выступающие металлические контакты покрыл силиконом, все-таки реле будет располагатся в силовом щите. Что же реле SSR-1 440V 10A, то у него есть небольшая неприятная вещь - это ток утечки 20-50мА. Когда выключаешь при помощи реле освещение, то этот самый ток утечки идет на ближайшую светодиодную лампочку и подсвечивает её.




Когда все провода подключены можно приступать к програмному коду.
В скетче указаны номера пинов подключаемых датчиков. Так же в нем почти все строки прокомментированы, если они не прокомментированы то вам их изменять точно не требуется, если только на свой риск.
В цикле void WIFIled() представлен код наполнения отображения веб страницы в локальной сети.
Отступление: "Для управлением реле переходим по соответсвующим ссылкам на странцы локальной сети и в зависимости от адреса ссылки выполняется действие."
Передача данных в базу данных сервера осуществляется в моем примере методом GET запроса. Есть еще и POST запрпос (он шифрует данные), но о нем не в этой статье.
Про передачу информации методом GET запроса можно подробно узнать на этой странице в статье: "Датчик температуры на NODEMCU V3.0" на примере одного датчика. Сейчас вместо одного датчика, будем использовать 6 разных типов.
Итак с передачей информации методом GET запроса вы должны быть знакомы, перейдем к приему и сохранению данных в БД mysqli (база данных).
Начнем с файла приема и обработки данных, назовем его priem_voda.php (для датчика протечки), вообще разницы нет как вы его назовете, ссылок на него больше нигде не будет кроме скетча. В скетче строчка будет такой - client.print("GET /ваша_папка/priem_voda.php?");
В файле priem_voda.php в строке include("../config.arduino.php"); подключаем файл с данными БД. Следовательно вам нужно создать файл в корне сайта config.arduino.php, в нем указываем: имя БД, пароль, имя юзера и localhost.
В строке $sostoyanie = $_GET["protech"]; - в переменную $sostoyanie передаются данные от nodemcu указанные в скетче в строках client.print("protech="); client.print("1");
Далее разбираем строку - mysqli_query($connect, "INSERT INTO protechka VALUES (NULL, NOW(), '$sostoyanie')"); - здесь создается запись строки в уже заранее созданную таблицу protechka со значениями:
NULL - это порядковый номер id
NOW() - это дата занесения данных в строку
$sostoyanie - это заносимое значение, которое мы отсылаем из nodemcu (0 или 1)
Перед тем как будут заносится данные в таблицу давайте ее создадим. Для этого в phpMyAdmin нужно нажать кнопку ИМПОРТ, выбрать файл protechka.sql с компьютера и загрузить.
Если использовать файл по каким-то причинам не получается, можно создать таблицу в ручную. Для этого щелкаем в панеле с лева под строкой названия вашей БД строку "новая", далее заполняем появившуюся таблицу:
По порядку, сначала указываем название таблицы в поле "Имя таблицы:" - protechka
Для первой строки, сюда будет автоматически заносится данные порядкового номера, в поле "имя" - печатаем id
В поле тип - int
В поле Длина/Значения - 6
В поле A_I - поставить галочку
Все остальные поля оставляем без изменений
Для второй строки в поле "имя" - печатаем date_time, как поняли, здесь будет присваиваться время и дата
В поле тип - DATETIME
Все остальные поля оставляем без изменений
Для третьей строки в поле "имя" - печатаем sostoyanie
В поле тип - TEXT
В поле сравнение - utf8_bin
Все остальные поля оставляем без изменений
Далее жмем сохранить
В панеле слева должна появиться таблица с названием protechka
Если все файлы, которые вы скачаете под этой статьей загружены на ваш сайт, nodemcu прошита скетчем, то данная таблица будет заполнятся автоматически посылаемыми с nodemcu значениями. Увидеть можно на вкладке "Обзор".
Дальше необходимо будет вывести поступаемые значения на страницу сайта и разместить в приятно читаемом виде.
Для этого создаем файл, имел ввиду скачиваем и загружаем, с названием prosmotr_voda.php на сайте, в том же месте где находятся файл конфигурации для БД (config.arduino.php) и файл приема и обработки данных (priem_voda.php).
Немного хочу пояснить некоторые строчки в файле prosmotr_voda.php
В теге style type="text/css" идет настройка расположения, отступов, величина шрифта, тип шрифта, цвета и т.д. для текста, блоков, рамок и таблиц.
В строке <div><a href="http://ваш_сайт.ru/ваша_папка/index.php" class="button9">назад</a></div><br>"); указана ссылка на главную страницу сайта.

В строке $link = mysqli_connect($DBSERVER, $DBUSER, $DBPASS, $DB); идет соединение с БД.

В строке $query1 = mysqli_query($link, "SELECT `date_time`,`sostoyanie` FROM protechka ORDER BY date_time DESC LIMIT 1"); делаем запрос в БД на вывод из таблицы "protechka" столбцов "date_time" и "sostoyanie" с выборкой по столбцу "date_time" только ОДНОЙ последней записи
В строках while($row = mysqli_fetch_array($query1)){ $d1=$row['date_time']; $s_replace5=$row['sostoyanie']; $s5 = str_replace($order5, $replace5, $s_replace5); $s_replace7=$row['sostoyanie']; $s7 = str_replace($order7, $replace7, $s_replace7); echo '<div>'; echo '<center>'; echo '<table width="100%">'; echo '<tr>'; echo '<td><center><font size="4">' . $row['date_time'] . '</font></center></td>'; echo '<td width="50%"><center><font color="#DC143C" size="4">сейчас - <font color="#0033FF"> ' . $s5 . '</font></font></center></td>'; echo '</tr>'; } $d_n = date("Y-m-d H:i:s", $TIME_ZONE); $razn = abs(strtotime($d_n) - strtotime($d1)); $years = floor($razn / (365*60*60*24)); $months = floor(($razn - $years * 365*60*60*24) / (30*60*60*24)); $days = floor(($razn - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); $hours = floor(($razn - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); $minuts = floor(($razn - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); $seconds = floor(($razn - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); echo '<tr>'; echo "<td><center>У Вас была <font color='#0033FF' size='4'>{$s7}</font></center></td>"; echo "<td width='50%'><center><font size='4'><font color='#0033FF'>{$months}</font> месяцев <font color='#0033FF'>{$days}</font> дней <font color='#0033FF'>{$hours}</font> часов <font color='#0033FF'>{$minuts}</font> мин <font color='#0033FF'>{$seconds}</font> сек назад</font></center></td>"; echo '</tr>'; echo '</table>'; echo '</center>'; echo '</div>'; идет выгрузка запрошен строк на подготовленное место на странице сайта и отсчитывается время предыдущей протечки от текущего времени.

Здесь $row['sostoyanie'] - это строка со значением 0 или 1, которую мы выводим и которое соответствует времени $row['date_time'].

Можно проще while($row = mysqli_fetch_array($query1)){ echo '<div id="block_temp2_3" class="h0"><font color="#696969"><center>' . $row['date_time'] . '</font></center></div>'; echo '<div id="block_temp1_3" class="h0"><center><font color="#0033FF"> ' .$row['sostoyanie'] . '</font></center></div><br />'; } Закончив с отправкой данных с одного датчика протечки нужно переходить к отправке данных с нескольких датчиков температуры, думаю стоит рассмотреть этот случай.
Nodemcu отправляет данные в строках: client.print("GET /ваша_папка/файл4.php?"); client.print("t1="); client.print(sensors.getTempC(sensor1)); client.print("&"); client.print("t2="); client.print(sensors.getTempC(sensor2)); client.print("&"); client.print("t3="); client.print(sensors.getTempC(sensor3)); client.print("&"); client.print("t4="); client.print(sensors.getTempC(sensor4)); Создадим и назовем файл для приема сведений о температуре - temperat.php
В запрорсе типа http://ваш_сайт.ru/ваша_папка/temperat.php?t1=27.2&t2=30.5&t3=40.5&t4=-12.7 через знак "&" передаются одновременно несколько переменных с данными.
В файле temperat.php принимаем эти переменные $t1 = $_GET["t1"] $t2 = $_GET["t2"] $t3 = $_GET["t3"] $t4 = $_GET["t4"], открываем соединение с БД и записываем в заранее созданную таблицу с названием temperature.
Вот так выглядит строка для записи в БД нескольких данных с переменных t1,t2,t1,3,t4, NULL и NOW() уже комментировались.mysqli_query($connect, "INSERT INTO temperature VALUES (NULL, NOW(), '$t1', '$t2','$t3', '$t4')"); Теперь про создание таблицы в БД:
Указываем название таблицы в поле "Имя таблицы:" - temperature
Для первой строки, сюда будет автоматически заносится данные порядкового номера, в поле "имя" - печатаем id
В поле тип - int
В поле Длина/Значения - 6
В поле A_I - поставить галочку
Все остальные поля оставляем без изменений
Для второй строки в поле "имя" - печатаем date_time, как поняли, здесь будет присваиваться время и дата
В поле тип - DATETIME
Все остальные поля оставляем без изменений
Для третьей строки в поле "имя" - печатаем t1
В поле тип - TEXT
не редактировал В поле сравнение - utf8_bin
Все остальные поля оставляем без изменений
Далее жмем сохранить


Все необходимые файлы для этой статьи можно здесь - скачать

к началу статьи


Смотрите также:
Ардуино часть_2

Комментарии

Добавить комментарий



Яндекс.Метрика 10
© Все права защищены. Распространение и копирование запрещено. Разработано Maksimus. 2011г.