#include <Wire.h>
#include <Adafruit_SHT4x.h> // Knihovna pro SHT4x
#include <WiFi.h>
#include <WiFiManager.h>
#include <ESP32AnalogRead.h>
#include <esp_sleep.h>
const char* serverUrl = "http://www.ardumet.cz/pokojicek/data.php?pokojicek=sklep";
// Globální proměnné pro ukládání dat
float batteryVoltage;
int wifiSignalStrength;
float temperature;
float humidity;
int sleepIntervalMinutes = 5; // Čas uspání v minutách
// Pin pro měření napětí na baterii
int batteryPin = 35;
// Pin pro LED na IO5
int ledPin = 5;
// Callback pro nastavení Wi-Fi v konfiguračním režimu
void configModeCallback(WiFiManager *myWiFiManager) {
Serial.println("Entered config mode");
Serial.println(WiFi.softAPIP());
// you can use this IP to connect to the WiFi manager portal
}
void setup() {
// Inicializace sériové komunikace pro debug výstupy
Serial.begin(115200);
// Inicializace ESP32AnalogRead
ESP32AnalogRead adc;
adc.attach(batteryPin);
// Inicializace LED pinu
pinMode(ledPin, OUTPUT);
// Připojení k Wi-Fi pomocí WiFiManager
WiFiManager wifiManager;
// Nastavení WiFi režimu na stanici (WIFI_STA)
WiFi.mode(WIFI_STA);
// Nastavení dalších preferencí WiFiManageru
wifiManager.setWiFiAutoReconnect(true);
wifiManager.setConnectRetries(3);
wifiManager.setDarkMode(true);
wifiManager.setConnectTimeout(5);
wifiManager.setSaveConnectTimeout(5);
// Nastavení maximální doby trvání portálu na 60 sekund
wifiManager.setConfigPortalTimeout(60);
// Nastavení callbacku pro konfigurační režim
wifiManager.setAPCallback(configModeCallback);
// Nastavení názvu hostitele (hostname) na základě MAC adresy WiFi
String hostname = "LOLIN32_" + WiFi.macAddress();
hostname.replace(":", ""); // Odstranění dvojteček
wifiManager.setHostname(hostname.c_str());
// Použití vlastního menu ve WiFiManageru
std::vector<const char *> menu = {"wifi", "restart", "exit"};
wifiManager.setMenu(menu);
bool res;
res = wifiManager.autoConnect(hostname.c_str()); // anonymous ap
if(!res) {
Serial.println("Pripojeni k WIFI selhalo, restartuji ....");
// Nastavení uspání na zadaný čas v mikrosekundách
esp_sleep_enable_timer_wakeup(sleepIntervalMinutes * 60 * 1000000);
// Krátké zpoždění před započetím uspání
delay(100);
// Zavolání funkce pro uspání
esp_deep_sleep_start();
} else {
Serial.print("WIFI signal RSSI: ");
Serial.println(WiFi.RSSI());
}
// Inicializace SHT40
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
// Připojení k serveru
WiFiClient client;
if (client.connect(serverUrl, 80)) {
// Měření napětí na baterii s lineárním výstupem
float voltage = adc.readVoltage() * 4096.0 / 7.445;
batteryVoltage = voltage;
// Měření signálu Wi-Fi v procentech
wifiSignalStrength = map(WiFi.RSSI(), -100, -40, 0, 100);
// Měření teploty a vlhkosti pomocí SHT40
if (sht4.begin()) {
Serial.println("SHT4x nalezeno.");
sht4.setPrecision(SHT4X_LOW_PRECISION);
sht4.setHeater(SHT4X_NO_HEATER);
sensors_event_t hum, temp;
sht4.getEvent(&hum, &temp);
temperature = temp.temperature;
humidity = hum.relative_humidity;
} else {
temperature = 0;
humidity = 0;
}
// Odeslání dat na server
String postData = "battery=" + String(batteryVoltage) +
"&wifi=" + String(wifiSignalStrength) +
"&temperature=" + String(temperature) +
"&humidity=" + String(humidity);
client.print("POST ");
client.print(serverUrl);
client.println(" HTTP/1.1");
client.println("Host: www.ardumet.cz");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(postData.length());
client.println();
client.println(postData);
// Přečtení odpovědi serveru
String response = "";
while (client.available()) {
char c = client.read();
response += c;
}
// Výpis, zda byla data odeslána úspěšně nebo nastala chyba
if (response.indexOf("HTTP/1.1 200 OK") != -1) {
Serial.println("Data odeslána úspěšně.");
Serial.println(response);
// rozsvitit LED
digitalWrite(ledPin, HIGH);
delay(1500);
digitalWrite(ledPin, LOW);
} else {
Serial.println("Chyba při odesílání dat. Odpověď serveru:");
Serial.println(response);
// Probliknout LED dvakrát jako indikaci chyby
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(300);
}
}
}
// Nastavení uspání na zadaný čas v mikrosekundách
esp_sleep_enable_timer_wakeup(sleepIntervalMinutes * 60 * 1000000);
// Krátké zpoždění před započetím uspání
delay(100);
// Zavolání funkce pro uspání
esp_deep_sleep_start();
}
void loop() {
// Tato funkce se nikdy nezavolá, protože zařízení po deepSleepu znovu startuje až po uplynutí času uspání.
}