Arduino - 多线程库SCoop应用 之 时钟(计时器)

本文详细介绍了如何使用SCoop库的时钟功能,包括引用库、设置setup和loop函数,以及两种时钟定义方式:完整定义和快速定义。同时提醒开发者在使用时钟功能后,应使用sleep(ms)作为延时,避免使用delay()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用该库的【时钟(又叫:计时器)】功能,首先要做三件事:

第一:引用库
#include “SCoop.h”
【库文件下载地址】
http://www.dfrobot.com.cn/community/forum.php?mod=attachment&aid=MTI4MzZ8MWFmMjk1MGF8MTQ1MDcwNTA2M3wwfD

第二:setup函数里,调用mySCoop.start()命令
void setup() {
mySCoop.start();
}

第三:loop函数里,调用yield()命令
void loop() {
yield();
}

接下来就可以使用【时钟】了。有两种定义方式,请继续往下看:
1、完整定义:定义线程的【setup】和【run】两个函数。
定义一个名字为“Tmr”的时钟:
defineTimer(Tmr,1000); //用defineTimer定义一个时钟,名为Tmr,周期为1000ms
void Tmr::setup() //定义该时钟的setup()函数,用于初始化设置。
{
//这里是时钟的setup函数的内容
}
void Tmr::run() //定义该时钟的run()函数,用于执行周期事件。
{
//这里是时钟的run函数的内容
}

2、快速定义:仅定义时钟的run函数
如果这个时钟不需要初始化setup,只需要周期事件run的话,可以直接使用defineTimerRun()快速定义该线程任务,如下:
defineTimerRun(Tmr,1000) //用defineTimerRun定义一个时钟,名为Tmr,周期为1000ms
{
//小技巧,如果某条件下,此时暂不需要执行周期事件,只需要在第一句返回,return 即可。可以用全局变量作为参考,从程序外部进行控制。
//这里是时钟的run函数的内容
//小技巧:如果此时需要动态修改时钟周期,只需要 schedule(新周期) 即可。可以用全局变量作为参考,从程序外部进行控制。
}

注意一点,使用此库之后,请使用sleep(ms)作为延时,不要用delay()了。
因为sleep(ms)只针对当前线程。而delay(ms)是针对全局的。

代码就不写了,参考 【Arduino - 多线程库SCoop应用 之 任务】。

ArduinoSCoop多线程 实例程序代码 /*#include #include */ #include //多线程程序 #include //超声波传感器 #include //电机传感器 //LiquidCrystal_I2C lcd(0x27,16,2); defineTask(LEDTask);//LED 灯的线程 defineTask(ServoTask);//舵机线程 #define TRIGGER_PIN 2 #define ECHO_PIN 3 #define MAX_DISTANCE 400 NewPing sonar(TRIGGER_PIN,ECHO_PIN,MAX_DISTANCE);//超声波传感器 Servo myservo;//电机传感器 const int replyPin=A2;//光敏传感器 const int soundPin=A0;//声音传感器 const int senorPin=8;//触摸感应键 const int rPin=7;//Led const int ledPin=6; //Led int value=0;//光敏传感器 int sound=0;//声音传感器 int Senor=-1; void LEDTask::setup(){ pinMode(replyPin,INPUT); pinMode(soundPin,INPUT); pinMode(rPin,OUTPUT); } void LEDTask::loop(){ value=analogRead(replyPin);//光敏传感器感应到光强度 Serial.print("光敏传感器感应到光强度:"); Serial.println(value); sound=analogRead(soundPin);//声音感应器感应到声音大小 Serial.print("声音感应器感应到声音大小:"); Serial.println(sound); unsigned int uS=sonar.ping();//超声波传感器感应到数据 Serial.print("超声波传感器感应到数据:"); Serial.println(uS/US_ROUNDTRIP_CM); if(value>400&&(sound>80||uS/US_ROUNDTRIP_CM<5)){ analogWrite(rPin,255); analogWrite(ledPin,0); delay(5000); }else{ analogWrite(rPin,0); analogWrite(ledPin,0); } } void ServoTask::setup(){ pinMode(senorPin,INPUT); myservo.attach(9); myservo.write(0); } void ServoTask::loop(){ Senor=digitalRead(senorPin);//触摸感应键感应 Serial.print("触摸感应键感应:"); Serial.println(Senor); if(Senor==1){ myservo.write(30); delay(100); myservo.write(60); delay(100); myservo.write(90); delay(3000); myservo.write(60); delay(100); myservo.write(30); delay(100); myservo.write(0); } } void setup(){ mySCoop.start(); Serial.begin(9600); } void loop(){ yield(); } //这段程序有一个舵机、一个LED灯(两者都是执行器),两个执行器执行时需要相互不干扰,所以使用多线程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卢光庆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值