arduino多任务的实现:光强检测+程序计时+控灯

多任务可以同时执行多个函数,无须等待传统的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);

}

不想写了,可以在代码里体会这种多任务的优势,有详细的注释,我们所说的操作系统,但这个只能说是轻量级的。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值