基于嵌入式的智能台灯系统

基于嵌入式的智能台灯系统

功能说明

通过微信小程序控制台灯的亮灭及亮度。采集温湿度传到微信小程序上,台灯可以显示实时北京时间。

功能展示

01智能台灯演示

Mqtt服务器

  • http://www.yoyolife.fun/iot:Mqtt服务器,我是在这里注册的,免费一个,之后每个2块钱每月。主要是结构简单,用起来容易。
  • 下位机即ESP32要选择mqtt地址:t.yoyolife.fun 端口:1883地址(里边有三个地址)
  • 微信小程序要选择mqtt:wss地址:t.yoyolife.fun/mqtt 端口:8084地址,不可选错
  • 两边的发布和订阅要对应起来,一个发布一个订阅,跟串口的Tx、Rx一样。服务器的主题可以随意定,意为服务器要监听哪个地址。
  • 设备ID即是用户名,密码即是密码。
  • 调试软件为mqttx,可自行下载https://mqttx.app/zh,调试下位机的时候可以连接上边提到的微信小程序8084那个端口,即服务器地址:wss://t.yoyolife.fun、端口:8084、Path:/mqtt、用户名即设备ID、密码即密码,然后订阅ESP32发布的那个地址,或者向ESP32订阅的那个地址发布信息。

硬件制作


采用的是ESP32+微信小程序+Mqtt协议。

硬件选型

  • ESP32开发板(VSCode+PlatformIO环境)
  • DHT11温湿度传感器
  • 两颗LED灯(模拟台灯)
  • 0.96寸OLED屏
  • 杜邦线若干

硬件连接

在这里插入图片描述
如图所示,需要注意的是LED串联电阻1K到10K都可以,主要起限流作用。如果多个LED并联显示的话也可选择更小的。

硬件程序


程序采用VSCode+PlatformIO环境。安装以下库

  • ArduinoJson 库:解析Mqtt协议收发的json格式数据。
  • DHT sensor library库:用于DHT11采集温湿度数据。
  • NTPClient 库:获取网络NTP时间。
  • PubSubClient 库:Mqtt通讯协议。
  • U8g2 库:OLED显示库。
代码展示

以下展示部分重要代码,完整完成在文章末尾。

Mqtt连接

const char *ssid = "Hide_2805";                            // ESP32连接的WiFi账号
const char *password = "asdfghjkl";                        // WiFi密码
const char *mqttServer = "t.yoyolife.fun";                 // 要连接到的服务器IP
const int mqttPort = 1883;                                 // 要连接到的服务器端口号
const char *mqttUser = "75bdfb62a1c56065949702a3a6430e38"; // MQTT服务器账号
const char *mqttPassword = "123465";                       // MQTT服务器密码
const char *mqttsub = "/iot/4432/wsy";                     // MQTT订阅主题
const char *mqttpub = "/iot/4432/waa";                     // MQTT发送主题WiFiClient espClient;                              // 定义wifiClient实例
PubSubClient client(espClient);                    // 定义PubSubClient的实例DynamicJsonDocument Json(1024);                    // 定义Json实例String Debug_Mqtt = "";
void callback(char *topic, byte *payload, unsigned int length)
{String Str = "";Serial.print("来自订阅的主题:"); // 串口打印:来自订阅的主题:Serial.println(topic);           // 串口打印订阅的主题Serial.print("信息:");          // 串口打印:信息:for (int i = 0; i < length; i++) // 使用循环打印接收到的信息{Serial.print((char)payload[i]);Str += (char)payload[i];}Serial.println();Serial.println("-----------------------");Debug_Mqtt = Str;deserializeJson(Json, Str);// Lamp_Duty = Json["target"].as<String>();Lamp_Duty = Json["value"].as<unsigned char>();if (Lamp_Duty > 100)Lamp_Duty = 100;Lamp_Num = Json["num"].as<bool>();Debug = Json["debug"].as<unsigned char>();Serial.print("value:"); // 串口打印:来自订阅的主题:Serial.println(Lamp_Duty);           // 串口打印订阅的主题Serial.print("num:"); // 串口打印:来自订阅的主题:Serial.println(Lamp_Num);           // 串口打印订阅的主题
}void WiFi_Click(void)
{while (WiFi.status() != WL_CONNECTED) // 若WiFi接入成功WiFi.status()会返回 WL_CONNECTED{Serial.println("连接wifi中"); // 串口输出:连接wifi中WiFi.begin(ssid, password);   // 接入WiFi函数(WiFi名称,密码)重新连接wifdelay(2000);                  // 若尚未连接WiFi,则进行重连WiFi的循环}Serial.println("wifi连接成功");         // 连接wifi成功之后会跳出循环,串口并输出:wifi连接成功client.setServer(mqttServer, mqttPort); // MQTT服务器连接函数(服务器IP,端口号)client.setCallback(callback);           // 设定回调方式,当ESP32收到订阅消息时会调用此方法while (!client.connected())             // 是否连接上MQTT服务器{Serial.println("连接服务器中");                            // 串口打印:连接服务器中if (client.connect("ESP32Client", mqttUser, mqttPassword)) // 如果服务器连接成功{Serial.println("服务器连接成功"); // 串口打印:服务器连接成功}else{Serial.print("连接服务器失败"); // 串口打印:连接服务器失败Serial.print(client.state());   // 重新连接函数delay(2000);}}client.subscribe(mqttsub);                    // 连接MQTT服务器后订阅主题Serial.print("已订阅主题,等待主题消息...."); // 串口打印:已订阅主题,等待主题消息client.publish(mqttpub, "Hello from ESP32");  // 向服务器发送的信息(主题,内容)
}void Pub_Mqtt(void)
{char payload[200];StaticJsonDocument<200> jsonDocument; // 声明一个Json格式变量jsonDocument["temperature"] = Temp;jsonDocument["humidity"] = Humi;serializeJson(jsonDocument, payload); // 将jSerial.println(payload);client.publish(mqttpub, payload);     // 向服务器发送的信息(主题,内容)son转换为字符串
}

