草庐IT

基于N32G45智能家居平台

IT_阿水 2023-03-28 原文

想了解更多关于开源的内容,请访问:

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

1、项目功能

本次项目采用腾讯物联网平台+微信小程序腾讯连连实现远程控制。本地采集温度数据和湿度数据,设置温湿度报警阈值,超过设定值即可通过蜂鸣器报警。微信小程序可远程控制开发板的硬件设备。OLED屏幕实时显示采集到的数据显示,采用两页显示方式,第一页显示实时时间,第二页显示环境温湿度数据,可通过按键切换。板子上电即可自动完成WIFI连接,在WIFI密码修改的情况下课实现手机一键配网,从而实现腾讯云平台接入。连接成功后屏幕界面默认显示当前实时时间。时间校准可现在网络校时或串口校时。

(1)硬件模块

  1. 温湿度模块DHT11完成环境温湿度采集。
  2. ESP8266 WIFI模块完成腾讯云平台接口。
  3. 0.96寸OLED屏幕显示实时数据信息。
  4. 按键实现界面切换(温湿度界面和时间显示界面切换)。
  5. LED灯配合微信小程序实现远程控制。
  6. 蜂鸣器报警提示。

(2)效果展示

2、物联联网平台

物联网平台也被称为应用支撑平台或者智能管理平台。它是一个中间层,主要位于物联网设备层和物联网网关(和数据)层之间。采用的通讯协议为MQTT。

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。MQTT属于应用层协议。最新版本为MQTT v5.0标准。本次连接腾讯云物联网平台主要以MQTT标准协议3.1版本为主。

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。

(1)腾讯云平台配置

注册腾讯云账号,登陆云平台

搜索物联网平台,登录物联网平台。

创建项目

进入物联网控制台。

创建项目:

创建产品:

创建产品功能

连接物理网平台的三个参数:设备名字、产品ID、设备秘钥。

//设备名,产品ID,设备秘钥修改为自己所创建产品参数
#define DeviceName "Smart_123"//设备名
#define ProductID "LA57WL612"//产品ID
#define DeviceSceret "9JHiCQ5668uZlVDuQ2ZnQ=="//设备秘钥

创建工程,连接腾讯物联网平台

用户名和密钥生成:

//服务器IP:{PRODUCT_ID}.iotcloud.tencentdevices.com ---PRODUCT_ID对应产品ID
#define SERVER_IP "LA57WL612.iotcloud.tencentdevices.com"//服务器IP
#define SERVER_PORT 1883 //端口号
//客户端ID:{产品ID}{设备名}
#define ClientID "LA57WL612Smart_123"
//用户名和秘钥可使用秘钥生成工具完成
#define Username "LA57WL612Smart_123;12010126;R05S3;1621619622"
#define Password "9ebe0d0069ac4dd1e9e98664abc9f726c13b5a150190afdfa7b3c12240ff1e73;hmacsha256"//密文
//订阅主题:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}产品ID,{DeviceName}设备名
#define SET_TOPIC "$thing/down/property/LA57WL612/Smart_123"//订阅

主题订阅

//订阅主题:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}产品ID,{DeviceName}设备名
#define SET_TOPIC "$thing/down/property/LA57WL612/Smart_123"//订阅
//发布主题:$thing/up/property/{ProductID}/{DeviceName}
#define POST_TOPIC "$thing/up/property/LA57WL612/Smart_123"//发布

(2)配置ESP8266WIFI

ESP8266是一款高性能的WIFI串口模块,内部集成MCU能实现单片机之间串口通信,是目前使用最广泛的一种WIFI模块之一。可以简单理解为一个WIFI转串口的设备,不用知道太多WIFI相关知识,只需要知道串口怎么使用就可以。

ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三种。利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。(SoftAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。Station:即无线终端,是一个无线网络的终端端。)。

本次采用模式为TCP+STA方式:

#define WIFI_NAME "wbyq"//WIFI名
#define WIFI_PASSWORD "asdfghjkl23"//wifi密码
char mqtt_message[200];//上报数据缓存区
int main()
{
int i=0;
u8 stat=0;
u32 time=0;
u16 cnt=0;
float temp;
Beep_Init();//蜂鸣器初始化
Led_Init();//LED初始化
Key_Init();//按键初始化
Usartx_Init(USART1,115200,72);
Usartx_Init(USART3,115200,36);
TIMx_Init(TIM2,72,20000);//通过定时器2辅助串口接收数据,20ms
TIMx_Init(TIM4,72,20000);//通过定时器2辅助串口接收数据,20ms
DS18B20_Init();
// RTC_Init();//RTC初始化
printf("初始化完成\r\n");
while(1)
{
stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
if(stat==0)break;
Delay_Ms(500);
printf("stat=%d\r\n",stat);
}
printf("服务器连接成功\r\n");
while(1)
{
MQTT_Init();
stat=MQTT_Connect(ClientID,Username,Password);
if(stat==0)break;
Delay_Ms(500);
printf("正在连接....\r\n");
}
printf("连接成功\r\n");
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("订阅失败\r\n");
else printf("订阅成功\r\n");
while(1)
{
if(usart3_flag)
{
for(i=0;i<usart3_cnt;i++)
{
printf("%c",usart3_rx_buff[i]);
}
usart3_cnt=0;
usart3_flag=0;
}
Delay_Ms(1);
time++;
cnt++;
if(time>=5000)
{
time=0;
MQTT_SentHeart();//发送心跳包
}
if(cnt>=1000)
{
cnt=0;
temp=DS18B20_GetTemp()*0.0625;
sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"LED1\":1,\"temp\":%.2f,\"L\":356}}",temp);//温度
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
}
}
}

