โปรแกรม Timer เปิดปิดเครื่องใช้ไฟฟ้า เอาไปต่อกับวงจรรีเลย์หรือคอนเทรคเตอร์ควบคุมอุปกรณ์ได้หลายตัวครับ เพิ่งเขียนเสร็จหมาดๆ แต่ในโปรแกรมผมใช้ LCD Shield ต่อกับแผง LED เพื่อทดสอบการทำงานครับ
//Timer controls by Kongphat
#include <LiquidCrystal.h>
// initialize the interface pins
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
byte LT[8] =
{
B00111,
B01111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte UB[8] =
{
B11111,
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte RT[8] =
{
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte LL[8] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B01111,
B00111
};
byte LB[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte LR[8] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11110,
B11100
};
byte MB[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte block[8] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
void custom0(int col)
{ // uses segments to build the number 0
lcd.setCursor(col,0); // set cursor to column 0, line 0 (first row)
lcd.write(8); // call each segment to create
lcd.write(1); // top half of the number
lcd.write(2);
lcd.setCursor(col, 1); // set cursor to colum 0, line 1 (second row)
lcd.write(3); // call each segment to create
lcd.write(4); // bottom half of the number
lcd.write(5);
}
void custom1(int col)
{
lcd.setCursor(col,0);
lcd.write(1);
lcd.write(2);
lcd.setCursor(col,1);
lcd.write(4);
lcd.write(7);
lcd.write(4);
}
void custom2(int col)
{
lcd.setCursor(col,0);
lcd.write(6);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(4);
lcd.write(4);
}
void custom3(int col)
{
lcd.setCursor(col,0);
lcd.write(6);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
void custom4(int col)
{
lcd.setCursor(col,0);
lcd.write(8);
lcd.write(4);
lcd.write(7);
lcd.setCursor(col+2, 1);
lcd.write(7);
}
void custom5(int col)
{
lcd.setCursor(col,0);
lcd.write(8);
lcd.write(6);
lcd.write(6);
lcd.setCursor(col, 1);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
void custom6(int col)
{
lcd.setCursor(col,0);
lcd.write(8);
lcd.write(6);
lcd.write(6);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(4);
lcd.write(5);
}
void custom7(int col)
{
lcd.setCursor(col,0);
lcd.write(1);
lcd.write(1);
lcd.write(2);
lcd.setCursor(col+2, 1);
lcd.write(7);
}
void custom8(int col)
{
lcd.setCursor(col,0);
lcd.write(8);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(4);
lcd.write(5);
}
void custom9(int col)
{
lcd.setCursor(col,0);
lcd.write(3);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col+2, 1);
lcd.write(7);
}
void clearnumber(int col)
{ // clears the area the custom number is displayed in
lcd.setCursor(col,0);
lcd.print(" ");
lcd.setCursor(col,1);
lcd.print(" ");
}
// loop counter
int count = 0;
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
// Convert ADC value to key number
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)k = -1; // No valid key pressed
return k;
}
void setup()
{
lcd.clear();
// assignes each segment a write number
lcd.createChar(8,LT);
lcd.createChar(1,UB);
lcd.createChar(2,RT);
lcd.createChar(3,LL);
lcd.createChar(4,LB);
lcd.createChar(5,LR);
lcd.createChar(6,MB);
lcd.createChar(7,block);
lcd.begin(16, 2);
pinMode(39,OUTPUT);
pinMode(41,OUTPUT);
pinMode(43,OUTPUT);
pinMode(45,OUTPUT);
digitalWrite(39,LOW);
digitalWrite(41,LOW);
digitalWrite(43,LOW);
digitalWrite(45,LOW);
}
void loop()
{
//printBigInt(analogRead(1),3);
for(int h=0;h<24;h++)
{
lcd.clear();
for(int m=0;m<60;m++)
{
for(int s=0;s<60;s++)
{
adc_key_in = analogRead(0);
key = get_key(adc_key_in);
if(key==1){ //UP
h+=1;
if(h>23) h=0;
printNum2Len(h,0);
}
if(key==2){ //DOWN
h-=1;
if(h<0) h=23;
printNum2Len(h,0);
}
if(key==3){ //LEFT
m-=1;
if(m<0) m=59;
printNum2Len(m,7);
}
if(key==0){ //RIGHT
m+=1;
if(m>59) m=0;
printNum2Len(m,7);
}
if(key==4){ //SELECT
digitalWrite(39,LOW);
digitalWrite(41,LOW);
digitalWrite(43,LOW);
digitalWrite(45,LOW);
}
lcd.setCursor(13,0);
lcd.print("SEC");
lcd.setCursor(14,1);
lcd.print(" ");
lcd.setCursor(14,1);
lcd.print(s);
if(h==6 && m==0)
{
digitalWrite(39,LOW);
digitalWrite(41,LOW);
digitalWrite(43,LOW);
digitalWrite(45,LOW);
}
if(h==18 && m==0)
{
digitalWrite(39,HIGH);
digitalWrite(41,LOW);
digitalWrite(43,LOW);
digitalWrite(45,LOW);
}
if(h==20 && m==30)
{
digitalWrite(39,LOW);
digitalWrite(41,HIGH);
digitalWrite(43,HIGH);
digitalWrite(45,LOW);
}
if(h==0 && m==0)
{
digitalWrite(39,HIGH);
digitalWrite(41,HIGH);
digitalWrite(43,HIGH);
digitalWrite(45,HIGH);
}
if(s==0){
lcd.setCursor(6,0);
lcd.print("o");
lcd.setCursor(6,1);
lcd.print("o");
printNum2Len(h,0);
printNum2Len(m,7);
}
delay(1000);
}
}
}
}
void printNum2Len(int num,int col)
{
int space = 3;
clearnumber(col);
clearnumber(col+space);
printBigInt(0,col,space);
printBigInt(0,col+space,space);
if(num<10) printBigInt(num,col+space,space);
if(num>9) printBigInt(num,col,space);
}
void printBigInt(int num,int col,int space)
{
int data = num;
String str = String(data);
char inp[4];
str.toCharArray(inp, 4);
printBigNumber(inp[0],col);
if(data>9){
printBigNumber(inp[1],col+space);
}
if(data>99){
printBigNumber(inp[2],col+(space*2));
}
}
void printBigNumber(char num,int col)
{
clearnumber(col);
switch (num){
case '1':
custom1(col);
break;
case '2':
custom2(col);
break;
case '3':
custom3(col);
break;
case '4':
custom4(col);
break;
case '5':
custom5(col);
break;
case '6':
custom6(col);
break;
case '7':
custom7(col);
break;
case '8':
custom8(col);
break;
case '9':
custom9(col);
break;
case '0':
custom0(col);
break;
}
}