本章以一个自动浇花项目为例,通过逐步迭代的方式实现所有需求。每个迭代都设置一个能正常工作的实现目标,通过对目标分析和功能分解,逐步掌握完成目标需要的知识点,最终完成一个能达到产品级的项目。
自动浇花项目的核心功能需求包括:
1. 能通过物理按键直接手动浇水;
2. 通过传感器收集土壤湿度数据;
3. 当土壤相对湿度低于一个阀值时(如40%)要能自动浇水;
4. 能通过物联网平台手动控制浇水;
5. 能通过物联网平台实现自动灌水;
6. 能通过物联网平台查看相关数据及图表;
7. 要尽可能的省电;
8. 提供WiFi连接信息设置界面;
本节我们实现一个基本能工作的手动浇水装置,即通过按下按键来闭合继发器让小水泵进行浇水。
针对本节的目标,分析如下:
1. 需要通过I/O端口输出信息控制闭合继电器让小水泵工作;
2. 需要通过I/O端口获取按键按下的状态;
ESP32共有34个物理GPIO管脚,序号为:0-19,21-23,25-27,32-39。其中GPIO34-39仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚,GPIO2为启动引脚,最好不要接东西。
ESP32芯片通过内部的GPIO交换矩阵,使每个GPIO引脚可以配置成GPIO功能或连接内部信号以实现特定功能,简单来讲就是每个GPIO管脚可以根据需要来配置以满足不同项目的需要。
更详细的GPIO信息可参考官方的ESP32芯片手册。
本书使用的ESP32主控板提供的GPIO引脚说明如下图
 
 
在2.2小节我们通过控制GPIO输出点亮了一个LED,但在实际应用场景中,我们并不能通过GPIO的输出来直接控制负载,如功率要求大的外设(电灯),电感类外设(电机,充电器)等。因为GPIO通常是用来做控制信号处理的,它的负载驱动能力很弱(即允许通过的电流很小)。
要驱动负载,可以使用使用信号放大类器件和继电器
信号放大类器如三极管和CMOS管等,一般以基极为控制端,发射极为负载端,通过在基极施加微小信号(小电流)以实现控制发射极的导通(大电流),示意电路图如下:
 
 
在许多电机驱动芯片(如L298、TB6612等)中就是使用信号放大类电路组成桥式电路来驱动电机。
继电器模块
 
 
继电器是通过以微小信号(小电流)使控制线圈产生磁场,从而闭合开关来控制负载电路导通(大电流),示意电路图如下:

从上图可以看到,控制电路和负载电路在电源层面是完全隔离的,这在控制不同电源的负载时是非常重要的!如在智能家居中控制各类电器、工业制造环境中控制各类设备等。
实例4:用继电器控制小水泵浇水5秒
本实例需要使用套件中的断电器模块(S引脚接GPIO12)、小水泵和电源模块。
电路图如下
 
 
代码如下:
const int RELAY_PIN = 12;
// 浇水子程序
void watering(int seconds) {
  digitalWrite(RELAY_PIN, HIGH);
  delay(seconds * 1000);
  digitalWrite(RELAY_PIN, LOW);
  Serial.printf("浇水 %d秒。\n", seconds);
}
void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  // 浇水5秒
  watering(5);
}
void loop() {
  
}本例中,使用digitalWrite函数来输出数字信号,其他程序在调用浇水子程序时,必须给出浇水时长。
当把GPIO设置为INPUT模式时,可通过引脚输入的电平来获得信号,对于ESP32芯片,引脚可获取信号分为数字信号和模拟信号,这里只介绍数字信号输入,当引脚输入电平为3.3V左右时,数字信号检测为1,当引脚输入电平为0V左右时,数字信号检测为0。
为了获取按键在断开和按下时的状态,需要设计一个电路让按键在断开和按下时能给出对应的高/低电平,若反之。下图是一个常见的开关电路
 
 
按键K断开时,GPIO输入为高电平;按键K合上后,GPIO接地,输入为低电平。
ESP32的GPIO引脚内置了上拉电阻和下拉电阻,可以通过设置引脚模式为INPUT_PULLUP/INPUT_PULLDOWN来简化电路。

