Created
March 22, 2025 13:14
-
-
Save SimedruF/af9a419f03da73730f446cc5f3e23734 to your computer and use it in GitHub Desktop.
ESP32 C6 connected to ST7789 and a Solid state relay
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Arduino.h> | |
#include <Adafruit_GFX.h> // Core graphics library | |
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 | |
#include <SPI.h> | |
#define RELAY1_PIN 20 // Pin relay 1 | |
#define RELAY2_PIN 21 // Pin relay 2 | |
#define BUTTON_PIN 9 // Buton de control manual | |
#define LED_PIN LED_BUILTIN | |
#define BUTTON_PIN 9 // ESP32-C6/H2 Boot button | |
#define ZIGBEE_LIGHT_ENDPOINT 10 | |
// For the breakout board, you can use any 2 or 3 pins. | |
// These pins will also work for the 1.8" TFT shield. | |
#define TFT_CS 10 | |
#define TFT_RST 3 // Or set to -1 and connect to Arduino RESET pin | |
#define TFT_DC 2 | |
#define TFT_SCLK 6 // SPI Clock | |
#define TFT_MOSI 7 // SPI MOSI | |
bool relay1_state = false; | |
bool relay2_state = false; | |
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); | |
void setup() | |
{ | |
Serial.begin(115200); | |
pinMode(RELAY1_PIN, OUTPUT); | |
pinMode(RELAY2_PIN, OUTPUT); | |
pinMode(BUTTON_PIN, INPUT_PULLDOWN); // Buton pull-down | |
// Relays OFF | |
digitalWrite(RELAY1_PIN, LOW); | |
digitalWrite(RELAY2_PIN, LOW); | |
Serial.println("ESP32-C6: Control relee pornit."); | |
Serial.print(F("ESP32-C6: Init TFT")); | |
// Init SPI | |
SPI.begin(TFT_SCLK, -1, TFT_MOSI, TFT_CS); | |
// Use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT: | |
tft.init(170, 320); // Set resolution | |
tft.setRotation(1); // Adjust orientation | |
uint16_t time = millis(); | |
tft.fillScreen(ST77XX_BLACK); | |
time = millis() - time; | |
Serial.println(time, DEC); | |
delay(500); | |
// large block of text | |
tft.fillScreen(ST77XX_BLACK); | |
testdrawtext("Automatic House Systems", ST77XX_WHITE); | |
delay(1000); | |
// tft print function! | |
tftPrintTest(); | |
delay(4000); | |
// a single pixel | |
tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); | |
delay(500); | |
// line draw test | |
testlines(ST77XX_YELLOW); | |
delay(500); | |
// optimized lines | |
testfastlines(ST77XX_RED, ST77XX_BLUE); | |
delay(500); | |
testdrawrects(ST77XX_GREEN); | |
delay(500); | |
testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); | |
delay(500); | |
tft.fillScreen(ST77XX_BLACK); | |
testfillcircles(10, ST77XX_BLUE); | |
testdrawcircles(10, ST77XX_WHITE); | |
delay(500); | |
testroundrects(); | |
delay(500); | |
testtriangles(); | |
delay(500); | |
mediabuttons(); | |
delay(500); | |
Serial.println("done"); | |
delay(1000); | |
tft.fillScreen(ST77XX_BLACK); | |
drawButton(50, 50, relay1_state, relay1_state ? "ON" : "OFF"); // display relay 1 state | |
drawButton(180, 50, relay2_state, relay2_state ? "ON" : "OFF"); // display relay 2 state | |
} | |
void loop() | |
{ | |
// Button controlled | |
if (digitalRead(BUTTON_PIN) == HIGH) | |
{ | |
relay1_state = !relay1_state; // switch the relay 1 | |
digitalWrite(RELAY1_PIN, relay1_state ? HIGH : LOW); | |
Serial.print("Buton apăsat, releu 1 este acum: "); | |
Serial.println(relay1_state ? "ON" : "OFF"); | |
delay(300); // Debounce pentru buton | |
drawButton(50, 50, relay1_state, relay1_state ? "ON" : "OFF"); // display relay 1 state | |
} | |
// Serial control (switcth state with "1" for relay 1 , and with "2" for relay 2) | |
if (Serial.available()) | |
{ | |
char cmd = Serial.read(); | |
if (cmd == '1') | |
{ | |
relay1_state = !relay1_state; | |
digitalWrite(RELAY1_PIN, relay1_state ? HIGH : LOW); | |
Serial.print("Releu 1: "); | |
Serial.println(relay1_state ? "ON" : "OFF"); | |
drawButton(50, 50, relay1_state, relay1_state ? "ON" : "OFF"); // display relay 1 state | |
} | |
if (cmd == '2') | |
{ | |
relay2_state = !relay2_state; | |
digitalWrite(RELAY2_PIN, relay2_state ? HIGH : LOW); | |
Serial.print("Releu 2: "); | |
Serial.println(relay2_state ? "ON" : "OFF"); | |
drawButton(180, 50, relay2_state, relay2_state ? "ON" : "OFF"); // display relay 2 state | |
} | |
} | |
} | |
void testlines(uint16_t color) { | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=0; x < tft.width(); x+=6) { | |
tft.drawLine(0, 0, x, tft.height()-1, color); | |
delay(0); | |
} | |
for (int16_t y=0; y < tft.height(); y+=6) { | |
tft.drawLine(0, 0, tft.width()-1, y, color); | |
delay(0); | |
} | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=0; x < tft.width(); x+=6) { | |
tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); | |
delay(0); | |
} | |
for (int16_t y=0; y < tft.height(); y+=6) { | |
tft.drawLine(tft.width()-1, 0, 0, y, color); | |
delay(0); | |
} | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=0; x < tft.width(); x+=6) { | |
tft.drawLine(0, tft.height()-1, x, 0, color); | |
delay(0); | |
} | |
for (int16_t y=0; y < tft.height(); y+=6) { | |
tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); | |
delay(0); | |
} | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=0; x < tft.width(); x+=6) { | |
tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); | |
delay(0); | |
} | |
for (int16_t y=0; y < tft.height(); y+=6) { | |
tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); | |
delay(0); | |
} | |
} | |
void testdrawtext(char *text, uint16_t color) { | |
tft.setCursor(0, 0); | |
tft.setTextColor(color); | |
tft.setTextWrap(true); | |
tft.print(text); | |
} | |
void testfastlines(uint16_t color1, uint16_t color2) { | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t y=0; y < tft.height(); y+=5) { | |
tft.drawFastHLine(0, y, tft.width(), color1); | |
} | |
for (int16_t x=0; x < tft.width(); x+=5) { | |
tft.drawFastVLine(x, 0, tft.height(), color2); | |
} | |
} | |
void testdrawrects(uint16_t color) { | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=0; x < tft.width(); x+=6) { | |
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); | |
} | |
} | |
void testfillrects(uint16_t color1, uint16_t color2) { | |
tft.fillScreen(ST77XX_BLACK); | |
for (int16_t x=tft.width()-1; x > 6; x-=6) { | |
tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); | |
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); | |
} | |
} | |
void testfillcircles(uint8_t radius, uint16_t color) { | |
for (int16_t x=radius; x < tft.width(); x+=radius*2) { | |
for (int16_t y=radius; y < tft.height(); y+=radius*2) { | |
tft.fillCircle(x, y, radius, color); | |
} | |
} | |
} | |
void testdrawcircles(uint8_t radius, uint16_t color) { | |
for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { | |
for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { | |
tft.drawCircle(x, y, radius, color); | |
} | |
} | |
} | |
void testtriangles() { | |
tft.fillScreen(ST77XX_BLACK); | |
uint16_t color = 0xF800; | |
int t; | |
int w = tft.width()/2; | |
int x = tft.height()-1; | |
int y = 0; | |
int z = tft.width(); | |
for(t = 0 ; t <= 15; t++) { | |
tft.drawTriangle(w, y, y, x, z, x, color); | |
x-=4; | |
y+=4; | |
z-=4; | |
color+=100; | |
} | |
} | |
void testroundrects() { | |
tft.fillScreen(ST77XX_BLACK); | |
uint16_t color = 100; | |
int i; | |
int t; | |
for(t = 0 ; t <= 4; t+=1) { | |
int x = 0; | |
int y = 0; | |
int w = tft.width()-2; | |
int h = tft.height()-2; | |
for(i = 0 ; i <= 16; i+=1) { | |
tft.drawRoundRect(x, y, w, h, 5, color); | |
x+=2; | |
y+=3; | |
w-=4; | |
h-=6; | |
color+=1100; | |
} | |
color+=100; | |
} | |
} | |
void tftPrintTest() { | |
tft.setTextWrap(false); | |
tft.fillScreen(ST77XX_BLACK); | |
tft.setCursor(0, 30); | |
tft.setTextColor(ST77XX_RED); | |
tft.setTextSize(1); | |
tft.println("Hello World!"); | |
tft.setTextColor(ST77XX_YELLOW); | |
tft.setTextSize(2); | |
tft.println("Hello World!"); | |
tft.setTextColor(ST77XX_GREEN); | |
tft.setTextSize(3); | |
tft.println("Hello World!"); | |
tft.setTextColor(ST77XX_BLUE); | |
tft.setTextSize(4); | |
tft.print(1234.567); | |
delay(1500); | |
tft.setCursor(0, 0); | |
tft.fillScreen(ST77XX_BLACK); | |
tft.setTextColor(ST77XX_WHITE); | |
tft.setTextSize(0); | |
tft.println("Hello World!"); | |
tft.setTextSize(1); | |
tft.setTextColor(ST77XX_GREEN); | |
//tft.print(p, 6); | |
tft.println(" Want pi?"); | |
tft.println(" "); | |
tft.print(8675309, HEX); // print 8,675,309 out in HEX! | |
tft.println(" Print HEX!"); | |
tft.println(" "); | |
tft.setTextColor(ST77XX_WHITE); | |
tft.println("Sketch has been"); | |
tft.println("running for: "); | |
tft.setTextColor(ST77XX_MAGENTA); | |
tft.print(millis() / 1000); | |
tft.setTextColor(ST77XX_WHITE); | |
tft.print(" seconds."); | |
} | |
void mediabuttons() { | |
// play | |
tft.fillScreen(ST77XX_BLACK); | |
tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); | |
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); | |
delay(500); | |
// pause | |
tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); | |
tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); | |
tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); | |
delay(500); | |
// play color | |
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); | |
delay(50); | |
// pause color | |
tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); | |
tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); | |
// play color | |
tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); | |
} | |
void drawButton(int x, int y, bool state, const char* label) { | |
if (state) { | |
tft.fillRect(x, y, 100, 50, ST77XX_GREEN); // green display (ON) | |
tft.setTextColor(ST77XX_BLACK); | |
} else { | |
tft.fillRect(x, y, 100, 50, ST77XX_RED); // Red display (OFF) | |
tft.setTextColor(ST77XX_WHITE); | |
} | |
tft.setCursor(x + 35, y + 20); | |
tft.setTextSize(2); | |
tft.print(label); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment