//ระบบควบคุมไฟหน้ามอเตอร์ไซค์ไฟ BI LED
#include <Bounce2.h>//ไรซ์เบอรี่ปุ่มกด
Bounce2::Button bn = Bounce2::Button();
int a4,w1,w2,r2,z1,z2,z3,z4,z5,z6,z8,z9,x0,x1,WW;
int L1,L2,S1;
unsigned char p1,p4,p5,p3,c1,s1,s2,i1,r1,j1,uy=10,vg,rl=0,ASD;
boolean f=0,s8,ld=0,mp=0,VF=0,vv=0,LE=0;
//วัดไฟ A0-----------------------------------------------------
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K) -see text!
float R2 = 10000.0; // resistance of R2 (10K) - see text!
int value = 0;
const float BETA = 3950;
void setup() {
pinMode(3, OUTPUT); //pwm หลอดไฟ 1
pinMode(9, OUTPUT); //ไฟโชว์ LED
pinMode(7, OUTPUT);//ปั๊มน้ำ
pinMode(8, INPUT_PULLUP);//กระพริบไฟสูงต่ำ
pinMode(A2, OUTPUT);//พัดลม
pinMode(5, OUTPUT);//pwm หลอดไฟ 2
pinMode(10, OUTPUT);//pwm มอสเฟตไฟสูงต่ำ
pinMode(A3, OUTPUT);//แผ่นทำความเย็น
pinMode(12, INPUT_PULLUP);//โซลินอยด์ไฟสูงต่ำ
pinMode(13, INPUT_PULLUP);//โซลินอยด์ไฟสูงต่ำ
bn.attach( 13, INPUT_PULLUP );//สวิทช์สลับหลอดไฟ
bn.interval(5);
//ทดสอบระบบสั่งงานด้วยรีเลย์พัดลมปั๊มน้ำหลอดไฟก่อนที่จะเข้าสู่ระบบการทำงาน
digitalWrite(9, HIGH);
delay(50);
digitalWrite(9, LOW);
delay(500);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(1000);
digitalWrite(3, HIGH);
delay(50);
digitalWrite(3, LOW);
delay(500);
digitalWrite(5, HIGH);
delay(100);
digitalWrite(5, LOW);
delay(800);
digitalWrite(3, HIGH);digitalWrite(5, HIGH);
delay(100);
digitalWrite(3, LOW);digitalWrite(5, LOW);
delay(100);
digitalWrite(A2, HIGH);
delay(2000);
digitalWrite(A2, LOW);
delay(1000);
digitalWrite(7, HIGH);
delay(2000);
digitalWrite(7, LOW);
delay(1000);
pwmSetup();
//Serial.begin(115200);
}
void loop() {
//OCR0A = p2;// ขา 6
OCR0B = p5;// ขา 5
//OCR1A = p3;// ขา 9
OCR1B = p4;//ขา 10
//OCR2A = p6;//ขา 11
OCR2B = p1;//ขา 3
//Serial.println(a4);
analogWrite(3,p1);
analogWrite(5,p5);
analogWrite(10,p4);
bn.update();
switch(s8){
case 0:
mp=0;if(bn.pressed()){ld=!ld;}
if(digitalRead(13)==0){if(z8==0){s8=1;}
if(z8>0){z8--;}}else{z8=1000;}z9=10; break;//สวิตซ์กดติดกดสลับเปิดหลอดไฟ
case 1:
if(bn.pressed()){mp=!mp;}
if(z9==0){
if(mp==0){s8=0;}} //สวิตซ์กดค้างเปิดไฟทั้ง 3 หลอด
if(mp==0){if(z9==10){s1=0;}z9=10;
}else{
if(z9>0){z9--;}}
break;}
//เปิดระบบการทำงานเมื่อแรงดันมากกว่า 10 โวลต์
if(vin<9.00){a4=0;digitalWrite(9,0);}else{a4=analogRead(A1);digitalWrite(9,LE);}
//วัดไฟที่ขา A0-------------------------
value = analogRead(A0);
vout = (value * 5.0) / 1024.0;
vin = vout / (R2/(R1+R2));
if (vin<0.09) {vin=0.0;}
w1=map(a4,0,1023,0,336);
w2=map(analogRead(A5),0,1023,255,0);//เซ็นเซอร์รับแสง ldr
//วัดแรงดัน 20 ถึง 336 โวลท์
if(w2<=85){vg=20;}else{
if(w2<=90){vg=19;}else{
if(w2<=95){vg=18;}else{
if(w2<=100){vg=17;}else{
if(w2<=105){vg=14;}else{
if(w2<=110){vg=12;}else{
if(w2<=115){vg=11;}else{
if(w2<=120){vg=8;}else{
if(w2<=125){vg=7;}else{
if(w2<=130){vg=6;}else{vg=5;}}}}}}}}}}
if(w2>70){if(WW>0){WW--;}}else{WW=30000;}// หน่วงเวลาปิดพัดลมและแผ่นทำความเย็น ปั๊มน้ำ
if(WW==0){VF=0;}else{VF=1;} // ปิดเปิดปั๊มน้ำพัดลม
if(a4>336){w1=336;}else{w1=a4;}//จำกัดค่าตัวแปรที่ 336
if(w1>800){i1=2;}else{if(w1>10){i1=1;}else{i1=0;}}//ดับเครื่องหลอดไฟก็จะดับ
switch(i1){
case 0:if(w1<8){p1=0;p5=0;digitalWrite(A2,0);digitalWrite(A3,0);}else{if(ld==1){p1=6;p5=0;digitalWrite(A2,0);digitalWrite(A3,0);}else{p5=6;p1=0;}} break;
case 1: if(ld==1){
if(w2<70){if(z1>0){z1--;}else{s1=1;}z2=2500;}z5=0;z6=0;
if(w2>80){if(z2>0){z2--;}else{s1=0;}z1=1000;}//ตั้งค่าหลอดไฟเปิดตามแสงและหน่วงเวลาเปิด
s2=2; if(w2<100){p5=6;}else{p5=0;}
} else{
if(w2<70){if(z1>0){z1--;}else{s2=1;}z2=2500;}z5=0;z6=0;//ตั้งค่าหลอดไฟปิดตามแสงและหน่วงเวลาปิด
if(w2>80){if(z2>0){z2--;}else{s2=0;}z1=1000;}//ตั้งค่าหลอดไฟเปิดตามแสงและหน่วงเวลาเปิด
s1=2;if(w2<100){p1=6;}else{p1=0;}
}
switch(s1){
case 0:p1=vg;digitalWrite(A2,VF);digitalWrite(A3,VF);break;
case 1:if(s8==1){p5=uy;p1=uy;}else{p5=6;p1=uy;}digitalWrite(A2,VF);digitalWrite(A3,VF);break;}
switch(s2){
case 0:p5=vg;digitalWrite(A2,VF);digitalWrite(A3,VF); break;
case 1:if(s8==1){p1=uy;p5=uy;}else{p1=6;p5=uy;}digitalWrite(A2,VF);digitalWrite(A3,VF);break;}
break;
break;}
if(w1>=38){if(x1>0){x1--;}else{uy=ASD;}}else{x1=800;} //เร่งเครื่องหลอดไฟจะเปิด
if(w1<=33){if(x0>0){x0--;}else{uy=6;}}else{x0=200;}// ผ่อนเครื่องหลอดไฟจะดับ
if(w1>13){if(digitalRead(8)==0|digitalRead(12)==0){//ควบคุมโซลินอยด์ไฟ
if(r1>0){r1--;p4=255;}else{p4=98;}}else{p4=0;r1=100;}}
else{p4=0;r1=100;}
if(digitalRead(8)==0){if(p4<=98){ //สวิตซ์ตบไฟสูงกระพริบอัตโนมัติ
switch(f){
case 0:if(z3>=0){z3--;}else{f=1;}z4=80;p1=0; break;
case 1:if(z4>=0){z4--;}else{f=0;}z3=700;p1=255; break;}}}
//วัดอุณหภูมิน้ำ
int analogValue=analogRead(A4);//เซ็นเซอร์วัดอุณหภูมิ 10 k
float celsius=1/(log(1/(1023./analogValue-1))/BETA+1.0/298.15)-273.15;
//สวิตซ์ปิดเปิดแผ่นทำความเย็น
if(VF==1){ if(celsius>=25){digitalWrite(7,vv);LE=1;}
if(celsius<=20){digitalWrite(7,0);}}else{digitalWrite(7,0);}
if(celsius>=35){ASD=10;vv=0;}else{vv=1;}//ถ้าระบบทำความเย็นขัดข้องหลอดไฟจะหรี่
if(celsius<=28){ASD=255;}//ระบบทำความเย็นใช้งานได้ปกติหลอดไฟจะเปิดสว่าง
if(VF==1){if(celsius<=20){ //ไฟกระพริบ
switch(S1){
case 0:if(L1>=0){L1--;}else{S1=1;}L2=700;LE=0; break;
case 1:if(L2>=0){L2--;}else{S1=0;}L1=700;LE=1; break;}}}
}
void pwmSetup(){//เพิ่มความถี่ให้สูงขึ้น
TCCR0A = _BV(COM0A1)|_BV(COM0B1)|_BV(WGM00);// pwm 31k
TCCR0B = _BV(CS00);
OCR0A = 0;
OCR0B = 0;
TCCR1A = _BV(COM1A1)|_BV(COM1B1)|_BV(WGM10);// pwm 31k
TCCR1B = _BV(CS10);
OCR1A = 0;
OCR1B = 0;
TCCR2A = _BV(COM2A1)|_BV(COM2B1)|_BV(WGM20);// pwm 31k
TCCR2B = _BV(CS20);
OCR2A = 0;
OCR2B = 0;
}