实验过程:
电路部分:设计并联电路,两个LED灯公用一个电源信号端口,通过控制数字引脚端的输出电压的高低控制LED的亮灭(高则灭,低即亮)。
程序部分:读取程序运行的时间,判断时间间隔,分别实现两个LED灯不同频率的闪烁
代码
unsigned long time1;//记录程序运行时间(灯1)
unsigned long time2;//记录程序运行时间(灯2)
unsigned long pretime1 = 0;//记录上次调节的时间时刻
unsigned long pretime2 = 0;
boolean on1 = true;//记录灯的亮灭状态
boolean on2 = true;
void setup() {
// put your setup code here, to run once:
pinMode(12,OUTPUT);
pinMode(8,OUTPUT);
}
void loop() {
//put your main code here, to run repeatedly:
time1 = millis();//获取程序运行时间
time2 = millis();
if((time1 - pretime1) >= 125 && on1 == true){
digitalWrite(12,HIGH);//灯灭
pretime1 = time1;
on1 = false;
}//当时间间隔达到要求时实现亮灭状态切换,并记录该时间时刻和亮灭状态
if((time1 - pretime1) >= 200 && on1 == false){
digitalWrite(12,LOW);//灯亮
pretime1 = time1;
on1 = true;
}
if((time2 - pretime2) >= 250 && on2 == true){
digitalWrite(8,HIGH);
pretime2 = time2;
on2 = false;
}
if((time2 - pretime2) >= 250 && on2 == false){
digitalWrite(8,LOW);
pretime2 = time2;
on2 = true;
}
}
实验装置图
装置示意图
出现的问题及思考:
若把代码中判断语句中的“pretime1 – time1 >= 125”改为“pretime1 – time == 125”(共四处,同理进行更改,’>=’改为’==’),LED灯正常闪烁27个周期后将
长亮不灭,且多次实验结果两个灯闪烁次数每次都为27次。
可能原因是在每次的判断语句+赋值语句等操作会导致(time – pretime)的值不能精确等于要求的间隔,会有零点几毫秒的偏差,且多次累积达到1-2ms偏差时,判断失效,灯将长亮不灭。
但是,将if语句改“if((time1 - pretime1) >=125 && (time1 - pretime1) <= 126 && on1 == true)”(共四处,同理进行更改,控制差值间隔为1s),实验结果为两个灯可正常持续闪烁至少半小时,故可认为,偏差的累积效应始终不超过2ms,在可接受范围内。
心得体会:
起初打算用delay函数实现,寻找两个周期的最小公倍数进行纯数字计算,但是这样做代码行数很多,而且这种做法通用性太差,一旦改掉用户需求,几乎整个程序需要重新修改。于是重新去查找可用的时间相关的函数,选择采取这种方法,逻辑上会比前者复杂一点,但其通用性会强许多。另一个心得是不要凭空去估计代码造成的时间偏差,而是应该写程序去测试。一开始的顾虑在于担心其时间偏差值太大造成的影响,但是程序写出来之后测试结果是偏差值不超过2ms,在可接受范围内。