wifi with relays

This commit is contained in:
2025-03-05 08:11:34 +02:00
parent 87b25e1f09
commit 7c88f3eb7a
6 changed files with 544 additions and 174 deletions

View File

@@ -1,82 +0,0 @@
/*
Please read README.md file in this folder, or on the web:
https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFiProv/examples/WiFiProv
Note: This sketch takes up a lot of space for the app and may not be able to flash with default setting on some chips.
If you see Error like this: "Sketch too big"
In Arduino IDE go to: Tools > Partition scheme > chose anything that has more than 1.4MB APP
- for example "No OTA (2MB APP/2MB SPIFFS)"
*/
#include "sdkconfig.h"
#if CONFIG_ESP_WIFI_REMOTE_ENABLED
#error "WiFiProv is only supported in SoCs with native Wi-Fi support"
#endif
#include "WiFiProv.h"
#include "WiFi.h"
// #define USE_SOFT_AP // Uncomment if you want to enforce using the Soft AP method instead of BLE
const char *pop = "abcd1234"; // Proof of possession - otherwise called a PIN - string provided by the device, entered by the user in the phone app
const char *service_name = "PROV_123"; // Name of your device (the Espressif apps expects by default device name starting with "Prov_")
const char *service_key = NULL; // Password used for SofAP method (NULL = no password needed)
bool reset_provisioned = true; // When true the library will automatically delete previously provisioned data.
// WARNING: SysProvEvent is called from a separate FreeRTOS task (thread)!
void SysProvEvent(arduino_event_t *sys_event) {
switch (sys_event->event_id) {
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("\nConnected IP address : ");
Serial.println(IPAddress(sys_event->event_info.got_ip.ip_info.ip.addr));
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: Serial.println("\nDisconnected. Connecting to the AP again... "); break;
case ARDUINO_EVENT_PROV_START: Serial.println("\nProvisioning started\nGive Credentials of your access point using smartphone app"); break;
case ARDUINO_EVENT_PROV_CRED_RECV:
{
Serial.println("\nReceived Wi-Fi credentials");
Serial.print("\tSSID : ");
Serial.println((const char *)sys_event->event_info.prov_cred_recv.ssid);
Serial.print("\tPassword : ");
Serial.println((char const *)sys_event->event_info.prov_cred_recv.password);
break;
}
case ARDUINO_EVENT_PROV_CRED_FAIL:
{
Serial.println("\nProvisioning failed!\nPlease reset to factory and retry provisioning\n");
if (sys_event->event_info.prov_fail_reason == NETWORK_PROV_WIFI_STA_AUTH_ERROR) {
Serial.println("\nWi-Fi AP password incorrect");
} else {
Serial.println("\nWi-Fi AP not found....Add API \" nvs_flash_erase() \" before beginProvision()");
}
break;
}
case ARDUINO_EVENT_PROV_CRED_SUCCESS: Serial.println("\nProvisioning Successful"); break;
case ARDUINO_EVENT_PROV_END: Serial.println("\nProvisioning Ends"); break;
default: break;
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(); // no SSID/PWD - get it from the Provisioning APP or from NVS (last successful connection)
WiFi.onEvent(SysProvEvent);
// BLE Provisioning using the ESP SoftAP Prov works fine for any BLE SoC, including ESP32, ESP32S3 and ESP32C3.
#if CONFIG_BLUEDROID_ENABLED && !defined(USE_SOFT_AP)
Serial.println("Begin Provisioning using BLE");
// Sample uuid that user can pass during provisioning using BLE
uint8_t uuid[16] = {0xb4, 0xdf, 0x5a, 0x1c, 0x3f, 0x6b, 0xf4, 0xbf, 0xea, 0x4a, 0x82, 0x03, 0x04, 0x90, 0x1a, 0x02};
WiFiProv.beginProvision(
NETWORK_PROV_SCHEME_BLE, NETWORK_PROV_SCHEME_HANDLER_FREE_BLE, NETWORK_PROV_SECURITY_1, pop, service_name, service_key, uuid, reset_provisioned
);
log_d("ble qr");
WiFiProv.printQR(service_name, pop, "ble");
#else
Serial.println("Begin Provisioning using Soft AP");
WiFiProv.beginProvision(NETWORK_PROV_SCHEME_SOFTAP, NETWORK_PROV_SCHEME_HANDLER_NONE, NETWORK_PROV_SECURITY_1, pop, service_name, service_key);
log_d("wifi qr");
WiFiProv.printQR(service_name, pop, "softap");
#endif
}
void loop() {}

View File

@@ -1,92 +0,0 @@
#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
const char* ap_ssid = "ESP32_Config";
const char* ap_password = "12345678";
WebServer server(80);
String ssid = "";
String password = "";
String static_ip = "";
String hostname = "";
void setup() {
Serial.begin(115200);
EEPROM.begin(512);
// Load saved settings
loadSettings();
// If settings are not set, enter AP mode
if (ssid == "" || password == "") {
WiFi.softAP(ap_ssid, ap_password);
Serial.println("AP Mode: Connect to the network and configure settings.");
server.on("/", handleRoot);
server.on("/save", handleSave);
server.begin();
} else {
// Connect to WiFi in client mode
WiFi.mode(WIFI_STA);
WiFi.config(IPAddress(static_ip.c_str()), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0));
WiFi.begin(ssid.c_str(), password.c_str());
WiFi.setHostname(hostname.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
}
}
void loop() {
if (WiFi.getMode() == WIFI_AP) {
server.handleClient();
}
}
void handleRoot() {
String html = "<form action='/save' method='POST'>";
html += "SSID: <input type='text' name='ssid'><br>";
html += "Password: <input type='text' name='password'><br>";
html += "Static IP: <input type='text' name='static_ip'><br>";
html += "Hostname: <input type='text' name='hostname'><br>";
html += "<input type='submit' value='Save'>";
html += "</form>";
server.send(200, "text/html", html);
}
void handleSave() {
ssid = server.arg("ssid");
password = server.arg("password");
static_ip = server.arg("static_ip");
hostname = server.arg("hostname");
saveSettings();
server.send(200, "text/html", "Settings saved. Rebooting...");
delay(2000);
ESP.restart();
}
void saveSettings() {
EEPROM.writeString(0, ssid);
EEPROM.writeString(32, password);
EEPROM.writeString(64, static_ip);
EEPROM.writeString(96, hostname);
EEPROM.commit();
}
void loadSettings() {
ssid = EEPROM.readString(0);
password = EEPROM.readString(32);
static_ip = EEPROM.readString(64);
hostname = EEPROM.readString(96);
}

View File

@@ -0,0 +1,3 @@

199
sketch_wifi/sketch_wifi.ino Normal file
View File

@@ -0,0 +1,199 @@
#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
#include "esp_mac.h" // required - exposes esp_mac_type_t values
const char* ap_ssid = "ESP32-AP";
const char* ap_password = "12345678";
const int userLedPin = 8; // Define the pin for the user LED
const int buttonPin = 0; // Define the pin for the button
WebServer server(80);
String ssid, password, static_ip, hostname;
bool isAPMode = false;
void handleRoot() {
String macAddress = getDefaultMacAddress();
String html = "<!DOCTYPE html><html><head><title>Configuration</title>";
html += "<style>";
html += "body { font-family: Arial, sans-serif; background-color: #f4f4f9; margin: 0; padding: 0; }";
html += ".container { max-width: 600px; margin: 50px auto; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); }";
html += "h2 { text-align: center; color: #333; }";
html += "form { display: flex; flex-direction: column; }";
html += "label { margin-bottom: 10px; color: #555; }";
html += "input[type='text'], input[type='password'] { padding: 10px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 4px; }";
html += "input[type='submit'] { padding: 10px; background-color: #28a745; color: #fff; border: none; border-radius: 4px; cursor: pointer; }";
html += "input[type='submit']:hover { background-color: #218838; }";
html += "</style></head><body>";
html += "<div class='container'><h2>Board Configuration</h2>";
html += "<form action='/save' method='POST'>";
html += "<label for='ssid'>SSID:</label>";
html += "<input type='text' id='ssid' name='ssid'><br>";
html += "<label for='password'>Password:</label>";
html += "<input type='password' id='password' name='password'><br>";
html += "<label for='static_ip'>Static IP:</label>";
html += "<input type='text' id='static_ip' name='static_ip'><br>";
html += "<label for='hostname'>Hostname:</label>";
html += "<input type='text' id='hostname' name='hostname'><br>";
html += "<label for='mac_address'>MAC Address:</label>";
html += "<input type='text' id='mac_address' name='mac_address' value='" + macAddress + "' readonly><br>";
html += "<input type='submit' value='Save'>";
html += "</form></div></body></html>";
server.send(200, "text/html", html);
}
void handleSave() {
ssid = server.arg("ssid");
password = server.arg("password");
static_ip = server.arg("static_ip");
hostname = server.arg("hostname");
saveSettings();
server.send(200, "text/html", "Settings saved. Device will restart in client mode.");
delay(2000);
ESP.restart();
}
void handleInfo() {
String html = "<!DOCTYPE html><html><head><title>Info</title>";
html += "<style>";
html += "body { font-family: Arial, sans-serif; background-color: #f4f4f9; margin: 0; padding: 0; }";
html += ".container { max-width: 600px; margin: 50px auto; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); }";
html += "h2 { text-align: center; color: #333; }";
html += "</style></head><body>";
html += "<div class='container'><h2>Connection Info</h2>";
if (WiFi.status() == WL_CONNECTED) {
html += "<p>Status: Connected</p>";
html += "<p>IP Address: " + WiFi.localIP().toString() + "</p>";
} else {
html += "<p>Status: Not Connected</p>";
}
html += "</div></body></html>";
server.send(200, "text/html", html);
}
void saveSettings() {
EEPROM.writeString(0, ssid);
EEPROM.writeString(32, password);
EEPROM.writeString(64, static_ip);
EEPROM.writeString(96, hostname);
EEPROM.commit();
}
void loadSettings() {
ssid = EEPROM.readString(0);
password = EEPROM.readString(32);
static_ip = EEPROM.readString(64);
hostname = EEPROM.readString(96);
}
void setup() {
Serial.begin(115200);
Serial.println("Setup started");
EEPROM.begin(128);
pinMode(userLedPin, OUTPUT);
digitalWrite(userLedPin, LOW);
pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with an internal pull-up resistor
loadSettings();
// Stop AP mode if it was previously started
WiFi.softAPdisconnect(true);
// Check if the button is pressed at startup
if (digitalRead(buttonPin) == LOW) {
Serial.println("Button pressed at startup. Starting in AP mode.");
startAPMode();
} else {
if (ssid.length() > 0 && password.length() > 0) {
Serial.println("Attempting to connect to WiFi with saved credentials:");
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("Password: ");
Serial.println(password);
WiFi.begin(ssid.c_str(), password.c_str());
Serial.print("Connecting to WiFi");
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED) {
if (millis() - startTime >= 10000) { // 10 seconds timeout
Serial.println("Failed to connect to WiFi.");
startAPMode();
return;
}
Serial.print(".");
delay(500);
}
Serial.println();
Serial.println("Connected to WiFi.");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Hostname: ");
Serial.println(hostname);
digitalWrite(userLedPin, HIGH); // Turn on the LED if connection is successful
isAPMode = false;
} else {
Serial.println("No saved WiFi credentials found. Starting in AP mode.");
startAPMode();
}
}
Serial.println("Setup completed");
}
void loop() {
server.handleClient();
blinkLed();
}
void blinkLed() {
static unsigned long lastBlinkTime = 0;
static bool ledState = LOW;
unsigned long interval = isAPMode ? 1000 : 3000; // 1 second interval for AP mode, 3 seconds for client mode
if (millis() - lastBlinkTime >= interval) {
ledState = !ledState;
digitalWrite(userLedPin, ledState);
lastBlinkTime = millis();
}
}
void startAPMode() {
WiFi.softAP(ap_ssid, ap_password);
Serial.println("Access Point Started");
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP());
server.on("/", handleRoot);
server.on("/save", handleSave);
server.on("/info", handleInfo);
server.begin();
isAPMode = true;
}
String getDefaultMacAddress() {
String mac = "";
unsigned char mac_base[6] = {0};
if (esp_efuse_mac_get_default(mac_base) == ESP_OK) {
char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
mac = buffer;
}
return mac;
}
String getInterfaceMacAddress(esp_mac_type_t interface) {
String mac = "";
unsigned char mac_base[6] = {0};
if (esp_read_mac(mac_base, interface) == ESP_OK) {
char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
mac = buffer;
}
return mac;
}

