本帖最后由 花间一壶酒 于 2025-1-1 23:35 编辑
由于家里养的有鸡鸭 有的时候回家的晚会存在没开灯的情况
别问为啥不用光敏传感器控制灯光 因为鸡舍比较暗 用光敏传感器白天也是亮的 小本生意 省点电费 而且我也要用继电器控制别的东西 比如换气扇 水泵之类的
如果放大棚外面又容易损坏
废话不多说 讲正题
硬件部分:
我使用了 ESP32单片机+5v单路继电器+DS18B20温度传感器
ESP32 Dev Module 价格某宝差不多24元左右 (看起来只用来控制一个灯和温度确实挺贵的 实际上并不贵 因为它有很多引脚 一个板子能控制整个大棚所有的继电器了 觉得贵就换esp8266 那玩意便宜 11块钱一个 又能力自己焊的 光买芯片 十块钱都不要 但是那个新手干不了)
5v单路继电器 4元左右
DS18B20 温度传感器 数字模块 差不多3元 当然要是大佬直接买单个传感器 几毛钱
我刚学这玩意 新手 大佬就别说话了 我只会买成品的模块不会焊板子
软件部分:
单片机这边使用的 Arduino IDE + VSCode + PlatformIO插件
Arduino IDE 这个是单片机开发的主要环境 软件直接百度 安装库会很慢 需要科学上网
VSCode 这个直接百度搜索就行了 没啥技巧可言
这里附上离线包 不然90%的同学会死在安装环境上
链接: https://pan.baidu.com/s/1r4Y0U4AFjaE_X_WJPf5TKA?pwd=2ng3 提取码: 2ng3
安装完IDE简单 主要是支持文件下载很慢 所以才要安装离线包 切记 不要手贱去更新
实在不会的看B站离线安装视频 https://www.bilibili.com/video/BV1xY4y1b7un
这是大佬的视频 不是我的 别喷!!
到了这里 环境安装完了 我说一下 我是怎么实现外网连接的 首先在没有公网的情况下一般我们能想到的远程连接 无非是局域网 但是这个有距离限制
但是呢 如果让我租服务器 每个月又得花几十块大洋 觉得又挺亏的 买排骨它不香么 ?
所以我这里使用了 https://www.emqx.com/zh 的白嫖云服务 他家每个用户可以部署一个实例 每个月送100万分钟的连接 1000连接上限 1G流量 (不要觉得1G少 我们只是在开关的时候发生 json的字符串命令 可以用很久)用完了1.5元1G
首先这里调用的库 在PIO的库搜索里面直接搜索下载就行了 如下图
如此这般
[C++] 纯文本查看 复制代码 // WiFi 连接信息
const char *ssid = "******"; // 替换为你的WiFi名称
const char *password = "**********"; // 替换为你的WiFi密码
// MQTT 服务器设置
const char *mqtt_broker = "********************"; // 连接地址
const char *mqtt_topic_f = "ESP32_KG_ZT_f"; // 发送主题
const char *mqtt_topic_s = "ESP32_KG_ZT_s"; // 接收主题
const char *mqtt_username = "*****"; // 用户名
const char *mqtt_password = "********"; // 密码
const int mqtt_port = 8883; // 端口
String client_id = "esp_002"; // 客户端ID
const char *switchArray[] = {"1"}; // 开关数组
const int switchPin[] = {21}; // 开关引脚
这部分就是基本的信息填写据实填就行了 在MQTT的后台有信息
后面三个参数
客户端ID 自己填就行了 每个单片机写一个 客户端ID 这样方便在你的APP里面区分不同的板子
开关数组和开关引脚数组 使用来在当前的板子上管理多个继电器开关的
比如 我给MQTT服务器发送 “{"设备":"esp_001","开关":"1","状态":"ON"}”
这代表我要 让esp_001这个板子的 第一个开关 常闭的接口通电
开关 1 代表第一个开关 它的引脚的 21
所以以此类推 我们可以在开关数组和引脚数组写上多个数据 如 开关2 对应22引脚
我发送 “{"设备":"esp_001","开关":"2","状态":"ON"}” 就可以打开第二个继电器
“{"设备":"esp_001","开关":"2","状态":"OFF"}” 关闭第二个继电器
“{"设备":"esp_002","开关":"1","状态":"ON"}” 就是打开另一个板子的第一个继电器
方便一个APP管理多个开关
再后面的部分 是不需要改动的 当然如果你不想用温度传感器 可以将温度传感器的部分删除 都是带有注释的
温度发生变化时传给服务器 服务器再转发给APP
在客户端上接收到的就是这种数据
然后我们再从火山安卓上建立APP 也登录客户端 用来接收数据 和给ESP32发送控制开关的命令
火山部分比较简单 就是调用MQTT模块 这个火山官网下载 自带的就有 主要 这里的连接地址是带 ssl:// 开头的
在窗口启动完成后 连接服务器 正常填写账号密码就行了
然后调用 连接成功 和收到消息的事件 用于初始化APP的数据
当我给服务器的 "ESP32_KG_ZT_s" 主题 发送 "add" 的时候 esp32那边订阅的 "ESP32_KG_ZT_s"主题接收到信息 就会返回收到信息的板子上的所有开关信息 如图
当我给服务器发送“add”时 服务器转发给 esp_001 和 esp_002 两块板子 它们返回的信息 代表esp_002的第一个开关是关闭状态 esp_001的第一个开关是开启状态
那么我的app上的开关选中状态 就得是一个关闭 一个开启状态 完成初始化
然后 再当我按开关的时候 APP就给服务器发送 “{"设备":"esp_001","开关":"1","状态":"ON"}” 这种json文本 按对应的开关 发送不同的数据就行了 这样就能控制开关了
像这样
最下面附上电路连接图
https://wokwi.com/ 连接图模拟网站也可以用这个网站学习简单的操作 不用配置环境
|