本章以一个自动浇花项目为例,通过逐步迭代的方式实现所有需求。每个迭代都设置一个能正常工作的实现目标,通过对目标分析和功能分解,逐步掌握完成目标需要的知识点,最终完成一个能达到产品级的项目。
自动浇花项目的核心功能需求包括:
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.测试
程序编译通过后,就可以上传到开发板进行测试了,在通电前,一定要检查各外设的电源正负极接线是否正确,以免烧坏器件。
Cat.1技术是LTE(Long-Term Evolution)技术的一种调制及编码技术,可以提供相对较高的数据传输速率,同时又具有低功耗、低成本的特点,可以为物联网设备的连接提供更好的解决方案。
本小节通过点亮LED和串口输出两个程序,来初步掌握ArduinoIDE、了解GPIO和串口使用、同时把开发环境与开发板的连接,上传程序的各环节跑通,
本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。
ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。
本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。
乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。
专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。
为讲师、学员提供专属的物联网教学环境。