Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)

Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon) Электроника

Здравствуйте, уважаемые читатели и самоделкины!
У многих из Вас имеются домашние «метеостанции», самые простые из которых умеют отображать текущую температуру и влажность в помещении. Более продвинутые версии имеют проводные и беспроводные выносные датчики, и могут запоминать пиковые значения.
Намного более интересными выглядят проекты на основе модулей NodeMcu — будучи оснащенными модулем WiFi они могут передавать показания датчиков на специальный сайт народного мониторинга.
Так Вы сможете посмотреть графики или текущие показания сенсоров своей станции из любой точки мира.
Там же на карте отображаются все метеостанции, подключенные к этому проекту. Возможностей у проекта много, и приводить их все не буду.
В данной статье Алесей, автор YouTube канала «arduinoLab», расскажет Вам как можно сделать цифровой датчик температуры с WiFi и передачей данных на сайт народного мониторинга.
Этот проект весьма прост в изготовлении, и с ним справится даже начинающий.
Материалы, необходимые для самоделки.
— Модуль ESP-01 WiFi
— Цифровой датчик температуры DS1820
— Датчик атмосферного давления BMP180
— Стабилизатор напряжения AMS1117 3.3
— Набор резисторов
— Набор танталовых конденсаторов
— Макетная плата, соединительные провода
— Герметичная коммутационная коробка 89×43×37 мм
— Термоусадочная трубка с клеевым наполнителем, провода, припой.
Инструменты, использованные автором.
— Паяльник с регулировкой температуры T12
— Лабораторный блок питания.
Процесс изготовления.
Итак, основой для этой самоделки послужит весьма дешевый модуль ESP-01.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)В первой версии Алексей собрал все на макетной плате, и использовал простой стабилизатор напряжения на 3.3В из серии LM78xx.
К плате был подключен цифровой датчик температуры DS1820 в корпусе TO-92, и загерметизирован термоусадочной трубкой.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Настройки датчиков на сайте, и график температуры на смартфоне выглядят вот так.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Плата питается напряжением 5В, и для этого подойдет старое зарядное устройство. Стабилизатор понижает его до 3.3В.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Схема подключения выглядит следующим образом.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Имея подключение по WiFi к точке доступа с интернетом, плата передает данные на сайт. Последний идентифицирует ее по MAC адресу. Его нужно будет указывать при регистрации датчика.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Вот так выглядит последняя версия прошивки. В ней нужно будет прописать имя и пароль от Вашей точки доступа, чтобы плата смогла подключиться к интернету.
// отправка данных на народмон.ру с градусника ds18b20
// для ESP8266, ver0.3
// изменена работа с градусниками, теперь работа с 18b20 при помощи библиотеки DallasTemperature
// добавленна работа с несколькоими градусниками, данные отправляются со всех подключенных 18b20
// из основного цикла убран delay
//, но как и прошлая версия, оно немного глючит.
#include
#include
#include // https://github.com/milesburton/Arduino-Temperature-Control-Library
#include
OneWire ds (2); // on pin 2 (a 4.7K resistor is necessary)
DallasTemperature sensors (&ds);
Ticker flipper;
const char* ssid = «SSID»;
const char* password = «PASS»;
const char* host = «narodmon.ru»;
const int httpPort = 8283;
const int interval = 10*60; // 10 минут
int tm = interval;
int deviceCount = 0;
void flip (){
tm–;
// Serial.println™;
}
void setup () {
Serial.begin (115200);
delay (10);
sensors.begin ();
delay (10);
deviceCount = sensors.getDeviceCount (); // узнаем количество подключенных градусников
// sensors.getAddress (Address18b20, 0);
sensors.setResolution (10); // устанавливаем разрешение градусника 9, 10, 11, или 12 bit
sensors.requestTemperatures (); // забераем температуру с градусника
Send (); // при включении отправляем данные
flipper.attach (1, flip); // запускаем таймер
}
/// функция отправляет данные на народмон.ру
void Send () {
// Подключаемся к wifi
Serial.println ();
Serial.println ();
Serial.print («Connecting to «);
Serial.println (ssid);
WiFi.begin (ssid, password);
while (WiFi.status () ≠ WL_CONNECTED) {
delay (500);
Serial.print (».»);
}
Serial.println (); // отправляем в Serial данные о подключении
Serial.println («WiFi connected»);
Serial.print («IP address: «);
Serial.println (WiFi.localIP ());
Serial.print («MAC address: «);
Serial.println (WiFi.macAddress ());
Serial.println ();
// подключаемся к серверу
Serial.print («connecting to «);
Serial.println (host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect (host, httpPort)) {
Serial.println («connection failed»);
return;
}
// отправляем данные
Serial.println («Sending…»);
// заголовок
client.print (»#»);
client.print (WiFi.macAddress ()); // отправляем МАС нашей ESP8266
client.print (»#»);
client.print («ESP8266»); // название устройства
// client.print (»#»);
// client.print («45.031660#39.004750»); // координаты местонахождения датчика
client.println ();
// в цикле отправляем данные с подключенных градусников.
for (int i = 0; i ≤ deviceCount — 1; i++){
DeviceAddress Address18b20;
sensors.getAddress (Address18b20, i);
float temp = sensors.getTempC (Address18b20);
client.print (»#»);
for (int i = 0; i < 8; i++) client.print (Address18b20[i], HEX); // номер 18b20
client.print (»#»);
client.println (temp);
}
client.println (»##»);
delay (10);
// читаем ответ с и отправляем его в сериал
// вообще на ответ нужно как-то реагировать
Serial.print («Requesting: «);
while (client.available ()){
String line = client.readStringUntil (‘r’);
Serial.print (line);
}
client.stop ();
Serial.println ();
Serial.println ();
Serial.println («Closing connection»);
WiFi.disconnect (); // отключаемся от сети
Serial.println («Disconnect WiFi.»);
}
void loop () {
if (tm == 0){ // если таймер отработал
flipper.detach (); // выключаем
tm = interval; // сбрасываем переменную таймера
sensors.requestTemperatures (); // забераем температуру с градусника
delay (10);
Send (); // отправляем
flipper.attach (1, flip); // включаем прерывание по таймеру
}
}
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Вот эту строку нужно будет раскомментировать (включить, убрав //), если нужно передавать данные о местоположении датчика.
В ней же нужно указать правильные координаты места.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Через некоторое время Алексей переделал проект, и упаковал его в герметичную коммутационную коробку размерами 89×43×37 мм. Это позволит установить датчик на улице.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)На этот раз использован цифровой датчик температуры DS1820 в герметичной металлической гильзе. Он выведен из корпуса через муфту с уплотнительным кольцом.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Также он сделал простенькую печатную плату, и установил хороший стабилизатор напряжения AMS1117 на 3.3В.
Фильтрами питания послужит пара танталовых конденсаторов
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Файл с макетом печатной платы Вы можете скачать по следующей ссылке, любезно предоставленной мастером.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)К шине данных можно подключить сразу несколько датчиков температуры DS1820, для чего используется библиотека DallasTemperature.
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Для подключения большего количества датчиков (атмосферного давления, влажности, освещенности и проч.), нужно применять вот такой модуль ESP12 с большим числом портов.
Прошивка для работы с датчиком атмосферного давления BMP180 представлена ниже.
// отправка данных на народмон.ру и cloudmqtt с модуля BMP180HTU21BH1750
// для ESP8266
#include
#include
#include «SparkFunHTU21D.h»
#include
#include
#include
#include
const char* ssid = «WLAN1»;
const char* password = «1231234123»;
#define mqtt_server «m11.cloudmqtt.com» // mqtt брокер
#define mqtt_login «123»
#define mqtt_password «123»
#define mqtt_port 1883 // порт подключения к mqtt, у cloudmqtt порт отличный от 1883
const char* host = «narodmon.ru»;
const int httpPort = 8283;
const int interval = 10*60; // 10 минут
//const int interval = 10; // 10 минут
int tm = interval;
int deviceCount = 0;
Ticker flipper;
HTU21D HTU21;
SFE_BMP180 BMP180;
BH1750 lightMeter;
WiFiClient client;
PubSubClient mqttclient (client);
float getBMP180(){
char status;
double T,P,p0,a;
status = BMP180.startTemperature ();
if (status ≠ 0) {
delay (status);
status = BMP180.getTemperature (T);
if (status ≠ 0) {
status = BMP180.startPressure (3);
if (status ≠ 0)
{
// Wait for the measurement to complete:
delay (status);
status = BMP180.getPressure (P,T);
if (status ≠ 0)
{
// Print out the measurement:
return P/1.333;
}
else Serial.println («error retrieving pressure measurementn»);
}
else Serial.println («error starting pressure measurementn»);
}
else Serial.println («error retrieving temperature measurementn»);
}
else Serial.println («error starting temperature measurementn»);
}
void flip (){
tm–;
Serial.println™;
}
void setup () {
Serial.begin (115200);
delay (10);
Wire.begin (2, 0);
HTU21.begin ();
BMP180.begin ();
lightMeter.begin ();
setup_wifi ();
mqttclient.setServer (mqtt_server, mqtt_port);
SendMQTT (); // при включении отправляем данные
// SendNarodmon ();
WiFi.disconnect ();
flipper.attach (1, flip); // запускаем таймер
}
/// функция отправляет данные на народмон.ру
void SendNarodmon () {
float HTU21humd = HTU21.readHumidity ();
float HTU21temp = HTU21.readTemperature ();
float BMP180Pressure = getBMP180();
int BH1750lux = lightMeter.readLightLevel ();
// подключаемся к серверу
Serial.print («connecting to «);
Serial.println (host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect (host, httpPort)) {
Serial.println («connection failed»);
return;
}
// отправляем данные
Serial.println («Narodmon sending…»);
// заголовок
client.print (»#»);
client.print (WiFi.macAddress ()); // отправляем МАС нашей ESP8266
client.print (»#»);
client.print («ESP8266»); // название устройства
client.println ();
// отправляем данные с подключенных градусников.
client.print (»#HTU21temp#»);
client.println (HTU21temp);
client.print (»#HTU21humd#»);
client.println (HTU21humd);
client.print (»#BMP180Pressure#»);
client.println (BMP180Pressure);
client.print (»#BH1750Light#»);
client.println (BH1750lux);
client.println (»##»);
delay (10);
// читаем ответ с и отправляем его в сериал
// вообще на ответ нужно както реагировать
Serial.print («Requesting: «);
while (client.available ()){
String line = client.readStringUntil (‘r’);
Serial.print (line);
}
client.stop ();
Serial.println ();
Serial.println ();
Serial.println («Closing connection»);
}
void SendMQTT () {
char msgT[7];
char msgH[7];
char msgP[7];
char msgL[7];
float HTU21temp = HTU21.readTemperature ();
float HTU21humd = HTU21.readHumidity ();
float BMP180Pressure = getBMP180();
int BH1750lux = lightMeter.readLightLevel ();
dtostrf (HTU21temp, 6, 2, msgT);
dtostrf (HTU21humd, 6, 2, msgH);
dtostrf (BMP180Pressure, 6, 2, msgP);
snprintf (msgL, sizeof (msgL), «%02d», BH1750lux);
if (!mqttclient.connected ()) {
Serial.print («Attempting MQTT connection…»);
// создаем случайный идентификатор клиента
String clientId = «ESP8266Client-»;
clientId += String (random (0xffff), HEX);
// подключаемся, в client.connect передаем ID, логин и пасс
if (mqttclient.connect (clientId.c_str (), mqtt_login, mqtt_password)) {
Serial.println («connected»); // если подключились
mqttclient.publish («Temperature», msgT);
mqttclient.publish («Humidity», msgH);
mqttclient.publish («Pressure», msgP);
mqttclient.publish («LightLevel», msgL);
Serial.println («MQTT Send OK»);
} else { // иначе ругаемся в монитор порта
Serial.println («MQTT connection failed»);
delay (5000);
}
}
}
void setup_wifi () {
delay (10);
// We start by connecting to a WiFi network
Serial.println ();
Serial.print («Connecting to «);
Serial.println (ssid);
WiFi.begin (ssid, password);
while (WiFi.status () ≠ WL_CONNECTED) {
delay (500);
Serial.print (».»);
}
randomSeed (micros ());
Serial.println (»»);
Serial.println («WiFi connected»);
Serial.println («IP address: «);
Serial.println (WiFi.localIP ());
}
void loop () {
if (tm == 0){ // если таймер отработал
flipper.detach (); // выключаем
tm = interval; // сбрасываем переменную таймера
setup_wifi ();
// отправляем
SendMQTT ();
SendNarodmon ();
WiFi.disconnect (); // отключаемся от сети
Serial.println («Disconnect WiFi.»);
flipper.attach (1, flip); // включаем прерывание по таймеру
}
}
Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Цифровой «онлайн» датчик температуры (с отслеживанием на сайте narodmon)Сайт «народного мониторинга» требует, чтобы датчик показывал корректные значения, и устанавливать его нужно исключительно в тени, или создавать для него защитный кожух.
Если Вам не нужны такие «навороты», то можно взять обычную метеостанцию с выносными радиодатчиками.
Благодарю Алексея за простую схему и прошивку «онлайн» датчика температуры.
За развитием проекта можно следить на следующей авторской страничке.
Всем хорошего настроения, крепкого здоровья, и интересных идей!
Подписывайтесь на телеграм-канал сайта, чтобы не пропустить новые статьи.
Авторское видео можно посмотреть здесь.

Оцените статью
Добавить комментарий