观前提醒!所有焊接及连接操作都应断电进行!
一、电路补完计划
上一章中我们已经确定了智能水龙头所需要的电路模块,接下来我们将来确定这些电路模块如何连接组成为一个完整的“系统”。
介于我们的系统结构简单,元器件相对较少,可以大致分为三个部分:
- 供电&充电部分
- 主控部分
- 驱动&电机部分
下面将对三个部分一次进行设计和讲解
(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) |
升压小板引脚定义
接线:
-
-
- TP4056模块 OUT+ 接升压小板 右侧 +(箭头侧),中间导线线断开接开关
- TP4056模块 OUT- 接升压小板 右侧 -(箭头侧)
-
注意:开关接在正极导线上!
步骤三:
-
-
- 闭合开关,测试升压小板左侧两端口电压是否为5v,如果不是则应检查升压小板A、B电阻出是否有焊锡残留
-
(2)主控&传感部分
步骤一:连接ESP32S3与升压小板
接线:
-
-
- 将esp32的5V连接升压小板的 左侧 +
- 将esp32的GND连接至升压小板的 左侧 -
-
步骤二:闭合开关,测试ESP32是否正常上电
步骤三:连接FSR402薄膜压力传感器与电压转换模块
VCC | GND | DO | AO | + | - |
3.3V供电 | 接地 | 数字量输出 | 模拟量输出 | 接电阻 | 接电阻 |
接线:
-
-
- 薄膜传感器接电压转换模块 +和- (薄膜传感器不区分正负极)
- VCC接ESP32 3.3V引脚,GND接单片机GND引脚
- 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.h
和PubSubClient.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);
}
这部分代码通过串行通信将接收到的消息内容输出到串行监视器,根据消息内容控制引脚AI1
和AI2
的电平。如果消息内容为字符串"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);
}
}
}
你的阅读就是对我最大的支持,下一篇,设备总装和上位机程序编写马上就来!
评论(0)
您还未登录,请登录后发表或查看评论