#include #include #include /////////////////////////////////////////////////////////////////// // Set your SSID & Pass for initial configuration #include "../include/configuration.h" // application configuration /////////////////////////////////////////////////////////////////// #include "max7219.h" #include "webserver.h" DHT dht(DHT_PIN, DHT22); Timer procTimer, procRTimer; Timer displayTimer; // Sensors values float SensorT, SensorH, SensorHI, SensorCR; String StrCF; // Time values time_t Time, NTPLastUpdate; void process(); void connectOk(); void connectFail(); void showTime(); // UDP server void onReceive(UdpConnection& connection, char *data, int size, IPAddress remoteIP, uint16_t remotePort); // Declaration const uint16_t EchoPort = 777; UdpConnection udp(onReceive); // NTP Client void onNtpReceive(NtpClient& client, time_t timestamp); NtpClient ntpClient ("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive); // FTP Server; FTPServer ftp; void init() { spiffs_mount(); // Mount file system, in order to work with files Serial.begin(SERIAL_BAUD_RATE); // 115200 by default Serial.systemDebugOutput(false); // Debug output to serial Serial.println("Wall Segment Clock"); ActiveConfig = loadConfig(); // Select control line pinMode(CONTROL_PIN, OUTPUT); PinRes(CONTROL_PIN); //wait for sensor startup delay(1000); // DHT sensor start dht.begin(); // 7-segment output MAX7219_Init(); // set timezone hourly difference to UTC SystemClock.setTimeZone(ActiveConfig.AddTZ); WifiStation.config(ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword); WifiStation.enable(true); WifiAccessPoint.enable(false); WifiStation.waitConnection(connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start // раз в минуту? procTimer.initializeMs(60000, process).start(); process(); // обновление экрана два раза в секунду displayTimer.initializeMs(500, showTime).start(); } void showTime() { static int8_t oldHour, oldMinute; static time_t oldTime; DateTime dt; int16_t *year; Time = SystemClock.now(); if (oldTime != Time) { oldTime = Time; dt.setTime(Time); /* * теперь в dt у нас следующее: * int8_t Hour; * int8_t Minute; * int8_t Second; * int16_t Milliseconds; * int8_t Day; * int8_t DayofWeek; -- Sunday is day 0 * int8_t Month; // Jan is month 0 * int16_t Year; // Full Year numer */ MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus); if (oldMinute != dt.Minute) { oldMinute = dt.Minute; MAX7219_writeData(MAX7219_DIGIT3, dt.Minute/10); MAX7219_writeData(MAX7219_DIGIT4, dt.Minute%10); if (oldHour != dt.Hour) { oldHour = dt.Hour; MAX7219_writeData(MAX7219_DIGIT0, dt.Hour/10); MAX7219_writeData(MAX7219_DIGIT1, dt.Hour%10); } } } else // time the same, output blank for "hh mm" { MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus); } } /* * Читаем и данные с DHT22, в случае неудачи -- данные остануться старыми. * меня это полностью устраивает. */ void process() { TempAndHumidity th; ComfortState cf; static int8_t status; if(dht.readTempAndHumidity(th)) { status = 0; SensorT = th.temp; SensorH = th.humid; SensorHI = dht.getHeatIndex(); SensorCR = dht.getComfortRatio(cf); switch(cf) { case Comfort_OK: StrCF = "OK"; break; case Comfort_TooHot: StrCF = "Too Hot"; break; case Comfort_TooCold: StrCF = "Too Cold"; break; case Comfort_TooDry: StrCF = "Too Dry"; break; case Comfort_TooHumid: StrCF = "Too Humid"; break; case Comfort_HotAndHumid: StrCF = "Hot And Humid"; break; case Comfort_HotAndDry: StrCF = "Hot And Dry"; break; case Comfort_ColdAndHumid: StrCF = "Cold And Humid"; break; case Comfort_ColdAndDry: StrCF = "Cold And Dry"; break; default: StrCF = "Unknown"; break; } } else { /* * В случае, если от датчика ничего не получили, запустим повторный опрос через * 10 секунд, но не более 5 раз подряд. */ if (status < 6) { status ++; procRTimer.initializeMs(10000, process).startOnce(); } } } void startFTP() { // Start FTP server ftp.listen(21); ftp.addUser("user", "resu"); // FTP account // You can also use special FTP comand: "fsformat" for clearing file system (for example from TotalCMD) } void connectOk() { WifiAccessPoint.enable(false); Serial.print("I'm connecteed. IP: "); Serial.println(WifiStation.getIP().toString()); startWebServer(); startFTP(); udp.listen(EchoPort); } /* * в случае неудачи подключения поднимаем точку доступа без авторизации */ void connectFail() { WifiAccessPoint.config("MeteoConfig", "", AUTH_OPEN); WifiAccessPoint.enable(true); // Stop main screen output procTimer.stop(); displayTimer.stop(); Serial.println("WiFi MeteoConfig"); Serial.println(WifiAccessPoint.getIP()); startWebServer(); WifiStation.waitConnection(connectOk); // Wait connection } /* * NTP Client */ void onNtpReceive(NtpClient& client, time_t timestamp) { SystemClock.setTime(timestamp, eTZ_UTC); NTPLastUpdate = SystemClock.now(); Serial.println("*** Time synchronized OK! ***"); // DEBUG } /* * UDP Server */ void onReceive(UdpConnection& connection, char *data, int size, IPAddress remoteIP, uint16_t remotePort) { debugf("UDP Sever callback from %s:%d, %d bytes", remoteIP.toString().c_str(), remotePort, size); // We implement string mode server for example Serial.print(">\t"); Serial.print(data); if (data == "get_sensors") { String text = String("Temperature: ") + String(SensorT, 2) + String("\rHumidity: ") + String(SensorH, 2) + String("\r"); udp.sendStringTo(remoteIP, EchoPort, text); } else { // Send echo to remote sender String text = String("echo: ") + data; udp.sendStringTo(remoteIP, EchoPort, text); } }