wifi with relays
This commit is contained in:
@@ -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() {}
|
||||
92
simple-wifi.
92
simple-wifi.
@@ -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);
|
||||
}
|
||||
3
sketch_test_button/sketch_test_button.ino
Normal file
3
sketch_test_button/sketch_test_button.ino
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
|
||||
|
||||
199
sketch_wifi/sketch_wifi.ino
Normal file
199
sketch_wifi/sketch_wifi.ino
Normal 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
24
test_but/test_but.ino
Normal 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
|
||||
}
|
||||
318
wifi_set_and_server/wifi_set_and_server.ino
Normal file
318
wifi_set_and_server/wifi_set_and_server.ino
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user