观前提醒!所有焊接及连接操作都应断电进行!

一、电路补完计划

上一章中我们已经确定了智能水龙头所需要的电路模块,接下来我们将来确定这些电路模块如何连接组成为一个完整的“系统”。

介于我们的系统结构简单,元器件相对较少,可以大致分为三个部分:

  • 供电&充电部分
  • 主控部分
  • 驱动&电机部分

下面将对三个部分一次进行设计和讲解

(1)供电&充电部分

步骤一:TP4056模块与电池连接,

TP4056充电管理芯片是一款常用的单节锂电池恒定电流/恒定电压线性充电管理芯片。

简而言之,当电池电压高于预设最高电压时停止充电,低于预设最低电压时停止放电,实现对电池充放电的功能。

同时此模块具有过流保护功能,电流大于1A时立即停止放电。(充电即可恢复)

B+ B- OUT+ OUT- Type-C

电池正极输出

电池负极输入 放电输出+ 放电输入- 充电输入

TP4056模块引脚定义

接线:电池的红线(正极)连接TP4056模块的B+,黑线(负极)连接B-

步骤二:连接升压小板

升压小板只需购买一个能够把3.7v左右的电压升至5v的即可。

注意:此升压小板到手默认12v输出,需要将右下角A、B两电阻移出方可输出5V。

右侧 +(箭头侧) 右侧 -(箭头侧) 左侧 + 左侧 -
3.7v输入 + 3.7v输出 -(GND) 5V输出 + 5V输出 -(GND)

升压小板引脚定义

接线:

      1. TP4056模块 OUT+ 接升压小板 右侧 +(箭头侧),中间导线线断开接开关
      2. TP4056模块  OUT- 接升压小板 右侧 -(箭头侧)

注意:开关接在正极导线上!

步骤三:

      1. 闭合开关,测试升压小板左侧两端口电压是否为5v,如果不是则应检查升压小板A、B电阻出是否有焊锡残留

(2)主控&传感部分

步骤一:连接ESP32S3与升压小板

接线:

      1. 将esp32的5V连接升压小板的 左侧 +
      2. 将esp32的GND连接至升压小板的 左侧 -

步骤二:闭合开关,测试ESP32是否正常上电

步骤三:连接FSR402薄膜压力传感器电压转换模块

VCC GND DO AO + -
3.3V供电 接地 数字量输出 模拟量输出 接电阻 接电阻

接线:

      1. 薄膜传感器接电压转换模块 +和- (薄膜传感器不区分正负极)
      2. VCC接ESP32 3.3V引脚,GND接单片机GND引脚
      3. AO接ESP32的5号引脚

(3)电机&驱动部分

步骤一:连接电机与电机驱动

TB6612原理图

TB6612引脚使用示例表

TB6612FNG的主要引脚功能:
(1)AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;
(2)AO1/A02、B01/B02为2路电机控制输出端;
(3)STBY为正常工作/待机状态控制引脚;
(4)VM(3~13.5 V)和VCC(2.7~5.5 V)分别为电机驱动电压输入和逻辑电平输入端。

接线:电机一端接AO1,另一端接AO2

步骤二:ESP32连接电机驱动,供电部分连接电机驱动

接线:

PWMA AIN1 AIN2 STBY VM GND
5 6 7 3.3V 接升压小板左侧 +(5v) 接地

二、ESP32遥控代码设计

完整代码如下:

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "809";          // WiFi SSID
const char* password = "809809809";  // WiFi 密码

const char* mqttServer = "192.168.137.20";  // MQTT 服务器地址
const int mqttPort = 1883;                    // MQTT 服务器端口
const char* mqttTopic = "slt";                 // MQTT 订阅的话题

const int AI1 = 4;  // 用于控制的引脚
const int AI2 = 5;  // 用于控制的引脚
const int outputPin = 6; 
const int pwmFrequency = 1000;  // PWM 波的频率,单位为赫兹
const int pwmResolution = 8;    // PWM 波的分辨率,取值范围为 1-16
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  //pinMode(outputPin, OUTPUT);  // 将引脚设置为输出模式
  Serial.begin(9600);
  // 连接 WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi!");

  // 连接 MQTT 服务器
  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      Serial.println("Connected to MQTT server!");
      client.subscribe(mqttTopic);
    } else {
      Serial.print("MQTT connection failed, rc=");
      Serial.print(client.state());
      Serial.println(" Retrying...");
      delay(2000);
    }
  }
  ledcSetup(0, pwmFrequency, pwmResolution);  // 初始化 PWM 通道
  ledcAttachPin(outputPin, 0);                // 将引脚与 PWM 通道关联
  ledcWrite(0, 254);                          // 设置 PWM 波的占空比为 50%
  pinMode(AI1,OUTPUT);
  pinMode(AI2,OUTPUT);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

