概述
一 项目简介
睡前给小朋友讲故事,哄自己的宝贝睡觉,已经成为很多家长的沉重负担,特别是很多女性,既要在外面拼搏,又要负责繁重的家务,好不容易想躺一下,不通情达理的心肝宝贝吵着听故事,真累!
这款智能设备可以为您分忧解难:通过ardiuno min单片机,语音模块,RGBLED模块,机智云平台,用手机作为控制界面,随心所欲地控制一个深受小朋友喜爱的,能播放故事,音乐,还能发出五彩缤纷,变幻莫测的灯光,秒杀小主人的无理要求,让你瞬间从纠缠中解脱出来。
二 硬件准备
改装前的硅胶玩具
改装后的语音播放彩灯系统
分解后的模块
完全肢解后的零部件
三 软件开发环境以及工具
(1)单片机
1)代码编辑:Notepad++
2)编译工具:Arduino IDE
3)烧写工具:OpenJumper
(2)固件烧写工具
ESP_DOWNLOAD_TOOL_V2.4
(3)手机测试用Demo App
请到机智云
物联网云平台
下载,与本系统配置绑定后立刻可以控制体验。
四 控制思路
(1)主机
1)主机MCU1 专注与云端和从机的通信,把采集,处理后的数据发送到相应的设备。
2)数据点 开关类:启动/停止播放或灯光,数据类型:布尔值。选项类:确定被控制对象的多项模式,数据类型:枚举。模拟类:对连续变化变量控制,数据类型:数值。详细数据内容请参阅下表:
(2)从机
1)语音专用模块MCU2 专注于解析从主机发来的数据包,依据自身规定的命令集,发挥语音模块丰富的功能,使用方法请参阅附件“N9200 MP3模块说明书(不带配置)v1.3”。
2)彩灯控制器MCU3 通过开源的Adafruit_NeoPixel函数库,控制WS2812B彩灯模块发出五颜六色的绚丽光彩。
五 代码说明
(1)使用机智云的代码自动生成工具,方法请参阅bigfanofloT老师的“史上最详细的Arduino uno R3接入机智云教程”一文。
(2)主机代码
1)WiFi配置用代码的修改
- void wifiStatusHandle()
- {
- //WIFI配置为SOFTAP模式
- if(myGizwits.wifiHasBeenSet(WIFI_SOFTAP))
- {
- sd_data = 'R';//设置标志字符为“R”
- Data_Send();//向从机发送点亮RGBLED红色灯指令
- }
- //WIFI配置为AIRLINK模式
- if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK))
- {
- sd_data = 'G';//设置标志字符为“G”
- Data_Send();//向从机发送点亮RGBLED绿色灯指令
- }
- //WIFI配置成功
- if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
- {
- sd_data = 'F';//设置标志字符为“F”
- Data_Send();//向从机发送关闭RGBLED灯指令
- }
2)语音模块控制代码
语音模块的指令集比较多,这里只简单说明几个数据包如何发送,其他都大同小异,主机完整代码里面有详细的注释,请参阅为盼。下面我们根据厂家提供的N9200B语音模块的部分指令集,说明一下如何添加这部分的逻辑代码:
②然后创建播放 Control_Play() ,暂停 Control_Pause() ,上一目录 Control_Back_dir() 以及音量控制 Control_Volume() 4个函数,这样在各个逻辑代码区域就可以调用了。
- void Control_Play(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x01,0x01};//将播放数据包存进数组储存器
- mySerial1.write(data,7);//将以上数据包发送到语音模块
- }
- void Control_Pause(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x02,0x02}; //将暂停数据包存进数组储存器
- mySerial1.write(data,7);//将以上数据包发送到语音模块
- }
- void Control_Back_dir(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x12,0x12};//将上一目录数据包存进数组储存器
- mySerial1.write(data,7);//将以上数据包发送到语音模块
- }
- void Control_Volume(){
- unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};//将音量数据包存进数组储存器
- mySerial1.write(data,7);//将以上数据包发送到语音模块
- }
因为音乐控制需要用到变量,下面我们详细说明一下如何调用音量控制函数对音量进行控制。其他函数的调用大同小异,请举一反三,与此类推。
(myGizwits.hasBeenSet(EVENT_Volume)), myGizwits.read(EVENT_Volume,&varR_Volume);都是机智云自动生成的代码,用于读取云端的数据,我们只管使用就行。
上面介绍过,语音模块厂家的音量通信指令格式为(06 F9 02 01 v w),其中,v为音量数据,厂家规定音量等级范围为(0-30),w为校验和,表示除了校验和本身之外,所有字节之和,这里我们有一个更简易的计算方法:w=v+2。下面的第9行代码就是用这个公式计算校验和的。第2-6行代码表示从云端读取音量变量 varR_Volume的数值,并存入v,当 音量在规定范围内 (0 <= v < 31)时,调用 Control_Volume();,注意函数内的数组 unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};,的变量将被替代成 unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,(v+2)};,例如:当将手机的音量滑动条移到20等级的音量位置时,v将存入0x14的16进制数据(十进制20的HEX值),数组将替代成 unsigned char data[7] = {0x06,0xf9,0x02,0x01,0x14,0x16};。 另外其他的二种状态: 音量小于0时 (v < 0), 音量大于最大值时 (v > 30)的时候,系统强制限定其回归规定范围内,数组变量替代方法以及调用的函数都大同小异,这里不再累述。
- //音量控制
- if(myGizwits.hasBeenSet(EVENT_Volume))
- {
- myGizwits.read(EVENT_Volume,&varR_Volume);//Address for storing data
- //收到来自云端的音量控制指令
- v = varR_Volume;//将云端下发的音量数值存到V
- if(0 <= v < 31)//音量在规定范围内
- {
- w = v + 2;//计算校验和,并将结果存入w
- Control_Volume();//调用带有当前音量数值的音量控制函数
- }
- else if(v < 0)//音量小于0时
- {
- v = 0;//强制静音
- w = v + 2;//计算校验和,并将结果存入w
- Control_Volume();//调用带有当前音量数值的音量控制函数
- }
- else if(v > 30)//音量大于规定值时
- {
- v = 30;//强制限定到音量最大值
- w = v + 2;//计算校验和,并将结果存入w
- Control_Volume();//调用带有当前音量数值的音量控制函数
- }
- }
发表评论 取消回复