Hello, all was explained on photo:
here is code:
#include <EEPROM.h>
#define INIT_FLAG_ADDR 100 // Address to store the init flag
#define INIT_FLAG_VALUE 0xAA // Value to check if EEPROM is initialized
// Define relay pins
const int relayPins[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // Extend to 8 channels
void setup() {
Serial.begin(9600);
// Set relay pins as OUTPUT
for (int i = 0; i < 8; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], HIGH); // Set all relays to OFF (HIGH)
}
// Check initialization flag
if (EEPROM.read(INIT_FLAG_ADDR) != INIT_FLAG_VALUE) {
// Clear EEPROM and initialize states
for (int i = 0; i < 8; i++) {
EEPROM.write(i, HIGH); // Write HIGH (OFF) to every address
}
// Set the initialization flag
EEPROM.write(INIT_FLAG_ADDR, INIT_FLAG_VALUE);
} else {
// Load relay states from EEPROM if already initialized
for (int i = 0; i < 8; i++) {
int state = EEPROM.read(i); // Read state from EEPROM
digitalWrite(relayPins[i], state); // Set the relays to their stored states
}
}
}
void loop() {
if (Serial.available() > 0) {
String command = Serial.readStringUntil('\n'); // Read until newline
if (command.length() > 1) {
char state = command.charAt(0); // '1' or '0'
int relayNumber = command.charAt(1) - '0'; // Convert char to int
if (relayNumber >= 0 && relayNumber < 8) { // Check valid relay number
if (state == '1') {
digitalWrite(relayPins[relayNumber], LOW); // Turn on relay (LOW means ON)
EEPROM.write(relayNumber, LOW); // Save the updated state to EEPROM
} else if (state == '0') {
digitalWrite(relayPins[relayNumber], HIGH); // Turn off relay (HIGH means OFF)
EEPROM.write(relayNumber, HIGH); // Save the updated state to EEPROM
}
}
}
}
}