基于ZigBee cc2530单片机多传感器的智能阳台仿真设计与实现

article/2025/5/11 10:59:07

文章目录

  • 摘 要:
    • 关键词:ZigBee 、语音识别、智能家居、传感器
  • 0.引言
  • 1.概述
  • 2.系统总体设计
      • 2.1系统组成
      • 2、系统使用流程
      • 3、开发环境
    • 2.2系统传感器构成
    • 2.3系统数据库设计
  • 3.系统详细设计与实现
  • 4.系统测试结果
  • 5.总结
  • 6.参考文献

摘 要:

对于传统阳台来说,阳台是采光的用来晾晒衣服作为主要作用,如今随着物联网技术的发展,阳台赋予了更多的应用,更多的使用空间,是一种生活场景。本文讲述智能阳台基础仿真设计与实现过程。使用语音助手,多传感器,ZigBee等技术为您展现。

关键词:ZigBee 、语音识别、智能家居、传感器

0.引言

随着社会的发展,城市化的比例越来越高,当下的年轻人对于房子的装修,也是不同于以前,尤其是智能家居的火热,当然对于阳台的使用也大有不同,对于传统阳台来说,阳台是采光的用来晾晒衣服作为主要作用,如今随着物联网技术的发展,阳台赋予了更多的应用,更多的使用空间,是一种生活场景。本文讲述智能阳台基础仿真设计与实现过程。

1.概述

阳台智能化,添加多元场景,本文介绍智能阳台三大功能:
其一,自然是智能晾衣架,作为阳台基本可以通过控制,自动升降,既不占空间,又保留其功能。使用步进电机传感器,以及中控系统完成晾衣架的自动升降。
其二就是智能养护功能,绿植在房子装饰上不可或缺,许多人都或多或少种植一些绿植,阳台作为采光的部分,自然是培养绿植的好地方,智能养护可以通过传感器获得光照强度,温度湿度,监测环境,完全可以实现科学种植,非常省心。
其三为智能灯光系统,要知道阳台作为不同生活场景时候对于灯光效果也是不相同的,所以配合灯光系统,可以带来不同的体验。最为最基础的灯光系统,配合光敏传感器,以及人体红外传感器,用于场景夜晚,检测阳台有人则自动开启灯光。

2.系统总体设计

2.1系统组成

1、本实验使用 Zstack 协议栈多点自组织网络形式采集实验数据。如图 1 所示,系统由一个协调器 和四个终端节点,即人体红外传感器,步进电机传感器,温湿度传感器,光照强度传感器以及电脑作为网关串口和本地数据库组成。

在这里插入图片描述

图 1 系统架构组成

2、系统使用流程

语音录入,python调用百度API识别语音命令向串口发送,再向协调器发送采集命令,协调器再将 命令以广播形式发送给四个终端节点。接着,终端节点采集信息反馈给协调器,协调器将数据发送给串口,最后通过python串口函数将数据存入数据库,然后通过python flask web框架结合echarts图表显示出来

3、开发环境

单片机编译IAR环境以及python3.9解释器,pyCharm环境需要的库与模块pymysql、serial、time、utils、 serial.tools.list_ports、win32com.client、from aip import AipSpeech、 pyaudio、 wave、flask、render_template。Mysql5.7数据库以及Navicat 作为数据管理工具。

2.2系统传感器构成

本任务使用HC-SR501传感器,是基于红外线技术的自动控制钱块,广泛应用于各类自动感应电器设备,HC-SR501的核心控制模块是采用稳定性好、可靠性强、灵敏度高且超低功耗
人体红外传感器检测到有人体活动时,其输出的I/O值发生变化。当传感器模块检测到有人入侵时,会返回一个高电平信号,无人入侵时,返回一个低电平信号,通过读取1/O口的状态判断是否有人体活动。因此通过检测此I/O口电平状态的变化,可判新是否检测到周围有人靠近。
光敏传感器主要是对于ADC值的读取光照越强,数值越低
在这里插入图片描述

