【嵌入式开发】经典两个案例刨析

本文介绍了ESP32中看门狗功能的原理及其在防止程序死循环时的自动复位作用,同时给出了一个使用压力传感器实现报警系统的实例,包括硬件连接和ArduinoIDE中的代码实现。
摘要由CSDN通过智能技术生成

案例一: “看门狗”:

在嵌入式系统中,看门狗(Watchdog)是一个非常重要的机制,用来在系统出现异常时进行复位,以恢复系统正常工作。ESP32内置了一个看门狗定时器,可以用来监视你的程序是否运行正常。如果程序运行过程中出现死循环或者其他问题,没有及时喂狗(重置看门狗定时器),看门狗定时器就会复位ESP32。

下面是一个简单的例子,展示了如何在ESP32上配置和使用看门狗。

硬件需求

  • ESP32开发板

软件需求

  • Arduino IDE
  • ESP32开发板支持(在Arduino IDE中安装)

步骤

  1. 打开Arduino IDE,选择正确的开发板(ESP32 Dev Module)和端口。
  2. 将以下代码复制粘贴到Arduino IDE的编辑器中。
#include <esp_task_wdt.h>

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

  // 初始化看门狗,设置超时时间为5秒
  esp_task_wdt_init(5, true); // true表示当看门狗触发时进行系统复位
  esp_task_wdt_add(NULL); // 将当前任务(loop)添加到看门狗监视列表

  Serial.println("Setup done.");
}

void loop() {
  // 这里是你的程序主要运行逻辑
  
  Serial.println("Loop running, resetting watchdog.");
  esp_task_wdt_reset(); // 重置看门狗定时器

  // 假设你的程序在这里卡住了,没有喂狗
  // 如果注释掉下面的延时,看门狗将会在5秒后复位ESP32
  // delay(10000);

  // 正常的程序逻辑,不会导致看门狗复位
  delay(2000);
}

  1. 将代码上传到ESP32板子。

如果你的程序运行正常,esp_task_wdt_reset()会定期被调用,看门狗就会被重置,系统不会复位。但是,如果程序卡在了某个地方超过了5秒(例如,如果你取消注释了delay(10000);这行代码),看门狗定时器将会超时,系统将会自动进行复位。

这个例子中,我们使用esp_task_wdt_init()函数来初始化看门狗并设置超时时间,使用esp_task_wdt_add()来将当前任务(在这里是loop()函数)添加到看门狗的监视列表中,然后在每次loop()循环中调用esp_task_wdt_reset()来重置看门狗定时器。

为了实现压力传感器达到阈值时的报警效果,我们可以将压力传感器接入ESP32,并编写相应的代码来读取压力值,当检测到的压力超过设定的阈值时触发报警(例如通过蜂鸣器发声或通过LED灯闪烁)。

案例二: 压力报警器

硬件需求

  • ESP32开发板
  • 压力传感器(例如,基于电阻式或压电式的模拟输出传感器)
  • 蜂鸣器或LED灯(用于报警)
  • 若干跳线

连接方式

  1. 压力传感器的模拟输出脚连接到ESP32的一个模拟输入引脚(如GPIO34)。
  2. 蜂鸣器的正极连接到ESP32的一个数字输出引脚(如GPIO13),负极连接到地(GND)。
  3. 如果使用LED灯作为指示,则LED的正极(较长的一脚)通过一个220欧姆的电阻连接到ESP32的另一个数字输出引脚(如GPIO12),负极(较短的一脚)连接到地(GND)。

软件代码

打开Arduino IDE,并编写以下代码:

const int pressurePin = 34; // 压力传感器接在ESP32的GPIO34
const int buzzerPin = 13; // 蜂鸣器连接到GPIO13
const int ledPin = 12; // LED连接到GPIO12
const int threshold = 500; // 设定压力阈值

void setup() {
  Serial.begin(115200);
  pinMode(pressurePin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(buzzerPin, LOW);
  digitalWrite(ledPin, LOW);
}

void loop() {
  int pressureValue = analogRead(pressurePin); // 读取压力传感器数值
  Serial.println(pressureValue); // 将压力数值打印到串口监视器
  
  if (pressureValue >= threshold) {
    // 如果压力超过阈值,启动报警
    digitalWrite(buzzerPin, HIGH); // 蜂鸣器发声
    digitalWrite(ledPin, HIGH); // LED灯亮
    delay(1000); // 持续一段时间
    digitalWrite(buzzerPin, LOW); // 关闭蜂鸣器
    digitalWrite(ledPin, LOW); // 关闭LED灯
  } else {
    // 如果压力未超过阈值,保持报警器关闭状态
    digitalWrite(buzzerPin, LOW); // 确保蜂鸣器不发声
    digitalWrite(ledPin, LOW); // 确保LED灯不亮
  }

  delay(200); // 短暂延时后重新检测
}

上传代码到ESP32开发板,当压力传感器检测到的压力值超过设定的阈值时,蜂鸣器将会发声,LED灯亮起,实现报警效果。

注意,实际应用中压力传感器的阈值需要根据实际压力传感器的规格及应用需求进行设定。如果你使用的压力传感器有不同的接口或通信协议(例如I2C、SPI或数字输出),你可能需要调整连接方式和代码以适应你的具体传感器。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值