查看: 440|回复: 1

arduino实现的无阻塞延时库JSTime

[复制链接]

该用户从未签到

发表于 2021-1-23 17:51 | 显示全部楼层 |阅读模式
我把上次在综合讨论区发的帖子转到技术进阶板块下, 并修复了几个bug。该库支持arduino uno,stm32,esp32等。

受javascript的 setTimeout 和 setInterval启发 实现的延时定时器,代替delay延时。
适合延时时间比较长, 延时精度要求不高的场合

demo代码:

#include <Arduino.h>
#include "cxg_JSTime.h"

//支持arduino uno, stm32, esp32
static JSTime jsTime;
int timeId = 0;
int i = 0;

void setup() {
  Serial.begin(115200);

  //每隔1s执行一次, 执行三次取消执行
  timeId = jsTime.setInterval([]() {
    Serial.println("setInterval 1000ms");
    i++;
    if(i == 3) {
      //清除延时执行, clearTime 如果不指定timeId,则全部取消
      jsTime.clearTime(timeId);
    }
  },
    1000);

  //无阻塞延时2s
  jsTime.setTimeout([]() {
    Serial.println("setTimeout delay 2000ms");
    //延时嵌套
    jsTime.setTimeout([]() {
      Serial.println("nesting setTimeout delay 1000ms");
    },
      1000);
  },
    2000);
}

void loop() {
  jsTime.refresh();
}




代码无阻塞延时, 也不用声明一些无意义的时间变量来控制代码了。
setInterval每隔一段时间执行一次,非常适合打印监控信息。
setTimeout执行完毕立即销毁。


CxgJSTime.zip (2.99 KB, 下载次数: 5)

该用户从未签到

 楼主| 发表于 2021-1-28 18:59 | 显示全部楼层
本帖最后由 cxg 于 2021-1-29 09:54 编辑

又升级了一下1.修复其他数个bug
2.新增延时回调函数传参

#include <Arduino.h>
#include "cxg_JSTime.h"

//支持arduino uno, stm32, esp32
static JSTime jsTime;

struct TestStruct {
  int a = 0;
  int b = 0;
};

//测试参数传递
void testTimeoutParams(int p1, void* p2) {
  Serial.println("params test");
  Serial.print("get param1: ");
  Serial.println(p1);
  struct TestStruct* param = ( struct TestStruct* )p2;
  if(param != NULL) {
    Serial.print("get param2 struct p->a:");
    Serial.println(param->a);
    Serial.print("get param2 struct p->b:");
    Serial.println(param->b);

    free(param);
    param = NULL;
  }
}

void setup() {
  Serial.begin(115200);
  jsTime.setTimeout([]() {
    //动态创建一个结构体
    struct TestStruct* param = ( struct TestStruct* )malloc(sizeof(struct TestStruct));
    if(param == NULL) {
      Serial.println("fail create TestStruct");
      return;
    }
    param->a = 123;
    param->b = 456;

    jsTime.setTimeout(testTimeoutParams, 2000, 789, param);
  },
    3000);
}

void loop() {
  jsTime.refresh();
}




CxgJSTime.zip (4.94 KB, 下载次数: 3)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
【花雕动手做】快餐盒盖,
吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成
【教程】M5StickV深度学习之微信跳一跳
【教程】M5StickV深度学习
M5StickV深度学习之微信跳一跳 【故事】 M5StickV以及后续的Unit-V都是M5Stack.co
AT固件编译出错怎么回事?
AT固件编译出错怎么回事?
在IDE里添加了Blinker的库,然后烧录AT固件的时候说编译出错 啥都没改动,就出错了,
DIY宠物喂食器,竟如此简单,更有硬件开发工具免费领!
DIY宠物喂食器,竟如此简
去年疫情突发,封城、封小区以及人员隔离,让原本享受千般宠爱的主子们变成了靠吃猫砂
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表