【嵌入式】ESP_01S智能家居:可二次开发式智能灯控/门禁,勾勒智能生活新图景

embedded/2025/3/18 7:57:06/


每文一诗  💪🏼

       操千曲而后晓声,观千剑而后识器。 ——《文心雕龙·知音》

        译文:掌握很多支乐曲之后才能懂得音乐,观察过很多柄剑之后才懂得如何识别剑器。


背景自述

        由于最近搬了一个新的房间,来回的用钥匙开门,手动开灯十分的烦人,所以就想做一个简单的智能家居项目,做一个智能门禁和智能灯孔开关,通过手机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);}

解析:

  • WiFiUDP udp:实例化一个udp对象

  • pinMode(LED_BUILTIN, OUTPUT):设置板子上led灯为输出模式

  • ssid为当前WiFi名称,password为当前WiFi密码。
  • WiFi.mode(WIFI_STA):使用STA模式

  • WiFi.begin(ssid, password):连接wifi

  • Serial.println(WiFi.localIP()):打印udp服务器的IP地址。

  • udp.begin(8899):udp服务器端口为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:常开端

图一默认情况,两个开关均未按下,常闭端默认与公共端接通,电机两端均为正极,无电势差,电机不转动。

图二第一个开关按下,另一个未按下。此时点击一端负极,一端正极,点击正转。

图三第一个开关未按下,另一个按下。此时点击一端正极,一端负极,点击反转。

图四两个开关同时按下,电机两端负极,无电势差,电机不转。

个人主页欢迎大佬来访!


http://www.ppmy.cn/embedded/173525.html

相关文章

Java0317初尝试与报错

支付模块&#xff1a;27min讲了打开神秘开关 在前面讲了Data&#xff0c;NoArgsConstructor&#xff0c;AllArgsConstructor lombok技术 报错1 package com.itheima.demo; public class GoldCard extends Card { Override public void cost(double money){ //消费八折 setM…

C语言的软件工程

C语言的软件工程 引言 C语言作为一种历史悠久、功能强大的编程语言&#xff0c;在软件工程领域有着广泛的应用。自1972年由Dennis Ritchie开发以来&#xff0c;C语言凭借其高效性能、灵活性以及可移植性&#xff0c;成为了操作系统、嵌入式系统及高性能应用程序开发的首选语言…

Qt MainWindow简单例子(文本编辑)

使用Qt控件练习文本编辑窗口的创建。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLabel> #include <QProgressBar>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public Q…

【Linux内核系列】:进程板块与文件板块的综合

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生中成功只是一时的&#xff0c;失败却是人生的主旋律&#xff0c;但是如何面对失败却把人分成了不同的样子&#xff0c;有的人会被…

泽众TestOne推出快速测试用例设计,让自动化更快捷

在当今快速迭代的软件开发环境中&#xff0c;测试用例设计的效率和质量直接关系到软件交付的速度和质量。传统测试用例设计方法往往依赖于测试人员的经验&#xff0c;经验不足的测试人员可能无法识别潜在的测试场景&#xff0c;导致关键问题被遗漏。同时&#xff0c;传统方法在…

Socket 、WebSocket、Socket.IO详细对比

WebSocket、Socket 和 Socket.IO 是网络通信中常用的技术&#xff0c;它们在功能、使用场景和实现方式上有明显的异同点。以下是它们的详细对比&#xff1a; 1. Socket 定义 Socket 是一个通用的网络编程接口&#xff0c;用于在网络上实现进程间通信&#xff08;IPC&#xff0…

变量和数据类型——Python

变量 计算机语言中变量的概念源于数学。在数学中&#xff0c;变量指用拉丁字母表示的、值不固定的数据&#xff1b;在计算机语言中&#xff0c;变量指能存储计算结果或表示值的抽象概念——程序在运行期间用到的数据会被保存在计算机的内存单元中。为了方便取内存单元中的数据…

DJ串烧集 2.4.5 | 海量大型DJ串烧歌曲,无广告,无需登录,高清在线播放

DJ串烧集APP是一款音乐播放软件&#xff0c;收录海量DJ串烧歌曲&#xff0c;涵盖多种音乐类型&#xff0c;适合DJ音乐爱好者。用户可以一键收藏喜欢的音乐&#xff0c;并创建歌单进行分类管理。提供高清的在线播放音质&#xff0c;还能下载无损音质的歌曲&#xff0c;随时随地享…