#include "U8glib.h"
#include <EEPROM.h>
#include <Enerlib.h>
Energy energy;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
float Ontime=1.0,Ontime1=0.0;
int Offtime=2,cycle=20,cycletag,Sleepstate=0;
boolean state=false,RelayState=true;
int progress = 0,option=0;
const int BTN01 = 2; //按键1、2、3、4分别接Nano 2、3、4、5
const int BTN02 = 3;
const int BTN03 = 4;
const int BTN04 = 5;
const int Relay01 = 13; //中间继电器接13脚,低电平有效。
unsigned long Time,Time1;
struct MyObject {
unsigned int field1;
unsigned int field4;
unsigned int field2;
unsigned int field3;
};
int eeAddress = 0;
void wakeISR() {
if (energy.WasSleeping()) {
Sleepstate = 1;
u8g.sleepOff();
SetDisplay();
} else {
Sleepstate = 2;
}
}
void setup() {
attachInterrupt(0, wakeISR, CHANGE);
for(int x=2;x<6;x++)pinMode(x, INPUT_PULLUP); //输入点内部上拉
pinMode(Relay01,OUTPUT);
digitalWrite(Relay01, HIGH);
MyObject customVar;
EEPROM.get(eeAddress, customVar); //读内存.
Ontime1=customVar.field4;
Ontime=customVar.field1+Ontime1/10;
Offtime=customVar.field2;
cycle=customVar.field3;
u8g.setFont(u8g_font_tpssb);
u8g.setColorIndex(1);
for(int x=0;x<110;x+=10){
u8g.firstPage();
do {
u8g.drawStr(10, 10, "VLab2");
u8g.drawStr(25, 60, "Loading......");
u8g.drawFrame(0, 20, 128, 30);
u8g.drawBox(10, 25, x, 20);
} while ( u8g.nextPage() );
}
u8g.firstPage();
do {
u8g.setFont(u8g_font_tpssb);
u8g.drawStr(10, 10, "VLab2");
u8g.setFont(u8g_font_profont10);
u8g.drawStr(20, 22, "ON : Sec");
u8g.drawStr(20, 34, "OFF: Sec");
u8g.drawStr(20, 46, "Cycle:");
u8g.setPrintPos(55, 22);
u8g.print(Ontime,1);
u8g.setPrintPos(55, 34);
u8g.print(Offtime);
u8g.setPrintPos(55, 46);
u8g.print(cycle);
} while ( u8g.nextPage() );
}
void loop() {
if(!digitalRead(BTN01)){
delay(500);
if(!digitalRead(BTN01)){
setting();
}
}
if(!digitalRead(BTN02)){
delay(1000);
if(!digitalRead(BTN02)){
state=true;
Time=millis();
cycletag=cycle;
//int cycletag1;
digitalWrite(Relay01, LOW);
while(cycletag){
SetDisplay();
if((millis()-Time)>(Ontime*1000)&&RelayState==true){
digitalWrite(Relay01, HIGH);
RelayState=false;
Time=millis();
}
if((millis()-Time)>(Offtime*1000)&&RelayState==false){
digitalWrite(Relay01, LOW);
RelayState=true;
Time=millis();
cycletag--;
}
if(!digitalRead(BTN02)){
delay(1000);
if(!digitalRead(BTN02)){
state=false;
digitalWrite(Relay01, HIGH);
RelayState=true;
cycletag=0;
SetDisplay();
}}
}
state=false;
digitalWrite(Relay01, HIGH);
RelayState=true;
SetDisplay();
}
}
if(Sleepkey()!=5){
Time1=millis();
}else {
if(millis()-Time1>18000) {
u8g.sleepOn();
energy.PowerDown();
}
}
// delay(5000);
// energy.PowerDown();
}
void SetDisplay()
{
u8g.firstPage();
do {
u8g.setFont(u8g_font_tpssb);
u8g.drawStr(10, 10, "VLab2");
u8g.setFont(u8g_font_profont10);
u8g.drawStr(20, 22, "ON : Sec");
u8g.drawStr(20, 34, "OFF: Sec");
u8g.drawStr(20, 46, "Cycle:");
if(state){
u8g.drawStr(0, 60, "In-progress: cycles done");
u8g.setPrintPos(60, 60);
{u8g.setFont(u8g_font_profont10);
u8g.print(cycle-cycletag+1);}
}
Menuitem();
if(option==1)u8g.setColorIndex(false);
u8g.setPrintPos(55, 22);
{
u8g.setFont(u8g_font_profont10);
u8g.print(Ontime,1);
}
u8g.setColorIndex(true);
if(option==2)u8g.setColorIndex(false);
u8g.setPrintPos(55, 34);
{
u8g.setFont(u8g_font_profont10);
u8g.print(Offtime);
}
u8g.setColorIndex(true);
if(option==3)u8g.setColorIndex(false);
u8g.setPrintPos(55, 46);
{
u8g.setFont(u8g_font_profont10);
u8g.print(cycle);
}
u8g.setColorIndex(true);
} while ( u8g.nextPage() );
}
int key()
{
int Kval=0;
if(!digitalRead(BTN03)){
delay(30);
if(!digitalRead(BTN03)){
Kval=1;
}
}
else if(!digitalRead(BTN04)){
delay(30);
if(!digitalRead(BTN04)){
Kval=2;
}
}
else if(!digitalRead(BTN02)){
delay(30);
if(!digitalRead(BTN02)){
option=0;
Kval=3;
}
}
return Kval;
}
int Sleepkey()
{
int SleepKval=0;
if(!digitalRead(BTN03)){
delay(30);
if(!digitalRead(BTN03)){
SleepKval=1;
}
}
else if(!digitalRead(BTN04)){
delay(30);
if(!digitalRead(BTN04)){
SleepKval=2;
}
}
else if(!digitalRead(BTN02)){
delay(30);
if(!digitalRead(BTN02)){
//option=0;
SleepKval=3;
}
}
else if(!digitalRead(BTN01)){
delay(30);
if(!digitalRead(BTN01)){
//option=0;
SleepKval=4;
}
}
else SleepKval=5;
return SleepKval;
}
void Menuitem()
{
switch(option){
case 1:{
u8g.drawBox(53,14,30,10);
break;
}
case 2:{
u8g.drawBox(53,26,30,10);
break;
}
case 3:{
u8g.drawBox(53,38,30,10);
break;
}
}
}
void setting()
{
while(key()!=3)
{
switch(option){
case 1 :{
if(key()==1){
Ontime+=0.5;
if(Ontime>60.5)Ontime=60.5;
}
if(key()==2){
Ontime-=0.5;
if(Ontime<0.5)Ontime=0.5;
}
break;
}
case 2 :{
if(key()==1){
Offtime+=1;
if(Offtime>3600)Offtime=3600;
}
if(key()==2){
Offtime-=1;
if(Offtime<1)Offtime=1;
}
break;
}
case 3 :{
if(key()==1){
cycle+=1;
if(cycle>100)cycle=100;
}
if(key()==2){
cycle-=1;
if(cycle<1)cycle=1;
}
break;
}
}
SetDisplay();
if(!digitalRead(BTN01)){
delay(500);
if(!digitalRead(BTN01)){
option++;
if(option>3)option=1;
} }
}
SetDisplay();
int Y;
Y=Ontime*10;
Ontime1=Y%10;
MyObject customVar = {Ontime,Ontime1,Offtime,cycle};
EEPROM.put(eeAddress, customVar);
delay(500);
}