#include <TM1637.h>
#include <EEPROM.h>
#include <IRremote.h>
#define ok A2
#define up A1
#define down A3
#define ad A4
#define fpwm 9
#define lpwm 10
#define ac_p 4
#define relay1 0
#define relay2 1
#define buzz 5
IRrecv ir(13);
const int button[]={4,5,6,7};
static bool power=true;
static bool ac = false;
static bool t = false;
static bool mn = false;
static bool s = false;
static bool aa = false;
static bool m = true;
static bool le = false;
// Instantiation and pins configurations
// Pin 3 - > DIO
// Pin 2 - > CLK
TM1637 tm(11,12);
const char data[4];
int mod=1,pmod=0,
speed=0,light=0,dig=1,min=0;
int lmod=0,smod=0,tmod=0;
float vol,sec=0,ttt;
unsigned long ss=0;
unsigned long pv=0;
unsigned long tt=0;
unsigned long mm=0;
unsigned long men=0;
unsigned long t_stop = 5000;
const unsigned long OneMinute = 60UL * 1000UL;
const unsigned long OneHour = 60UL * OneMinute;
void setup()
{
tm.begin();
Serial.begin(9600);
pinMode(ok,INPUT_PULLUP);
pinMode(ad,INPUT_PULLUP);
pinMode(up,INPUT_PULLUP);
pinMode(down,INPUT_PULLUP);
pinMode(relay1,OUTPUT);
pinMode(relay2,OUTPUT);
pinMode(fpwm,OUTPUT);
pinMode(lpwm,OUTPUT);
pinMode(buzz,OUTPUT);
pinMode(ac_p,INPUT);
ir.enableIRIn();
digitalWrite(buzz,LOW);
vol= analogRead(A0)*(15/1023);
// tm.setBrightnessPercent(70);
tm.setBrightness(30);
////eeprom read
smod=EEPROM.read(1);
pmod=EEPROM.read(2);
/////on display
ddd(" ON");
delay(20);
//////mode chake
if(pmod>=2){
ddd("Erro");
delay(20);
EEPROM.write(2,1);
ddd("donE");
pmod=EEPROM.read(2);
}
/////battery voltage
// tm.display(vol);
// delay(2000);
//////yeahya name
for(int i=0;i<100;i++){
if(i<100){
tm.display("--ABDULLAH-AL-YAHYA")->scrollLeft(50);
// tm.display("h");
delay(10);
continue;
}
}
if(smod<=0){
ddd("Erro");
delay(20);
smod=5;}
}
void loop()
{
//////voltage read
vol= analogRead(A0)*(15/1023);
////////function
power_status();
function();
key();
ir_f();
//////pwm output
analogWrite(fpwm,speed);
analogWrite(lpwm,light);
///////display function switch
switch(dig){
///////menu function / setup display
case 1:
if(power==true && mod==1){
acdc();
}
if(power==true && mod==2){
led();
}
if(power==true && mod==3){
tim();
}
break;
/////ac dc speed mode display
case 2:
acdc();
break;
/////led on off function display
case 3:
if(le==true && power==true){
led();
}
else{dig=5;}
break;
//////timer off function display
case 4:
/* if(t==true && power==true){
tm.display(min);
}*/
dig=5;
break;
/////timer minite display
case 5:
if(t==true && power==true){
sprintf(data, "%d",ttt);
ddd(data);
}
else{ddd("p");}
break;
///////power off function display
case 6:
if(power==false){
speed=0;
light=0;
tt=0;
min=0;
ddd("off");
delay(20);
ddd("----");
delay(20);
dig=8;
}
break;
//////ac dc mode change function display
case 7:
if(pmod==0){
ddd(" Ac");}
else if(pmod==1){
ddd(" dc");}
break;
//////power off display blink
case 8:
dbb("off ",150);
break;
}
// Check each button
for (int i = 0; i < 4; i++) { if (digitalRead(button[i]) == LOW) { digitalWrite(buzz, HIGH); // Turn on buzzer
// delay(50); // Beep duration
digitalWrite(buzz, LOW); // Turn off buzzer//delay(300); // Debounce delay
} }
}
void power_status(){
if(digitalRead(ac_p)==HIGH){
ac=true;
}
else if(digitalRead(ac_p)==LOW ){
ac=false;
}
// if(p==1){power=true;}
// if(p==0){power=false;}
}
void buzzer() { digitalWrite(buzz, HIGH); // Turn on buzzer
delay(50); // Beep duration
digitalWrite(buzz, LOW); // Turn off buzzer
}
void ddd(const char dat_a[50]){
tm.display(dat_a);
}
void dbb(const char dat_a[50],int dly){
tm.display(dat_a)->blink(dly);
}void acdc(){
if(pmod==0 && ac==true){
sprintf(data, "Ac %d",smod);
}
else if(pmod==1){
sprintf(data, "dc %d",smod);
}
ddd(data);
}
void led(){
sprintf(data, "l- %d",lmod);
ddd(data);
}
void tim(){
sprintf(data, "t-%02d",tmod*5);
ddd(data);
if(tmod>=1 && t==false){
t_stop=tmod*5*OneMinute;min=tmod*5;sec=0;
}
else if(tmod==0){t_stop=0;t=false;min=0;tt=0;
men=0,sec=0,ttt=0;
}
}void function(){
if(ttt==2&&sec==0){
digitalWrite(buzz,HIGH);
delay(100);
digitalWrite(buzz,LOW);
delay(100);
digitalWrite(buzz,HIGH);
delay(50);
digitalWrite(buzz,LOW);
delay(50);
}
else if(tt==1&&sec==0){
digitalWrite(buzz,HIGH);
delay(100);
digitalWrite(buzz,LOW);
delay(100);
digitalWrite(buzz,HIGH);
delay(50);
digitalWrite(buzz,LOW);
delay(50);
}
//check if the fan is ON timer off
if(tt > 0 && t==true && power==true){
unsigned long cv = millis();
//____________________________________________
if(cv - tt >= t_stop) {
speed=0;
light=0;
tt=0;
dig=6;
power=false;t=false;
}
}
/////timer power off display minute function
if(men>0 && t==true && power==true){
unsigned long cv = millis();
int mi;
if((cv-men)>=1000){
men=cv;
if (sec == 0) {
min=min-1;
sec = 59;
if(mi == 0){mi=0;}
} else {
sec=sec-1.00;
}
ttt=min+sec/100;
}
}
////auto display mode=1 back function
if(mod>=2 && m==false && power==true){
if(millis()-mm>=3000){
mod=1;
m=true;
power=true;
if(tmod>=1 && t==false){
t==true;
}
else{t=t;}
}
}
else if (mod==1){
m=true;}
////fan speed mode eeprom save display function
if(s==true){
if(millis()-ss>=5000){
EEPROM.update(1,smod);
ddd("donE");
pmod=EEPROM.read(2);
smod=EEPROM.read(1);
delay(100);
s=false;
}
}
///////ac dc mode eeprom save display function
if(aa==true && power==true){
if(millis()-ss>=5000){
EEPROM.update(2,pmod);
tm.clearScreen();
ddd("donE");
pmod=EEPROM.read(2);
smod=EEPROM.read(1);
delay(100);
aa=false;
dig=dig;
}
}
///////10s display function change dig
if(m==true && power==true){
if(millis()-mm>=6000){
tm.clearScreen();
dig++;
mm=millis();
if(dig>=6){dig=2;}
delay(200);
}
}
///////relay on off function
if(pmod==0 && ac==true){
digitalWrite(relay2,HIGH);
//digitalWrite(13,LOW);
}
else if (pmod==1){
//digitalWrite(13,HIGH);
digitalWrite(relay2,LOW);
}
if(smod>=1){
speed=smod*28;
}
else{
speed=0;
}
//////led on off display function
if(lmod>=1){
le=true;
light=lmod*50;
}
else{
le=false;
light=0;
}
////////power change function
if(pmod==0 && ac==false){
ddd("Erro");
delay(20);
ddd("Auto");
delay(20);
pmod=1;
}
else if(pmod==1 && EEPROM.read(2)== 0 && ac==true){
ddd("Auto");
delay(10);
ddd("Ac");
pmod=0;}
}void ir_f(){
if(ir.decode()){
unsigned long value = ir.decodedIRData.decodedRawData;
ir.resume();
Serial.print("value : ");
Serial.println(value);
///////0-9 fan speed controll
if(value==1020){
smod=0;speed=0;t=false;ss=millis();s=true;
mn=false;mm=millis();}
else if(value==1016){
smod=1;ss=millis();s=true;mn=false;mm=millis();}
else if(value==1012){
smod=2;ss=millis();s=true;mn=false;mm=millis();}
else if(value==1008){
smod=3;ss=millis();s=true;mn=false;mm=millis();}
else if(value==1004){
smod=4;ss=millis();s=true;mn=false;mm=millis();}
else if(value==1000){
smod=5;ss=millis();s=true;mn=false;mm=millis();}
else if(value==996){
smod=6;ss=millis();s=true;mn=false;mm=millis();}
else if(value==992){
smod=7;ss=millis();s=true;mn=false;mm=millis();}
else if(value==988){
smod=8;ss=millis();s=true;mn=false;mm=millis();}
else if(value==984){
smod=9;ss=millis();s=true;mn=false;mm=millis();}
/////fan speed
if(value==956 && mod==1&& power==true){
smod++;ss=millis();s=true;mn=false;mm=millis();
if(smod>=10){
smod=0;
}
}
if(value==940 && mod==1&& power==true){
smod--;ss=millis();s=true;mn=false;mm=millis();
if(smod<0){
smod=9;
}
}
///////led bright 0-5
else if(value==956 && mod==2 && power==true){
lmod++;mod=2;mn=false;mm=millis();
if(lmod>=6){
lmod=0;
}
}
else if(value==940&& mod==2 && power==true){
lmod--;mod=2;mn=false;mm=millis();
if(lmod<0){
lmod=5;
}
}
///////timer off
else if(value==956&& mod==3 && power==true){
tmod++;mod=3;tt=millis();men=millis();
mm=millis();
if(tmod>=13){
tmod=0;
}
if(tmod>=2&&smod>=2){
t=false;
}
}
else if(value==940 && mod==3 && power==true){
tmod--; mod=3; tt=millis();men=millis();mm=millis();
if(tmod<0){
tmod=12;
}
if(tmod>=2 && smod>=2){
t=false;
}
}
////ac dc mode
else if(value==932 && power==true){
pmod++;ss=millis();aa=true;
dig=7;
delay(1000);
if(pmod>=2){
pmod=1;
}
else if(pmod<0){
pmod=1;
}
}
///////power on off and mode++
else if(value==964 && power==true){
pv=millis();
mm=millis();
men=millis();
ss=millis();
mod++;
dig=1;
m=false;
if(mod>=4){
mod=1;
}
}
else if(value==948 && power==true){
power=false;
t=false;
smod=0;lmod=0;
tmod=0;
tt=0;
dig=6;
}
/////arduino reset
else if(value==948 && power==false){
asm volatile(" jmp 0");
}
}
}void key(){
/////fan speed
if(digitalRead(up)==LOW && mod==1&& power==true){
smod++;ss=millis();s=true;mn=false;mm=millis();
if(smod>=10){
smod=0;
}
delay(30);
}
if(digitalRead(down)==LOW && mod==1&& power==true){
smod--;ss=millis();s=true;mn=false;mm=millis();
if(smod<0){
smod=9;
}
delay(30);
}
///////led bright
if(digitalRead(up)==LOW && mod==2&& power==true){
lmod++;;mn=false;mm=millis();
if(lmod>=6){
lmod=0;
}
delay(30);
}
if(digitalRead(down)==LOW && mod==2&& power==true){
lmod--;mn=false;mm=millis();
if(lmod<0){
lmod=5;
}
delay(30);
}
///////timer off
if(digitalRead(up)==LOW && mod==3&& power==true){
tmod++;tt=millis();men=millis();
mm=millis();
if(tmod>=13){
tmod=0;
}
if(tmod>=2&&smod>=2){
t=false;
}
// else if(tmod==1){t=false;}
delay(30);
}
if(digitalRead(down)==LOW && mod==3 && power==true){
tmod--; tt=millis();men=millis();mm=millis();
if(tmod<0){
tmod=12;
}
if(tmod>=2 && smod>=2){
t=false;
}
// else if(tmod==1){t=false;}
delay(30);
}
////ac dc mode
if(digitalRead(ad)==LOW && power==true){
pmod++;ss=millis();aa=true;
dig=7;
delay(10);
if(pmod>=2){
pmod=0;
}
if(pmod<0){
pmod=1;
}
}
///////power on off and mode++
if(digitalRead(ok)==LOW && power==true){
pv=millis();
mm=millis();
men=millis();
ss=millis();
while(digitalRead(ok)==LOW && power==true){
if(millis()-pv>=3000){
power=false;
smod=0;lmod=0;
tmod=0;
tt=0;
dig=6;
return;
}
}
mod++;
dig=1;
m=false;
if(mod>=4){
mod=1;
}
delay(20);
}
/////arduino reset
if(digitalRead(ok)==LOW && power==false){
delay(10);
asm volatile(" jmp 0");
}
}