物联网项目开发实战-第3章-自动浇花项目迭代1

本节我们实现一个基本能工作的手动浇水装置,即通过按下按键来闭合继发器让小水泵进行浇水。

本章以一个自动浇花项目为例,通过逐步迭代的方式实现所有需求。每个迭代都设置一个能正常工作的实现目标,通过对目标分析和功能分解,逐步掌握完成目标需要的知识点,最终完成一个能达到产品级的项目。

3.1项目需求

自动浇花项目的核心功能需求包括:

1. 能通过物理按键直接手动浇水;

2. 通过传感器收集土壤湿度数据;

3. 当土壤相对湿度低于一个阀值时(如40%)要能自动浇水;

4. 能通过物联网平台手动控制浇水;

5. 能通过物联网平台实现自动灌水;

6. 能通过物联网平台查看相关数据及图表;

7. 要尽可能的省电;

8. 提供WiFi连接信息设置界面;

3.2迭代一:手动控制浇水

3.2.1迭代目标

本节我们实现一个基本能工作的手动浇水装置,即通过按下按键来闭合继发器让小水泵进行浇水。

3.2.2需求分析

针对本节的目标,分析如下:

1. 需要通过I/O端口输出信息控制闭合继电器让小水泵工作;

2. 需要通过I/O端口获取按键按下的状态;

3.2.3知识点

知识点3-1:ESP32的GPIO

ESP32共有34个物理GPIO管脚,序号为:0-19,21-23,25-27,32-39。其中GPIO34-39仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚,GPIO2为启动引脚,最好不要接东西。

ESP32芯片通过内部的GPIO交换矩阵,使每个GPIO引脚可以配置成GPIO功能或连接内部信号以实现特定功能,简单来讲就是每个GPIO管脚可以根据需要来配置以满足不同项目的需要。

更详细的GPIO信息可参考官方的ESP32芯片手册。

本书使用的ESP32主控板提供的GPIO引脚说明如下图

物联网项目开发实战-第3章-自动浇花项目迭代1 

 

知识点3-2:通过输出数字信号控制继电器

在2.2小节我们通过控制GPIO输出点亮了一个LED,但在实际应用场景中,我们并不能通过GPIO的输出来直接控制负载,如功率要求大的外设(电灯),电感类外设(电机,充电器)等。因为GPIO通常是用来做控制信号处理的,它的负载驱动能力很弱(即允许通过的电流很小)。

要驱动负载,可以使用使用信号放大类器件和继电器

信号放大类器如三极管和CMOS管等,一般以基极为控制端,发射极为负载端,通过在基极施加微小信号(小电流)以实现控制发射极的导通(大电流),示意电路图如下:

物联网项目开发实战-第3章-自动浇花项目迭代1 

在许多电机驱动芯片(如L298、TB6612等)中就是使用信号放大类电路组成桥式电路来驱动电机。

继电器模块

物联网项目开发实战-第3章-自动浇花项目迭代1 

继电器是通过以微小信号(小电流)使控制线圈产生磁场,从而闭合开关来控制负载电路导通(大电流),示意电路图如下:

物联网项目开发实战-第3章-自动浇花项目迭代1

从上图可以看到,控制电路和负载电路在电源层面是完全隔离的,这在控制不同电源的负载时是非常重要的!如在智能家居中控制各类电器、工业制造环境中控制各类设备等。

实例4:用继电器控制小水泵浇水5秒

本实例需要使用套件中的断电器模块(S引脚接GPIO12)、小水泵和电源模块。

电路图如下

物联网项目开发实战-第3章-自动浇花项目迭代1 

代码如下:

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函数来输出数字信号,其他程序在调用浇水子程序时,必须给出浇水时长。

知识点3-3:通过GPIO获取按键状态

当把GPIO设置为INPUT模式时,可通过引脚输入的电平来获得信号,对于ESP32芯片,引脚可获取信号分为数字信号和模拟信号,这里只介绍数字信号输入,当引脚输入电平为3.3V左右时,数字信号检测为1,当引脚输入电平为0V左右时,数字信号检测为0。

为了获取按键在断开和按下时的状态,需要设计一个电路让按键在断开和按下时能给出对应的高/低电平,若反之。下图是一个常见的开关电路

物联网项目开发实战-第3章-自动浇花项目迭代1 

按键K断开时,GPIO输入为高电平;按键K合上后,GPIO接地,输入为低电平。

ESP32的GPIO引脚内置了上拉电阻和下拉电阻,可以通过设置引脚模式为INPUT_PULLUP/INPUT_PULLDOWN来简化电路。

物联网项目开发实战-第3章-自动浇花项目迭代1

实例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函数来获取输入信号,因为机械按键存在物理抖动,即在按下和释放瞬间,按键状态是不稳定的,故使用两次读取来简单防止机械抖动。

3.2.4实现

掌握了控制继电器和获取按键状态的知识点后,我们来实现迭代一的目标。

1.流程图

迭代一的程序流程图如下:
物联网项目开发实战-第3章-自动浇花项目迭代1

2.电路搭建

物联网项目开发实战-第3章-自动浇花项目迭代1 

 

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.测试

程序编译通过后,就可以上传到开发板进行测试了,在通电前,一定要检查各外设的电源正负极接线是否正确,以免烧坏器件。

- 本文由用户 老张 发布,文中观点仅代表作者本人,不代表本站立场。
- 如需转载,请联系作者;如有侵权,请联系本站处理。

09-06   阅读(12)   评论(0)
 标签: 创客 ESP32 物联网 继电器

涨知识
GPIO

GPIO 是指单片机(微控制器)主板上的一组引脚,这些引脚可以发送或接收电信号,但它们不是为任何特定目的而设计的,这就是为什么它们被称为“通用”IO。

评论:
相关文章
Arduino-ESP32与ESP-IDF的版本对应表

Arduino-ESP32与ESP-IDF的版本对应表。


Arduino-ESP32文件系统全解析:SPIFFS、LittleFS、SD卡操作

Arduino-ESP32提供了多种文件系统解决方案,本文将深入解析SPIFFS、LittleFS和SD卡三种主流存储方案,帮助你做出最佳选择。


ESP32-P4-WIFI6开发板

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-Hosted 解决方案提供了将 ESP 板用作 Wi-Fi 和 Bluetooth/BLE 连接的通信处理器的方法。


设备上云太麻烦?ESP-Hosted一站触达!

ESP-Hosted 提供了一种将ESP芯片和模组用作通信协处理器的解决方案,该解决方案为主机微处理器或微控制器提供无线连接,使主机能够与其他设备通信。简单来说为网卡方案。


ESP32 + Arduino使用TFT_eSPI库

Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789


ESP32 利用 SPI 连通 TFT 彩屏

本文给出了一个ESP32与SPI 接口TFT显示屏接线的详细说明,供大家参考。


在Micropython下使用ESPNow功能进行数据传输

本文讲解如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。


用 ESP32-S3 打造多功能 USB Dongle

ESP-Dongle 是一款基于 ESP32-S3 芯片开发的多功能 USB Device 解决方案。它不仅外形小巧,功能齐全,更集成了无线 U 盘、SD 卡读取以及 USB 无线网卡等多项功能。


利用 ESP32-S3 和 CSI 技术打造智能家居

ESP32 系列芯片可以利用 CSI 数据实现动作检测和存在检测。无论是自动调节灯光、风扇,还是节能控制,CSI 技术为智能家居带来了新的可能性。随着 CSI 技术的发展,未来的智能家居将能够更精确地感知和响应我们的行为,实现更高效、更人性化的控制。