您的位置:首页 > 大数据 > 物联网

【物联网设计记录】基于机智云云平台的Wi-Fi控制开发板

2019-07-18 21:00 666 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/BaiYeZP/article/details/96447186

1、设计整体思路

开发板使用了ESP8266Wi-Fi模块实现数据传输。
控制流程图
ESP8266模块负责传输数据,手机通过Wi-Fi连接至机智云平台,并传输指令至平台再而传递控制指令至开发板,实现Wi-Fi的远程控制。
实现RGB灯颜色变换,全彩等颜色变换,电机转速变换和温湿度数据传输显示的远程控制功能。

2、机智云平台的部署

2.1、创建产品

创建属于自己的新产品,产品分类和产品名称随自己编辑,选择 “Wi-Fi/移动网络方案” ,通讯方式 “Wi-Fi”,数据传输方式为 “定长”,选择完成后确定保存。并能看到自己开发中的产品。

2.2、创建数据点

数据点是一套机智云设备通信协议,用于描述设备功能及其参数。简单点来说,数据点就是用来传递控制数据的。通过数据点,用户可以通过手机改变数据时传递到开发板,对应数据点实现开发板上的对应功能。
数据点的创建如下(可参考):

显示名称 标识名 读写类型 数据类型 范围 分辨率
RGB灯开关 LED_OnOff 可写 布尔值 / /
全彩灯 LED_Color 可写 枚举 0.无 1.橙色 2.紫色 3.粉色 /
RGB灯_R LED_R 可写 数值 0-254 1
RGB灯_G LED_G 可写 数值 0-254 1
RGB灯_B LED_B 可写 数值 0-254 1
风扇转速 Motor_Speed 可写 数值 -3-3 1
温度 Temperature 只读 数值 -13-187 1
湿度 Humidity 只读 数值 0-100 1

注:显示名称用于显示在手机端软件的名字,而标识名用于数据点编程。

2.3、启动虚拟设备

虚拟设备主要用于检验你所创建的数据点,手机端是否能通过测试软件(机智云平台官方软件)发送数据值,机智云平台会接收到数据,判断你的数据点是否成功运行。

当手机通过软件扫描二维码后,会连上一个虚拟设备,手机界面如图的左边显示,当控制手机端的软件对数据进行改动时,模拟设备上报的数据就会随手机更新,通信日志也会随之更新。此时说明数据点创建成功。
下面便可以在服务中创建 MCU开发,选择 SOC方案,快速创建工程,此时机智云平台会根据你的数据点为你制定固定的程序模板。
注:每当改动数据点时程序模板都需要选择修改,重新输密钥下载,否则下载下来的程序都是未修改前的代码。
注意的创建MCU开发的 Product Secret在基本信息中,需要输入密码后便可显示完整密钥。
至此机智云平台基本上部署完成,下面便可以进行代码的修改。

3、功能代码实现

各功能模块的函数封装分别存放在 ./app/driver目录下,头文件存放在 ./app/include/driver目录下。需要实现什么功能就把功能函数封装存放在以上两个目录。

3.1、RGB灯模块

RGB的原理图:

由上述原理图可以知道,RGB灯由P9813模块控制,而P9813是由DIN、CIN来控制,故在开发板上需要接通DIN和CIN两个引脚。
P9813 是一款全彩点光源 LED 驱动芯片,采用 CMOS工艺,提供三路恒流驱动及 256 级灰度调制输出。采用双线传输方式(DATA 与 CLK) ,内建再生,可提升传输距离。用于驱动显示灯光变换、各式字符变换、彩色动漫图案。
DIN引脚为串行数据输入,内置上拉。通过函数rgbControl便可输入控制RGB灯颜色的数据。
功能调用函数:

void ICACHE_FLASH_ATTR rgbControl(uint8_t R, uint8_t G, uint8_t B)
{
//contron power

send_32zero();
dataDealwithSend(R, G, B);	  // display red
dataDealwithSend(R, G, B);	  // display red
}
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);

gpio_output_set(0, 0, GPIO_ID_PIN(GPIO_RGB_SCL) | GPIO_ID_PIN(GPIO_RGB_SDA), 0);