(3)设备上报数据格式

{
"method":"report",//上报设备属性
"clientToken":"123",//消息配对标识
"timestamp":1212121221, //可不填,默认为系统时间
"params":{
"power_switch":1, //设备属性power_switch
"color":1, //设备属性color
"brightness":32 //设备属性brightness
}
}
至此,云服务器创建成功,WIFI模式配置完成,云端接入成功。

3、无源蜂鸣器控制

无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。通过2K~5k的方波信号实现驱动。

本次采用定时器3通道1实现无源蜂蜜器驱动。

/***********************************
**
**函数功能:定时器器PWM输出
**TIM3通道引脚:
** 没有重映射 部分重映射 完全重映射
** TIM3_CH1 PA6 PB4 PC6
** TIM3_CH2 PA7 PB5 PC7
**形参:
** chx --要开启的通道(1 --通道1,2--通道2, 3 --表示开启通道1和通道2)
** psc --预分频系数
** ar --重装载值(即周期时间)
** ccr --占空比
** 注意:本示例采用部分重映射功能
**作者:IT_阿水
************************************/
void TIM3_PWM_Out(u8 chx,u16 psc,u16 ar,u16 ccr)
{
/*1.开时钟*/
RCC->APB2PCLKEN|=1<<4;//PB
RCC->APB2PCLKEN|=1<<0;//AFIO
AFIO->RMP_CFG&=~(0x3<<10);
AFIO->RMP_CFG|=0X3<<10;//完全重映像

/*2.配置GPIO*/
GPIOC->PL_CFG&=0xF0FFFFFF;
GPIOC->PL_CFG |=0x0B000000;//通用复用推挽输出模式
/*3.定时器配置*/
RCC->APB1PCLKEN|=1<<1;//TIM3
RCC->APB1PRST|=1<<1;//开启复位时钟
RCC->APB1PRST&=~(1<<1);//取消复位
TIM3->CTRL1|=1<<7;
TIM3->PSC=psc-1;//预分频
TIM3->AR=ar;//重装载值

/*输出PWM配置*/
if(chx&0x1)
{
TIM3->CCMOD1&=~(0x3<<0);//输出
TIM3->CCMOD1|=1<<2;//快速使能
TIM3->CCMOD1|=1<<3;//预加载
TIM3->CCMOD1|=0x6<<4;//PWM0
TIM3->CCDAT1=ccr;//占空比,有效电平时间
TIM3->CCEN|=1<<0;//开启CH1
}
if(chx&1<<1)//CH2
{
TIM3->CCMOD1&=~(0x3<<8);//输出
TIM3->CCMOD1|=1<<10;//快速使能
TIM3->CCMOD1|=1<<11;//预加载
TIM3->CCMOD1|=0x6<<12;//PWM0
TIM3->CCDAT2=ccr;//占空比,有效电平时间
TIM3->CCEN|=1<<4;//开启CH2
}
TIM3->CTRL1|=1<<0;//开启定时器
}

4、DTH11温湿度传感器

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。

//从DHT11读取一次数据
//temp:温度值-20~60℃
//humi:湿度值5~95%RH
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5]={0};
u8 i;
DHT11_Rst();//起始信号
if(DHT11_Check()==0)//应答信号
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi++=buf[0];
*humi=buf[1];
*temp++=buf[2];
*temp=buf[3];
}
}else return 1;
return 0;
}

5、RTC电子钟

RTC,英文全称:Real-time clock,中文名称:实时时钟,是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。实时时钟芯片是日常生活中应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。

本次采用的是芯片自带电子钟,配置好后直接即可读取时间信息,非常方便。

/*读取RTC时间和日期*/
void RTC_GetDate(RTC_TIME *RTC_Time)
{
u32 date=RTC->DATE;
u32 tsh=RTC->TSH;
RTC_Time->year=((date>>20)&0xf)*10+ ((date>>16)&0xf);
RTC_Time->mon=((date>>12)&0x1)*10+ ((date>>8)&0xf);
RTC_Time->day=((date>>4)&0x3)*10+(date&0xf);
RTC_Time->week=((date>>13)&0x7);
//时间,注意,+-优先级 高于 &的优先级
RTC_Time->hour=((tsh>>20)&0x3)*10+((tsh>>16)&0xf);
RTC_Time->min=((tsh>>12)&0x7)*10+((tsh>>8)&0xf);
RTC_Time->sec=((tsh>>4)&0x7)*10+(tsh&0xf);
// printf("%d/%d/%d -- %d:%d:%d \r\n",RTC_Time->year,RTC_Time->mon,RTC_Time->day, \
RTC_Time->hour,RTC_Time->min,RTC_Time->sec);
}
文章相关附件可以点击下面的原文链接前往下载:

 https://ost.51cto.com/resource/2567。

想了解更多关于开源的内容,请访问:

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

有关基于N32G45智能家居平台的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  6. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  7. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  8. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  9. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  10. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

随机推荐