图 2人体红外传感器

在这里插入图片描述

图 3 光敏传感器

·
在这里插入图片描述
图四温湿度传感器
在这里插入图片描述

图 5步进电机传感器
在这里插入图片描述

图 6协调器

2.3系统数据库设计

在这里插入图片描述

图 7 光照强度数据表

在这里插入图片描述

图 8 温湿度数据表

选择设计id作为主键自增,datatime设计为varchar,并没有设为time类型,因为可以直接存储,不需要调用数据库时间函数,id用来查询最新数据,这样就可以显示最新数据完成实时读取

3.系统详细设计与实现

光敏传感器功能
在这里插入图片描述

图 9光敏传感器功能图

核心代码


if (strncmp("0x11", pData, len) == 0) {             //如果收到的数据是"0x11"osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, 3000 );//光照强度触发事件循环采集3s一次}
传感器初始化
int getADC(void) 
{unsigned int  value;P0SEL |= 0x02;ADCCON3  = (0xB1);                    ADCCON1 |= 0x30;                      ADCCON1 |= 0x40;                                 while(!(ADCCON1 & 0x80));             value =  ADCL >> 2;value |= (ADCH << 6);                 //取得最终转化结果,存入value中return ((value) >> 2);        
}

步进电机功能图
在这里插入图片描述

图 10步进电机功能图

核心代码

电机初始化

/*motor_init函数
-------------------------------------------------------*/
void motor_init(void)
{P0SEL &=~ 0x62;   //P0_1 P0_5 P0_6 为普通io口P0DIR |= 0x62;    //作输出P1SEL &=~ 0x08;   //P1_3为普通io口 P1DIR |= 0x08;    //作输出AA = 1;BB = 1;CC = 1;DD = 1;
}if (strncmp("0x14", pData, len) == 0) {             //如果收到的数据是"0x14"flag=0;     //改变方向用的 motor_init();//初始化for(int i=0;i<1000;i++){Motor_Test();//转动}}

人体红外功能图
在这里插入图片描述

图 11人体红外功能图

核心代码


初始化以及发送数据P0SEL &= ~0x20;                        //P0_5为普通io口P0DIR &= ~0x20;                        //P0_5输入int Value; Value = P0_5;char  rbuf[10] = {0};if(Value==1){sprintf(rbuf,"Y%u",Value); zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); 	//发送数据*/}else{sprintf(rbuf,"N%u",Value); zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); 	//发送数据*/
}else if (strncmp("0x13", pData, len) == 0) {     //如果收到的数据是"0x13"osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, 1000 );//人体红外}else if (strncmp("0x15", pData, len) == 0) { flag2=1;//开灯}else if (strncmp("0x16", pData, len) == 0) { flag2=0;//关灯}

温湿度功能图
在这里插入图片描述

图 12温湿度传感器功能图

核心代码


void dht11_io_init(void)
{P0SEL  &= ~0x20;          //P1为普通 I/O 口COM_OUT;COM_SET;  
}
unsigned char dht11_temp(void)
{return sTemp;
}
unsigned char dht11_humidity(void)
{return sHumidity;
}void dht11_update(void)
{int flag = 1;unsigned char dat1, dat2, dat3, dat4, dat5, ck;//主机拉低18ms COM_CLR;halMcuWaitMs(18);COM_SET;flag = 0;while (COM_R && ++flag);if (flag == 0) return;//总线由上拉电阻拉高 主机延时20us//主机设为输入 判断从机响应信号  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  	    flag = 0;while (!COM_R && ++flag);if (flag == 0) return;flag = 0;while (COM_R && ++flag);if (flag == 0) return;dat1 = dht11_read_byte();dat2 = dht11_read_byte();dat3 = dht11_read_byte();dat4 = dht11_read_byte();  dat5 = dht11_read_byte();            ck = dat1 + dat2 + dat3 + dat4;if (ck == dat5) {sTemp = dat3;sHumidity = dat1;        }char  rbuf[20] = {0};sprintf(rbuf,"H%dT%d",dat1,dat3); //A0表示湿度,A1表示温度zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); 	//发送数据}

串口功能图
在这里插入图片描述

图 13串口功能图

核心代码

Python


def serilink():#串口连接port_list = list(serial.tools.list_ports.comports())s=''if len(port_list) == 0:speak('无可用串口')else:for i in port_list:s=str(i)portx = s[0:4]bps = 38400# 超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)timex = Noneser = serial.Serial(portx, bps, timeout=timex)return serdef Judgmentcommand(n):#判断接收数据类型函数此处是我个性化数据if 'H' and 'T'in n:position=n.find('T')humi=int(n[1:position])temp=int(n[position+1::])insertdata(temp,humi)elif 'Y' in n:light=utils.selectmaxid()if(light>1000):Sendcommand('0x15\r\n')speak('自动为您开启阳台灯光')else:Sendcommand('0x16\r\n')elif 'L' in n:light=n[1::]insert_l2_data(light)elif 'D' in n:dark=n[1::]insert_l2_data(dark)speak("为你开启补光")def Readdata():#读取串口数据函数for i in range(10):time.sleep(1)data = serilink().read(10)#读取10字节data = str(data)#转为字符串data = data.replace('\\x00', '')#数据分割data = data.replace("'", '')#数据分割Judgmentcommand(data[1:])#数据判断函数判断数据并存入数据print(data[1:])
# 百度API语音识别自行申请
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)
#语音识别
def recognize(file):data=open(file,'rb').read()result=client.asr(data,'wav',16000,{'dev_pid':1537})result=str(result['result'][0])return resultdef get_audio(sec):p=pyaudio.PyAudio()#创建流,采样数,声道数,采样频率,缓存区,input=Truestream=p.open(format=pyaudio.paInt16,channels=1,rate=16000,input=True,frames_per_buffer=1024)#创建打开音频文件wf=wave.open('test.wav','wb')#设置wf.setnchannels(1)wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))wf.setframerate(16000)print("请说话")for w in range(int(16000*sec/1024)):data=stream.read(1024)wf.writeframes(data)print("开始识别")stream.stop_stream()stream.close()p.terminate()wf.close()return "test.wav"
def speak(s):print("-->"+s)win32com.client.Dispatch("SAPI.SpVoice").Speak(s)

Web功能图
在这里插入图片描述

图 14 web功能图
核心代码

function get_l1_data() {$.ajax({type:"GET",url:"http://127.0.0.1:5000/l1",dataType:"json",async:false,success: function(data) {option_left1.xAxis.data = data.secoption_left1.series[0].data = data.humioption_left1.series[1].data = data.tempec_left1.setOption(option_left1)},error: function(errorData) {}});}
get_l1_data()
setInterval(get_l1_data, 1000)

4.系统测试结果

在这里插入图片描述

图15温湿度折线图
在这里插入图片描述

图16温湿度折线图

可以看到数据随着时间的变化进行采集,温湿度设置为3s读取一次,串口读取数据读10,可能协调器不一定能接受到因为传感器太多,需要等一等
在这里插入图片描述

图 17光照强度折线图
在这里插入图片描述

图 18光照强度折线图

同理光照强度也是如此可以随着时间变化读取数据,采集的数据也可以通过仪表图显示最新数据

在这里插入图片描述

图 19实时数据

在这里插入图片描述

图 20 整体效果

5.总结

本文主要是对于阳台的温度、湿度、光照强度进行采集,以及对于光照低情况下自动开启补光,光照低阳台有人的话,开启灯光,还有就是控制晾衣架自动升降这些作为主要功能,设计些许不足,后面拓展可以进行语音助手升级优化,可以设置唤醒词,或者按键唤醒,对于串口读取可以使用双线程实现边读边写,还有也可拓展写一个小程序用于手机控制,对于平台优化,可以基于算法模型对于土壤湿度模型曲线的预测把拟合数据与实际湿度数据对比这样就可以提醒什么时候浇水,补光等操作。

6.参考文献

[1]聂佰玲,武将将,沈昊.阳台菜园智能控制系统的设计与研究[J].产业与科技论坛,2019,18(01):64-65.
[2]李海川,杨思民.浅谈基于智能硬件在阳台智能化场景中的应用[J].科学技术创新,2021(17):147-148.
[3]何文祥,李社蕾.智能家居盆栽系统技术的研究与设计[J].现代计算机,2021,27(23):167-170.
[4]洪长平.基于物联网ZigBee技术的防盗报警系统设计[J].九江学院学报(自然科学版),2020,35(03):57-60.DOI:10.19717/j.cnki.jjun.2020.03.015.
[5]张军. 基于智能盆栽系统的新型物联网架构设计[D].深圳大学,2017.
[6]曾星,陈长菊,张坤. 基于物联网的智能阳台控制系统设计[J]. 通讯世界,2018(6):85-86. DOI:10.3969/j.issn.1006-4222.2018.06.053.
[7]成都信息工程大学,孙翔. 一种基于ZigBee的智能化盆栽浇灌系统:CN201721211830.4[P]. 2018-04-27.
[8]章煜佳,罗文强,金航,杨钦洋,陈祥军,陈超娣,杨金伟.专用于学生公寓阳台的智能防护装置研制[J].科学技术创新,2020(02):188-190.
[9]杨巍,刘倩,邱博.基于STM32与物联网IP技术的智能生态阳台场景的设计与实现[J].电子产品世界,2018,25(09):57-60.


http://chatgpt.dhexx.cn/article/W06NSkKx.shtml

相关文章

CC2530单片机精确延时的时间分析

CC2530单片机精确延时的时间分析 IAR 仿真时如何得知运行周期for循环的时间计算使用反汇编工具计算延时时间验证讨论CC2530与普通8051单片机时钟的不同 IAR 仿真时如何得知运行周期 关于这个问题&#xff0c;网上有很多好文章&#xff0c;讲得很清楚。IAR的操作很简单&#xf…

嵌入式cc2530单片机ZigBee-流水灯的实验

嵌入式cc2530单片机ZigBee 单片机是一种集成电路芯片&#xff0c;包含中央处理器CPU、随机存储器RAM、只读存储器ROM、输入输出I/O接口、中断控制系统、定时/计数器和通信等多种功能部件 其针脚定义如下&#xff1a; 1.0 --P0、P1各8个针脚&#xff08;1字节8位&#xff0c;…

快速学会CC2530单片机基础点灯

使用的软件是IAR 使用的板是经常提到的小黑板 上面四个灯分别是 D3 ---> P1_0 D4 ---> P1_1 D5 ---> P1_3 D6 ---> P1_4 #include <ioCC2530.h>//引用CC2530头文件 #define D3 P1_0 #define D4 P1_1 #define D5 P1_3 #define D6 P1_4//为了方便使用&…

CC2530单片机开发--串口

题目 源码下载链接https://download.csdn.net/download/czx20020728/85975522?spm1001.2014.3001.5503

【CC2530入门教程-06】CC2530的ADC工作原理与应用

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

【CC2530入门教程-01】CC2530微控制器开发入门基础

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

CC2530概述(简单了解)

CC2530概述简单版 CC2530是由TI公司生产&#xff08;德州仪器&#xff09;用于 2.4Ghz IEEE 802.15.4、ZigBee 和RF4CE 的片上系统&#xff08;SOC&#xff09;&#xff0c;经济实惠功耗低。 CC2530F256 结合了ZigBee 协议栈&#xff08;Z-Stack&#xff09;。 什么是片上系统…

单片机CC2530学习笔记

文章目录&#xff1a; 一&#xff1a;与或操作 二&#xff1a;CC2530的通用 IO及相关寄存器 1.与通用I/O端口相关常用的4个寄存器 2.PxSEL寄存器与PxDIR寄存器 3.P0INP寄存器与P1INP寄存器与P2INP 三&#xff1a;按键的工作原理与程序设计思路 四&#xff1a;CC2530的中…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a; 不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。 空格没有转义字符。合法转义字符如下&#xff1a; \a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(…

读入带空格的字符串 C语言

如何输出带空格的字符串 C语言默认是遇到空格&#xff0c;即代表输入的字符串的结束处 那么该如何读入带空格的字符串呢&#xff1f; scanf("%[^\n]", buf); //回车结束 这样的话就可以读入空格啦 表达式的意思为遇到’\n’才读取结束 请看演示代码 #include <…

C语言去除一段字符串中的空格

函数说明 将字符串中的所有空格都去掉。该函数简单但实用性强&#xff0c;可以作为字符串过滤器使用&#xff0c;随便改一下就可以实现去掉任意字符的功能&#xff0c;建议程序员的代码库里可以收藏一段该类型代码&#xff0c;用取方便。 函数实现 #include <stdio.h>…

C语言删除字符串中的空格

实现思路&#xff1a;分别定义2个指针&#xff0c;一个快指针s1, 一个慢指针s2,s1负责快速移动&#xff0c;遍历我们的的字符串&#xff0c;遇到空格就跳过&#xff0c;不是空格&#xff0c;就赋值给我们的s2,我们s2再往后移动&#xff0c;这样就把空格挤掉了。 最后别忘记s2 …

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a; 都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格 \t 跳格 \r 回车 \n 换行 \\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。 转义字符串(E…

c++之静态数据成员与静态成员函数

什么是静态数据成员&#xff1f; 数据成员我们之前学过&#xff0c;是对象的属性。 同一个类&#xff0c;不同的对象&#xff0c;可能拥有不同的属性 例如一个车行&#xff0c;不同的车有不同的颜色&#xff0c;不同的耗油量。。。等等属性 但是当我们统计一个公有的数据&am…

类的静态数据成员和静态成员函数

一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中,全局变量创建在程序开头. 二.为什么要用类的静态成员而不用全局变量 …

37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

静态函数 &#xff08;一&#xff09;、什么是静态函数?1.static变量2.static函数&#xff08;也叫内部函数&#xff09; &#xff08;二&#xff09;、静态数据成员1.空间分配和释放2.静态数据成员初始化效果展示: 3.静态数据成员的访问代码展示:效果展示: (四)、静态成员函数…

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

目录 一、声明静态成员&#xff1a; 二、定义静态成员&#xff1a; 三、使用类的静态成员&#xff1a; 四、静态成员类内初始化&#xff1a; 五、静态成员与普通成员的区别&#xff1a; 六、案例代码&#xff1a; 类内的静态成员包括&#xff1a; 静态数据成员 和 静态成…

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的&#xff0c;就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的&#xff0c;在程序开始运行时被分配空间&#xff0c;到程序结束才释放空间。 3.静态数据成员可以初始化&#xff0c;但只能在类体外进行初…

静态数据成员与非静态数据成员的区别

数据成员&#xff1a; 静态数据成员是类的一部分&#xff0c;为类的所有实例共享(静态区)&#xff1b; 非静态数据成员&#xff0c;类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问&#xff1a; 静态数据成员是类的一部分&#xff0c;在产生任何实例之前已经存在&a…

静态数据成员和静态数据成员函数

c中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西&#xff0c;好像也是找工作公司面试中常常问到的东西。我自己也深有体会&#xff0c;在学习c的过程中&#xff0c;总感觉static很烦人&#xff0c;但是又是一个必须懂的东西&#xff0c;所以今天就对静态数据…