多任务可以同时执行多个函数,无须等待传统的delay似的排队操作。受到某位大神的笔记启发和实践后,整理成适用于个人的项目。总体流程:声明任务、添加任务、创建任务、激活任务。
整体代码(删除了一些内容):
#include <stdio.h>
#include <SoftwareSerial.h>
#include <TaskScheduler.h>//多任务
#include <splash.h>//?
#include <Wire.h>//IIC库
#include <math.h>
#include <MsTimer2.h>
#include <Adafruit_GFX.h>//OLED库
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);//声明OLED
int BH1750address = 0x23;//BH1750 I2C地址
byte buff[2];
unsigned long nowtime=millis(); //获取当前的系统运行时间长度
//unsigned currenttime;
// int Time_second;//秒钟
// int Time_minute;//分钟
// int Time_hour; //小时
// long Time_hour_setting = 3600000; //1小时 = 3600000 毫秒
// long Time_minute_setting = 60000; // 1分钟 = 60000 毫秒
// long Time_second_setting = 1000; //1秒 = 1000 毫秒
// unsigned long start_time;
//声明任务
void time_Callback();
void control_Callback();
//向调度器中添加任务1
Task test1(100, TASK_FOREVER, &time_Callback);//函数名、任务第一次执行的时间、任务执行的周期、合作式还是抢占式(一般取1)
Task test2(100, TASK_FOREVER, &control_Callback);//函数名、任务第一次执行的时间、任务执行的周期、合作式还是抢占式(一般取1)
Scheduler runner;//申请任务调度器runner
//创建任务1,程序计时
void time_Callback()
{
nowtime = nowtime+1;
Serial.println(nowtime);
}
//创建任务2,控制
void control_Callback()
{
if(nowtime>=60) {
*********************************
}
}
//初始化**********************
void setup(){
Wire.begin();
Serial.begin(9600);//波特率9600
//多任务调度
runner.init();//runner.init()初始化,
Serial.println("Initialized scheduler");
runner.addTask(test1);//添加任务test1,
Serial.println("added test1");
test1.enable();//激活任务test1
Serial.println("Enabled test1");
runner.addTask(test2);//添加任务test2,
Serial.println("added test2");
test2.enable();//激活任务test2
Serial.println("Enabled test2");
}
//主循环***************************
void loop() {
BH1750();
OLED_Show();//调用OLED函数显示数值
runner.execute();//执行调度函数
}
//光强检测
double BH1750() {
int i=0;
//开始I2C读写操作
Wire.beginTransmission(BH1750address);
Wire.write(0x10);//1lx reolution 120ms//发送命令
Wire.endTransmission();
delay(200);
//读取数据
Wire.beginTransmission(BH1750address);
Wire.requestFrom(BH1750address, 2);
while(Wire.available()) //
{
buff[i] = Wire.read(); // receive one byte
i++;
}
Wire.endTransmission();
if(2==i)
{
val=((buff[0]<<8)|buff[1])/1.2;
}
return val;
}
//oled显示函数*******************
void OLED_Show()
{
//设置OLED显示屏的参数
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);//开像素点发光
display.clearDisplay();//清屏
//光强实时显示
display.setCursor(0,40);//设置光标位置
display.print("light:");//显示光强具体数值
display.print(val);//显示光强具体数值
display.println("lux");//光强单位流明
//打开显示
display.display();//开机显示
delay(200);
}
不想写了,可以在代码里体会这种多任务的优势,有详细的注释,我们所说的操作系统,但这个只能说是轻量级的。