初始化、主函数及时间片

void Time_Slice(void)
{if (F_Time_10ms){F_Time_10ms = 0;Display();}if (F_Time_100ms){F_Time_100ms = 0;Log_Print();Ctrl_Lamp();}if (F_Time_2s){F_Time_2s = 0;DHT11_Get();Pub_Mqtt();TimeClient.update();Serial.println(TimeClient.getFormattedTime());}
}void setup()
{pinMode(LED_Pin_Gnd, OUTPUT);digitalWrite(LED_Pin_Gnd, 0);U8g2_Init();u8g2.setCursor(0, 8);u8g2.print("U8g2 OK!");u8g2.sendBuffer();Serial.begin(115200); // 串口函数,波特率设置u8g2.setCursor(0, 8 + 12 * 1);u8g2.print("串口 OK!");u8g2.sendBuffer();WiFi_Click();u8g2.setCursor(0, 8 + 12 * 2);u8g2.print("WiFi OK!");u8g2.sendBuffer();Timer0_Init();PWM_Init();TimeClient.begin();TimeClient.setTimeOffset(28800); //+1地区偏移3600u8g2.setCursor(0, 8 + 12 * 3);u8g2.print("NTP OK!");u8g2.sendBuffer();DHT.begin();u8g2.setCursor(0, 8 + 12 * 4);u8g2.print("DHT11 OK!");u8g2.sendBuffer();delay(2000);
}void loop()
{client.loop(); // 回旋接收函数  等待服务器返回的数据Time_Slice();
}

硬件修改代码作为己用

用户如需借用代码,只需修改关键部分即可,例如Mqtt的Key、发布订阅地址,WiFi的账号密码等。

初始化修改

#define LED_Pin 2		//系统LED灯 不用修改
#define DHT11_Pin 4		//DHT11连接的IO口 可修改
#define DHTTYPE DHT11	//DHT11	不用修改#define Lamp_Pin1 12	//LED控制输出IO 可修改
#define Lamp_Pin2 13	//LED控制输出IO 可修改
#define LED_Pin_Gnd 14	//LED控制输出地 可修改const char *ssid = "Hide_2805";                            // ESP32连接的WiFi账号
const char *password = "asdfghjkl";                        // WiFi密码
const char *mqttServer = "t.yoyolife.fun";                 // 要连接到的服务器IP
const int mqttPort = 1883;                                 // 要连接到的服务器端口号
const char *mqttUser = "75bdfb62a1c56065949702a3a6430e38"; // MQTT服务器账号
const char *mqttPassword = "123465";                       // MQTT服务器密码
const char *mqttsub = "/iot/4432/wsy";                     // MQTT订阅主题
const char *mqttpub = "/iot/4432/waa";                     // MQTT发送主题

