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

目 录
摘 要 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  	
#include      //Keil library  
#include     //Keil library	
#include  
#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();       //初始化BH1750
  while(1)              //循环
  { Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode

     delay_nms(180);              //延时180ms

    Multiple_Read_BH1750();       //连续读出数据,存储在BUF中

    dis_data=BUF[0];
    dis_data=(dis_data8)+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(shijian0) 
     {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(shijian0) 
    {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(h4)
 {fmq=0;}
 else if(h8)
 {fmq=1;}
 else h=0;
}


  /**************************************
 **********按键确认子函数***************
**************************************/
void jia_key()				 //加法扫描
{

if (jia==0)
{  if(mode_flag==2)
   { yi++; }
   else
   if(!p)
   { td++;
     if(td==5)
	 td=4;
   }

}while(jia==0);

}
void jian_key()				 //减法扫描
{

if (jian==0)
{ if (mode_flag==2)
  { yi--;
    if(yi0)
    yi=0;
  }
  else
  if(!p)
  { td--;
    if(td0)
	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(guangzhaoyi)
  {shuju1=1;shuju2=1;shuju3=1;shuju4=1;dang=4;}	  //0档
  else if(guangzhaoer)					  
  {shuju1=0;shuju2=1;shuju3=1;shuju4=1;dang=3;}	  //1档
  else if(guangzhaosan)
  {shuju1=1;shuju2=0;shuju3=1;shuju4=1;dang=2;}	  //2档
  else if(guangzhaosi)
  {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;i300;i++)
   { 
   shuju1=1;shuju2=1;shuju3=1;shuju4=0;
   }
}


//-----------------------------------
//毫秒延时**************************
void delay_nms(unsigned int k)	
{						
unsigned int i,j;				
for(i=0;ik;i++)
{			
for(j=0;j121;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; i8; 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; i8; 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; i3; 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;
}

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

本文章来源于互联网,如有侵权,请联系删除!原文地址:基于Ocean Connect云平台的照明控制系统设计

相关推荐: 美团隐私计算平台通过行业权威认证

近日,在2022年隐私计算大会上,中国信通院公布第六批可信隐私计算评测结果,美团隐私计算平台通过“联邦学习安全”和“多方安全计算基础能力”两个专项评测认证。2021年,美团已经通过“联邦学习基础能力”专项评测认证。 通过这三项认证标志着美团隐私计算平台(产品名…