每文一诗 💪🏼
操千曲而后晓声,观千剑而后识器。 ——《文心雕龙·知音》
译文:掌握很多支乐曲之后才能懂得音乐,观察过很多柄剑之后才懂得如何识别剑器。
背景自述
由于最近搬了一个新的房间,来回的用钥匙开门,手动开灯十分的烦人,所以就想做一个简单的智能家居项目,做一个智能门禁和智能灯孔开关,通过手机app远程控制门的上锁与灯的开关,这样就不用再麻烦用钥匙开门和用手开关灯了。在选择开发板时,我想选择一个体积较小并且具有wifi功能的单片机,ESP_01S这个芯片就是十分不错的选择。
同样这也是我第一次画pcb和嘉立创打样,因为用杜邦线连接的话即乱又不美观,第一次可能画的不好,不过没关系,经历最重要🤠,以上所有的花销控制在20元以内。
🔥🔥✨✨ 个人主页 点击✨✨🔥🔥
关注小弟不迷路🤓🤓
展示
🔥esp01s烧录调试器
🔱智能门禁与智能灯控
🌴单片机+电源+摇杆三体分离可组装,可单独开发单片机功能。
由于打印机有些拉胯,打印的质量不太好😂
ESP_01S芯片介绍
ESP01S 是安信可科技开发的基于 ESP8266 芯片的 Wi-Fi 模块,常用于物联网和嵌入式应用
ESP01S 芯片共有 8 个引脚,以下是各引脚的详细介绍:
- GND(引脚 1):接地引脚,为芯片提供电气参考电位,确保电路稳定工作。
- IO2(引脚 2):多功能引脚,可作为通用输入输出引脚 GPIO2 使用,也可用于 UART1_TXD 功能,还能用于 I2C 通信中的 SDA 线以及 I2S0_BCK 功能。
- IO0(引脚 3):具有多种功能,作为 GPIO0 时,在芯片启动时,若该引脚为悬空或外部拉高,则进入 Flash 下载模式或工作模式;若为下拉状态,则进入串口下载模式
- RXD(引脚 4):主要用于接收异步串口数据,是 UART0_RXD 引脚,同时也可作为 GPIO3 使用。
- TXD(引脚 5):用于发送异步串口数据,是 UART0_TXD 引脚,也可作为 GPIO1 使用。
- EN(引脚 6):芯片使能端,高电平有效,当该引脚为高电平时,芯片正常工作;为低电平时,芯片不工作。
- RST(引脚 7):复位引脚,低电平有效,当该引脚接收到低电平时,芯片将进行复位操作,恢复到初始状态。
- VCC(引脚 8):模块供电引脚,电压范围为 3.0V 至 3.6V,为芯片提供工作电源,外部供电电源输出电流建议在 500mA 以上。
设计/需求分析
🌱由于ESP_01S烧录模式需要将GPIO0下拉,所以板子上需要用短接帽的方式来解决,另外要外接舵机的话,为了方便调试,要预留出几排gnd,vcc,signal,芯片烧录当然还需要ch340驱动,所以就买了usb转ttl芯片,芯片供电就通过这个usb来得到3.3v和5v电压。
电源采用的是一个充放电芯片+18650锂电池。
ESP_01S烧录调试器PCB板设计
原理图
EN引脚默认是高电平,芯片使能;RST复位端没接。
🍎功能:可通过短接帽进入烧录/工作模式,可直接接电脑usb进行串口通信,提供多个舵机端接口,方便调试。
PCB/2D,3D,实物图
花销
🫰🏼零件:usb转ttl+esp01s+排针+排母+pcb板 共大约10元(排针和pcb(免费打样)都是免费的,炫学校的😁)
ESP_01S连接WIFI并启用Udp通信服务器
使用Arudino IDE,芯片选择esp82666
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
WiFiUDP udp;
const char* ssid = "xxx";
const char* password = "88888888";
void setup() {Serial.begin(921600);WiFi.mode(WIFI_STA);pinMode(LED_BUILTIN, OUTPUT);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());udp.begin(8899);}
解析:
通信方式
⚡ 这里为什么使用udp呢,是因为udp在通信时是不需要连接的,可以直接通信,另外这里我只是采用了单向的通信,即开环,我只需要用手机向单片机发送数据即可,不需要单片机的反馈。
单片机端使用udp服务器循环接收手机客户端的控制数据,此时手机控制端是主动的,而单片机端是被动的,即什么时候开关门和开关灯是有手机端决定的,符合客户端请求服务器响应的模式,客户端提交数据,服务端响应 是最常见的网络通信模式,尤其是在 请求-响应模型(Request-Response Model)。
由于ESP_01S的引脚较少,所以智能门禁和智能灯控采用了两个单片机,即多个服务器,一个客户端的方式,一个手机客户端可以通过获取多个服务器在局域网下的IP地址来与其通信,属于分布式通信的一种形式
ESP_01S控制舵机
无论是智能门禁还是智能灯控,二者都是依靠舵机实现的。
- 智能门禁是通过大扭矩舵机配合两个齿轮来完成旋转开锁与上锁。
- 智能灯控就是一个舵机加上一个杆子来按动灯的开关完成的。
包含头文件#include <Servo.h>
在setup()函数中添加
Servo myservo;//实例化舵机对象
myservo.attach(2);//设置舵机的信号输出引脚为gpio2
loop()函数
void loop() {// put your main code here, to run repeatedly:char bytes[100] = {};static int k =0;String aim_buffer = "";if(udp.parsePacket()){digitalWrite(LED_BUILTIN,HIGH);delay(150);digitalWrite(LED_BUILTIN,LOW);delay(150);size_t len = udp.readBytes(bytes,100); if(len>0){for(size_t i=0;i<len;i++)aim_buffer+=bytes[i];}//打印数据Serial.println(aim_buffer); //控制开锁和关锁if(aim_buffer == "open")myservo.write(180);else if(aim_buffer == "close")myservo.write(0);else myservo.write(aim_buffer.toInt());}aim_buffer = ""; }
loop函数实现的就是收到udp客户端消息之后LED灯闪烁,并将发来的数据解析,然后转为整数发送到GPIO2引脚,进而控制舵机转动。
全部代码:
#include <WiFiUdp.h>
#include <Servo.h>
#include <ESP8266WiFi.h>
WiFiUDP udp;
const char* ssid = "杂物房";
const char* password = "88888888";
const char* host = "192.168.68.149";
Servo myservo;
void setup() {// put your setup code here, to run once:Serial.begin(921600);pinMode(LED_BUILTIN, OUTPUT);myservo.attach(2); WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());udp.begin(8899);}void loop() {// put your main code here, to run repeatedly:char bytes[100] = {};static int k =0;String aim_buffer = "";if(udp.parsePacket()){digitalWrite(LED_BUILTIN,HIGH);delay(150);digitalWrite(LED_BUILTIN,LOW);delay(150);size_t len = udp.readBytes(bytes,100); if(len>0){for(size_t i=0;i<len;i++)aim_buffer+=bytes[i];}//打印数据Serial.println(aim_buffer); //控制开锁和关锁if(aim_buffer == "open")myservo.write(180);else if(aim_buffer == "close")myservo.write(0);else myservo.write(aim_buffer.toInt());}aim_buffer = ""; }
ESP_01S电源组装
花销
🫰🏼所需材料:18650锂电池+正负极电池片+充放电一体模块 总共不到6元
一节锂电池续航较短,由于多个LED灯持续发光导致电能转化为光能损耗,经过测试一节电池可持续续航约6小时。可以直接通过type-c数据线进行充电,加电量显示。
3d打印设计
esp01s烧录调试器与电源
灯控sg90舵机外壳(可组装)
其他:两个微动开关无驱动控制直流电机正反转
如何控制直流电机的正反转,想必大家首先想到的是通过电机驱动+单片机控制,这样的方法虽然可以做出的功能更多,但是如果只是需要主动地控制电机正反转,有更好的办法,就是通过微动开关两通过交换点击两端正负极来控制电机正反转。
微动开关原理
如左图,在开关未按下(默认)时,常闭端与公共端导通;
开关按下式,常开端与公共端导通。
正反转原理
将两个微动开关常开端连在一起,常闭端连在一起,常闭端接电池正极,常开端接电池负极,两个公共端接电机正负极
NC:常闭端
NO:常开端
图一默认情况,两个开关均未按下,常闭端默认与公共端接通,电机两端均为正极,无电势差,电机不转动。
图二第一个开关按下,另一个未按下。此时点击一端负极,一端正极,点击正转。
图三第一个开关未按下,另一个按下。此时点击一端正极,一端负极,点击反转。
图四两个开关同时按下,电机两端负极,无电势差,电机不转。
个人主页欢迎大佬来访!