callback函数中修改地方

    Lamp_Duty = Json["value"].as<unsigned char>();//接受的Json格式的键名称,跟你发送的对应起来,后边格式也要解析成相应格式if (Lamp_Duty > 100)		//这里可以做一些逻辑判断等Lamp_Duty = 100;Lamp_Num = Json["num"].as<bool>();Debug = Json["debug"].as<unsigned char>();

Pub_Mqtt函数中修改地方

jsonDocument["temperature"] = Temp;		//要发送的Json的键名称
jsonDocument["humidity"] = Humi;
serializeJson(jsonDocument, payload); 
Serial.println(payload);
client.publish(mqttpub, payload);     // 向服务器发送的信息(主题,内容)son转换为字符串

微信小程序制作


软件采用的是微信开发者工具,下载软件即可使用,无需复杂环境,成品直接发布就能使用,方便快捷。

软件程序

  • 引入Mqtt的js包。
  • 请求获取系统地址权限,请求天气API(高德),获取当地天气。
  • 请求Mqtt服务器,订阅相关地址。
  • 获取接受的数据,Json解析。
  • 按键像相关地址发布Json数据。

下边是具体代码。

天气数据

  getUserLocation: function () {let that = this;wx.getSetting({success: (res) => {console.log("天气", res);if (res.authSetting["scope.userLocation"] != undefined &&res.authSetting["scope.userLocation"] != true) {wx.showModal({title: "请求授权当前位置",content: "需要获取您的地理位置,请确认授权",success: function (res) {if (res.cancel) {wx.showToast({title: "拒绝授权",icon: "none",duration: 1000,});} else if (res.confirm) {wx.openSetting({success: function (dataAu) {if (dataAu.authSetting["scope.userLocation"] == true) {wx.showToast({title: "授权成功",icon: "success",duration: 1000,});//再次授权,调用wx.getLocation的APIthat.getLocation();} else {wx.showToast({title: "授权失败",icon: "none",duration: 1000,});}},});}},});} else if (res.authSetting["scope.userLocation"] == undefined) {//调用wx.getLocation的APIthat.getLocation();} else {//res.authSetting['scope.userLocation'] == true//调用wx.getLocation的APIthat.getLocation();}},});},getLocation() {let that = this;wx.getLocation({type: "wgs84",success(res) {console.log("经纬度", res);if (res?.errMsg === "getLocation:ok") {/* ----------------通过经纬度获取地区编码---------------- */wx.request({url: "https://restapi.amap.com/v3/geocode/regeo?parameters",data: {key: KEY, //填入自己申请到的Keylocation: res.longitude + "," + res.latitude, //传入经纬度},header: {"content-type": "application/json",},success: function (res) {console.log("坐标转换和查询天气", res.data);wx.setStorageSync("city",res.data.regeocode.addressComponent.adcode //地区编码);that.setData({location: res.data.regeocode.addressComponent.city +" " +res.data.regeocode.addressComponent.district,});wx.request({url: "https://restapi.amap.com/v3/weather/weatherInfo",data: {key: KEY, //填入自己申请到的Keycity: res.data.regeocode.addressComponent.adcode, //传入地区编码},header: {"content-type": "application/json",},success: function (weather) {console.log("天气", weather.data);that.setData({temp: weather.data.lives[0].temperature, //温度weatherText: weather.data.lives[0].weather, //天气描述 晴天 下雨天...welcome: "今天的天气是 " + weather.data.lives[0].weather + ",又是爱豆的一天!", //欢迎语});},});},});}},});},

Mqtt协议

  connectMqtt() {let that = this;const options = {connectTimeout: 4000,address: "t.yoyolife.fun/mqtt", //输入的地址port: 8084, //输入的端口号username: "75bdfb62a1c56065949702a3a6430e38", //输入的用户名password: "123465", //输入的密码};console.log("address是:", options.address);client = mqtt.connect(MQTTADDRESS, options); //连接client.on("connect", (e) => {console.log('连接成功');})client.on("reconnect", (error) => {console.log("正在重连:", error);wx.showToast({icon: "none",title: "正在重连",});});client.on("error", (error) => {console.log("连接失败:", error);wx.showToast({icon: "none",title: "mqtt连接失败",});});// 订阅一个主题let message = this.data.push;client.subscribe(this.data.push, {qos: 0}, function (err) {if (!err) {console.log("订阅成功", message);wx.showToast({icon: "none",title: "添加成功",});}});client.on("message", (topic, message) => {console.log("收到地址:", topic);console.log("收到消息:", message.toString());let getMessage = {}; //收到的消息try {getMessage = JSON.parse(message); //收到的消息转换成json对象console.log(getMessage);that.setData({temperature: getMessage.temperature,humidity: getMessage.humidity,})} catch (error) {console.log("JSON解析失败!");}})}

修改代码作为己用

用户如需借用代码,只需修改关键部分即可,例如Mqtt的Key、发布订阅地址,WiFi的账号密码等。

程序初始化

const KEY = "1acc1391bf1593cf96f258d2f9ebe552";	//注意这里是高德地图的KEY 不是Mqtt服务器的KEYconst app = getApp();
import mqtt from "../../utils/mqtt.min";		//加载的Mqtt协议的文件名
const MQTTADDRESS = "wxs://t.yoyolife.fun/mqtt"; //mqtt服务器地址

data中数据

    welcome: "你好,这里是Shiboven。",//主页显示push: "/iot/4432/waa", //订阅地址subscr: "/iot/4432/wsy", //发布地址

connectMqtt函数

    const options = {connectTimeout: 4000,		//重连时间address: "t.yoyolife.fun/mqtt", //Mqtt服务器地址port: 8084, //Mqtt服务器端口号username: "75bdfb62a1c56065949702a3a6430e38", //Mqtt用户名password: "123465", //Mqtt密码};

总结

项目本身功能简单,但是包含内容还是挺多的,扩展的话也比较容易。

项目地址:https://download.csdn.net/download/weixin_42320020/88731183

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20固定串口名称

查看串口的详细信息 udevadm info --name/dev/ttyUSB0结果&#xff1a; P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 L: 0 S: serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UAR…

电阻如何读取阻值

前言&#xff1a;大家经常见到的贴片电阻上的丝印有纯数字、数字与R组合、数字与除R之外的字母组合的&#xff0c;但大家知不知道这样的标注与贴片电阻的i精度相关&#xff1f;同一个阻值因为精度不同&#xff0c;标注也会不同。例如封装为0805的贴片电阻&#xff0c;丝印473和…

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章&#xff0c;其实这个css技术已经出现很久了&#xff0c;在一些大型项目很多人也已经在用了&#xff0c;虽然不是说必须要会吧&#xff0c;但是没听说过肯定是不行的&#xff0c;他的操作逻辑应该是和unocss差不多&#xff0c;但是今…

Docker 安装:在linux系统CentOS7 版本 安装Docker

目录 一&#xff0c;Docker介绍&#xff1a; 1.1Docker是什么&#xff1f; 1.2Docker组成 二&#xff0c;Docker安装&#xff1a; 三&#xff0c;Docker基本使用 3.1服务 3.2镜像 3.3容器 &#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&am…

java SSM物业管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物业管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B/…

【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据

一、前言 目的&#xff1a;借助虚拟串口软件&#xff08;VSPD&#xff09;模拟硬件串口发送数据&#xff0c;使用PHP语言实现接收硬件发送的数据。 我这里的需求是连接天平&#xff0c;把天平的称量数据实时的传送到PHP使用。 使用工具&#xff1a;vspd串口调试工具 使用语…

105、Zero-1-to-3: Zero-shot One Image to 3D Object

简介 官网  使用合成数据集来学习相对摄像机视点的控制&#xff0c;这允许在指定的摄像机变换下生成相同对象的新图像&#xff0c;用于从单个图像进行三维重建的任务。 实现流程 输入图像 x ∈ R H W 3 x \in \R^{H \times W \times 3} x∈RHW3&#xff0c;所需视点的相…

阿里云c8i服务器CPU、内存性能测评

阿里云第八代云服务器ECS计算型c8i实例&#xff0c;CPU采用Intel Xeon Emerald Rapids或者Intel Xeon Sapphire Rapids&#xff0c;主频不低于2.7 GHz&#xff0c;全核睿频3.2&#xff0c;阿里云百科aliyunbaike.com分享阿里云c8i服务器CPU处理器型号、存储、网络、安全、使用场…

抵御爬虫的前线护盾:深度解读验证码技术的演变历程

一.前言 在当今信息技术迅速发展的背景下&#xff0c;网站和在线服务面临着日益增长的自动化访问威胁&#xff0c;这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力&#xff0c;还可能导致敏感数据的泄露&#xff0c;甚至被用于不正当竞争和恶意…

idea试用到期,重新试用

版本号&#xff1a;2021.2.* 打开运行 删除以下内容 1. 计算机注册表 \HKEY_CURRENT_USER\Software\JavaSoft\Prefs\Jetbrains 2. 文件夹 C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea C:\Users\用户名\AppData\Local\JetBrains\IntelliJIdea 以上仅用于临时使用…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑨

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回文字“xa*a*b的值&#xff1a;”和x的值&#xff1b;返回文字“xa-b的值&#xff1a;”和x的值&#xff1b;返回文字“xab的值&#xff1a;”和x的值。其中变量a、b均须为整型…

Linux:NTP校时、PTP校时

目录 前言一、NTP校时1、简介2、ubuntu使用 NTP3、嵌入式设备使用 NTP 校时4、NTP 服务器的校时精度 二、PTP校时1、简介2、ubuntu使用 PTP3、嵌入式设备使用 PTP 校时 三、PTP 校时和 NTP 校时那个精度高一些 前言 在进行网络协议通信时&#xff0c;我们有时候需要计算通信的延…

本地开发环境请求服务器接口跨域的问题(vue的问题)

上面的这个报错大家都不会陌生&#xff0c;报错是说没有访问权限&#xff08;跨域问题&#xff09;。本地开发项目请求服务器接口的时候&#xff0c;因为客户端的同源策略&#xff0c;导致了跨域的问题。下面先演示一个没有配置允许本地跨域的的情况&#xff1a; 可以看到&…

jsoncpp学习

1.环境配置 C 操作 &#xff08;读写&#xff09;json 文件及jsoncpp的配置-CSDN博客 一步步跟下来&#xff0c;就可以了!!! 2.遇到的问题&#xff1a; 读取json文件&#xff0c;出现中文乱码&#xff01;&#xff01;&#xff01; 参考&#xff1a;C ifstream open 读取…

解决“百度网盘启动缓慢”问题

最近在使用百度网盘&#xff0c;双击桌面的《百度网盘》图标&#xff0c;发现有等好几分钟&#xff0c;软件才会启动。百度网盘启动太慢了&#xff0c;后面发现百度网盘&#xff0c;使用dll注入技术&#xff0c;附加到很多不相干的进程里&#xff0c;比如附加explorer进程、附加…

Golang defer 使用及面试常见的坑

前言 defer是Golang中一个常用的关键字&#xff0c;通常用来做一些收尾工作。比如开启了一个东西&#xff0c;就顺手defer中关闭。对于面试&#xff0c;defer也算一个高频考点&#xff0c;尤其是他的许多个坑&#xff0c;因此本文主要复习一下defer的用法。 多个defer的执行顺…

数谷·企声|贵州空港智能科技:以“智”提“质”,助力贵阳智慧机场建设

当前&#xff0c;我国民航正大力推进“平安、绿色、智慧、人文”的四型机场建设。贵州空港智能科技有限公司&#xff08;下称“空港智能科技”&#xff09;作为贵州民航产业集团有限公司&#xff08;下称“民航产业集团”&#xff09;信息化建设的排头兵和主力军&#xff0c;近…

Unity组件开发--长连接webSocket

1.下载安装UnityWebSocket 插件 https://gitee.com/cambright/UnityWebSocket/ 引入unity项目&#xff1a; 2.定义消息体结构&#xff1a;ExternalMessage和包结构Package&#xff1a; using ProtoBuf; using System; using System.Collections; using System.Collections.Ge…

Springboot使用自带Logback 与 整合log4j 和 log4j2过程详解

logback 1、添加依赖 <!--spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2、logback-spring.xml配置 <?xml version"1.0&…

个人事务备忘录管理微信小程序

介绍 UniApp是一款使用Vue.js开发所有前端应用的框架&#xff0c;能够同时在iOS、Android、H5、小程序等多个平台上运行&#xff1b;所以本系统可以是一个安卓app&#xff0c;也可以是微信小程序 系统包括以下功能&#xff1a; 备忘录 管理个人事务 记事本 事务分类 日记编写…