24
test_but/test_but.ino Normal file
View File

@@ -0,0 +1,24 @@
const int buttonPin = 0; // Assuming BUT1 is connected to GPIO 0
const int ledPin = 8; // Assuming the user LED is connected to GPIO 8
//test1
void setup() {
Serial.begin(115200);
Serial.println("Setup started");
pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with an internal pull-up resistor
pinMode(ledPin, OUTPUT); // Set the LED pin as output
Serial.println("Setup completed");
}
void loop() {
int buttonState = digitalRead(buttonPin); // Read the state of the button
if (buttonState == LOW) {
Serial.println("Button is pressed");
digitalWrite(ledPin, HIGH); // Turn on the LED
} else {
Serial.println("Button is not pressed");
digitalWrite(ledPin, LOW); // Turn off the LED
}
delay(2000); // Add a 2-second delay between readings
}

View File

@@ -0,0 +1,318 @@
#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include "esp_mac.h" // required - exposes esp_mac_type_t values
//ver 0.0.2
const char* ap_ssid = "ESP32-AP"; // SSID for the Access Point mode
const char* ap_password = "12345678"; // Password for the Access Point mode
const int userLedPin = 8; // Define the pin for the user LED
const int buttonPin = 0; // Define the pin for the button
const int relayPins[4] = {10, 11, 22, 23}; // Define the pins for the relays
const int inputPins[4] = {1, 2, 3, 15}; // Define the pins for the inputs
WebServer server(80); // Create a web server on port 80
String ssid, password, static_ip, netmask, gateway, hostname; // Variables to store WiFi settings
bool isAPMode = false; // Flag to indicate if the board is in AP mode
unsigned long lastStatusPrintTime = 0; // Variable to keep track of the last status print time
// Handle the root URL ("/") and serve the configuration page
void handleRoot() {
String macAddress = getDefaultMacAddress();
String html = "<!DOCTYPE html><html><head><title>Configuration</title>";
html += "<meta http-equiv='refresh' content='1'>"; // Refresh the page every second
html += "<style>";
html += "body { font-family: Arial, sans-serif; background-color: #f4f4f9; margin: 0; padding: 0; }";
html += ".container { max-width: 600px; margin: 50px auto; padding: 20px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); }";
html += "h2 { text-align: center; color: #333; }";
html += "form { display: flex; flex-direction: column; }";
html += "label { margin-bottom: 10px; color: #555; }";
html += "input[type='text'], input[type='password'] { padding: 10px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 4px; }";
html += "input[type='submit'] { padding: 10px; background-color: #28a745; color: #fff; border: none; border-radius: 4px; cursor: pointer; }";
html += "input[type='submit']:hover { background-color: #218838; }";
html += "button { padding: 10px; background-color: #007bff; color: #fff; border: none; border-radius: 4px; cursor: pointer; margin: 5px; }";
html += "button:hover { background-color: #0056b3; }";
html += "</style></head><body>";
if (isAPMode) {
html += "<div class='container'><h2>Board Configuration</h2>";
html += "<form action='/save' method='POST'>";
html += "<label for='ssid'>SSID:</label>";
html += "<input type='text' id='ssid' name='ssid' value='" + ssid + "'><br>";
html += "<label for='password'>Password:</label>";
html += "<input type='password' id='password' name='password' value='" + password + "'><br>";
html += "<label for='static_ip'>Static IP:</label>";
html += "<input type='text' id='static_ip' name='static_ip' value='" + static_ip + "'><br>";
html += "<label for='netmask'>Netmask:</label>";
html += "<input type='text' id='netmask' name='netmask' value='" + netmask + "'><br>";
html += "<label for='gateway'>Gateway:</label>";
html += "<input type='text' id='gateway' name='gateway' value='" + gateway + "'><br>";
html += "<label for='hostname'>Hostname:</label>";
html += "<input type='text' id='hostname' name='hostname' value='" + hostname + "'><br>";
html += "<label for='mac_address'>MAC Address:</label>";
html += "<input type='text' id='mac_address' name='mac_address' value='" + macAddress + "' readonly><br>";
html += "<input type='submit' value='Save'>";
html += "</form></div>";
}
// Add WiFi connection information if connected
if (WiFi.status() == WL_CONNECTED) {
html += "<div class='container'><h2>Connection Info</h2>";
html += "<p>Status: Connected</p>";
html += "<p>IP Address: " + WiFi.localIP().toString() + "</p>";
html += "<p>Hostname: " + hostname + "</p>";
html += "</div>";
// Add relay and input status with control buttons
html += "<div class='container'><h2>Relay and Input Status</h2>";
for (int i = 0; i < 4; i++) {
html += "<p>Relay " + String(i + 1) + ": " + (digitalRead(relayPins[i]) == HIGH ? "ON" : "OFF") + "</p>";
html += "<form action='/relay' method='POST'>";
html += "<input type='hidden' name='relay' value='" + String(i) + "'>";
html += "<button type='submit' name='action' value='on'>Turn ON</button>";
html += "<button type='submit' name='action' value='off'>Turn OFF</button>";
html += "</form>";
html += "<p>Input " + String(i + 1) + ": " + (digitalRead(inputPins[i]) == LOW ? "Pressed" : "Not Pressed") + "</p>";
}
html += "</div>";
} else {
html += "<div class='container'><h2>Connection Info</h2>";
html += "<p>Status: Not Connected</p>";
html += "</div>";
}
html += "</body></html>";
server.send(200, "text/html", html);
}
// Handle the save URL ("/save") and save the WiFi settings
void handleSave() {
ssid = server.arg("ssid");
password = server.arg("password");
static_ip = server.arg("static_ip");
netmask = server.arg("netmask");
gateway = server.arg("gateway");
hostname = server.arg("hostname");
saveSettings();
server.send(200, "text/html", "Settings saved. Device will restart in client mode.");
delay(2000);
ESP.restart();
}
// Handle the relay control URL ("/relay") and control the relays
void handleRelay() {
int relay = server.arg("relay").toInt();
String action = server.arg("action");
if (relay >= 0 && relay < 4) {
if (action == "on") {
digitalWrite(relayPins[relay], HIGH);
} else if (action == "off") {
digitalWrite(relayPins[relay], LOW);
}
}
server.sendHeader("Location", "/");
server.send(303);
}
// Save the WiFi settings to EEPROM
void saveSettings() {
EEPROM.writeString(0, ssid);
EEPROM.writeString(32, password);
EEPROM.writeString(64, static_ip);
EEPROM.writeString(96, netmask);
EEPROM.writeString(128, gateway);
EEPROM.writeString(160, hostname);
EEPROM.commit();
}
// Load the WiFi settings from EEPROM
void loadSettings() {
ssid = EEPROM.readString(0);
password = EEPROM.readString(32);
static_ip = EEPROM.readString(64);
netmask = EEPROM.readString(96);
gateway = EEPROM.readString(128);
hostname = EEPROM.readString(160);
}
void setup() {
Serial.begin(115200);
Serial.println("Setup started");
EEPROM.begin(192);
pinMode(userLedPin, OUTPUT);
digitalWrite(userLedPin, LOW);
pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with an internal pull-up resistor
for (int i = 0; i < 4; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Turn off all relays at startup
pinMode(inputPins[i], INPUT_PULLUP); // Set input pins as input with internal pull-up resistors
}
loadSettings();
// Stop AP mode if it was previously started
WiFi.softAPdisconnect(true);
// Check if the button is pressed at startup
if (digitalRead(buttonPin) == LOW) {
Serial.println("Button pressed at startup. Starting in AP mode.");
startAPMode();
} else {
if (ssid.length() > 0 && password.length() > 0) {
Serial.println("Attempting to connect to WiFi with saved credentials:");
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("Password: ");
Serial.println(password);
// Convert Strings to IPAddress objects
IPAddress ip, gw, nm;
if (!ip.fromString(static_ip) || !gw.fromString(gateway) || !nm.fromString(netmask)) {
Serial.println("Invalid IP configuration. Starting in AP mode.");
startAPMode();
return;
}
// Set hostname and static IP configuration
WiFi.config(ip, gw, nm);
WiFi.setHostname(hostname.c_str());
WiFi.begin(ssid.c_str(), password.c_str());
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED) {
if (millis() - startTime >= 10000) { // 10 seconds timeout
Serial.println("Failed to connect to WiFi. Starting in AP mode.");
startAPMode();
return;
}
delay(500);
}
Serial.println("Connected to WiFi.");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Hostname: ");
Serial.println(WiFi.getHostname());
digitalWrite(userLedPin, HIGH); // Turn on the LED if connection is successful
isAPMode = false;
startWebServer();
} else {
Serial.println("No saved WiFi credentials found. Starting in AP mode.");
startAPMode();
}
}
Serial.println("Setup completed");
}
void loop() {
server.handleClient();
blinkLed();
printStatus();
}
// Blink the LED to indicate the mode (AP mode or client mode)
void blinkLed() {
static unsigned long lastBlinkTime = 0;
static bool ledState = LOW;
unsigned long interval = isAPMode ? 1000 : 3000; // 1 second interval for AP mode, 3 seconds for client mode
if (millis() - lastBlinkTime >= interval) {
ledState = !ledState;
digitalWrite(userLedPin, ledState);
lastBlinkTime = millis();
}
}
// Print the status of the board every 20 seconds
void printStatus() {
if (millis() - lastStatusPrintTime >= 20000) { // 20 seconds interval
Serial.println("Board Status:");
if (isAPMode) {
Serial.println("Mode: Access Point");
Serial.print("AP SSID: ");
Serial.println(ap_ssid);
Serial.print("AP IP Address: ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println("Mode: Client");
Serial.print("Connected to SSID: ");
Serial.println(ssid);
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Hostname: ");
Serial.println(WiFi.getHostname());
}
for (int i = 0; i < 4; i++) {
Serial.print("Relay ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(digitalRead(relayPins[i]) == HIGH ? "ON" : "OFF");
Serial.print("Input ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(digitalRead(inputPins[i]) == LOW ? "Pressed" : "Not Pressed");
}
Serial.println();
lastStatusPrintTime = millis();
}
}
// Start the Access Point mode
void startAPMode() {
WiFi.softAP(ap_ssid, ap_password);
Serial.println("Access Point Started");
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP());
server.on("/", handleRoot);
server.on("/save", handleSave);
server.on("/relay", handleRelay); // Add handler for relay control
server.begin();
isAPMode = true;
}
// Start the web server in client mode
void startWebServer() {
server.on("/", handleRoot);
server.on("/save", handleSave);
server.on("/relay", handleRelay); // Add handler for relay control
server.begin();
}
// Get the default MAC address of the ESP32
String getDefaultMacAddress() {
String mac = "";
unsigned char mac_base[6] = {0};
if (esp_efuse_mac_get_default(mac_base) == ESP_OK) {
char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
mac = buffer;
}
return mac;
}
// Get the MAC address of a specific interface
String getInterfaceMacAddress(esp_mac_type_t interface) {
String mac = "";
unsigned char mac_base[6] = {0};
if (esp_read_mac(mac_base, interface) == ESP_OK) {
char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
mac = buffer;
}
return mac;
}