本帖最后由 偶是谁 于 2016-9-18 20:21 编辑
程序根据Malc【红绿灯】 程序修改,开关置低进中断暂停,置高退出中断循环
该倒计时器特点是可以根据自己设备要求随意添加更改多组时间和输出,(更改时间组和输出组就OK)
应用范围非常广泛。
- #define Duration 5 //数码管扫描时间,间隔
- #define SegNum 3 //3位数码管
- #define LEDNum 13 //13个输出
- #define SensorINPUT 2 //低电平进入中断程序,暂停计时
- int val;
- int Light_time[13]={12,13,7,134,73,133,73,134,104,194,194,134,74};//13组时间
- char number[10][7]={ //共阳0~9编码
- 0,0,0,0,0,0,1,
- 1,0,0,1,1,1,1,
- 0,0,1,0,0,1,0,
- 0,0,0,0,1,1,0,
- 1,0,0,1,1,0,0,
- 0,1,0,0,1,0,0,
- 1,1,0,0,0,0,0,
- 0,0,0,1,1,1,1,
- 0,0,0,0,0,0,0,
- 0,0,0,0,1,0,0,
- };
- /*
- arduino引脚 3 4 5 6 7 8 9
- 数码管引脚 a b c d e f g
- */
- char seg[7]={3,4,5,6,7,8,9};//arduino引脚
-
- char DS[SegNum]={10,11,12};//arduino位选引脚
- char LED[LEDNum]={A0,A1,A2,A1,A2,A1,A3,A1,A2,A1,A0,A0,A4};
- /*arduino13组输出a0=5km,a1=7km,a2=9km,a3=11km,A4=3km*/
- unsigned long timer=0,ptimer=0;
- void setup()
- {
- pinMode(2, INPUT_PULLUP);
- attachInterrupt(0, keyInt, LOW); //当D2脚0电平时,触发中断函数
- Serial.begin(9600);//串口显示
- int i;
- for(i=0;i<7;i++)
- {
- pinMode(seg[i],OUTPUT);
- digitalWrite(seg[i],HIGH);
- }
-
- for(i=0;i<SegNum;i++)//段选
- {
- pinMode(DS[i],OUTPUT);
- digitalWrite(DS[i],HIGH);
- }
-
-
- for(i=0;i<LEDNum;i++)//位选
- {
- pinMode(LED[i],OUTPUT);
- digitalWrite(LED[i],HIGH);
- }
- timer=millis();/*millis()返回arduino从启动到当前所经过的毫秒数,大约42天
- 后溢出。如果将当前的时间记录下来(时间戳),记为timeStamp,然后在之后某一
- 时间进行一次(millis()-timeStamp)计算,就可以得出两次读数的时间差。一旦算出
- 超过预定值,就可以执行后续语句什么的。至于串口有没有数据,可以用Serial.
- available()来 判断,它返回的是缓冲区中的字符数。或者直接写一个serialEvent()
- 函数,如果串口有数据会在一个loop()执行完之后执行。BTW,用delay会导致loop()
- 不能及时结束,即,推迟serialEvent()函数的执行。*/
-
- }
- void dis(char num,char _DS)
- {
- int i;
- for(i=0;i<7;i++)
- digitalWrite(seg[i],number[num][i]);
- for(i=0;i<SegNum;i++)
- if(i==_DS)
- digitalWrite(DS[i],HIGH);
- else
- digitalWrite(DS[i],LOW);
- delay(Duration);
- for(i=0;i<SegNum;i++)//消隐
- {
- digitalWrite(DS[i],LOW);
- }
- }
- void show(unsigned long timer)
- {
- dis((timer/100)%10,2);
- dis((timer/10)%10,1);
- dis(timer%10,0);
-
- }
- void loop()
- {
- int i;
- for(i=0;i<LEDNum;i++)
- {
- if(timer==0)
- {
- digitalWrite(LED[i],LOW);
- delay(500);
- digitalWrite(LED[i],HIGH);
- while(timer<=Light_time[i])
- {
- show(Light_time[i]-timer);
- val=(Light_time[i]-timer);
- timer=(millis()-ptimer)/1000;
- Serial.println(Light_time[i]-timer);
- }
- }
- timer=0;
- ptimer=millis();
- }
- }
- void keyInt()
- {
- show(val);//
- }
复制代码
视频晚上拍的不好,程序是修改好的:带暂停功能,输出是触发继电器短路键盘按键
控制跑步机按设定13组时间,5组速度运行,经过实验,实现自己想要的功能
有朋友控制其他电器设备的,修改程序加入功能的,保持arduino开源精神,跟贴介绍,一起学习,希望大神多提意见,谢谢
|