arduino scoop多线程

arduino scoop多线程

实际上arduino没有多线程,所谓的多线程可能只是多任务。在同时运行两个较为简单的或者是执行周期很短的程序时应该是没问题的。程序较为复杂,或者需要放到某一线程中的程序所需的执行周期较长时,scoop的优势可能就没有了,两个线程的程序执行时可能会时序冲突,就需要再考虑cpu时序的问题。反而不如用中断库了。
scoop库下载资源:arduino scoop库
我用这个scoop库在程序里建了两个线程(两对setup+loop()),其中一个里面运行一个HX711模拟量+重量传感器的采集程序,另一个里面运行一个电磁阀控制的程序(其中采集程序运行一周期通过millis()函数测量需要大约138ms)

当这个scoop多线程开始运行时,传感器受力时,采集程序进行运算执行,使得控制程序频率被拖慢。并且当其中一个多线程中用到while()死循环时,另一个线程也不能执行(即被while卡住),由此也证明是假的多线程。

scoop库再使用时需要在主程序的Setup函数中写入以下代码:

#include <SCoop.h>
void setup() {
  mySCoop.start();
}
void loop()
{
  yield();
}

下面是简单使用scoop库的例子:线程1以1s的频率闪烁,线程2以2s的频率闪烁

#include <SCoop.h>
defineTask(TaskTest1);//定义子线程1
defineTask(TaskTest2);//定义子线程2
void TaskTest1::setup()//线程1设定
{
  pinMode(2, OUTPUT);
}
void TaskTest1::loop()//线程1循环(快速定义)
{
  digitalWrite(2, HIGH);
  sleep(1000);
  digitalWrite(2, LOW);
  sleep(1000);
}

void TaskTest2::setup()//线程2设定
{
  pinMode(3, OUTPUT);
}
void TaskTest2::loop()//线程2循环
{
  digitalWrite(3, HIGH);
  sleep(2000);
  digitalWrite(3, LOW);
  sleep(2000);
}
void setup() {
  mySCoop.start();
}

void loop()
{
  yield();
}

需要注意的是,分线程中的delay()要改成sleep(),而delay()为全局

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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灯(两者都是执行器),两个执行器执行时需要相互不干扰,所以使用多线程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值