用Arduino控制两个交替闪烁的LED灯

实验过程:

电路部分:设计并联电路,两个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,在可接受范围内。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值