基于Ocean Connect云平台的照明控制系统设计

news/2025/5/28 3:37:58

目 录
摘 要 I
Abstract II
1 绪论 1
1.1选题背景及意义 1
1.2国内外研究现状 2
1.2.1云平台发展现状 2
1.2.2智能照明的发展现状 2
1.3 研究主要内容 3
2 总体方案设计 5
2.1 系统的需求分析 5
2.2 系统架构设计 6
2.3 通信协议设计 7
2.3.1协议数据帧格式 7
2.3.2控制协议的具体实现 7
3 硬件设计 9
3.1 电源模块 9
3.2 单片机最小系统 11
3.3 Ocean Connect云平台 11
3.3.1 ESP8266模块电路设计 12
3.3.2 ESP8266模块特性 12
3.3.3 ESP8266模块功耗 13
3.4 按键输入模块电路的设计 14
3.5 RGB 灯驱动电路设计 14
3.5.1 WS2811主要特点 15
3.5.2 WS2811概述 16
3.5.3 WS2811管脚说明 17
4 Ocean Connect云平台使用 18
4.1 工作模式 18
4.2 AT指令集 18
4.2.1 基础AT指令 19
4.2.2 WiFi功能AT指令 19
4.3.3 TCP/IP工具箱 AT指令 21
5 软件设计 30
5.1软件总流程图 30
5.2 RGB灯驱动程序编写 31
5.3 Ocean Connect云平台编写 36
5.4数据帧处理机制 37
6 系统调试 44
总 结 48
参考文献 49
致 谢 51
附录一 原理图 52
附录二 手机客户端操作界面截图 53
(1)在网上或图书馆查阅,收集相关资料,通过对资料的归纳、分析,对本系统的背景、意义、现状及思路进行阐述。并提出本系统的核心是云平台和ZigBee无线通信。
(2)设计系统的总体架构,整体分析系统的工作流程,对相关的通信协议进行说明。本文所提出的基于Ocean Connect云平台的照明控制系统技术架构主要由应用层、传输层和感知层组成。感知层包括了感知平台和各类LED照明设备,这些设备均是通过感知平台进行控制。传输层用于实现感知层与应用层之间的通信。感知层和传输层均托管在应用层中的云平台上,用户通过移动端/PC端与云平台进行交互,可以对整个系统进行远程监控。
(3)智能照明控制系统能够在远端接收控制中心发出的指令,并按照控制中心的要求进行相应的变换处理,实现定时开关,自动亮灭,情景模拟等模式;智能照明控制系统能够采用当下流行的调光技术对控制对象进行亮度的调控,进而实现不同情景下的照明;LED 照明作为当下智能照明的主流照明光源,相比较传统的白炽灯有较好的节能效果。当下的智能照明系统在不工作的情况下也会存在低功耗模式,极大地减少了资源的浪费,减少成本开支;智能照明控制系统可嵌入各种传感器模块,能够使系统在无人控制情境下实现自我控制,根据外界的变化自主的做出响应,达到真正的智能控制;智能照明控制系统多采用新一代无线通信技术,极大地减少了有线布施的复杂性。
(4)最后进行系统的功能测试,根据测试来判断系统能否达到预期的设计需求。
2 总体方案设计
总体方案设计是关系到产品定位,器件选型和技术路线的关键行设计,它主要包括以下内容:
2.1 系统的需求分析
基于物联网技术的室内LED照明控制系统设计目的是为了实现安卓手机/PAD通过安装APP来控制彩色LED灯的颜色、亮度。整个系统主要包含通信系统和控制系统两大部分,其中通信系统使用Ocean Connect云平台通过UDP协议来完成单片机和手机/PAD之间的数据传输,控制系统使用增强型51单片机产生四路PWM信号实现对彩灯的颜色、亮度调整,为了保证脱离网络和手机也能控制灯光,本文转载自http://www.biyezuopin.vip/onews.asp?id=14183本系统还可以设计几组按键来调整灯光颜色和开关。系统具体实现功能如下:
(1)整个系统网络由灯控终端建立一个wifi热点无需外网接入,数据传输层采用的是 UDP 协议通信机制。对LED灯能够实现开、关、调光功能。
(2)由于整个系统是建立在 WIFI 网络基础上的,对Ocean Connect云平台建立的热点默认SSID是“MY_RGB”,密码是“0123456789”为了保证保证通信安全,网络采用了WPA2加密方式。
(3)手机客户端和灯控终端通信使用的是UDP通信方式,灯控终端处于server模式监听7136端口,手机客户端会将控制数据帧发送到这个端口经单片机解析数据后实现对灯光的控制。
(4)灯控终端在正常使用时要求在同一时间内单盏灯只能接受一个客户端的请求,以避免命令信息的错乱现象。

