#include <Arduino.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_I2CDevice.h>
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h> // Arduino SPI library
#define TFT_MOSI 23 // SDA Pin on ESP32
#define TFT_SCLK 18 // SCL Pin on ESP32
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
#define RELAY1_PIN 32
#define RELAY2_PIN 33
#define RELAY3_PIN 25
#define RELAY4_PIN 26
volatile byte RELAY1_STATE = LOW;
volatile byte RELAY2_STATE = LOW;
volatile byte RELAY3_STATE = LOW;
volatile byte RELAY4_STATE = LOW;
// Initialize Adafruit ST7789 TFT library
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
Serial.begin(115200);
pinMode(RELAY1_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, RELAY1_STATE);
pinMode(RELAY2_PIN, OUTPUT);
digitalWrite(RELAY2_PIN, RELAY2_STATE);
pinMode(RELAY3_PIN, OUTPUT);
digitalWrite(RELAY3_PIN, RELAY3_STATE);
pinMode(RELAY4_PIN, OUTPUT);
digitalWrite(RELAY4_PIN, RELAY4_STATE);
tft.init(240, 280);
//tft.init(240, 280, SPI_MODE2); // Init ST7789 display
//tft.setRotation(4);
tft.invertDisplay(true);
tft.fillScreen(ST77XX_BLACK);
Serial.print(F("ESP32 4 RELAY Test"));
}
void loop() {
setRelayState(1, 1); //pullRelay1HIGH();
DisplayRefresh();
delay(1000);
setRelayState(1, 0); //pullRelay2HIGH();
DisplayRefresh();
delay(1000);
setRelayState(2, 1); //pullRelay3HIGH();
DisplayRefresh();
delay(1000);
setRelayState(2, 0); //pullRelay4HIGH();
DisplayRefresh();
delay(1000);
setRelayState(3, 1); //pullRelay1LOW();
DisplayRefresh();
delay(1000);
setRelayState(3, 0); //pullRelay2LOW();
DisplayRefresh();
delay(1000);
setRelayState(4, 1); //pullRelay3LOW();
DisplayRefresh();
delay(1000);
setRelayState(4, 0); //pullRelay4LOW();
DisplayRefresh();
delay(2000);
Serial.println(millis()/1000);
//delay(1000);
}
void setRelayState(int relay_num, byte relay_status) {
switch (relay_num) {
case 1:
digitalWrite(RELAY1_PIN, relay_status);
RELAY1_STATE = relay_status;
tft.setCursor(0, 30);
tft.fillRect(0,30,240,22,ST77XX_BLACK);
if (relay_status == 1) {
tft.setTextColor(ST77XX_RED);
tft.setTextSize(3);
tft.println("RELAY1 ON");
}
else {
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(3);
tft.println("RELAY1 OFF");
}
break;
case 2:
digitalWrite(RELAY2_PIN, relay_status);
RELAY2_STATE = relay_status;
tft.setCursor(0, 60);
tft.fillRect(0,60,240,22,ST77XX_BLACK);
if (relay_status == 1) {
tft.setTextColor(ST77XX_RED);
tft.setTextSize(3);
tft.println("RELAY2 ON");
}
else {
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(3);
tft.println("RELAY2 OFF");
}
break;
case 3:
digitalWrite(RELAY3_PIN, relay_status);
RELAY3_STATE = relay_status;
tft.setCursor(0, 90);
tft.fillRect(0,90,240,22,ST77XX_BLACK);
if (relay_status == 1) {
tft.setTextColor(ST77XX_RED);
tft.setTextSize(3);
tft.println("RELAY3 ON");
}
else {
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(3);
tft.println("RELAY3 OFF");
}
break;
case 4:
digitalWrite(RELAY4_PIN, relay_status);
RELAY4_STATE = relay_status;
tft.setCursor(0, 120);
tft.fillRect(0,120,240,22,ST77XX_BLACK);
if (relay_status == 1) {
tft.setTextColor(ST77XX_RED);
tft.setTextSize(3);
tft.println("RELAY4 ON");
}
else {
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(3);
tft.println("RELAY4 OFF");
}
break;
}
}
void DisplayRefresh() {
tft.drawCircle(30, 250, 20, ST77XX_CASET);
tft.drawCircle(90, 250, 20, ST77XX_CASET);
tft.drawCircle(150,250, 20, ST77XX_CASET);
tft.drawCircle(210,250, 20, ST77XX_CASET);
if (RELAY1_STATE != LOW) { tft.fillCircle(30,250, 17, ST77XX_RED); }
else { tft.fillCircle(30,250, 17, ST77XX_GREEN); }
if (RELAY2_STATE != LOW) { tft.fillCircle(90,250, 17, ST77XX_RED); }
else { tft.fillCircle(90,250, 17, ST77XX_GREEN); }
if(RELAY3_STATE != LOW) { tft.fillCircle(150,250, 17, ST77XX_RED); }
else { tft.fillCircle(150,250, 17, ST77XX_GREEN); }
if(RELAY4_STATE != LOW) { tft.fillCircle(210,250, 17, ST77XX_RED); }
else { tft.fillCircle(210,250, 17, ST77XX_GREEN); }
Serial.print("RELAY1 - "+ String(RELAY1_STATE)+", RELAY2 - "+ String(RELAY2_STATE));
Serial.println(", RELAY3 - "+ String(RELAY3_STATE)+", RELAY4 - "+ String(RELAY4_STATE));
}