物联网项目开发实战-第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   阅读(2)   评论(0)
 标签: 创客 ESP32 物联网

涨知识
LTE Cat.1

Cat.1技术是LTE(Long-Term Evolution)技术的一种调制及编码技术,可以提供相对较高的数据传输速率,同时又具有低功耗、低成本的特点,可以为物联网设备的连接提供更好的解决方案。

评论:
相关文章
物联网项目开发实战-第2章-开发环境

本小节通过点亮LED和串口输出两个程序,来初步掌握ArduinoIDE、了解GPIO和串口使用、同时把开发环境与开发板的连接,上传程序的各环节跑通,


小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


ESP32 的中断机制和处理

本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。


在ESP32上实现WEB交互界面

本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。


Arduino ESP32获取芯片、RAM信息

本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


ESP32 GPIO 矩阵和引脚多路复用

ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。


ESP32Encoder:高效的ESP32旋转编码器库

ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。


适合学习物联网的几款盒子

本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。


乐动掌控

乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。

小鹏AIoT服务

为讲师、学员提供专属的物联网教学环境。