引脚布置:

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
gpio_output_set(0, 0, GPIO_ID_PIN(GPIO_RGB_SCL) | GPIO_ID_PIN(GPIO_RGB_SDA), 0);

3.2、全彩灯模块

全彩灯原理图:

由原理图可知,开发板上需要连同DIN1-G#0才能点亮全彩灯。而全彩灯上的每一盏RGB灯都由24位的寄存器控制。

分别控制着绿色、红色和蓝色,其中每八位代表着0 - 254的颜色深度值。
同理,通过setAllPixelColor函数可以对DIN1数据进行输入,从而全彩灯的颜色变化。

void  SEND_WS_0()
{
uint8_t time;
time = 3; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
time = 8; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
}

void  SEND_WS_1()
{
uint8_t time;
time = 7; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 1 );
time = 5; while(time--) WRITE_PERI_REG( PERIPHS_GPIO_BASEADDR + GPIO_ID_PIN(WSGPIO), 0 );
}

void ICACHE_FLASH_ATTR setAllPixelColor(uint8_t r, uint8_t g, uint8_t b)
{
uint8_t i=0;
for(i=0;i<PIXEL_MAX;i++)
{
rBuffer[i]=0;
gBuffer[i]=0;
bBuffer[i]=0;
}
for(i=0;i<PIXEL_MAX;i++)
{
rBuffer[i]=r;
gBuffer[i]=g;
bBuffer[i]=b;
}

for(i=0;i<PIXEL_MAX;i++)
{
WS2812BSend_24bit(rBuffer[i],gBuffer[i],bBuffer[i]);
}
}

3.3、风扇

电机是通过L9110来控制的,L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电器器件,将分立电路集成在单片IC之中,使外围器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过800mA的持续电流,峰值电流能力可达1.5A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。
在控制波形上,输入A和输入B相反,而输出A和输出B与其输入一样。
电机原理图:

通过PWM1,PWM2来控制L9110,GPIO12连接PWM1,GPIO13连接PWM2。

void ICACHE_FLASH_ATTR motorPwmControl(uint8_t m0, uint8_t m1)
{
uint32 temp_m0 = 0;
uint32 temp_m1 = 0;

temp_m0 = (uint32)((m0 * 1.0 / (MOTOR_SFCT_STA )) * (MOTOR_MAX_DUTY));
temp_m1 = (uint32)((m1 * 1.0 / (MOTOR_SFCT_STA)) * (MOTOR_MAX_DUTY));

if(temp_m0 != motorParam.duty[CHANNEL_0])
{
pwm_set_duty(temp_m0, CHANNEL_0);
motorParam.duty[CHANNEL_0] = pwm_get_duty(CHANNEL_0);
}

if(temp_m1 != motorParam.duty[CHANNEL_1])
{
pwm_set_duty(temp_m1, CHANNEL_1);
motorParam.duty[CHANNEL_1] = pwm_get_duty(CHANNEL_1);
}

pwm_start();

}

void ICACHE_FLASH_ATTR motorControl(_MOTOR_T status)
{
if((-5 > status) || (5 < status))
{
os_printf("Motor_status Error : [%d] \r\n", status);
}

if(status == 0)
{
motorPwmControl(0, 0);
}
else if (status > 0)
{
motorPwmControl(MOTOR_MIN_STA, (uint8_t)status);
}
else if (status < 0)
{
motorPwmControl(MOTOR_SFCT_STA, (uint8_t)(MOTOR_SFCT_STA - abs(status)));
}
}

3.4、温湿度模块

温湿度传感器DHT11,该传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保具有极高的可靠性不卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,因此该具有品质卓越、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精准的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,产品为4针单排引脚封装。相关参数:精度湿度±5%RH,温度±2℃,量程湿度20-90%RH,温度0 ~ 50℃。
温湿度模块原理图:

3.5、Gizwits函数

对于机智云平台下载的模板,除了将需要实现的功能函数封装移植到模板之外,主要的一步修改./Gizwits/gizwits_product.c文件,该函数主要是对发生事件进行对应的开发板动作控制。
不管是RGB灯数据点,还是其他事件,发生了改变,机智云平台就会传递到通过ESP8266接收传递到开发板,开发板接收到事件,就会通过判断,执行对应控制。