void callback(char* topic, byte* payload, unsigned int length) {
  // 将接收到的消息转换为字符串
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.print("Received message: ");
  Serial.println(message);

  // 根据消息内容控制引脚电平
  if (message == "1") {
    digitalWrite(AI1, HIGH);
    digitalWrite(AI2, LOW);
    Serial.println("Set outputPin HIGH");
    delay(1000);
    digitalWrite(AI1, LOW);
  } else if (message == "0") {
    digitalWrite(AI2, HIGH);
    digitalWrite(AI1, LOW);
    Serial.println("Set outputPin LOW");
    delay(1000);
    digitalWrite(AI2, LOW);
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      Serial.println("Connected to MQTT server!");
      client.subscribe(mqttTopic);
    } else {
      Serial.print("MQTT connection failed, rc=");
      Serial.print(client.state());
      Serial.println(" Retrying...");
      delay(2000);
    }
  }
}

下面依次对每段程序进行分析:

包含了WiFi.hPubSubClient.h库的预处理指令,这些库是用于处理WiFi连接和MQTT协议的通信。

#include <WiFi.h>
#include <PubSubClient.h>

定义了连接WiFi和MQTT服务器所需的凭证和参数,以及与PWM(脉冲宽度调制)和GPIO引脚操作相关的配置。

const char* ssid = "809";          // WiFi SSID
const char* password = "809809809";  // WiFi 密码
const char* mqttServer = "192.168.137.20";  // MQTT 服务器地址
const int mqttPort = 1883;                    // MQTT 服务器端口
const char* mqttTopic = "slt";                 // MQTT 订阅的话题
const int AI1 = 4;  // 用于控制的引脚
const int AI2 = 5;  // 用于控制的引脚
const int outputPin = 6; 
const int pwmFrequency = 1000;  // PWM 波的频率,单位为赫兹
const int pwmResolution = 8;    // PWM 波的分辨率,取值范围为 1-16
WiFiClient espClient;
PubSubClient client(espClient);

setup函数中,初始化了串行通信,连接到WiFi,并尝试连接到MQTT服务器。此外,还初始化了PWM通道,并将GPIO引脚设置为输出模式。

void setup() {
  //pinMode(outputPin, OUTPUT);  // 将引脚设置为输出模式
  Serial.begin(9600);
  ...
  ledcSetup(0, pwmFrequency, pwmResolution);  // 初始化 PWM 通道
  ledcAttachPin(outputPin, 0);                // 将引脚与 PWM 通道关联
  ledcWrite(0, 254);                          // 设置 PWM 波的占空比为 50%
  pinMode(AI1,OUTPUT);
  pinMode(AI2,OUTPUT);
}

loop函数负责在断开连接时重新连接MQTT服务器,并不断处理MQTT消息。

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

callback函数会在收到MQTT消息时被调用。它将接收到的消息转换为字符串,并根据消息内容控制GPIO引脚的电平。下面将重点对callback函数进行分析。

void callback(char* topic, byte* payload, unsigned int length) 

这个函数定义了一个名为callback的函数,它接受三个参数:

    • char* topic:指向一个字符数组的指针,表示接收到的消息所属的MQTT话题。
    • byte* payload:指向数据负载的指针,表示接收到的消息内容,消息内容是字节形式的。
    • unsigned int length:表示接收到的数据负载的长度(字节数)。
String message = "";
for (int i = 0; i < length; i++) {
  message += (char)payload[i];
}

这个循环将payload指针指向的字节数据逐个转换成字符,并拼接到String对象message中,最终message将包含完整的消息内容。

Serial.print("Received message: ");
Serial.println(message);
if (message == "1") {
  digitalWrite(AI1, HIGH);
  digitalWrite(AI2, LOW);
  Serial.println("Set outputPin HIGH");
  delay(1000);
  digitalWrite(AI1, LOW);
} else if (message == "0") {
  digitalWrite(AI2, HIGH);
  digitalWrite(AI1, LOW);
  Serial.println("Set outputPin LOW");
  delay(1000);
  digitalWrite(AI2, LOW);
}

这部分代码通过串行通信将接收到的消息内容输出到串行监视器,根据消息内容控制引脚AI1AI2的电平。如果消息内容为字符串"1",则将AI1设置为高电平(通常对应5V或3.3V),AI2设置为低电平(通常对应0V),然后打印一条消息到串行监视器,说明输出引脚被设置为高电平。之后,程序暂停1000毫秒(1秒),然后将AI1引脚设置回低电平。

如果消息内容为字符串"0",则将AI2设置为高电平,AI1设置为低电平,并打印一条消息到串行监视器,说明输出引脚被设置为低电平。之后,程序同样暂停1000毫秒,然后将AI2引脚设置回低电平。

reconnect函数尝试重新连接到MQTT服务器,并在成功后订阅一个话题。

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      Serial.println("Connected to MQTT server!");
      client.subscribe(mqttTopic);
    } else {
      Serial.print("MQTT connection failed, rc=");
      Serial.print(client.state());
      Serial.println(" Retrying...");
      delay(2000);
    }
  }
}

你的阅读就是对我最大的支持,下一篇,设备总装和上位机程序编写马上就来!