//#include <Arduino.h>
//#include <Wire.h> // нужна только для Arduino 1.6.5 и старее
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <U8g2lib.h>
#include <DHT.h> // Либа для датчиков DHT
//#include <BME280I2C.h> // Либа для датчиков BME --- поключение SCL ---> 4 SDA ---> 5
#include "GyverNTP.h"
//#include <ESP8266WiFi.h>
#include <WiFi.h>
#include <DNSServer.h>
//#include <WiFiUdp.h>
#include <string>
//#include "EmonLib.h" // ------- ДЛЯ ДАТЧИКА ТОКА
void printLocalTime(void);
void GetIP(void);
bool SendToNarodmon();
void ConnectWIFI();
const char* ssid = "Wokwi-GUEST"; // Имя сети
const char* password = ""; // Пароль
IPAddress ip; // переменная для IP адреса.. в дальнейшем будем выводить на экран, если выводить в loop
// текущее значение IP, срабатывает watchdog и постоянные перезагрузки контроллера
char buf[16]; // переменная для IP адреса ------ мак 30:AE:A4:0E:A0:D4
unsigned long lastConnectionTime = 0; // время последней передачи данных
String Hostname; //имя железки - выглядит как WROOMAABBCCDDEEFF т.е. WROOM+mac адрес.
//BME280I2C bme; // Default : forced mode, standby time = 1000 ms
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
#define postingInterval 600000 // интервал между отправками данных в миллисекундах (10 минут)
//#define DHT1PIN 15 //
#define DHT2PIN 13 //
#define DHT3PIN 14 //
//#define DHT1TYPE DHT22 // DHT 22 (AM2302)
#define DHT2TYPE DHT21 // DHT 21 (AM2301)
#define DHT3TYPE DHT21 // DHT 21 (AM2301)
//DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
DHT dht3(DHT3PIN, DHT3TYPE);
//EnergyMonitor emon1; // ------- ДЛЯ ДАТЧИКА ТОКА
GyverNTP ntp(3);
U8G2_SSD1306_128X64_NONAME_F_SW_I2C display(U8G2_R0, /* clock=*/ 4, /* data=*/ 5, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C // инициализация дисплея
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 10800;
const int daylightOffset_sec = 10800;
bool getLTime(struct tm * info, uint32_t ms = 5000)
{
uint32_t start = millis();
time_t now;
while ((millis() - start) <= ms) {
time(&now);
localtime_r(&now, info);
if (info->tm_year > (2016 - 1900)) {
return true;
}
delay(10);
}
return false;
}
void setup() {
display.begin(); //display.flipScreenVertically();
display.clearBuffer();
display.enableUTF8Print();
display.setFont(u8g2_font_6x12_tr);
display.sendBuffer();
Serial.begin(115200);
ntp.begin();
display.clearBuffer();
display.setCursor(109, 5);
display.print("Initialising sensors ...");
display.sendBuffer();
dht2.begin(); dht3.begin();
delay(2000);
// while(!bme.begin())
// {
// Serial.println("Could not find BME280 sensor!");
// display.clear(); display.drawString(0,0,"Could not find BME280\nsensor!"); display.display();
// delay(2000);
// }
// switch(bme.chipModel())
// {
// case BME280::ChipModel_BME280:
// Serial.println("Found BME280 sensor! Success.");
// display.clear(); display.drawString(0,0,"Found BME280 sensor!\nSuccess."); display.display();
// break;
// case BME280::ChipModel_BMP280:
// Serial.println("Found BMP280 sensor! No Humidity available.");
// display.clear(); display.drawString(0,0,"Found BMP280 sensor!\nNo Humidity available."); display.display();
// break;
// default:
// Serial.println("Found UNKNOWN sensor! Error!");
// display.clear(); display.drawString(0,0,"Found UNKNOWN sensor!\nError!"); display.display();
// }
delay(2000);
// We start by connecting to a WiFi network
//Serial.println();
//Serial.println();
//Serial.print("Connecting to ");
//Serial.println(ssid);
// Hostname = "WROOM"+WiFi.macAddress();
Hostname = "WROOM30AEA40EA0D4"; // ПРОПИСЫВАЕМ ЭТОТ ID ДЛЯ WROOM !!!!!!!!!!!!!!!
//Hostname.replace(":","");
// wifimanstart();
// WiFi.hostname(Hostname);
WiFi.begin(ssid, password);
Serial.println("Connecting to " + String (ssid));
while (WiFi.status() != WL_CONNECTED) {
display.clear();
Serial.print(".");
display.clearBuffer();
display.setCursor(109, 5);
display.print( "Connecting to...\n" + String (ssid));
display.sendBuffer();
delay(1000);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(buf);
Serial.print("MAC address: ");
Serial.println(WiFi.macAddress());
Serial.print("Narodmon ID: "); Serial.println(Hostname); // выдаем в компорт мак и айпишник железки, так же выводим на дисплей
Serial.println("----------\r");
GetIP();
display.clearBuffer();
display.drawStr(0,36,buf);
display.sendBuffer();
lastConnectionTime = millis() - postingInterval + 15000; //первая передача на народный мониторинг через 15 сек.
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//pinMode(A0, INPUT); // ------- ДЛЯ ДАТЧИКА ТОКА
//emon1.current(A0, 111.1); // ------- ДЛЯ ДАТЧИКА ТОКА
//Udp.begin(localPort);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) // нет подключения к WiFi
{
ConnectWIFI(); //подключаемся к WiFi
}
ntp.tick();
if (millis() - lastConnectionTime > postingInterval) {// ждем postingInterval минут и отправляем
if (WiFi.status() == WL_CONNECTED) // ну конечно если подключены
{
if (SendToNarodmon())
{
lastConnectionTime = millis();
}
else
{
lastConnectionTime = millis() - postingInterval + 15000;
}//следующая попытка через 15 сек
}
else
{
lastConnectionTime = millis() - postingInterval + 15000;
Serial.println("Not connected to WiFi");
display.clearBuffer();
display.clearDisplay();
display.drawRFrame(0, 38, 111, 9, 1);
display.drawStr(0, 36, "Not connected to WiFi");
display.sendBuffer();
}//следующая попытка через 15 сек
} yield();
unsigned long current = millis();
static unsigned long previous = current;
//if (событие сброса ) {previous = current;}
if (current - previous > 1000) {
previous = current;
// что-то делается
printLocalTime();
} yield();
}
bool SendToNarodmon()
{ // Собственно формирование пакета и отправка.
WiFiClient client;
String buf_w;
float temp(NAN), hum(NAN), pres(NAN), temp2(NAN), hum2(NAN), temp3(NAN), hum3(NAN);
// BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
// BME280::PresUnit presUnit(BME280::PresUnit_Pa);
// bme.read(pres, temp, hum, tempUnit, presUnit);
hum2 = dht2.readHumidity(); temp2 = dht2.readTemperature();
hum3 = dht3.readHumidity(); temp3 = dht3.readTemperature();
pres /= 133.3;
display.clear();
if (isnan(hum) || isnan(temp) || isnan(pres)) {
display.drawStr(0, 0, "Error sensor 1");
} else {
display.setCursor(0, 0);
display.print( "H1: " + String(hum) + "%\t" + " T1: " + String(temp) + "°C");
display.setCursor(0, 27);
display.print("Pressure: " + String(pres) + " mmHg\t");
}
if (isnan(hum2) || isnan(temp2)) {
display.drawStr(0, 9, "Error sensor 2");
} else display.setCursor(0, 9);
display.print("H2: " + String(hum2) + "%\t" + " T2: " + String(temp2) + "°C");
if (isnan(hum3) || isnan(temp3)) {
display.drawStr(0, 18, "Error sensor 3");
} else display.setCursor(0, 18);
display.print("H3: " + String(hum3) + "%\t" + " T3: " + String(temp3) + "°C");
if (WiFi.status() != WL_CONNECTED) {
display.drawStr(0, 36, "Not connected to WiFi");
} else {
display.drawStr(0, 36, buf);
}
display.display();
Serial.printf(ntp.timeString().c_str());
Serial.print("\tT1: "); Serial.print(temp); Serial.print("°C");
Serial.print("\tH1: "); Serial.print(hum); Serial.print("% RH");
Serial.print("\tP: "); Serial.print(pres); Serial.println(" mmHg");
Serial.print("\tT2: "); Serial.print(temp2); Serial.print("°C");
Serial.print("\tH2: "); Serial.print(hum2); Serial.println("% RH");
Serial.print("\tT3: "); Serial.print(temp3); Serial.print("°C");
Serial.print("\tH3: "); Serial.print(hum3); Serial.println("% RH"); Serial.println("----------\r");
// delay(1000);
// buf_w = "#" + Hostname + "#WROOM" + "\r\n"; // заголовок И ИМЯ, которое будет отображаться в народном мониторинге, чтоб не палить мак адрес
// //dhttemp=dht.readTemperature(); // сохравняем в буферные переменные данные с dht22, чтобы удобно было оперировать
// //dhthum=dht.readHumidity();
// //buf = buf + "#T1#" + String(dhttemp) + "\r\n"; // buf = buf + "#T1#" + String(bmp.readTemperature()) + "\r\n"; //температура bmp180
// buf_w = buf_w + "#T1#" + String(temp) + "\r\n"; //температура BME
// buf_w = buf_w + "#H1#" + String(hum) + "\r\n"; //влажность
// buf_w = buf_w + "#P1#" + String(pres) + "\r\n"; //давление // buf = buf + "#P1#" + String(bmp.readPressure()) + "\r\n"; //давление
// buf_w = buf_w + "#T2#" + String(temp2) + "\r\n"; //температура dht21
// buf_w = buf_w + "#H2#" + String(hum2) + "\r\n"; //влажность
// buf_w = buf_w + "#T3#" + String(temp3) + "\r\n"; //температура dht21
// buf_w = buf_w + "#H3#" + String(hum3) + "\r\n"; //влажность
// buf_w = buf_w + "##\r\n"; // закрываем пакет
if (!client.connect("narodmon.ru", 8283)) { // попытка подключения
Serial.println("Connection Failed\n");
display.drawRFrame(0, 38, 111, 9, 1);
display.drawStr(0, 36, "Connection Failed");
display.sendBuffer();
return false; // не удалось;
} else
{
client.print(buf_w); // и отправляем данные
Serial.println(buf_w);
Serial.println("----------\r");
while (client.available()) {
String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
Serial.print(line);
}
}
return true; //ушло
display.sendBuffer();
}
void GetIP()
{
ip = WiFi.localIP();
sprintf(buf, "IP:%d.%d.%d.%d", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3] );
}
void printLocalTime()
{
struct tm timeinfo;
if (!ntp.synced()) {
display.drawRFrame(0, 47, 128, 9, 1);
display.drawStr(0, 45, "Failed to obtain time");
display.sendBuffer();
Serial.println("Failed to obtain time");
return;
}
// Serial.println(&timeinfo, "%d %b %Y %H:%M:%S, %a");
display.drawRFrame(0, 47, 128, 9, 1);
display.drawStr(0, 45, ntp.timeString().c_str());
display.sendBuffer();
}
void ConnectWIFI()
{
Serial.println("Подключение к WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// WiFi.config(ip, gateway, subnet);
}
Loading
ssd1306
ssd1306