#include <Arduino.h>
#include <U8g2lib.h>
//#include <WiFi.h>
#include <WiFiConnector.h>
#include <GyverNTP.h>
#include "DHT.h"
#include "Graphics.h"
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void Draw_Screen_0 ();
void Draw_Screen_1 ();
void Draw_Screen_2 ();
void Draw_Caption ();
void printDate (int x, int y);
void printTime (int x, int y);
void printWiFi (int x, int y);
void printIP (int x, int y);
bool State_Colon;
int True_Screen = 0,
WiFi_Signal_vol;
unsigned long C_01_sec, P_01_sec,
C_03_sec, P_03_sec,
C_05_sec, P_05_sec,
C_1_sec, P_1_sec,
C_5_sec, P_5_sec,
C_1_min, P_1_min; // = millis();
const char* ssid = "Wokwi-GUEST"; // подставить название своей сети WiFi
const char* password = ""; //подставить пароль свой сети WiFi
#define DHT1PIN 13
#define DHT2PIN 14
#define DHTTYPE DHT22
DHT dht1(DHT1PIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);
static const char *dayNames[] = {
"Пн",
"Вт",
"Ср",
"Чт",
"Пт",
"Сб",
"Вс",
};
static const char *monthNames[] = {
"Янв",
"Фев",
"Мар",
"Апр",
"Май",
"Июн",
"Июл",
"Авг",
"Сен",
"Окт",
"Ноя",
"Дек",
};
float State_by_Hours [8] [24],
State_by_Minutes [8] [60];
GyverNTP ntp(3);
void setup(void) {
Serial.begin(9600);
u8g2.begin();
u8g2.setBitmapMode(1);
u8g2.enableUTF8Print();
dht1.begin();
dht2.begin();
WiFiConnector.connect(ssid, password);
WiFiConnector.onConnect([]() {
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
});
WiFiConnector.onError([]() {
Serial.println("WiFi error");
});
ntp.begin();
P_01_sec = P_03_sec = P_05_sec = P_1_sec = P_5_sec = millis();
}
void loop(void) {
ntp.tick();
//---------------------- Блок таймеров ------------------------------
C_01_sec = C_03_sec = C_05_sec = C_1_sec = C_5_sec = C_1_min = millis();
//---------------------- 0.1 секунды --------------------------------
if (C_01_sec - P_01_sec >= 100) {
P_01_sec = C_01_sec;
}
//---------------------- 0.25 секунды --------------------------------
if (C_03_sec - P_03_sec >= 250) {
if (WiFi.status() != WL_CONNECTED) {
WiFi_Signal_vol = 0;
} else {
WiFi_Signal_vol = map(WiFi.RSSI(), -100, -35, 1, 5);
// Шкала 0 - 100, 4 - 35 дБм.
}
switch (True_Screen)
{
case 0:
Draw_Screen_0();
break;
case 1:
Draw_Screen_1();
break;
default:
Draw_Screen_1();
break;
}
P_03_sec = C_03_sec;
}
//---------------------- 0.5 секунды --------------------------------
if (C_05_sec - P_05_sec >= 500) {
WiFiConnector.tick();
P_05_sec = C_05_sec;
}
//---------------------- 1 секунда ----------------------------------
if (C_1_sec - P_1_sec >= 1000) {
State_Colon = ! State_Colon;
P_1_sec = C_1_sec;
}
//---------------------- 5 секунд ------------------------------------
if (C_5_sec - P_5_sec >= 5000) {
True_Screen++;
if (True_Screen > 1 ) True_Screen = 0;
Serial.println(ntp.status());
Serial.println(WiFiConnector.connected());
P_5_sec = C_5_sec;
}
//---------------------- 1 минута ------------------------------------
if (C_1_min - P_1_min >= 60000) {
float h1 = dht1.readHumidity();
float h2 = dht2.readHumidity();
float t1 = dht1.readTemperature();
float t2 = dht2.readTemperature();
if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) {
Serial.println(F("Failed to read from DHT sensors!"));
return;
}
// float hif1 = dht1.computeHeatIndex(f1, h1);
// float hif2 = dht2.computeHeatIndex(f2, h2);
// float hic1 = dht1.computeHeatIndex(t1, h1, false);
// float hic2 = dht2.computeHeatIndex(t2, h2, false);
P_1_min = C_1_min;
}
}
void Draw_Screen_0 () {
u8g2.clearBuffer();
Draw_Caption();
// u8g2.setFont(u8g2_font_6x13_tr);
u8g2.setFont(u8g2_font_profont11_tr);
u8g2.drawXBMP(2, 20, 11, 13, weather_temperature); // температура
u8g2.drawStr(15, 30, "-02,09");
u8g2.drawXBMP(2, 34, 11, 13, weather_humidity_white); // влажность
u8g2.drawStr(15, 44, "82,19");
u8g2.drawXBMP(2, 48, 11, 13, weather_pressure); // давление
u8g2.drawStr(15, 58, "736,52");
u8g2.drawXBMP(52, 22, 39,39, basel);
// u8g2.drawXBMP(55, 34, 11, 13, weather_wind);
// u8g2.drawStr(68, 44, "3,1M/c");
// u8g2.drawXBMP(2, 48, 11, 13, weather_flug);
// u8g2.drawStr(15, 58, "-CB- 144");
u8g2.sendBuffer();
}
void Draw_Screen_1 () {
u8g2.clearBuffer();
Draw_Caption();
// u8g2.setFont(u8g2_font_6x13_tr);
u8g2.setFont(u8g2_font_profont11_tr);
u8g2.drawXBMP(2, 20, 11, 13, weather_temperature);
u8g2.drawStr(15, 30, "+22,54");
u8g2.drawXBMP(2, 34, 11, 13, weather_humidity_white);
u8g2.drawStr(15, 44, "43,65");
u8g2.drawXBMP(55, 20, 11, 13, weather_temperature);
u8g2.drawStr(68, 30, "+21,77");
u8g2.drawXBMP(55, 34, 11, 13, weather_humidity_white);
u8g2.drawStr(68, 44, "31,53");
u8g2.sendBuffer();
}
void Draw_Screen_2 () {
u8g2.clearBuffer();
u8g2.sendBuffer();
}
void Draw_Caption () {
printWiFi (116, 1);
printTime (1, 10);
printDate (1, 16);
printIP (63, 10);
u8g2.drawLine(1, 18, 126, 18);
u8g2.drawLine(60, 1, 60, 16);
}
void printDate (int x, int y) {
char buffer[40];
if (ntp.online()) {
sprintf(buffer, "%02u %s %d %s", ntp.day(), monthNames[ntp.month() - 1], ntp.year(), dayNames[ntp.weekDay() - 1]);
} else {
// sprintf(buffer, "-- --- ---- --");
sprintf(buffer, "Ошибка времени");
}
u8g2.setCursor(x, y);
// u8g2.setFont(u8g2_font_5x8_t_cyrillic);
u8g2.setFont(u8g2_font_4x6_t_cyrillic);
u8g2.print(buffer);
}
void printTime (int x, int y) {
char buffer[12];
const char colon [2] = {' ', ':'};
u8g2.setFont(u8g2_font_profont15_mn);
// u8g2.setFont(u8g2_font_spleen8x16_mn);
// u8g2.setFont(u8g2_font_freedoomr10_mu);
// u8g2.setFont(u8g2_font_12x6LED_mn);
if (ntp.online()) {
sprintf(buffer, "%02u%c%02u%c%02u", ntp.hour(), colon[State_Colon], ntp.minute(), colon[State_Colon], ntp.second());
} else {
sprintf(buffer, "--%c--%c--", colon[State_Colon], colon[State_Colon]);
}
u8g2.setCursor(x, y);
u8g2.print(buffer);
}
void printWiFi (int x, int y) {
u8g2.drawXBMP(x, y, 11, 11, image_network_allArray[WiFi_Signal_vol]);
if (WiFi_Signal_vol) {
u8g2.setFont(u8g2_font_4x6_t_cyrillic);
// u8g2.setFont(u8g2_font_micro_mr);
u8g2.setCursor(x - 8, y + 5); // u8g2.setCursor(x - 5, y + 5);
u8g2.print(WiFi.RSSI());
}
}
void printIP (int x, int y) {
u8g2.setFont(u8g2_font_4x6_t_cyrillic);
u8g2.setCursor(x, y);
u8g2.print(WiFi.SSID());
u8g2.setCursor(x, y + 6);
u8g2.print(WiFi.localIP());
}