#include  <REG51.H>	
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library	
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int		
#define	  SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改//ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
uchar code  dis[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0xf6,0xf0,0xff};sbit SCL=P3^6;      //IIC时钟引脚定义
sbit SDA=P3^5;      //IIC数据引脚定义
sbit P27=P2^7;				   
sbit P26=P2^6;				   
sbit P25=P2^5;				   
sbit P24=P2^4;				   
sbit moshi=P1^2;			   //模式按键
sbit qiehuan=P1^3;			   //调档按键
sbit shezhi=P1^4;			   //设置按键
sbit jia=P1^5;				   //加法按键
sbit jian=P1^6;				   //减法按键
sbit zhiling=P1^7;			   //置零按键
sbit zsd=P3^7;				   //模式指示灯
sbit shuju1=P2^3;			   //数据串口1
sbit shuju2=P2^2;			   //数据串口2
sbit shuju3=P2^1;			   //数据串口3
sbit shuju4=P2^0;			   //数据串口4
sbit zsd1=P1^1;            	   //设置指示灯
sbit fmq=P1^0;typedef   unsigned char BYTE;
typedef   unsigned short WORD;
BYTE    BUF[8];                         //接收数据缓存区      	
void InitLcd();
void Init_BH1750(void);
void disp();
void Delay(uint i);
void delay_nms(unsigned int k);
void key(void);
void qudou(void);
void xianshi();
void csh();
void jingbao();		
void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start();                    //起始信号
void BH1750_Stop();                     //停止信号
void BH1750_SendACK(bit ack);           //应答ACK
bit  BH1750_RecvACK();                  //读ack
void BH1750_SendByte(BYTE dat);         //IIC单个字节写
BYTE BH1750_RecvByte();                 //IIC单个字节读
void conversion(uint temp_data);uchar   ge=12;shi=11;bai=11;qian=10;guangzhao,daima=0;            //光照变量
int     dis_data;xxs;dang;dt;              //变量
int yi=100;er=200;san=300;si=400;e=0;linshi=0;h=0;
int ms=0;p=1;ss=0;td=0;mode_flag=1;shijian=0;/****************************************************主函数*******************
**************************************/
void main()
{  float temp;TMOD=0x01;  //中断开启   TH0 = 0x0FF;TL0 = 0x38;TR0=1;      ET0=1;EA=1;        csh();				//初始化显示Init_BH1750();       //初始化BH1750while(1)              //循环{ Single_Write_BH1750(0x01);   // power onSingle_Write_BH1750(0x10);   // H- resolution modedelay_nms(180);              //延时180msMultiple_Read_BH1750();       //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据temp=(float)dis_data/1.2;conversion(temp);    		  //数据转换key();}								  
} /*************************************************数据转换和显示**************
**************************************/
void conversion(uint temp_data)  //数据转换
{  guangzhao=temp_data;if(!ss){ if(p==1){if(shijian<=0) {qian=guangzhao%10000/1000;   bai=guangzhao%10000%1000/100;shi=guangzhao%10000%1000%100/10;ge=guangzhao%10000%1000%100%10;}else{ shijian--;qian=10;bai=dang/10;shi=dang%10;ge=12;}}else{if(shijian<=0) {qian=10;bai=dang/10;shi=dang%10;ge=12;}else{ shijian--;qian=guangzhao%10000/1000;   bai=guangzhao%10000%1000/100;shi=guangzhao%10000%1000%100/10;ge=guangzhao%10000%1000%100%10;}}}else{qian=yi/1000;bai=yi%1000/100;shi=yi%1000%100/10;ge=yi%1000%100%10;}if(guangzhao>1000){ jingbao();  }else	 fmq=1;   
}
void jingbao()
{h++;if(h<4){fmq=0;}else if(h<8){fmq=1;}else h=0;
}/************************************************按键确认子函数***************
**************************************/
void jia_key()				 //加法扫描
{if (jia==0)
{  if(mode_flag==2){ yi++; }elseif(!p){ td++;if(td==5)td=4;}}while(jia==0);}
void jian_key()				 //减法扫描
{if (jian==0)
{ if (mode_flag==2){ yi--;if(yi<=0)yi=0;}elseif(!p){ td--;if(td<=0)td=0;}
}while(jian==0);}
void shezhi_key( )		      //设置扫描
{if(shezhi==0)
{
mode_flag++;
if (mode_flag==3)
{
mode_flag=1;
}
}while(shezhi==0);switch(mode_flag)
{
case 1:
ss=0;zsd1=1;
break;
case 2:
ss=1;zsd1=0;
break; 
}
} 
void moshi_key()				//模式切换扫描
{   if(moshi==0){ms++;if (ms==2){ms=0;p=1;}else p=0;}while(moshi==0);}
void zhiling_key()				//置零扫描
{  if(zhiling==0){ yi=100;}while(zhiling==0);}
void qiehuan_key()				//切换显示扫描
{if(qiehuan==0){ shijian=30;}while(qiehuan==0);}
/**************模式调用子函数******************/
void zidong()			//自动
{ if(guangzhao<=yi){shuju1=1;shuju2=1;shuju3=1;shuju4=1;dang=4;}	  //0档else if(guangzhao<=er)					  {shuju1=0;shuju2=1;shuju3=1;shuju4=1;dang=3;}	  //1档else if(guangzhao<=san){shuju1=1;shuju2=0;shuju3=1;shuju4=1;dang=2;}	  //2档else if(guangzhao<=si){shuju1=1;shuju2=1;shuju3=0;shuju4=1;dang=1;}	  //3档else {shuju1=1;shuju2=1;shuju3=1;shuju4=0;dang=0;}	  //4档
}
void shoudong()			//手动
{
switch(td){case 4:		shuju1=0;shuju2=0;shuju3=0;shuju4=0;dang=4;	  //4档break;case 3:		 shuju1=1;shuju2=0;shuju3=0;shuju4=0;dang=3;	  //3档break;case 2:		shuju1=0;shuju2=1;shuju3=0;shuju4=0;dang=2;	  //2档break;case 1:		 shuju1=0;shuju2=0;shuju3=1;shuju4=0;dang=1;	  //1档break;case 0:shuju1=0;shuju2=0;shuju3=0;shuju4=1;dang=0;	  //0档break;	 }
}
void jisuan()	//档限计算
{ er=yi+100;san=er+100;si=san+100;
}
/*********键盘扫描********/
void key(void)
{  jia_key();	   //加法jian_key();	   //减法shezhi_key();   //设置moshi_key();	   //模式切换zhiling_key();  //置零qiehuan_key();  //切换显示jisuan();	   //档限计算switch(p){ case 1:		 //自动zidong(),zsd=1;break;case 0:		 //手动shoudong(),zsd=0;break;}
}
/*********初始化********/
void csh()
{  int i;for(i=0;i<300;i++){ shuju1=1;shuju2=1;shuju3=1;shuju4=0;}
}//-----------------------------------
//毫秒延时**************************
void delay_nms(unsigned int k)	
{						
unsigned int i,j;				
for(i=0;i<k;i++)
{			
for(j=0;j<121;j++)			
{;}}						
}//*********************************************************/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{WORD n = 560;while (n--);
}/**************************************
起始信号
**************************************/
void BH1750_Start()
{SDA = 1;                    //拉高数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 0;                    //产生下降沿Delay5us();                 //延时SCL = 0;                    //拉低时钟线
}/**************************************
停止信号
**************************************/
void BH1750_Stop()
{SDA = 0;                    //拉低数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 1;                    //产生上升沿Delay5us();                 //延时
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{SDA = ack;                  //写应答信号SCL = 1;                    //拉高时钟线Delay5us();                 //延时SCL = 0;                    //拉低时钟线Delay5us();                 //延时
}/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{SCL = 1;                    //拉高时钟线Delay5us();                 //延时CY = SDA;                   //读应答信号SCL = 0;                    //拉低时钟线Delay5us();                 //延时return CY;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{BYTE i;for (i=0; i<8; i++)         //8位计数器{dat <<= 1;              //移出数据的最高位SDA = CY;               //送数据口SCL = 1;                //拉高时钟线Delay5us();             //延时SCL = 0;                //拉低时钟线Delay5us();             //延时}BH1750_RecvACK();
}/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{BYTE i;BYTE dat = 0;SDA = 1;                    //使能内部上拉,准备读取数据,for (i=0; i<8; i++)         //8位计数器{dat <<= 1;SCL = 1;                //拉高时钟线Delay5us();             //延时dat |= SDA;             //读数据               SCL = 0;                //拉低时钟线Delay5us();             //延时}return dat;
}//*********************************void Single_Write_BH1750(uchar REG_Address)
{BH1750_Start();                  //起始信号BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号BH1750_SendByte(REG_Address);    //内部寄存器地址,//  BH1750_SendByte(REG_data);       //内部寄存器数据,BH1750_Stop();                   //发送停止信号
}//********单字节读取*****************************************
/*
uchar Single_Read_BH1750(uchar REG_Address)
{  uchar REG_data;BH1750_Start();                          //起始信号BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始	BH1750_Start();                          //起始信号BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号REG_data=BH1750_RecvByte();              //读出寄存器数据BH1750_SendACK(1);   BH1750_Stop();                           //停止信号return REG_data; 
}
*/
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read_BH1750(void)
{   uchar i;	BH1750_Start();                          //起始信号BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF{BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1);                //最后一个数据需要回NOACK}else{		BH1750_SendACK(0);                //回应ACK}}BH1750_Stop();                          //停止信号Delay5ms();
}//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{Single_Write_BH1750(0x01);  }
void time1(void) interrupt 1	 //定时器中断1,每20ms中断一次
{   TH0 = 0x0FF;TL0 = 0x38;switch(daima){case 0:P27=0;P26=0;P25=0;P24=0;  P0 =dis[qian];  P27=1;P26=0;P25=0;P24=0;      break;case 1:P27=0;P26=0;P25=0;P24=0;  P0 =dis[bai];  P27=0;P26=1;P25=0;P24=0;      break;case 2:P27=0;P26=0;P25=0;P24=0;  P0 =dis[shi];  P27=0;P26=0;P25=1;P24=0;      break;case 3:P27=0;P26=0;P25=0;P24=0;  P0 =dis[ge];  P27=0;P26=0;P25=0;P24=1;      break;}daima++;if(daima==4)daima=0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文章来源:https://biyezuopin.blog.csdn.net/article/details/127222415
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-25377.html

相关文章

360全景开发(二) 鱼眼摄像头校正

鱼眼摄像头校正有很多方法&#xff0c;这里取棋盘法&#xff0c;因为opencv自带这个方法。棋盘法是将一块类似国际象棋的黑白棋盘放到摄像头的前面&#xff0c;然后调用opencv获取棋盘上的角点&#xff0c;算出图像的相关转换矩阵&#xff0c;这样以后这个摄像头的图像就可以直…

基于Java springboot技术的班务管理系统的设计与实现

目 录 摘  要 I Abstract II 第一章 绪论 1 1.1 课题背景、目的及意义 1 1.2 班务管理系统部署现状及未来发展趋势 1 1.2.1 班务管理系统部署的现状 1 1.2.2 班务管理系统未来发展趋势 2 1.3 研究主要内容 3 第二章 系统开发技术 4 2.1 Java语言 4 2.2 Spring框架简介 6 2.3 …

AppCrawler自动遍历测试

AppCrawler 是由 seveniruby开源的一个自动遍历测试工具&#xff0c;谷歌有一个叫App Crawler 的遍历工具。AppCrawler具有很大的灵活性&#xff0c;可以自由控制测试页面&#xff0c;控件类型&#xff0c;测试深度等&#xff0c;且支持Android和IOS应用测试。 目录AppCrawler安…

在线多人游戏开发(一)

最近想自己开发个在线多人的小游戏&#xff0c;看能不能开拓下职业生涯&#xff0c;顺便赚点外快。目标是多人在线手游&#xff0c;现阶段只做安卓端&#xff0c;不考虑苹果&#xff08;主要是没苹果。。。而且苹果开发成本高&#xff0c;先忽略&#xff09;。采用unity3d、pro…

图像复原的实现(MATLABGUI)

1.使用环境&#xff1a; 软件环境&#xff1a;MATLAB R2014b 硬件环境&#xff1a;CPU&#xff1a;IntelCore™i5-5200U CPU 内存&#xff1a;4.00GB 硬盘&#xff1a;SSD ST510 512G 显卡&#xff1a;AMD Radeon R7 M265 Series 编程语言&#xff1a;MATLAB 2.操作流程图&…

自己动手网络框架(一)--概述

自己做C开发已经很多年了&#xff0c;C不像其他语言有很多现成的框架&#xff0c;基本上C都要自己使用第三方库造轮子。造轮子主要在业务流程、网络、数据库三个方面。今天想先把网络解决了&#xff0c;为以后不用造轮子做准备。 网络分为三层&#xff1a;通信层、协议层、应用…

接口测试简介及 Web 服务架构

API (Application Programming Interface&#xff0c;应用程序接口) 是支持两个相互独立的软件系统之间进行通信和数据交换的计算机接口&#xff0c;它定义了两个软件系统之间可以发出什么请求、如何发出请求、可用的数据格式等。 接口测试 什么是接口测试&#xff1f; 接口…

4G移动通信基站选址分析

全套资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86781775 全套资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86781775 目 录 毕业设计(论文)任务书 I 摘 要 I Abstract II 前 言 1 第一章 4G移动通信系统组成 2 第一节…