zoukankan      html  css  js  c++  java
  • 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文件夹放入Arduinolibraries中,并在新建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应用 之 任务】。

  • 相关阅读:
    单例模式的几种写法 总结
    TCP的三次握手与四次挥手总结(详解+动图) 面试准备
    向mysql插入表中的中文显示为乱码或问号的解决方法,亲测有用!!
    再论红黑树
    jQuery插件机制
    jQuery高级案例
    jQuery事件绑定与切换
    jQuery动画和遍历
    jQuery基础案例
    DOM操作
  • 原文地址:https://www.cnblogs.com/MCSFX/p/12736097.html
Copyright © 2011-2022 走看看