//Constants https://www.aranacorp.com/en/controlling-8-relays-with-esp32-and-shift-register/
//#define number_of_74hc595s 1
#define number_of_74hc595s 4
#define numOfRegisterPins number_of_74hc595s * 8
#define SER_Pin 15
#define RCLK_Pin 2
#define SRCLK_Pin 4
#include <WiFi.h>
#include <Wire.h>
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
boolean registers [numOfRegisterPins];
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void setup(){
Serial.begin(115200);
Serial.println(F("Initialize System"));
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
clearRegisters();
writeRegisters();
delay(500);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();}
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
uint8_t characters[10][8] = {
{0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C}, //0
{0x10, 0x18, 0x14, 0x10, 0x10, 0x10, 0x10, 0x3C}, //1
{0x3C, 0x42, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x7E}, //2
{0x3C, 0x40, 0x40, 0x3C, 0x40, 0x40, 0x42, 0x3C}, //3
{0x22, 0x22, 0x22, 0x22, 0x7E, 0x20, 0x20, 0x20}, //4
{0x7E, 0x02, 0x02, 0x3E, 0x40, 0x40, 0x42, 0x3C}, //5
{0x3C, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x3C}, //6
{0x3C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}, //7
{0x3C, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x3C}, //8
{0x3C, 0x42, 0x42, 0x42, 0x3C, 0x40, 0x40, 0x3C}, //9
};
/*
1 = 2, 6
2 = 1, 2, 3, 4, 5
3 = 1, 2, 3, 5, 6
4 = 0, 2, 3, 6
5 = 0, 1, 3, 5, 6
6 = 0, 1, 3, 4, 5, 6
7 = 1, 2, 6
8 = 0, 1, 2, 3, 4, 5, 6
9 = 0, 1, 2, 3, 5, 6
0 = 0, 1, 2, 4, 5, 6*/
void loop(){
writeGrpRelay();
}
void clearRegisters(){
for(int i = numOfRegisterPins-1; i >= 0; i--){
registers[i] = LOW;
}
}
void writeRegisters(){
digitalWrite(RCLK_Pin, LOW);
for(int i = numOfRegisterPins-1; i >= 0; i--){
digitalWrite(SRCLK_Pin, LOW); int val = registers[i];
digitalWrite(SER_Pin, val);
digitalWrite(SRCLK_Pin, HIGH);
}
digitalWrite(RCLK_Pin, HIGH);
}
void setRegisterPin(int index,int value){
registers[index] = value;
}
void writeGrpRelay(){
for(int i = numOfRegisterPins-1; i >= 0; i--){
Serial.print(F("Relay "));Serial.print(i);Serial.println(F(" HIGH"));
setRegisterPin(i, HIGH);
writeRegisters();
delay(200);
Serial.print(F("Relay "));Serial.print(i);Serial.println(F(" LOW"));
setRegisterPin(i, LOW);
writeRegisters();
delay(500);
printLocalTime();
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return;
}
Serial.println(&timeinfo, "%H:%M:%S");
Serial.println(&timeinfo, "%d/%m/%Y %Z");
}