Собрал метеостанцию, данные обновляются каждые 5 минут+-10сек. Для начала нужно было зарегистрироваться в проекте. Тут можно посмотреть пример работы разработанной метеостанции. Посмотрел пример с narodmon.ru под ардуино. Перепилил. Питание от LiFePo4 c подзарядкой от солнечной батарейки до 3,37В. Умеет работать с датчиком BME280, BMP280, c одним или несколькими DS18B20, шлет уровень VCC, % сигнала wifi, время millis() перед текущей отправкой данных. Автоматически определяет наличие датчиков и шлет по ним инфу на сервер. При первом запуске (или отсутствии сети) создает точку доступа на 10 секунд (нужно успеть подключится, сделано с целью экономии батареек при пропадании wifi). В веб интерфейсе можно просканировать сети и подключится к имеющийся либо вписать название сети вручную. после чего на сайт начинают отправляться данные а в SERIAL печатается уникальный ID станции( В случае если в коде поставить #define debug true иначе только ошибки выдает в Serial), который потом привяжется к сайту. Все показания, статистику на графиках можно смотреть в приложениях для разных платформ в том числе Android, IOS.
Лучше собирать на голой ESP. но под руками был только NOD MCU.
Схема заряда работает так: При достижении на солнечной батареи напряжения 3,7В (примерно) стабилизатор tl431 шунтирует солнечную батарею рассеивая излишек энергии в тепло. Далее на диоде падает примерно 0,4В и на выходе получаем 3,3-3,4В. В моих условиях солнечная батарея выдает максимум 8 мА тока(теневая сторона). tl321 может взять на себя до 100 мА. Соответственно не стоит брать мощную солнечную батарею.
Новая версия кода тут https://community.alexgyver.ru/threads/meteostancija-narodnogo-monitoringa.3529/post-48748
Еще новее но без датчиков DS18B20, очень экономит батарею https://community.alexgyver.ru/threads/meteostancija-narodnogo-monitoringa.3529/post-50793
При повторении регистрируйтесь на народмоне по реф. ссылке https://narodmon.ru/?invite=androidpasha (тогда мне разрешат подключить еще один приватный датчик)
И собственно код для Arduino IDE:
Лучше собирать на голой ESP. но под руками был только NOD MCU.
Схема заряда работает так: При достижении на солнечной батареи напряжения 3,7В (примерно) стабилизатор tl431 шунтирует солнечную батарею рассеивая излишек энергии в тепло. Далее на диоде падает примерно 0,4В и на выходе получаем 3,3-3,4В. В моих условиях солнечная батарея выдает максимум 8 мА тока(теневая сторона). tl321 может взять на себя до 100 мА. Соответственно не стоит брать мощную солнечную батарею.
Новая версия кода тут https://community.alexgyver.ru/threads/meteostancija-narodnogo-monitoringa.3529/post-48748
Еще новее но без датчиков DS18B20, очень экономит батарею https://community.alexgyver.ru/threads/meteostancija-narodnogo-monitoringa.3529/post-50793
При повторении регистрируйтесь на народмоне по реф. ссылке https://narodmon.ru/?invite=androidpasha (тогда мне разрешат подключить еще один приватный датчик)
И собственно код для Arduino IDE:
Код метеостанции:
#include <FS.h>
#include <FS.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
#include <DallasTemperature.h>
#include <Wire.h>
#include <BMx280I2C.h>
byte bmx_not_found = false;
BMx280I2C bmx280(0x76);
ADC_MODE(ADC_VCC);// Будем измерять напряжение на VCC внутри МК
#define debug false // вывод отладочных сообщений
#define postingInterval 930e6 // интервал между отправками данных в секундах (930 сек=15 минут)
#define ONE_WIRE_BUS 14 // GPIO к которому подключен DS18B20
#define TEMPERATURE_PRECISION 10 // точность бит.DS18B20 Если глючит или врет, уменьшить до 9
#define DS18b20_VCC 12 //Нога питания датчика температуры
#define BMX280_VCC 13 //Нога питания датчика давления
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int NumberOfDevices; //сколько датчиков найдем.
unsigned long lastConnectionTime = 0; // время последней передачи данных
String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.
void wifimanstart() { // Волшебная процедура начального подключения к Wifi.
// Если не знает к чему подцепить - создает точку доступа ESP8266 и настроечную таблицу http://192.168.4.1
// Подробнее: https://github.com/tzapu/WiFiManager
WiFiManager wifiManager;
wifiManager.setTimeout(10);//устанавливает время ожидания до выключения портала конфигурации полезно, чтобы все повторилось или пошло спать в секундах
wifiManager.setDebugOutput(debug);
wifiManager.setMinimumSignalQuality(1);//минимальное качество сигнала в % для попытки соединится
if (!wifiManager.autoConnect("meteostation")) {
Serial.println("failed to connect and hit timeout");
//Если не видно интернет то включаем точку доступа на 5 секунд и если не успели подключиться то спим 20 минут.
ESP.deepSleep(postingInterval);//СПИМ 20 МИНУТ
}
if (debug) Serial.println("connected...");
}
void setup() {
pinMode(DS18b20_VCC, OUTPUT); digitalWrite(DS18b20_VCC, HIGH); //d6
pinMode(BMX280_VCC, OUTPUT); digitalWrite(BMX280_VCC, HIGH); //d7
DeviceAddress tempDeviceAddress;
Serial.begin(115200);
sensors.begin(); //ds18b20
NumberOfDevices = sensors.getDeviceCount(); //поищем.
for (int i = 0; i < NumberOfDevices; i++) {
if (sensors.getAddress(tempDeviceAddress, i)) sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); //настроим.
}
sensors.requestTemperatures(); //Начали измерение ds18b20
Wire.begin();
if (!bmx280.begin()) {
Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
bmx_not_found = true;
}
if (debug){ if (bmx280.isBME280())Serial.println("sensor is a BME280"); else Serial.println("sensor is a BMP280");}
bmx280.resetToDefaults(); //reset sensor to default parameters.
bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
if (bmx280.isBME280()) bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);//Для BME
while (!bmx280.measure()) {
delay(10); // Ждем измерение
}
while (!bmx280.hasValue()) {
delay (10);
}
wifimanstart();
Hostname = "ESP" + WiFi.macAddress();
Hostname.replace(":", "");
WiFi.hostname(Hostname);
Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print("Narodmon ID: "); Serial.println(Hostname);
lastConnectionTime = millis() - postingInterval + 15000; //первая передача на народный мониторинг через 15 сек.
}
bool SendToNarodmon() { // Собственно формирование пакета и отправка.
bmx280.measure();
DeviceAddress tempDeviceAddress;
WiFiClient client;
String buf;
buf = "#" + Hostname + "\n"; //mac адрес для авторизации датчика
while (!bmx280.hasValue()) {
delay (5);
}
if (bmx_not_found == false) { // если bmx подключен то выводим с него данные
buf = buf + "#TEMPC#" + String(bmx280.getTemperature()) + "#Датчик температуры BMx280\n"; //показания температуры
if (bmx280.isBME280()) buf = buf + "#HUMID#" + String(bmx280.getHumidity()) + "#Датчик влажности BME280\n"; //показания влажности
buf = buf + "#PRESS#" + String(bmx280.getPressure64()) + "#Датчик давления BMx280\n"; //показания давления
}
for (int i = 0; i < NumberOfDevices; i++) { //перечисляем датчики 18b20 и их показания
sensors.getAddress(tempDeviceAddress, i);
buf = buf + "#";
for (uint8_t i = 0; i < 8; i++) {
if (tempDeviceAddress[i] < 16) buf = buf + "0"; // адрес датчика
buf = buf + String(tempDeviceAddress[i], HEX);
}
buf = buf + "#" + String(sensors.getTempCByIndex(i)) + "#DS18B20 №" + String(i + 1) + "\n"; //и температура
}
buf = buf + "#VCC#" + String(ESP.getVcc() + 350) + "#Напряжение батареи\n"; //показания температуры
int WIFIRSSI=constrain(((WiFi.RSSI()+100)*2),0,100);
buf = buf + "#WIFI#" + String(WIFIRSSI) + "#Уровень WI-FI " + String(WiFi.SSID()) + "\n"; // уровень WIFI сигнала
String worctime=String(millis());
float WTime=worctime.toInt();WTime/=1000;
buf = buf + "#WORKTIME#" + String(WTime) + "#Время передачи данных" + "\n"; // уровень WIFI сигнала
buf = buf + "##\n"; //окончание передачи
// попытка подключения
if (!client.connect("narodmon.ru", 8283)) {
Serial.println("connection failed"); return false; // не удалось;
}
else {
client.print(buf); // и отправляем данные
if (debug) Serial.print(buf);
delay(10);// сделать 100 если нужен ответ или 10 если не нужен . Время активности увеличивается в 2 раза
while (client.available()) {
String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
if (debug){Serial.println(line);}
}
}
return true; //ушло
}
void loop() {
yield();
if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
if (SendToNarodmon()) {
if (debug){Serial.print (millis());}
digitalWrite(DS18b20_VCC, LOW); digitalWrite(BMX280_VCC, LOW);// отключаем питание датчиков
ESP.deepSleep(postingInterval);
} else {ESP.deepSleep(postingInterval);}
}
yield();
}
Вложения
-
62.2 KB Просмотры: 84
Изменено: