Arduino 的几种点灯方式

发布时间 2023-09-03 14:51:10作者: 沙里

延时函数点灯

// 定义灯管脚
const uint8_t blinkPin = LED_BUILTIN;

// 依靠延时函数来闪烁
void funcBlink(int second) {
  unsigned long millisSecond = second * 1000;
  // 亮灯
  digitalWrite(blinkPin, HIGH);
  delay(millisSecond);
  // 延时熄灯
  digitalWrite(blinkPin, LOW);
  delay(millisSecond);
}

void setup() {
  // 设置管脚输出模式
  pinMode(blinkPin, OUTPUT);
}

void loop() {
  // 延时 1 闪烁
  funcBlink(1);
}

定时器点灯

#include <Ticker.h>

// 定义灯管脚
const uint8_t blinkPin = LED_BUILTIN;

// 使用定时器闪烁
Ticker timer1;
void timerBlink() {
  // 读取管脚状态
  int oldState = digitalRead(blinkPin);
  // 翻转管脚状态
  uint8_t newState = 1 == oldState ? LOW : HIGH;
  digitalWrite(blinkPin, newState);
}

void setup() {
  // 设置管脚为输出模式
  pinMode(blinkPin, OUTPUT);
  // 给定时器 timer1 添加定时器触发回调函数,回调函数参数 1 秒
  timer1.attach(1, timerBlink);
}

void loop() {
}

线程点灯

// 下载地址 https://github.com/SanUSB-grupo/RITOS
#include <ritos.h>

// 定义灯管脚
const uint8_t blinkPin = LED_BUILTIN;

// 实例化线程类
Ritos task1;
// 定义上个时间
unsigned long previousTime = 0;

void threadBlink() {
  unsigned long currentTime = millis();
  if (currentTime - previousTime < 1000) {
    // 未到 1 秒
    return;
  }
  previousTime = currentTime;
  // 读取管脚状态
  int oldState = digitalRead(blinkPin);
  Serial.printf("线程 task1 获取管脚状态 %d\n", oldState);
  // 翻转管脚状态
  digitalWrite(blinkPin, !oldState);
}

void setup() {
  Serial.begin(115200);
  // 设置管脚为输出模式
  pinMode(blinkPin, OUTPUT);
  // 给线程添加执行任务
  task1.task(threadBlink);
}

void loop() {
}

多线程花样点灯

  1. 一个线程以秒点灯
  2. 另一个线程以毫秒闪灯

类似节奏,闪闪,闪闪闪,这样的节奏。