//#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
bme280Breakout