#include <Arduino.h>
#include <menu.h>
#include <menuIO/serialOut.h>
#include <menuIO/chainStream.h>
#include <menuIO/serialIn.h>
#include <Bounce2.h>
#include <LittleFS.h>
#include <ArduinoJson.h>
using namespace Menu;
#define BTN0_PIN 32
#define RELAY0 26
#define RELAY1 27
#define MAX_DEPTH 3
#pragma region RELAY0变量
float _RELAY0_DELAY=0;
float _RELAY0_RUN=1;
float _RELAY0_WAIT=0;
uint8_t _RELAY0_COUNT=1;
#pragma endregion
#pragma region RELAY1变量
float _RELAY1_DELAY=0;
float _RELAY1_RUN=1;
float _RELAY1_WAIT=0;
uint8_t _RELAY1_COUNT=1;
#pragma endregion
#pragma region RELAY2变量
float _RELAY2_DELAY=0;
float _RELAY2_RUN=1;
float _RELAY2_WAIT=0;
uint8_t _RELAY2_COUNT=1;
#pragma endregion
#pragma region RELAY3变量
float _RELAY3_DELAY=0;
float _RELAY3_RUN=1;
float _RELAY3_WAIT=0;
uint8_t _RELAY3_COUNT=1;
#pragma endregion
Bounce BTN0 = Bounce();
void RELAY0_HIGH(){
digitalWrite(RELAY0, HIGH);
}
void RELAY0_LOW(){
digitalWrite(RELAY0, LOW);
}
void RELAY1_HIGH(){
digitalWrite(RELAY1, HIGH);
}
void RELAY1_LOW(){
digitalWrite(RELAY1, LOW);
}
result updateSetting(eventMask e,prompt& p){
File file=LittleFS.open("/.config","w");
DynamicJsonDocument doc(1024);
doc["_RELAY0_DELAY"]=_RELAY0_DELAY;
doc["RELAY0_RUN"]=_RELAY0_RUN;
doc["_RELAY0_WAIT"]=_RELAY0_WAIT;
doc["_RELAY0_COUNT"]=_RELAY0_COUNT;
doc["_RELAY1_DELAY"]=_RELAY1_DELAY;
doc["RELAY1_RUN"]=_RELAY1_RUN;
doc["_RELAY1_WAIT"]=_RELAY1_WAIT;
doc["_RELAY1_COUNT"]=_RELAY1_COUNT;
String json="";
serializeJson(doc, json);
file.print(json);
file.close();
}
//littlefs操作
// https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html
void readSetting(){
DynamicJsonDocument doc(1024);
if(LittleFS.exists("/.config")){
File file=LittleFS.open("/.config","r");
Serial.println("open config.");
String json=file.readString();
deserializeJson(doc, json);
_RELAY0_DELAY=doc["_RELAY0_DELAY"];
_RELAY0_RUN=doc["_RELAY0_RUN"];
_RELAY0_WAIT=doc["_RELAY0_WAIT"];
_RELAY0_COUNT=doc["_RELAY0_COUNT"];
_RELAY1_DELAY=doc["_RELAY1_DELAY"];
_RELAY1_RUN=doc["_RELAY1_RUN"];
_RELAY1_WAIT=doc["_RELAY1_WAIT"];
_RELAY1_COUNT=doc["_RELAY1_COUNT"];
file.close();
}
else{
File file=LittleFS.open("/.config","w");
doc["_RELAY0_DELAY"]=_RELAY0_DELAY;
doc["RELAY0_RUN"]=_RELAY0_RUN;
doc["_RELAY0_WAIT"]=_RELAY0_WAIT;
doc["_RELAY0_COUNT"]=_RELAY0_COUNT;
doc["_RELAY1_DELAY"]=_RELAY1_DELAY;
doc["RELAY1_RUN"]=_RELAY1_RUN;
doc["_RELAY1_WAIT"]=_RELAY1_WAIT;
doc["_RELAY1_COUNT"]=_RELAY1_COUNT;
String json="";
serializeJson(doc, json);
file.print(json);
file.close();
}
}
MENU(testSubMenu,"TEST",doNothing,anyEvent,wrapStyle,
OP("RELAY0_HIGH",RELAY0_HIGH,enterEvent),
OP("RELAY0_LOW",RELAY0_LOW,enterEvent),
OP("RELAY1_HIGH",RELAY1_HIGH,enterEvent),
OP("RELAY1_LOW",RELAY1_LOW,enterEvent),
EXIT("<Back")
);
MENU(
setMenu_RELAY_DELAY, "RELAYS_DELAY_SETTING", doNothing, noEvent, wrapStyle,
FIELD(_RELAY0_DELAY,"_RELAY0_DELAY"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY1_DELAY,"_RELAY1_DELAY"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY2_DELAY,"_RELAY2_DELAY"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY3_DELAY,"_RELAY3_DELAY"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
EXIT("<Back")
);
MENU(
setMenu_RELAY_RUN, "RELAYS_RUN_SETTING", doNothing, noEvent, wrapStyle,
FIELD(_RELAY0_RUN,"_RELAY0_RUN"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY1_RUN,"_RELAY1_RUN"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY2_RUN,"_RELAY2_RUN"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY3_RUN,"_RELAY3_RUN"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
EXIT("<Back")
);
MENU(
setMenu_RELAY_WAIT, "RELAYS_WAIT_SETTING", doNothing, noEvent, wrapStyle,
FIELD(_RELAY0_WAIT,"_RELAY0_WAIT"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY1_WAIT,"_RELAY1_WAIT"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY2_WAIT,"_RELAY2_WAIT"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
FIELD(_RELAY3_WAIT,"_RELAY3_WAIT"," (s)",0,100,0.1,0.01, updateSetting, updateEvent, noStyle),
EXIT("<Back")
);
MENU(
setMenu_RELAY_COUNT, "RELAYS_COUNT_SETTING", doNothing, noEvent, wrapStyle,
FIELD(_RELAY0_COUNT,"_RELAY0_COUNT","",0,100,1,1, updateSetting, updateEvent, noStyle),
FIELD(_RELAY1_COUNT,"_RELAY1_COUNT","",0,100,1,1, updateSetting, updateEvent, noStyle),
FIELD(_RELAY2_COUNT,"_RELAY2_COUNT","",0,100,1,1, updateSetting, updateEvent, noStyle),
FIELD(_RELAY3_COUNT,"_RELAY3_COUNT","",0,100,1,1, updateSetting, updateEvent, noStyle),
EXIT("<Back")
);
MENU(
selectRelayMenu, "RELAYS SETTING", doNothing, noEvent, wrapStyle,
SUBMENU(setMenu_RELAY_DELAY),
SUBMENU(setMenu_RELAY_RUN),
SUBMENU(setMenu_RELAY_WAIT),
SUBMENU(setMenu_RELAY_COUNT),
EXIT("<Back")
);
MENU(
mainMenu, "mainMenu", doNothing, noEvent, wrapStyle,
SUBMENU(testSubMenu),
SUBMENU(selectRelayMenu),
EXIT("<Exit")
);
serialIn serial(Serial);
MENU_INPUTS(in,&serial);
MENU_OUTPUTS(out,MAX_DEPTH
,SERIAL_OUT(Serial)
,NONE//must have 2 items at least
);
NAVROOT(nav,mainMenu,MAX_DEPTH,in,out);
void TASK1(void * pvParameters){
while(true){
BTN0.update();
if(BTN0.rose()){
vTaskDelay(_RELAY0_DELAY*1000);
digitalWrite(RELAY0, HIGH);
vTaskDelay(_RELAY0_RUN*1000);
delay(_RELAY0_RUN*1000);
digitalWrite(RELAY0, LOW);
}
}
}
void TASK2(void * pvParameters){
while(true){
BTN0.update();
if(BTN0.rose()){
vTaskDelay(_RELAY1_DELAY*1000);
digitalWrite(RELAY1, HIGH);
vTaskDelay(_RELAY1_RUN*1000);
delay(_RELAY1_RUN*1000);
digitalWrite(RELAY1, LOW);
}
}
}
void setup() {
pinMode(RELAY0, OUTPUT);
pinMode(RELAY1, OUTPUT);
BTN0.attach(BTN0_PIN,INPUT_PULLUP);
xTaskCreate(TASK1,"TASK1",4096,NULL,1,NULL);
xTaskCreate(TASK2,"TASK2",4096,NULL,1,NULL);
Serial.begin(115200);
while(!Serial);
Serial.println("Menu 4.x");
Serial.println("Use keys + - * /");
Serial.println("to control the menu navigation");
nav.canExit=false;
nav.useUpdateEvent=true;
}
void loop() {
nav.poll();
}