如,当设置LED_Color数据点发生改变,触发事件,便进行一下判断,进行全彩灯的控制。

case EVENT_LED_Color:
currentDataPoint.valueLED_Color = dataPointPtr->valueLED_Color;
GIZWITS_LOG("Evt: EVENT_LED_Color %d\n", currentDataPoint.valueLED_Color);
switch(currentDataPoint.valueLED_Color)
{
case LED_Color_VALUE0:
//user handle
setAllPixelColor(0, 0, 0);
break;
case LED_Color_VALUE1:
//user handle
setAllPixelColor(254, 35, 0);
break;
case LED_Color_VALUE2:
//user handle
setAllPixelColor(250, 0, 70);
break;
case LED_Color_VALUE3:
//user handle
setAllPixelColor(240, 30, 30);
break;
default:
break;
}
break;

诸如此类事件的判断,就可以基本实现对开发板的功能无线控制。

3.6、main函数

主函数主要实现的各功能函数的初始化,以及实现温湿度数据的传输,需要注意的是./Gizwits/gizwits_product.c文件是不会显示温湿度事件的,因为温湿度的数据点的数据类型设置为只读,所以不会再那个文件下进行事件判断,执行对应操作。
但可以在./Gizwits/gizwits_product.c文件下进行温湿度数据传递,而我在main函数下实现该功能也是同样的道理。

void ICACHE_FLASH_ATTR userTimerFunc(void)
{
uint8_t ret = 0;
uint8_t curTemperature = 0;
uint8_t curHumidity = 0;

static uint8_t thCtime = 0;

thCtime++;

if(TH_TIMEOUT < thCtime)
{
thCtime = 0;

ret = dh11Read(&curTemperature, &curHumidity);

if(0 == ret)
{
currentDataPoint.valueTemperature = curTemperature;
currentDataPoint.valueHumidity = curHumidity;
}
else
{
os_printf("@@@@ dh11Read error ! \n");
}
}
//setAllPixelColor(0,50,0);
system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0);
}

使用定时器去调用回调函数,实现每隔一段时间就回传温湿度数据至机智云平台,再传至手机上显示。
此外就是其他功能函数的初始化:

//user init
//rgb led init
rgbGpioInit();
rgbLedInit();

//temperature and humidity init
dh11Init();

keyInit();

//motor init
motorInit();
motorControl(0);

WS2812B_Init();

//gizwits InitSIG_UPGRADE_DATA
os_memset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t));
gizwitsInit();

system_os_task(gizwitsUserTask, USER_TASK_PRIO_0, userTaskQueue, userQueueLen);

//user timer
os_timer_disarm(&userTimer);//定时器清零
os_timer_setfn(&userTimer, (os_timer_func_t *)userTimerFunc, NULL);//开启定时器,构建回调函数userTimerFunc
os_timer_arm(&userTimer, USER_TIME_MS, 1);//每一定时间调用回调函数
在编译工程前,需要在工程设置中增添“COMPILE=gcc BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=4”来为工程的编译做准备工作。

4、最终成果

手机软件封面(采用官方测试软件):

当调节不同的开关,机智云云平台就会接收到不同的数据,再而发送对应的数据点的数据至开发板,开发板通过ESP8266模块接收到数据后,判断对应事件的发生进行对应的功能实现。
由于效果图没有拍下来,就选择口头表述效果。
如:全彩灯选为橙色------点阵全彩灯便会全亮且为橙色
风扇转速调为-3-------风扇会逆时针旋转(绝对值越大,转速越快)

5、不足

没有考虑好开发板内存的空间,在引入点阵的头文件时,编译时会出错,就是因为内存空间不足,需要在部分函数前引入ICACHE_FLASH_ATTR,作用在于让该函数存入irom0_0_seg,在需要用到的时候才导入iram1_0_seg。
此外在点阵的C文件下减去不需要的功能函数,节省空间的同时能保留点阵RGB灯的功能模块。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: