#include "OneButton.h"
#include "FS.h"
#include <LittleFS.h>
//LittleFS
#define FORMAT_LITTLEFS_IF_FAILED true
//定义按钮
int BTNS[] = {25, 33, 32, 35, 34};
//定义输出
int LEDS[] = {15, 2, 0, 4, 17};
//定义状态
int LEDSTATUS[] = {0, 0, 0, 0, 0};
//定义组
int BANKS[5][5] ={
{1, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 0, 5}
};
//按钮对象
OneButton OBTNS[5];
//单击切换
void loadClick(int index){
Serial.println("load click");
int cnt = sizeof(BANKS[index])/sizeof(BANKS[index][0]);
for(int i=0; i<cnt; i++){
digitalWrite(LEDS[i], BANKS[index][i]);
}
readFile(LittleFS, "/data.txt");
}
//进入编程
int programBTN = -1;//被编程的按钮
void enterProgram(int btn){
Serial.println("enter program");
programBTN = btn;
int cnt;
//初始化LED为0
cnt = sizeof(LEDS)/sizeof(LEDS[0]);
for (int i=0; i<cnt; i++){
digitalWrite(LEDS[i], LOW);
}
//初始化LED状态为0
cnt = sizeof(LEDSTATUS)/sizeof(LEDSTATUS[0]);
for (int i=0; i<cnt; i++){
LEDSTATUS[i] = 0;
}
//初始化BANK为0
cnt = sizeof(BANKS[programBTN])/sizeof(BANKS[programBTN][0]);
for (int i=0; i<cnt; i++){
BANKS[programBTN][i] = 0;
}
}
//编程中
void inProgram(int btn){
int cnt = sizeof(BTNS)/sizeof(BTNS[0]);
for (int i=0; i<cnt; i++){
OBTNS[i] = OneButton(BTNS[i], false,false);
OBTNS[i].reset();
OBTNS[i].attachClick([](void* p) { setClick((int)p); }, (void*)i);//监听单击
OBTNS[i].attachDoubleClick([](void* p) {exitProgram((int)p);}, (void*)i);//监听双击
OBTNS[i].attachLongPressStart([](void* p) {}, (void*)i);//取消监听长按(按下)
OBTNS[i].attachLongPressStop([](void* p) {}, (void*)i);//取消监听长按(抬起)
}
}
//编程单击
void setClick(int btn){
Serial.println("set click");
if (programBTN!=-1){
BANKS[programBTN][btn] = 1;
LEDSTATUS[btn] = !LEDSTATUS[btn];
digitalWrite(LEDS[btn], LEDSTATUS[btn]);
}
}
//退出编程
void exitProgram(int btn){
Serial.println("exit program");
programBTN = -1;
int cnt = sizeof(BTNS)/sizeof(BTNS[0]);
for (int i=0; i<cnt; i++){
OBTNS[i] = OneButton(BTNS[i], false,false);
OBTNS[i].reset();
OBTNS[i].attachClick([](void* p) { loadClick((int)p); }, (void*)i);//监听单击
OBTNS[i].attachLongPressStart([](void* p) { enterProgram((int)p); }, (void*)i);//监听长按(按下)
OBTNS[i].attachLongPressStop([](void* p) { inProgram((int)p); }, (void*)i);//监听长按(抬起)
}
}
//写文件
void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\r\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("- failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("- file written");
} else {
Serial.println("- write failed");
}
file.close();
}
//读文件
void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\r\n", path);
File file = fs.open(path);
if(!file || file.isDirectory()){
Serial.println("- failed to open file for reading");
return;
}
Serial.println("- read from file:");
while(file.available()){
Serial.write(file.read());
}
file.close();
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
int cnt;
//初始化LED
cnt = sizeof(LEDS)/sizeof(LEDS[0]);
for (int i=0; i<cnt; i++){
Serial.println(i);
pinMode(LEDS[i], OUTPUT);
}
//初始化按钮
cnt = sizeof(BTNS)/sizeof(BTNS[0]);
for (int i=0; i<cnt; i++){
pinMode(BTNS[i], INPUT);
OBTNS[i] = OneButton(BTNS[i], false,false);
OBTNS[i].reset();
OBTNS[i].attachClick([](void* p) { loadClick((int)p); }, (void*)i);//监听单击
OBTNS[i].attachLongPressStart([](void* p) { enterProgram((int)p); }, (void*)i);//监听长按(按下)
OBTNS[i].attachLongPressStop([](void* p) { inProgram((int)p); }, (void*)i);//监听长按(抬起)
}
//LittleFS
if(!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
Serial.println("LittleFS Mount Failed");
return;
}else{
Serial.println("Little FS Mounted Successfully");
}
writeFile(LittleFS, "/data.txt", "MY ESP32 DATA \r\n");
}
void loop() {
delay(10);
int cnt = sizeof(OBTNS)/sizeof(OBTNS[0]);
for (int i=0; i<cnt; i++){
OBTNS[i].tick();
}
}