arduino中SCoop庫的簡單應用案例


轉載:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html

arduino中SCoop庫的簡單應用案例
首先這篇文章來在視頻
https://v.youku.com/v_show/id_XNzYxMDQ1NDIw.html?refer=seo_operation.liuxiao.liux_00003308_3000_YvmIba_19042900
吃水不忘挖井人
1.SCoop庫下載
https://github.com/soif/SCoop/tree/fix_scoop_compil
由於github不能下載單個文件,所以需要全部下載后再找出自己需要的文件
在這里插入圖片描述
下載壓縮文件
解壓后復制出SCoop文件到Arduino安裝文件的libraries文件夾內,重啟Arduino編輯器就可以只用
在這里插入圖片描述

以下為簡單例子實現每毫秒輸出計數器的數值同時六號口的燈每秒閃爍一次

//1.引頭文件
//2.setup mySCoop.start();
//loop yield();
//暫停使用sleep();
//sleep與delay的區別在於delay是全局暫停,sleep是分支暫停
#include<SCoop.h>//聲明函數庫
int count=0;
//簡單的使用兩種定義方式
//如果不需要定義端口這種方式最簡單defineTaskLoop(X){}
//每毫秒輸出計數器的數值
defineTaskLoop(Task2){
Serial.println(count++);
sleep(1);
}
//如果需要使用端口則這種定義可以兼顧端口定義和程序循環、
//六號口的燈每秒閃爍一次
//defineTask是一個詞,不可隔開
defineTask(Task1)
void Task1::setup(){
pinMode(6,OUTPUT);
}
void Task1::loop(){
digitalWrite(6,!digitalRead(6));
sleep(1000);
}

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
mySCoop.start();

}

void loop() {
// put your main code here, to run repeatedly:
//loop里面需要使用yield()函數
yield();
}

2018-11-24 23:37:58 daybreak___ 閱讀數 1938

庫文件下載地址

GitHub下載地址

加載庫文件

將下載到的SCoop文件夾放入Arduino\libraries中,並在新建ino文件時加載SCoop庫文件

命令執行與調用

使用時在主程序的Setup函數中寫入以下代碼:

#include <SCoop.h>voidsetup(){ mySCoop.start();}voidloop(){yield();}

完整代碼及子線程完整定義

注意延遲函數使用sleep();不要使用delay();
sleep();只在當前線程進行延遲,delay();則會在全局進行延遲。
實現線程1以1s的頻率閃爍,線程2以2s的頻率閃爍

#include <SCoop.h>defineTask(TaskTest1);//定義子線程1defineTask(TaskTest2);//定義子線程2void 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);}voidsetup(){ mySCoop.start();}voidloop(){yield();}
2015-12-21 21:52:24 sdlgq 閱讀數 11872

使用該庫的【任務】功能,首先要做三件事:

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

https://share.weiyun.com/45420032c079bbf55a42f32d6a023ca2

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

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

接下來就可以使用【任務】了。有兩種定義方式,請繼續往下看:
1、完整定義:定義【任務】的setup和loop兩個函數。
定義一個名字為“TaskTest”的任務:
defineTask(TaskTest); //用defineTask定義一個任務,名為TaskTest
void TaskTest::setup() //定義該任務的setup()函數,用於初始化設置。
{
//這里是任務的setup函數的內容
}
void TaskTest::loop() //定義該任務的loop()函數,用於循環執行代碼。
{
//這里是任務的loop函數的內容
}

2、快速定義:僅定義任務的loop函數
如果這個線程中執行的動作不需要初始化setup,只需要循環loop的話,可以直接使用defineTaskLoop()快速定義該線程任務,如下:
defineTaskLoop(TaskTest1)
{
//這里是任務的loop函數的內容
}

注意一點,使用此庫之后,請使用sleep(ms)作為延時,不要用delay()了。
因為sleep(ms)只針對當前線程。而delay(ms)是針對全局的。

最后來一個完成的演示吧,2個LED分別以100毫秒和1秒的速度閃爍。12和13引腳分別接LED,然后運行代碼看看效果吧。

#include "SCoop.h" //完整定義defineTask(TaskTest); void TaskTest::setup() { pinMode(13, OUTPUT); } void TaskTest::loop() { digitalWrite(13, HIGH);sleep(1000); digitalWrite(13, LOW); sleep(1000); } //快速定義defineTaskLoop(TaskTest1) { digitalWrite(12, HIGH); sleep(100); digitalWrite(12, LOW); sleep(100); } void setup() { pinMode(12, OUTPUT); mySCoop.start(); } void loop() { yield(); } 
2015-12-22 20:45:26 sdlgq 閱讀數 7651

使用該庫的【時鍾(又叫:計時器)】功能,首先要做三件事:

第一:引用庫
#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應用 之 任務】。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM