#include #include #include #include #include const char* ssid = "ESP32_Slave"; #define M0_PIN 23 #define M1_PIN 32 #define AUX_PIN 4 const int oneWireBus = 5; // DS18B20 на GPIO5 OneWire oneWire(oneWireBus); DallasTemperature sensors(&oneWire); const int controlPins[] = {12, 13, 14}; const int numControlPins = sizeof(controlPins) / sizeof(controlPins[0]); WebServer server(80); LoRa_E32 e32(&Serial2, AUX_PIN, M0_PIN, M1_PIN); String receivedMessage = ""; float temperature = 0.0; float cpuTemp = 0.0; String testResult = "Not tested yet"; #pragma pack(push, 1) struct Message { char type; // 'C'-command, 'T'-temp, 'S'-test, 'A'-ack int pin; int state; float temp; float cpu_temp; }; #pragma pack(pop) void setup() { Serial.begin(115200); Serial2.begin(9600); for (int i = 0; i < numControlPins; i++) { pinMode(controlPins[i], OUTPUT); digitalWrite(controlPins[i], LOW); } sensors.begin(); WiFi.softAP(ssid, NULL, 11); e32.begin(); ResponseStructContainer c = e32.getConfiguration(); Configuration configuration = *(Configuration*)c.data; configuration.ADDL = 0x02; configuration.ADDH = 0x00; configuration.CHAN = 0x15; configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuration.OPTION.fec = FEC_1_ON; configuration.OPTION.transmissionPower = POWER_20; e32.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE); c.close(); server.on("/", HTTP_GET, []() { String html = "ESP32 Slave"; html += ""; html += ""; html += "

ESP32 Slave Controller

"; html += "

Pin Status

"; for (int i = 0; i < numControlPins; i++) { int pinState = digitalRead(controlPins[i]); html += "
"; html += "GPIO" + String(controlPins[i]) + "
" + String(pinState ? "ON" : "OFF") + "
"; } html += "
"; html += "

Control Pins

"; html += "
"; html += ""; html += ""; html += "
"; html += "

Temperatures

"; html += "

CPU Temperature: " + String(cpuTemp) + " °C

"; html += "

DS18B20 Temperature: " + String(temperature) + " °C

"; html += "
"; html += "

Connection Test

"; html += "
" + testResult + "
"; html += "

Last Received

" + receivedMessage + "

"; server.send(200, "text/html", html); }); server.on("/control", HTTP_POST, []() { if (server.hasArg("pin") && server.hasArg("state")) { int pin = server.arg("pin").toInt(); int state = server.arg("state").toInt(); digitalWrite(pin, state); Message msg; msg.type = 'C'; msg.pin = pin; msg.state = state; msg.temp = 0.0; msg.cpu_temp = 0.0; e32.sendFixedMessage(0, 0x01, 0x15, &msg, sizeof(Message)); } server.sendHeader("Location", "/"); server.send(303); }); server.on("/temperature", HTTP_POST, []() { sensors.requestTemperatures(); temperature = sensors.getTempCByIndex(0); cpuTemp = temperatureRead(); Message msg; msg.type = 'T'; msg.pin = 0; msg.state = 0; msg.temp = temperature; msg.cpu_temp = cpuTemp; e32.sendFixedMessage(0, 0x01, 0x15, &msg, sizeof(Message)); server.sendHeader("Location", "/"); server.send(303); }); server.begin(); } void loop() { server.handleClient(); cpuTemp = temperatureRead(); if (e32.available() > 0) { ResponseContainer rc = e32.receiveMessage(); if (rc.status.code == 1) { Message msg; memcpy(&msg, rc.data.c_str(), sizeof(msg)); if (msg.type == 'C') { receivedMessage = "CMD:SETPIN:" + String(msg.pin) + ":" + String(msg.state); for (int i = 0; i < numControlPins; i++) { if (controlPins[i] == msg.pin) digitalWrite(msg.pin, msg.state); } } else if (msg.type == 'T') { if (msg.temp == 0.0) { sensors.requestTemperatures(); temperature = sensors.getTempCByIndex(0); cpuTemp = temperatureRead(); Message response; response.type = 'T'; response.pin = 0; response.state = 0; response.temp = temperature; response.cpu_temp = cpuTemp; e32.sendFixedMessage(0, 0x01, 0x15, &response, sizeof(Message)); } else { temperature = msg.temp; receivedMessage = "TEMP:" + String(temperature) + " CPU:" + String(msg.cpu_temp); } } else if (msg.type == 'S') { testResult = "Received test signal from Master"; receivedMessage = "TEST:SIGNAL"; Message ack; ack.type = 'A'; ack.pin = 0; ack.state = 0; ack.temp = 0.0; ack.cpu_temp = 0.0; e32.sendFixedMessage(0, 0x01, 0x15, &ack, sizeof(Message)); } } } }