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不能下载单个文件,所以需要全部下载后再找出自己需要的文件
以下为简单例子实现每毫秒输出计数器的数值同时六号口的灯每秒闪烁一次
//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();
}

库文件下载地址
加载库文件
将下载到的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();}
使用该库的【任务】功能,首先要做三件事:
第一:引用库
#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();
}

使用该库的【时钟(又叫:计时器)】功能,首先要做三件事:
第一:引用库
#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应用 之 任务】。
arduino中SCoop库的简单应用案例的更多相关文章
- php中GD库的简单使用
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
- 利用python中的库文件简单的展示mnist 中的数据图像
import sys, os sys.path.append('F:\ml\DL\source-code') #导入此路径中 from dataset.mnist import load_mnist ...
- 关于Unity中使用刚体制作简单跑酷案例
一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...
- php中GD库的一些简单使用
今天了解了一些GD库的简单使用,现在稍微做一下总结! GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处 ...
- solr简单搜索案例
solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...
- 你我都会遇到的需求:如何导出MySQL中的数据~ 简单!实用!
目录 你我都有的需求 方式一:tee 方式二:mysql_use_result 推荐阅读 一.给研发同学看的面试指南 二.MySQL-视频 三.进阶MySQL中间件-视频 四.白日梦的云原生-笔记 五 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- QT中静态库的生成与使用
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
随机推荐
- python爬取B站视频弹幕分析并制作词云
1.分析网页 视频地址: www.bilibili.com/video/BV19E… 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...
- LinuxIP配置方法
一.双网卡双IP. eth0为电信,eth1为联通. # cd /etc/sysconfig/network-scripts/ # vi ifcfg-eth0 DEVICE=eth0 HWADDR=0 ...
- vue打包之后找不到图片路径,打包项目时,dist文件夹内部分图片找不到
1.打包项目时,会默认把存放在public内的小于4k的图片转换成base64,作为内联样式. 可以在vue.config.js中修改默认大小,在chainWepack:config=>{}中添 ...
- render 强大的渲染函数
可以动态的创建节点 可以改变表格中要去换一种形式去展示的列 (未完暂定)
- ARouter使用
1. androidstudio3.0配置 javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_ ...
- python小白入门基础(四:浮点型和布尔型)
# Number (int float bool complex)# (1) float 浮点型 也就是小数# 表达方式一floatvar = 0.98print(floatvar)print(typ ...
- VSM
好吧,在被这个算法折腾了许多天之后,我终于对它竖起了中指.这几天的经历让我明白了一个道理:对于数学基础不好的人来说,对待图形学最好远观不可亵玩焉:如果坚持硬闯却又碰巧E文不咋地,那受罪程度真叫人生不如 ...
- An Introduction to Differential Privacy
原文链接:An Introduction to Differential Privacy 差分隐私算法可以允许分析人员执行良性的聚合分析,同时保证个人隐私得到切实的保护.. 背景数据分析中的隐私保护技 ...
- .net 中的 StringBuilder 和 TextWriter 区别
最近闲来之余,看了一些开源的类库,看到有些类库喜欢用TextWriter类来记录相关的字符串数据,感到比较好奇,为啥不用StringBuilder类对象.于是在网上搜索了一番,总结了相关笔记. Str ...
- BeautifulSoup解析页面
beautiful soup是一个解析包,专门用来解析html语法的,lxml是一个解析器,用来分析以及定位内容的 .是class #是id import requests from bs4 impo ...