#include <stdio.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//搖桿模組接腳
#define xAxisPin A0 // X轴连接到A0
#define yAxisPin A1 // Y轴连接到A1
#define buttonPin A2 // 按钮连接到D2
//各通道輸出接腳
#define DC_on_off_output 12
#define AC_on_off_pin1_output 7
#define AC_on_off_pin2_output 6
#define AC_on_off_pin3_output 5
#define AC_on_off_pin4_output 4
#define USB_on_off_output 2
//紅外線感測模組輸出接腳
#define infrared_input A3
// OLED 参数
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//搖桿模組
unsigned short int xValue = 0;
unsigned short int yValue = 0;
unsigned short int buttonState = 0;
//系統時間計算
unsigned long currentMillis;
unsigned long previousMillis = 0;
//頁面計數
unsigned short int page_n = 1;
//程式清單計數
unsigned short int on_count = 1;
unsigned short int ac_count = 1;
unsigned short int dc_count = 1;
unsigned short int ub_count = 1;
//旗標數值設置
bool system_setup_en = 1;
bool home_en = 0;
//from esp32 tx
bool rx_esp32 = 0;
//紅外線讀取
bool infrared_en = 1;
//各通道訊號旗標
bool Channel_EN[6];
/*
ch1:DC_on_off_en
ch2:AC_on_off_pin1_en
ch3:AC_on_off_pin2_en
ch4:AC_on_off_pin3_en
ch5:AC_on_off_pin4_en
ch6:USB_on_off_en
*/
bool DC_on_off_en = 0;
bool AC_on_off_all_en = 0;
bool AC_on_off_pin1_en = 0;
bool AC_on_off_pin2_en = 0;
bool AC_on_off_pin3_en = 0;
bool AC_on_off_pin4_en = 0;
bool USB_on_off_en = 0;
//
bool time_per_o_en[6];
/*
ch0:DC_on_off_time_per_o_en
ch1:AC_on_off_pin1_time_per_o_en
ch2:AC_on_off_pin2_time_per_o_en
ch3:AC_on_off_pin3_time_per_o_en
ch4:AC_on_off_pin4_time_per_o_en
ch5:USB_on_off_time_per_o_en
ch6:all_pin_time_per_o_en
*/
String message;
//顯示資料緩衝
char DP[20] = "";
//
int b = 0;
int d = 1;
int f = 0;
void setup() {
//baud rate set
Serial.begin(9600);
//設定I2C地址
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{ // 替换为实际的 I2C 地址 (如 0x3D)
Serial.println(F("OLED 初始化失败"));
for(;;);
}
display.clearDisplay();
//接腳模式定義
pinMode(buttonPin, INPUT_PULLUP);
pinMode(infrared_input, INPUT_PULLUP);
pinMode(DC_on_off_output, OUTPUT);
pinMode(AC_on_off_pin1_output, OUTPUT);
pinMode(AC_on_off_pin2_output, OUTPUT);
pinMode(AC_on_off_pin3_output, OUTPUT);
pinMode(AC_on_off_pin4_output, OUTPUT);
pinMode(USB_on_off_output, OUTPUT);
}
void loop() {
//訊號偵測
xValue = analogRead(xAxisPin);
yValue = analogRead(yAxisPin);
buttonState = digitalRead(buttonPin);
infrared_en = digitalRead(infrared_input);
//系統時間
currentMillis = millis();
// 检查是否已经到达时间间隔
if (currentMillis - previousMillis >= 300) {
btn_detect(); //搖桿模組偵測
//program_list_detection();//程式清單訊號偵測
on_off_en_detect();//各通道訊號檢測
previousMillis = currentMillis;
}
system_setup_detect(); //系統初始化訊號偵測
home_detect(); //系統初始化訊號偵測
rx_detect(); //接收來自esp32的訊息
infrared_detect();
//btn_detect(); //搖桿模組偵測
//on_off_en_detect(); //各通道訊號檢測
Channel_EN[0] = DC_on_off_en;
Channel_EN[1] = AC_on_off_pin1_en;
Channel_EN[2] = AC_on_off_pin2_en;
Channel_EN[3] = AC_on_off_pin3_en;
Channel_EN[4] = AC_on_off_pin4_en;
Channel_EN[5] = USB_on_off_en;
}
void system_setup_detect() {
if (system_setup_en == 1) {
//各通道於初始化時關閉
digitalWrite(DC_on_off_output, HIGH);
digitalWrite(AC_on_off_pin1_output, HIGH);
digitalWrite(AC_on_off_pin2_output, HIGH);
digitalWrite(AC_on_off_pin3_output, HIGH);
digitalWrite(AC_on_off_pin4_output, HIGH);
digitalWrite(USB_on_off_output, HIGH);
//
display.setCursor(0,10); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("Power control"));
display.setCursor(0,20); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("system"));
display.display(); // 更新显示内容
delay(4000);
display.drawRect(25, 40, 78, 4, WHITE); // 矩形左上角为 (25,35),宽度为 78,高度为 15
for (int i = 0; i < 40; i = i + 1) {
// 画一个填充矩形
display.fillRect(25, 40, i, 3, WHITE); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.display(); // 更新显示内容
}
for (int j = 39; j < 78; j = j + 1) {
// 画一个填充矩形
display.fillRect(25, 40, j, 3, WHITE); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.display(); // 更新显示内容
}
//各通道於初始化完成後開啟
digitalWrite(DC_on_off_output, LOW);
digitalWrite(AC_on_off_pin1_output, LOW);
digitalWrite(AC_on_off_pin2_output, LOW);
digitalWrite(AC_on_off_pin3_output, LOW);
digitalWrite(AC_on_off_pin4_output, LOW);
digitalWrite(USB_on_off_output, LOW);
display.clearDisplay();
//
system_setup_en = 0;
home_en = 1;
page_n = 1;
}
}
void btn_detect() {
if (buttonState == LOW) {
delay(30);
Serial.println(F("按鈕按下"));
} else {
buttonState = HIGH;
}
if (xValue > 1000) {
delay(100);
Serial.println(F("左"));
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
if (home_en == 1) {
page_n = page_n - 1;
}
if (page_n == 0) {
page_n = 5;
}
} else if (xValue < 50) {
delay(100);
Serial.println(F("右"));
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
if (home_en == 1) {
page_n = page_n + 1;
}
if (page_n == 6) {
page_n = 1;
}
}
if (yValue > 1000) {
delay(100);
Serial.println(F("上"));
if (page_n == 2) {
on_count = on_count - 1;
if (on_count == 0) {
on_count = 6;
}
}
} else if (yValue < 50) {
delay(100);
Serial.println(F("下"));
if (page_n == 2) {
on_count = on_count + 1;
if (on_count == 7) {
on_count = 1;
}
}
}
}
void home_detect() {
if (home_en == 1) {
display.fillRect(11, 54, 6, 8, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.setCursor(2,54); // 设置光标位置
display.println(F("<"));
display.setCursor(20,54); // 设置光标位置
display.println(F(">"));
display.setCursor(11,54); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(page_n); // 顯示整數變數
display.display(); // 更新显示内容
if (page_n == 1) { //home page
display.setCursor(0,10); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("Welcome"));
} else if (page_n == 2) { //ON/OFF setting
display.setCursor(0,0); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("ON/OFF"));
display.setCursor(0,10); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("setting"));
display.setCursor(60,0); // 设置光标位置
display.println(F("DC:"));
display.setCursor(60,10); // 设置光标位置
display.println(F("AC1:"));
display.setCursor(60,20); // 设置光标位置
display.println(F("AC2:"));
display.setCursor(60,30); // 设置光标位置
display.println(F("AC3:"));
display.setCursor(60,40); // 设置光标位置
display.println(F("AC4:"));
display.setCursor(60,50); // 设置光标位置
display.println(F("USB:"));
//display.display(); // 更新显示内容
//選擇焦點位置判別
for (int c = 0; c <= 50; c += 10) {
if (on_count == d) {
display.setCursor(52,c); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("["));
display.setCursor(105,c); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("]"));
//display.display(); // 更新显示内容
} else {
display.setCursor(52,c); // 设置光标位置
display.setTextColor(BLACK); // 设置文本颜色
display.println(F("["));
display.setCursor(105,c); // 设置光标位置
display.setTextColor(BLACK); // 设置文本颜色
display.println(F("]"));
//display.display(); // 更新显示内容
}
d = d + 1;
if (d == 7) {
d = 1;
}
}
//判斷各通道有無導通並顯示於LCD上
for (int a = 0; a <= 50; a += 10) {
if (Channel_EN[b] == 0) {
display.fillRect(85, a, 18, 8, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.setCursor(85,a); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("ON"));
//display.display(); // 更新显示内容
} else {
display.fillRect(85, a, 18, 8, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.setCursor(85,a); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("OFF"));
//display.display(); // 更新显示内容
}
b = b + 1;
if (b == 6) {
b = 0;
}
}
display.display(); // 更新显示内容
} else if (page_n == 3) { //Auto channel open
display.setCursor(0,0); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("Auto"));
display.setCursor(0,10); // 设置光标位置
display.println(F("channel"));
display.setCursor(0,20); // 设置光标位置
display.println(F("open"));
display.setCursor(50,0); // 设置光标位置
display.println(F("DC:"));
display.setCursor(50,10); // 设置光标位置
display.println(F("AC1:"));
display.setCursor(50,20); // 设置光标位置
display.println(F("AC2:"));
display.setCursor(50,30); // 设置光标位置
display.println(F("AC3:"));
display.setCursor(50,40); // 设置光标位置
display.println(F("AC4:"));
display.setCursor(50,50); // 设置光标位置
display.println(F("USB:"));
for (int e = 0; e <= 50; e += 10)
{
display.fillRect(74, e, 54, 8, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
}
//判斷各通道有無導通並顯示於LCD上
for (int g = 0; g <= 50; g += 10) {
if (time_per_o_en[f] == 1) {
display.setCursor(74,g); // 设置光标位置
display.println(F("executing"));
} else
{
display.setCursor(74,g); // 设置光标位置
display.println(F("----"));
}
f = f + 1;
if (f == 6)
{
f = 0;
}
}
display.display(); // 更新显示内容
} else if (page_n == 4) {
display.setCursor(0,0); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("Specification"));
display.setCursor(0,15); // 设置光标位置
display.println(F("AC MAX Power:1100W"));
display.setCursor(0,25); // 设置光标位置
display.println(F("DC MAX Power:50W"));
display.setCursor(0,35); // 设置光标位置
display.println(F("USB MAX Power:130W"));
display.display(); // 更新显示内容
} else if (page_n == 5) {
display.setCursor(0,0); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("About"));
display.setCursor(0,15); // 设置光标位置
display.println(F("system time"));
display.fillRect(0, 28, 60, 8, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
display.setCursor(0,28); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(currentMillis/1000);
display.setCursor(0,38); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("Second"));
display.setCursor(84,10); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F("56000"));
display.setCursor(84,25); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F(" ACK"));
display.setCursor(84,40); // 设置光标位置
display.setTextColor(WHITE); // 设置文本颜色
display.println(F(" Sean"));
display.display(); // 更新显示内容
}
}
}
void on_off_en_detect()
{
if (buttonState == 0 and page_n == 2)
{
if (on_count == 1) {
if (DC_on_off_en == 0) {
DC_on_off_en = 1;
} else {
DC_on_off_en = 0;
}
} else if (on_count == 2) {
if (AC_on_off_pin1_en == 0) {
AC_on_off_pin1_en = 1;
} else {
AC_on_off_pin1_en = 0;
}
} else if (on_count == 3) {
if (AC_on_off_pin2_en == 0) {
AC_on_off_pin2_en = 1;
} else {
AC_on_off_pin2_en = 0;
}
} else if (on_count == 4) {
if (AC_on_off_pin3_en == 0) {
AC_on_off_pin3_en = 1;
} else {
AC_on_off_pin3_en = 0;
}
} else if (on_count == 5) {
if (AC_on_off_pin4_en == 0) {
AC_on_off_pin4_en = 1;
} else {
AC_on_off_pin4_en = 0;
}
} else if (on_count == 6) {
if (USB_on_off_en == 0) {
USB_on_off_en = 1;
} else {
USB_on_off_en = 0;
}
}
}
if (DC_on_off_en == 0) {
digitalWrite(DC_on_off_output, LOW);
//Serial.println("0020101");
} else {
digitalWrite(DC_on_off_output, HIGH);
//Serial.println("0020001");
}
if (AC_on_off_pin1_en == 0) {
digitalWrite(AC_on_off_pin1_output, LOW);
//Serial.println("0020103");
} else {
digitalWrite(AC_on_off_pin1_output, HIGH);
//Serial.println("0020003");
}
if (AC_on_off_pin2_en == 0) {
digitalWrite(AC_on_off_pin2_output, LOW);
//Serial.println("0020104");
} else {
digitalWrite(AC_on_off_pin2_output, HIGH);
//Serial.println("0020004");
}
if (AC_on_off_pin3_en == 0) {
digitalWrite(AC_on_off_pin3_output, LOW);
//Serial.println("0020105");
} else {
digitalWrite(AC_on_off_pin3_output, HIGH);
//Serial.println("0020005");
}
if (AC_on_off_pin4_en == 0) {
digitalWrite(AC_on_off_pin4_output, LOW);
//Serial.println("0020106");
} else {
digitalWrite(AC_on_off_pin4_output, HIGH);
//Serial.println("0020006");
}
if (USB_on_off_en == 0) {
digitalWrite(USB_on_off_output, LOW);
//Serial.println("0020107");
} else {
digitalWrite(USB_on_off_output, HIGH);
//Serial.println("0020007");
}
}
void rx_detect()
{
if (Serial.available()) {
message = Serial.readStringUntil('\n');
message.trim(); //將手機傳輸文字的空格刪除
message.toLowerCase(); //將手機端傳輸的文字轉為小寫
rx_esp32 = 1;
}
//
delay(100);
if(message == "0010001")
{
if(DC_on_off_en == 0)
{
DC_on_off_en = 1;
} else
{
DC_on_off_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010002")
{
if(AC_on_off_pin1_en == 0 or AC_on_off_pin2_en == 0 or AC_on_off_pin3_en == 0 or AC_on_off_pin4_en == 0)
{
AC_on_off_pin1_en = 1;
AC_on_off_pin2_en = 1;
AC_on_off_pin3_en = 1;
AC_on_off_pin4_en = 1;
} else
{
AC_on_off_pin1_en = 0;
AC_on_off_pin2_en = 0;
AC_on_off_pin3_en = 0;
AC_on_off_pin4_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010003")
{
if(AC_on_off_pin1_en == 0)
{
AC_on_off_pin1_en = 1;
} else
{
AC_on_off_pin1_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010004")
{
if(AC_on_off_pin2_en == 0)
{
AC_on_off_pin2_en = 1;
} else
{
AC_on_off_pin2_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010005")
{
if(AC_on_off_pin3_en == 0)
{
AC_on_off_pin3_en = 1;
} else
{
AC_on_off_pin3_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010006")
{
if(AC_on_off_pin4_en == 0)
{
AC_on_off_pin4_en = 1;
} else
{
AC_on_off_pin4_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
if(message == "0010007")
{
if(USB_on_off_en == 0)
{
USB_on_off_en = 1;
} else
{
USB_on_off_en = 0;
}
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = 2;
message = "0000000";
}
//模式3按照時程進行開啟
if(message == "0030101")
{
DC_on_off_en = 0;
time_per_o_en[0] = 1;
message = "0000000";
}
if(message == "0030103")
{
AC_on_off_pin1_en = 0;
time_per_o_en[1] = 1;
message = "0000000";
}
if(message == "0030104")
{
time_per_o_en[2] = 1;
AC_on_off_pin2_en = 0;
message = "0000000";
}
if(message == "0030105")
{
time_per_o_en[3] = 1;
AC_on_off_pin3_en = 0;
message = "0000000";
}
if(message == "0030106")
{
time_per_o_en[4] = 1;
AC_on_off_pin4_en = 0;
message = "0000000";
}
if(message == "0030107")
{
time_per_o_en[5] = 1;
USB_on_off_en = 0;
message = "0000000";
}
if(message == "0030108")
{
time_per_o_en[6] = 1;
DC_on_off_en = 0;
AC_on_off_pin1_en = 0;
AC_on_off_pin2_en = 0;
AC_on_off_pin3_en = 0;
AC_on_off_pin4_en = 0;
USB_on_off_en = 0;
message = "0000000";
}
//模式3自動恢復關閉狀態
if(message == "0030001")
{
time_per_o_en[0] = 0;
DC_on_off_en = 1;
message = "0000000";
}
if(message == "0030003")
{
time_per_o_en[1] = 0;
AC_on_off_pin1_en = 1;
message = "0000000";
}
if(message == "0030004")
{
time_per_o_en[2] = 0;
AC_on_off_pin2_en = 1;
message = "0000000";
}
if(message == "0030005")
{
time_per_o_en[3] = 0;
AC_on_off_pin3_en = 1;
message = "0000000";
}
if(message == "0030006")
{
time_per_o_en[4] = 0;
AC_on_off_pin4_en = 1;
message = "0000000";
}
if(message == "0030007")
{
time_per_o_en[5] = 0;
USB_on_off_en = 1;
message = "0000000";
}
if(message == "0030008")
{
time_per_o_en[6] = 0;
DC_on_off_en = 1;
AC_on_off_pin1_en = 1;
AC_on_off_pin2_en = 1;
AC_on_off_pin3_en = 1;
AC_on_off_pin4_en = 1;
USB_on_off_en = 1;
message = "0000000";
}
}
void infrared_detect()
{
if(infrared_en == 0)
{
display.fillRect(0, 0, 120, 64, BLACK); // 填充矩形左上角为 (25,35),宽度为 78,高度为 15
page_n = page_n + 1;
}
}
Loading
ssd1306
ssd1306