【项目介绍】
最近突如其来的降温让我们马上从夏天转到冬天。像我这样日常手脚冰冷的人通常要靠电热水袋续命。然而每年都会有电热水袋爆炸的新闻出现。有一些是因为质量问题,有一些是使用不当。比较常见的情况就是一直充电忘记拔掉电源。因此我设计了一款暖手宝充电管家,防止过度充电,时间到了自动断电,消除隐患。
【功能介绍】
基础功能:快速充电,按A键充电5分钟,时间到自动断电。按B键可以一键停止充电。
拓展功能:手机App远程控制充电/断电。定时充电,自定义设置充电时间。
【作品演示】
【制作过程】
步骤1 连接设备
设备连接很简单,将简易继电器接到扩展板 P0 引脚,将充电宝接到简易继电器 VIN 接口,VOUT 接口接暖手宝(图中用充电灯代替)。
注意:掌控板朝向 PYTHON 金手指方向。
步骤2 创建Blynk项目
打开 Blynk App,创建一个项目,名叫“暖手宝充电管家”。选择设备为“ESP32 Dev Board”,连接方式选择“Wi-Fi”。
点击项目空白处,在工具箱中选择“Styled Button”和“Timer”。调整为合适大小并放在适当的位置。
点击按钮,修改名称。选择虚拟引脚 V0 作为输出,并将按钮状态的文字修改为“关”和“开”。
点击计时器,修改名称。选择虚拟引脚 V1 作为输出。
完成后效果如下:
步骤3 加载扩展
打开 Mind+,切换为“上传模式”,选择“扩展”按钮,添加“掌控板”为主控板。
选择“用户库”,搜索“blynk”,加载“Blynk 物联网”用户库。
步骤4 编写代码
因为用到了Blynk,所以要先连接网络,输入Blynk的授权码。授权码会发送到你的Blynk账户绑定的邮箱,也可以在Blynk项目页面获取。为了提升用户体验,程序开始的时候在屏幕上显示使用说明。
接下来写基础部分代码。这个比较简单,就是按A键充电5分钟后断开。控制继电器开关即可。按B键直接断开继电器,设置低电平。
虚拟引脚V0对应的是App上的充电开关。当用户在App上点按开关后,我们需要判断应该打开继电器还是关闭继电器。
V1虚拟引脚对应的是计时器,也就是定时开关。定时开关会在开始时间打开开关,即由“0”变为“1”,结束时间将“1”变为“0”。这部分代码基本与虚拟引脚V0一致。不同的地方是,我们需要向开关引脚 V0 传送一次数据。如果不发送数据的话,那么充电时开关依旧显示关闭状态,无法与充电状态同步。
步骤5 测试运行
将代码上传到掌控板,测试程序是否和预期效果一致。
【总结】
项目基本功能均已实现。原本想控制手头的暖手宝的,但查阅继电器参数后发现最大支持30V,便只好放弃,改用充电灯代替。原理是一致的。
/*!
* MindPlus
* mpython
*
*/
#include <WiFi.h>
#include <MPython.h>
#include <WiFiClient.h>
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>
#include <WidgetRTC.h>
// 函数声明
void onButtonAPressed();
void onButtonBPressed();
// 主程序开始
void setup() {
mPython.begin();
Serial.begin(9600);
Blynk.connectWiFi("你的无线名称", "你的无线密码");
Blynk.config("你的授权码", IPAddress(116,62,49,166), 8080);
buttonA.setPressedCallback(onButtonAPressed);
buttonB.setPressedCallback(onButtonBPressed);
display.setCursor(20, 0);
display.print("暖手宝充电管家");
display.setCursor(18, 34);
display.print("按A键充电5分钟");
display.setCursor(22, 48);
display.print("按B键停止充电");
}
void loop() {
Blynk.run();
}
// 事件回调函数
void onButtonAPressed() {
display.setCursor(40, 18);
display.print("正在充电");
digitalWrite(P0, HIGH);
delay(300000);
display.setCursor(40, 18);
display.print("充电结束");
digitalWrite(P0, LOW);
}
void onButtonBPressed() {
display.setCursor(40, 18);
display.print("停止充电");
digitalWrite(P0, LOW);
}
BLYNK_WRITE(V0) {
if ((param[0].asFloat()==1)) {
display.setCursor(40, 18);
display.print("正在充电");
digitalWrite(P0, HIGH);
}
else if ((param[0].asFloat()==0)) {
display.setCursor(40, 18);
display.print("充电结束");
digitalWrite(P0, LOW);
}
}
BLYNK_WRITE(V1) {
if ((param[0].asFloat()==1)) {
display.setCursor(40, 18);
display.print("正在充电");
Blynk.virtualWrite(V0, 1);
digitalWrite(P0, HIGH);
}
else if ((param[0].asFloat()==0)) {
display.setCursor(40, 18);
display.print("充电结束");
Blynk.virtualWrite(V0, 0);
digitalWrite(P0, LOW);
}
}
附件
评论