实例5:获取按键状态
本实例需要使用按键模块(S引脚接GPIO13)
const int BUTTON_PIN = 13;
boolean button_pressed = 0;
boolean buttonClicked() {
  // 检测按钮是否已按下
  if (digitalRead(BUTTON_PIN) == LOW) { // 已按下
    delay(10); // 延时10ms,用于防止机械抖动
    if (digitalRead(BUTTON_PIN)==LOW) { // 再次读取
      button_pressed = 1;
      Serial.print(“按键已按下。”);
    } 
  }
  // 检测按键是否已释放
  if (button_pressed==1 && digitalRead(BUTTON_PIN) == HIGH) { // 已释放
    delay(10); // 延时10ms,用于防止机械抖动
    if (button_pressed==1 && digitalRead(BUTTON_PIN) == HIGH) {
      button_pressed = 0;
      Serial.print(“按键已释放。”);
      Serial.print(“按键单击。”);
      return true;
    }
  }
  return false;
}
void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // 使用引脚内置上拉电阻
}
void loop() {
  if (buttonClicked()) {
    // 业务代码
  }
  delay(10);
}本例中,通过digitalRead函数来获取输入信号,因为机械按键存在物理抖动,即在按下和释放瞬间,按键状态是不稳定的,故使用两次读取来简单防止机械抖动。
掌握了控制继电器和获取按键状态的知识点后,我们来实现迭代一的目标。
1.流程图
迭代一的程序流程图如下:
2.电路搭建
 
 
3.程序开发
const int RELAY_PIN = 12;
const int BUTTON_PIN = 13;
boolean button_pressed = 0;
// 浇水子程序
void watering(int seconds) {
  digitalWrite(RELAY_PIN, HIGH);
  delay(seconds * 1000);
  digitalWrite(RELAY_PIN, LOW);
  Serial.printf("浇水 %d秒。\n", seconds);
}
boolean buttonClicked() {
  // 检测按钮是否已按下
  if (digitalRead(BUTTON_PIN) == LOW) { // 已按下
    delay(10); // 延时10ms,用于防止机械抖动
    if (digitalRead(BUTTON_PIN)==LOW) { // 再次读取
      button_pressed = 1;
      Serial.print("按键已按下。");
    } 
  }
  // 检测按键是否已释放
  if (button_pressed==1 && digitalRead(BUTTON_PIN) == HIGH) { // 已释放
    delay(10); // 延时10ms,用于防止机械抖动
    if (button_pressed==1 && digitalRead(BUTTON_PIN) == HIGH) {
      button_pressed = 0;
      Serial.print("按键已释放。");
      Serial.print("按键单击。");
      return true;
    }
  }
  return false;
}
void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // 使用引脚内置上拉电阻
}
void loop() {
  if (buttonClicked()) {
    // 浇水5秒
    watering(5);
  }
  delay(10);
}程序合并了知识点的实例代码,没有特殊的地方,就不细述了。
4.测试
程序编译通过后,就可以上传到开发板进行测试了,在通电前,一定要检查各外设的电源正负极接线是否正确,以免烧坏器件。
 
            GPIO 是指单片机(微控制器)主板上的一组引脚,这些引脚可以发送或接收电信号,但它们不是为任何特定目的而设计的,这就是为什么它们被称为“通用”IO。
Arduino-ESP32与ESP-IDF的版本对应表。
Arduino-ESP32提供了多种文件系统解决方案,本文将深入解析SPIFFS、LittleFS和SD卡三种主流存储方案,帮助你做出最佳选择。
ESP32-P4-WIFI6-DEV-KIT是一款微雪(Waveshare)设计的基于 ESP32-P4 的多媒体开发板,并集成 ESP32-C6,支持 Wi-Fi 6 和 BLE 5 无线连接。它提供丰富的人机交互接口,包括 MIPI-CSI (集成图像信号处理器 ISP)、MIPI-DSI、SPI、I2S、I2C、LED PWM、MCPWM、RMT、ADC、UART 和 TWAI 等。
 
            ESP-Hosted 解决方案提供了将 ESP 板用作 Wi-Fi 和 Bluetooth/BLE 连接的通信处理器的方法。
ESP-Hosted 提供了一种将ESP芯片和模组用作通信协处理器的解决方案,该解决方案为主机微处理器或微控制器提供无线连接,使主机能够与其他设备通信。简单来说为网卡方案。
Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789
本文给出了一个ESP32与SPI 接口TFT显示屏接线的详细说明,供大家参考。
本文讲解如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。
ESP-Dongle 是一款基于 ESP32-S3 芯片开发的多功能 USB Device 解决方案。它不仅外形小巧,功能齐全,更集成了无线 U 盘、SD 卡读取以及 USB 无线网卡等多项功能。
 
            ESP32 系列芯片可以利用 CSI 数据实现动作检测和存在检测。无论是自动调节灯光、风扇,还是节能控制,CSI 技术为智能家居带来了新的可能性。随着 CSI 技术的发展,未来的智能家居将能够更精确地感知和响应我们的行为,实现更高效、更人性化的控制。
