Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********* Pleasedontcode.com **********
- Pleasedontcode thanks you for automatic code generation! Enjoy your code!
- - Terms and Conditions:
- You have a non-exclusive, revocable, worldwide, royalty-free license
- for personal and commercial use. Attribution is optional; modifications
- are allowed, but you're responsible for code maintenance. We're not
- liable for any loss or damage. For full terms,
- please visit pleasedontcode.com/termsandconditions.
- - Project: **Smart Control**
- - Version: 002
- - Source Code NOT compiled for: ESP32S3 Dev Module
- - Source Code created on: 2026-03-15 10:51:11
- ********* Pleasedontcode.com **********/
- /****** SYSTEM REQUIREMENTS *****/
- /****** SYSTEM REQUIREMENT 1 *****/
- /* Blink LED1 with 1000ms interval (1 second on, 1 */
- /* second off). LED connected to GPIO pin. */
- /****** SYSTEM REQUIREMENT 2 *****/
- /* [POTA] Include POTA.h and secrets.h. Init POTA in */
- /* setup() with WiFi creds from secrets.h. Call */
- /* pota.loop() in loop(). */
- /****** SYSTEM REQUIREMENT 3 *****/
- /* [POTA] MANDATORY OTA: call */
- /* pota.checkAndPerformOTA() in setup() after */
- /* begin(). Register pota.onOTAAvailable(cb) where cb */
- /* sets a bool flag. In loop() when flag is true call */
- /* pota.restart(). Without OTA the device cannot */
- /* update remotely. */
- /****** END SYSTEM REQUIREMENTS *****/
- /****** DEFINITION OF LIBRARIES *****/
- #include <POTA.h>
- #include "secrets.h"
- /****** FUNCTION PROTOTYPES *****/
- void setup(void);
- void loop(void);
- void setupDashboard(void);
- void setupCallbacks(void);
- void setInitialValues(void);
- void updateSensorValues(void);
- void updateCharts(void);
- void otaAvailableCallback(const char* version);
- /***** DEFINITION OF DIGITAL OUTPUT PINS *****/
- const uint8_t LED1_LED_PIN_D1 = 1;
- // Interval definition for LED blink (1000ms = 1 second on, 1 second off)
- const unsigned long LED_BLINK_INTERVAL = 1000;
- // POTA instance for OTA management and dashboard
- POTA pota;
- // Flag to track if OTA is available
- bool otaAvailable = false;
- unsigned long lastLEDToggle = 0;
- unsigned long lastSensorUpdate = 0;
- const unsigned long SENSOR_UPDATE_INTERVAL = 3000; // Update sensors every 3 seconds
- // Widget IDs structure for dashboard management
- struct WidgetIDs {
- // Tabs
- uint8_t tabMonitoring;
- uint8_t tabControl;
- uint8_t tabAnalytics;
- // Monitoring Tab - Display cards
- uint8_t headerMonitoring;
- uint8_t ledStatusCard;
- uint8_t ledToggleButton;
- uint8_t blinkRateSlider;
- uint8_t systemHealthCard;
- uint8_t statusIndicator;
- // Control Tab - Control widgets
- uint8_t headerControl;
- uint8_t ledManualToggle;
- uint8_t blinkFrequencySlider;
- uint8_t ledModeDropdown;
- uint8_t brightnessSlider;
- uint8_t configSeparator;
- uint8_t deviceNameInput;
- uint8_t saveConfigButton;
- uint8_t restartButton;
- // Analytics Tab - Charts and trends
- uint8_t headerAnalytics;
- uint8_t ledActivityChart;
- uint8_t uptimeCard;
- uint8_t onOffStatusCard;
- uint8_t systemLogsCard;
- } widgets;
- // System state structure
- struct SystemState {
- bool ledActive = false;
- int blinkInterval = 1000;
- int ledBrightness = 100;
- int ledMode = 0; // 0=Manual, 1=Auto, 2=Blink
- String deviceName = "LED_Blink_Device";
- float uptime = 0.0; // in seconds
- int toggleCount = 0;
- unsigned long systemStartTime = 0;
- // Chart data for activity history
- int activityHistory[12]; // Last 12 measurements
- const char* timeLabels[12] = {
- "00:00", "02:00", "04:00", "06:00", "08:00", "10:00",
- "12:00", "14:00", "16:00", "18:00", "20:00", "22:00"
- };
- } systemState;
- // OTA Callback function - sets flag when OTA is available
- void otaAvailableCallback(const char* version) {
- Serial.print("đĻ OTA Available! Version: ");
- Serial.println(version);
- otaAvailable = true; // Set flag to trigger restart in loop
- }
- // Setup dashboard with all widgets and configurations
- void setupDashboard() {
- Serial.println("đ¨ Setting up LED Control Dashboard...");
- // Initialize activity history
- for (int i = 0; i < 12; i++) {
- systemState.activityHistory[i] = random(20, 80);
- }
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- // TABS
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- widgets.tabMonitoring = pota.dashboard.addWidget(TAB, "đ Monitoring");
- widgets.tabControl = pota.dashboard.addWidget(TAB, "âī¸ Control");
- widgets.tabAnalytics = pota.dashboard.addWidget(TAB, "đ Analytics");
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- // TAB 1: MONITORING - Real-time status and controls
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- widgets.headerMonitoring = pota.dashboard.addWidget(SEPARATOR_CARD,
- "đĄ LED Status & Quick Control",
- widgets.tabMonitoring,
- "Real-time monitoring of LED status. Quick toggle for immediate control");
- // Display current LED status as temperature card (repurposed for visual impact)
- widgets.ledStatusCard = pota.dashboard.addWidget(GENERIC_CARD, "LED Status", widgets.tabMonitoring);
- // Quick toggle button for LED on/off
- widgets.ledToggleButton = pota.dashboard.addWidget(TOGGLE_BUTTON_CARD, "LED Power", widgets.tabMonitoring);
- // Blink interval control with 100ms precision
- widgets.blinkRateSlider = pota.dashboard.addWidget(SLIDER_CARD, "Blink Interval (ms)", widgets.tabMonitoring, "", 100, 300, 3000);
- // System health indicator
- widgets.systemHealthCard = pota.dashboard.addWidget(FEEDBACK_CARD, "System Health", widgets.tabMonitoring);
- // Status indicator button (read-only visual)
- widgets.statusIndicator = pota.dashboard.addWidget(INDICATOR_BUTTON_CARD, "Connection Status", widgets.tabMonitoring);
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- // TAB 2: CONTROL - Manual LED control and configuration
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- widgets.headerControl = pota.dashboard.addWidget(SEPARATOR_CARD,
- "đ§ LED Control Panel",
- widgets.tabControl,
- "Manual LED control with mode selection, brightness adjustment, and device configuration");
- // Manual LED toggle
- widgets.ledManualToggle = pota.dashboard.addWidget(TOGGLE_BUTTON_CARD, "Manual LED Toggle", widgets.tabControl);
- // Blink frequency fine-tuning with 50ms precision
- widgets.blinkFrequencySlider = pota.dashboard.addWidget(SLIDER_CARD, "Blink Frequency (ms)", widgets.tabControl, "", 50, 100, 5000);
- // LED operating mode selector
- widgets.ledModeDropdown = pota.dashboard.addWidget(DROPDOWN_CARD, "LED Mode", widgets.tabControl, "Manual,Auto,Blink,Pulse");
- // LED brightness control (PWM simulation) with 5% steps
- widgets.brightnessSlider = pota.dashboard.addWidget(SLIDER_CARD, "Brightness (%)", widgets.tabControl, "", 5, 0, 100);
- // Configuration section separator
- widgets.configSeparator = pota.dashboard.addWidget(SEPARATOR_CARD,
- "âī¸ Device Configuration",
- widgets.tabControl,
- "Configure device name and settings");
- // Device name configuration input
- widgets.deviceNameInput = pota.dashboard.addWidget(TEXT_INPUT_CARD, "Device Name", widgets.tabControl);
- // Save configuration button
- widgets.saveConfigButton = pota.dashboard.addWidget(PUSH_BUTTON_CARD, "Save Configuration", widgets.tabControl);
- // Restart device button with confirmation
- widgets.restartButton = pota.dashboard.addWidget(ACTION_BUTTON_CARD, "Restart Device", widgets.tabControl, "Are you sure?");
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- // TAB 3: ANALYTICS - Historical data and trends
- // ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- widgets.headerAnalytics = pota.dashboard.addWidget(SEPARATOR_CARD,
- "đ System Analytics",
- widgets.tabAnalytics,
- "Historical LED activity, uptime tracking, and system performance metrics");
- // LED activity history chart (line chart showing on/off cycles)
- widgets.ledActivityChart = pota.dashboard.addWidget(LINE_CHART, "LED Activity (24h)", widgets.tabAnalytics);
- // Uptime display in hours
- widgets.uptimeCard = pota.dashboard.addWidget(ENERGY_CARD, "System Uptime (hours)", widgets.tabAnalytics);
- // Current on/off status progress
- widgets.onOffStatusCard = pota.dashboard.addWidget(PROGRESS_CARD, "LED ON Time (%)", widgets.tabAnalytics, "", 1, 0, 100);
- // System logs / status message display
- widgets.systemLogsCard = pota.dashboard.addWidget(GENERIC_CARD, "Last Event", widgets.tabAnalytics);
- Serial.println("â All dashboard widgets created!");
- // Set initial values for all widgets
- setInitialValues();
- // Setup callbacks for widget interactions
- setupCallbacks();
- }
- // Initialize dashboard widgets with default values
- void setInitialValues() {
- Serial.println("đ Setting initial widget values...");
- // Monitoring Tab initial values
- pota.dashboard.setValue(widgets.ledStatusCard, "LED OFF");
- pota.dashboard.setValue(widgets.ledToggleButton, systemState.ledActive);
- pota.dashboard.setValue(widgets.blinkRateSlider, systemState.blinkInterval);
- pota.dashboard.setValue(widgets.systemHealthCard, STATUS_SUCCESS);
- pota.dashboard.setValue(widgets.statusIndicator, STATUS_SUCCESS);
- // Control Tab initial values
- pota.dashboard.setValue(widgets.ledManualToggle, systemState.ledActive);
- pota.dashboard.setValue(widgets.blinkFrequencySlider, systemState.blinkInterval);
- pota.dashboard.setValue(widgets.ledModeDropdown, "Manual");
- pota.dashboard.setValue(widgets.brightnessSlider, systemState.ledBrightness);
- pota.dashboard.setValue(widgets.deviceNameInput, systemState.deviceName);
- // Analytics Tab initial values
- pota.dashboard.setValue(widgets.uptimeCard, 0.0);
- pota.dashboard.setValue(widgets.onOffStatusCard, 50);
- pota.dashboard.setValue(widgets.systemLogsCard, "System initialized");
- // Initialize activity chart
- pota.dashboard.setX(widgets.ledActivityChart, systemState.timeLabels, 12);
- pota.dashboard.setY(widgets.ledActivityChart, systemState.activityHistory, 12);
- Serial.println("â Initial values set!");
- }
- // Register callbacks for all dashboard widget interactions
- void setupCallbacks() {
- Serial.println("đ Setting up widget callbacks...");
- // ââââ MONITORING TAB CALLBACKS ââââ
- // LED Toggle callback - Toggle LED on/off
- pota.dashboard.onUpdate(widgets.ledToggleButton, [](WidgetData data) {
- systemState.ledActive = data.getBool();
- digitalWrite(LED1_LED_PIN_D1, systemState.ledActive ? HIGH : LOW);
- Serial.print("đĄ LED Toggle: ");
- Serial.println(systemState.ledActive ? "ON" : "OFF");
- // Update status display
- pota.dashboard.setValue(widgets.ledStatusCard, systemState.ledActive ? "LED ON" : "LED OFF");
- pota.dashboard.setValue(widgets.ledManualToggle, systemState.ledActive);
- systemState.toggleCount++;
- });
- // Blink rate slider callback - Adjust blink interval
- pota.dashboard.onUpdate(widgets.blinkRateSlider, [](WidgetData data) {
- systemState.blinkInterval = data.getInt();
- Serial.print("âąī¸ Blink Interval: ");
- Serial.print(systemState.blinkInterval);
- Serial.println(" ms");
- pota.dashboard.setValue(widgets.blinkFrequencySlider, systemState.blinkInterval);
- });
- // ââââ CONTROL TAB CALLBACKS ââââ
- // Manual toggle from control tab
- pota.dashboard.onUpdate(widgets.ledManualToggle, [](WidgetData data) {
- systemState.ledActive = data.getBool();
- digitalWrite(LED1_LED_PIN_D1, systemState.ledActive ? HIGH : LOW);
- Serial.print("đ Manual Toggle: ");
- Serial.println(systemState.ledActive ? "ON" : "OFF");
- // Sync with monitoring tab
- pota.dashboard.setValue(widgets.ledToggleButton, systemState.ledActive);
- pota.dashboard.setValue(widgets.ledStatusCard, systemState.ledActive ? "LED ON" : "LED OFF");
- systemState.toggleCount++;
- });
- // Blink frequency slider callback
- pota.dashboard.onUpdate(widgets.blinkFrequencySlider, [](WidgetData data) {
- systemState.blinkInterval = data.getInt();
- Serial.print("đī¸ Blink Frequency: ");
- Serial.print(systemState.blinkInterval);
- Serial.println(" ms");
- pota.dashboard.setValue(widgets.blinkRateSlider, systemState.blinkInterval);
- });
- // LED Mode dropdown callback
- pota.dashboard.onUpdate(widgets.ledModeDropdown, [](WidgetData data) {
- String mode = data.getString();
- Serial.print("đ LED Mode: ");
- Serial.println(mode);
- if (mode == "Manual") {
- systemState.ledMode = 0;
- } else if (mode == "Auto") {
- systemState.ledMode = 1;
- } else if (mode == "Blink") {
- systemState.ledMode = 2;
- } else if (mode == "Pulse") {
- systemState.ledMode = 3;
- }
- });
- // Brightness slider callback
- pota.dashboard.onUpdate(widgets.brightnessSlider, [](WidgetData data) {
- systemState.ledBrightness = data.getInt();
- Serial.print("đ Brightness: ");
- Serial.print(systemState.ledBrightness);
- Serial.println("%");
- // If LED is active, apply brightness (PWM simulation)
- if (systemState.ledActive) {
- analogWrite(LED1_LED_PIN_D1, (systemState.ledBrightness * 255) / 100);
- }
- });
- // Save configuration button callback
- pota.dashboard.onUpdate(widgets.saveConfigButton, [](WidgetData data) {
- Serial.println("đž Configuration saved!");
- Serial.print(" Device Name: ");
- Serial.println(systemState.deviceName);
- Serial.print(" Blink Interval: ");
- Serial.print(systemState.blinkInterval);
- Serial.println(" ms");
- Serial.print(" Brightness: ");
- Serial.print(systemState.ledBrightness);
- Serial.println("%");
- pota.dashboard.setValue(widgets.systemHealthCard, STATUS_SUCCESS);
- });
- // Device name input callback
- pota.dashboard.onUpdate(widgets.deviceNameInput, [](WidgetData data) {
- systemState.deviceName = data.getString();
- Serial.print("đ Device Name Updated: ");
- Serial.println(systemState.deviceName);
- });
- // Restart button callback with confirmation
- pota.dashboard.onUpdate(widgets.restartButton, [](WidgetData data) {
- Serial.println("đ Restart button pressed!");
- Serial.println(" Device will restart in 2 seconds...");
- pota.dashboard.setValue(widgets.systemLogsCard, "Device restarting...");
- pota.dashboard.setValue(widgets.systemHealthCard, STATUS_INFO);
- delay(2000);
- ESP.restart();
- });
- Serial.println("â All callbacks registered!");
- }
- // Update sensor values and chart data
- void updateSensorValues() {
- if (millis() - lastSensorUpdate < SENSOR_UPDATE_INTERVAL) {
- return;
- }
- lastSensorUpdate = millis();
- // Calculate uptime in hours
- systemState.uptime = (millis() - systemState.systemStartTime) / 3600000.0;
- // Update uptime display
- pota.dashboard.setValue(widgets.uptimeCard, systemState.uptime);
- // Update LED ON time percentage (simulated)
- int onTimePercent = systemState.ledActive ? 75 : 25;
- pota.dashboard.setValue(widgets.onOffStatusCard, onTimePercent);
- // Update activity history for chart
- for (int i = 0; i < 11; i++) {
- systemState.activityHistory[i] = systemState.activityHistory[i + 1];
- }
- systemState.activityHistory[11] = onTimePercent;
- // Update chart
- updateCharts();
- // Update status message
- String statusMsg = "LED: " + String(systemState.ledActive ? "ON" : "OFF");
- statusMsg += " | Toggles: " + String(systemState.toggleCount);
- pota.dashboard.setValue(widgets.systemLogsCard, statusMsg);
- Serial.print("đ Uptime: ");
- Serial.print(systemState.uptime, 1);
- Serial.print("h | Toggles: ");
- Serial.println(systemState.toggleCount);
- }
- // Update chart data
- void updateCharts() {
- // Update LED activity chart with current activity history
- pota.dashboard.setX(widgets.ledActivityChart, systemState.timeLabels, 12);
- pota.dashboard.setY(widgets.ledActivityChart, systemState.activityHistory, 12);
- }
- // Arduino setup function - Initialize hardware and POTA
- void setup(void) {
- Serial.begin(115200);
- delay(2000);
- // Initialize LED pin as OUTPUT
- pinMode(LED1_LED_PIN_D1, OUTPUT);
- digitalWrite(LED1_LED_PIN_D1, LOW);
- Serial.println("\nââââââââââââââââââââââââââââââââââââââââââ");
- Serial.println("â LED_Blink with POTA OTA â");
- Serial.println("â Dashboard Integration â");
- Serial.println("ââââââââââââââââââââââââââââââââââââââââââ\n");
- Serial.println("đ§ Initializing POTA...");
- // Initialize POTA with WiFi credentials from secrets.h
- POTAError err = pota.begin(
- DEVICE_TYPE, // Device type from secrets.h
- FIRMWARE_VERSION, // Firmware version from secrets.h
- AUTH_TOKEN, // Authentication token from secrets.h
- SERVER_SECRET, // Server secret from secrets.h
- WIFI_SSID, // WiFi SSID from secrets.h
- WIFI_PASSWORD // WiFi password from secrets.h
- );
- if (err != POTAError::SUCCESS) {
- Serial.print("â POTA initialization failed: ");
- Serial.println(POTA::errorToString(err));
- return;
- }
- Serial.println("â POTA initialized successfully!");
- // MANDATORY OTA: Check for available OTA updates after begin()
- Serial.println("đ Checking for OTA updates...");
- POTAError otaErr = pota.checkAndPerformOTA();
- if (otaErr == POTAError::NO_UPDATE_AVAILABLE) {
- Serial.println("âšī¸ No OTA update available - running latest version");
- } else if (otaErr != POTAError::SUCCESS) {
- Serial.print("â ī¸ OTA check result: ");
- Serial.println(POTA::errorToString(otaErr));
- }
- // Register OTA available callback - callback sets otaAvailable flag
- pota.onOTAAvailable(otaAvailableCallback);
- // Register dashboard setup callback
- pota.dashboard.setWidgetConfigCallback(setupDashboard);
- // Record system start time
- systemState.systemStartTime = millis();
- Serial.println("â Setup complete!");
- Serial.println("đ Connect to POTA dashboard for remote control\n");
- }
- // Arduino loop function - Main program execution
- void loop(void) {
- // Call POTA loop for WiFi, OTA, and dashboard management
- pota.loop();
- // MANDATORY OTA: Check if OTA is available and restart
- if (otaAvailable) {
- Serial.println("đ OTA available - initiating restart...");
- pota.restart();
- // After restart, the device will download and install the update
- otaAvailable = false;
- }
- // LED blinking logic based on mode and interval
- if (systemState.ledMode == 2 && systemState.ledActive) {
- // Blink mode: Toggle LED on/off
- if (millis() - lastLEDToggle >= systemState.blinkInterval) {
- lastLEDToggle = millis();
- systemState.ledActive = !systemState.ledActive;
- digitalWrite(LED1_LED_PIN_D1, systemState.ledActive ? HIGH : LOW);
- }
- } else if (systemState.ledMode == 0) {
- // Manual mode: LED controlled by toggle buttons (no automatic changes)
- digitalWrite(LED1_LED_PIN_D1, systemState.ledActive ? HIGH : LOW);
- } else if (systemState.ledMode == 1) {
- // Auto mode: LED blinks continuously at specified interval
- if (millis() - lastLEDToggle >= systemState.blinkInterval) {
- lastLEDToggle = millis();
- digitalWrite(LED1_LED_PIN_D1, digitalRead(LED1_LED_PIN_D1) ? LOW : HIGH);
- }
- } else if (systemState.ledMode == 3) {
- // Pulse mode: Simulate PWM pulse effect
- if (systemState.ledActive) {
- analogWrite(LED1_LED_PIN_D1, (systemState.ledBrightness * 255) / 100);
- } else {
- digitalWrite(LED1_LED_PIN_D1, LOW);
- }
- }
- // Update sensor values and dashboard periodically
- updateSensorValues();
- }
- /* END CODE */
Advertisement
Add Comment
Please, Sign In to add comment