Arduino最简多线程代码-绝对可用

        Arduino 的运算速度其实很快的,绝对大部分的应用都不会用到其CPU计算资源的10%的,因此本程序源码巧妙地利用了时间分片原理,实现了多线程。示范代码演示了控制2个LED灯以各自不同的频率闪烁不同的次数,同时你还可以自由地加入不同优先级的代码到其他。而这一切的实现完全无需第三方库的支持。代码完全兼容所有Arduino uno、nano、2560、CC_SMINI、CC_MINI、包括ESP8266和ESP32 等所有使用arduino IDE的开发板。

      本例程不使用任何中断和回调函数,可以确保线程安全。可以添加任意多个不同执行频繁程度的子程序。相互之间不会导致线程卡死。

     比如同时检测W5500网络有无指令到达,外接RFID读卡器有无刷卡操作,同时操作闪烁指示灯或者蜂鸣器鸣叫,还可以同时检测按钮是否按下等,都没有问题。

//******最简Arduino 多线程示范********************
//**本例程展示LED和蜂鸣器独立闪烁和鸣叫,同时还能处理其他事务不卡顿,且每件事务可以设置执行频率,也就是优先级了*****
//******计时精度虽然不高,但已能应付绝大多少应用了。***********
//***D1和D13分别接2个LED灯,执行后会看到两盏灯以不同的频率闪烁,闪烁不同的次数后停止,而且闪烁过程你还可以执行其他程序

unsigned int LTnum=0; //计算分时的计数器 

const int PD_LED=13; //绿色LED
unsigned long PD_LED_num=0; //绿色LED剩余闪烁次数   值  0-2147483647  400次约等于1分钟,理论最大3728天
int PD_LED_count=0;//绿色LED当前状态维持的时间倒计时

const int LB_LED=1; //红色LED
unsigned long LB_LED_num=0; //红色LED剩余次数  0-2147483647
int LB_LED_count=0;//红色LED当前状态维持的时间倒计时

void setup() {
  pinMode(PD_LED, OUTPUT); 
  pinMode(LB_LED, OUTPUT); 
  digitalWrite(PD_LED, HIGH);//这里绿色LED是低电平亮
  digitalWrite(LB_LED, HIGH);//这里红色LED是低电平亮
  PD_LED_num=30;//绿色闪烁30次
  LB_LED_num=10;//红色闪烁10次
  
}
void Fl_PD(){//绿色指示灯闪烁线程
    if (PD_LED_count==0)//达到翻转条件
    {
      if (PD_LED_num % 2 ==0){digitalWrite(PD_LED,LOW);}//应该亮灯了
      else{digitalWrite(PD_LED,HIGH);}//应该灭灯了
      PD_LED_num--;//翻转后,次数减少
      PD_LED_count=200;//重新计时,200控制亮灯和灭灯时长
    }
    else
    PD_LED_count--;
}
void Fl_LB(){//红色指示灯闪烁线程
    if (LB_LED_count==0)//达到翻转条件
    {
      if (LB_LED_num % 2 ==0){digitalWrite(LB_LED,LOW);}//应该亮灯了
      else{digitalWrite(LB_LED,HIGH);}//应该灭灯了
      LB_LED_num--;//翻转后,次数减少
      LB_LED_count=500;//重新计时,500控制时长
    }
    else
    LB_LED_count--;
}
void loop() {
  LTnum++; //大约1ms多的时间累加一次
  if (LTnum > 10000) {//这里设置10秒左右为最大计数范围,可自行修改
    LTnum = 1;  //  分时计数,这里初始值不能为0,否则后面的取模都为0
  }
 if (LTnum % 1000 == 0) {;}//你要每1秒需要执行一次的任务放这里
 if (LTnum % 3000 == 0) {;}//你要每3秒需要执行一次的任务放这里
 if (PD_LED_num>0) {Fl_PD();}//绿色LED闪烁
 if (LB_LED_num>0) {Fl_LB();}//红色LED闪烁
 if (LTnum % 100== 0){}// 你要100ms处理一次的高频事务放这里
 if (LTnum % 500== 0){}// 你要500ms处理一次的低频事务放这里
 delay(1);
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lihaMIMI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值