本帖最后由 jinglixixi_457498010 于 2025-2-28 15:18 编辑
摘要:
智能家居是一个长盛不衰的设计主题,随着AI智能技术的发展智能家居的设计必将有全新的发展。
本设计是基于富芮坤 FR3068x-C 开发板设计一个桌面化的智能家居终端,其主要功能是以RTC计时器为基础通过多个时段的设置,以语音播报的方式调试家中老人定时服用保养和维持健康的药品;另外,借助相应的传感器来感知环境周围的隐患,如火患的预防、易燃气体的预防及绿色植物的湿度保持等;此外,可利用其音频播放功能可以中文菜单的方式来播放音乐等以愉悦心情等。在使用蓝牙上网的基础上,可实现与手机等设备的通讯。
目录
1 前言
1.1 设计背景
1.2 设计目标
1.3 设计方法及内容
2 系统功能概述
2.1 多时段播报提示
2.2 环境状态感知
2.3 外设控制
2.4 桌面化与远程控制
3 系统硬件设计
3.1 核心控制
3.2 语音模块
3.3 光照强度传感器
3.4 温湿度传感器
3.5 模拟类传感器
3.6 外设及控制
3.7 显示屏
4 软件设计
4.1 语音播放功能实现
4.2 温湿度检测
4.3 光照强度检测
4.4 模拟信号采集
4.5 步进电机控制
4.6 电子时钟及控制
4.7 界面与功能选择
5 集成与测试
5.1 系统集成
5.2 功能测试
6 感想与展望
6.1 设计感想
6.2 改进方向
1 前言
1.1 设计背景
智能家居是一个长盛不衰的设计主题,随着AI智能技术的发展智能家居的设计必将有全新的发展,其突出的特点将是AI与具身机器人的结合。
尽管目前距离它的普及还有一定的差距,但这不影响我们对家居智能化得探寻,此次对作品得设计就是一次有效的实践。
1.2 设计目标
该设计是在富芮坤FR3068x-C 开发板的基础上来构建,以实现多时段定点音乐提示、中文环境安全提示、外部设备开关控制、音乐播放等多种功能。
1.3 设计方法及内容
该作品采用模块化设计法,系统被划分为硬件和软件两大部分。其中硬件部分主要涉及核心控制、语音播放模块、传感器检测模块、设备控制、显示屏及蓝牙模块等。对于软件部分则则是通过各功能模块来实现具体的功能,然后以桌面化的方式进行管理和使用。
2 系统功能概述
2.1 多时段播报提示
该功能是建立在RTC计时器的基础上,通过多时段的设置,准时地发出相关的语音提示信息,具有可修改多个提示时段及内容的灵活性。
如前面附上视频演示
2.2 语音播报功能
为增强并行性,这里没有使用MCU控制下的音频编解码播放方式,而是采用一款串口控制型的语音播放模块来实现,播放的语音段被存储在TF卡上,其作用类似于语音库,大大地扩展了播放的信息量,并可以利用它来播放语音以供愉悦身心。
2.3 环境状态感知
利用相应的传感器来感知周围的状态变化,如使用火焰传感器来避免火灾的发生、用气体传感器来检测易燃气体的出现以防意外情况的发生、用土壤湿度传感器来检测绿植的湿度状态,以确保有一个舒适的生活环境、温湿度传感器来感知和控制室内环境的舒适度。
2.4 外设控制
在RTC的配合下,可能调节室内的温湿度外,还可以控制窗帘的定时启闭等,以及利用光照传感器来控制室内的照明。
2.5 桌面化与远程控制
为便于使用,作品所提供的相应功能是以桌面化的方式进行管理,此外还可利用蓝牙等无线通讯方式进行信息交换。
图1 界面效果
3 硬件设计
3.1 核心控制
该设计以富芮坤FR3068x-C为控制核心,它拥有丰富的外设接口及内置的蓝牙功能,能够满足设计的需求,为稳定运行提供强大的功能支持。
3.2 语音模块
采用进行多时段的语音提示播报,这里采用的是MP3音频模块,并由串口来控制其播放。此外,还可用来播放音乐以音乐心情。语音模块所使用的引脚为:
RX---PB5
TX---PB4
图2 音频播放模块
3.3 光照强度模块
为进行光照强度的采集和控制,选用的是BH1750光照强度传感器模块。该模块以I2C方式工作,具有测量、精度高、稳定性好的特点,其使用的引脚为:
SCL----PB3
SDA----PB6
3.4 温湿度传感器
为进行温湿度检测,选用的是DHT22温湿度传感器,该传感器采用单总线方式工作,能够准确地反映周围环境的温湿度变化,其使用的引脚为:
OUT---PB7
图3 播放模块与数字传感器
3.5 模拟类传感器
在家具环境检测方面还使用了一些模拟类的传感器,如使用火焰传感器来检测和防止火灾的发生,使用MQ-2易燃气体传感器来防止意外隐患的出现。此外,还使用了土壤湿度传感器,以保持绿植的生长环境。这些传感器,均是在ADC转换器的配合下,来实现数据的采集,其引脚占用为:
PP2----火焰传感器
PP3----气体传感器
PP4----土壤湿度传感器
图4土壤湿度传感器
3.6 外设及控制
为实现窗帘的自动开合,这里是用步进电机来驱动窗帘的开合,并使用UNL2003功能模块来驱动。步进电机的引脚占用为:
A----PB8
B----PB9
C----PB10
D----PB11
图5 步进电机及驱动器
3.7 显示屏
为便于桌面化的管理,是采用TFT显示屏进行显示。原计划是使用板载的显示屏,单很难从例程种提取该显示屏的启动程序,故只好放弃它的使用,这也是设计延期的重要原因。该显示屏的引脚占用为:
CS---PD12
REST---PD8
DC---PD9
SDI---PD10
SCK---PD11
BCK---PD14
4 软件设计
4.1 语音播放功能实现
语音播放功能是通过串口来控制语音模块的播放,并便于指令的发送,是将指令存放到数组内,其形式如下:
uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};
uint8_t cmd5[] = {0X7E, 0xFF, 0x06, 0X16, 00, 00, 00, 0xFE, 0xE5, 0XEF};
uint8_t cmd6[] = {0X7E, 0xFF, 0x06, 0X06, 00, 00, 10, 0xFE, 0xE5, 0XEF};
生成播放指令的函数为playn(n),发送播放指令的语句为uart_transmit(&Uart3_handle, cmd3, 10)。
音乐播放功能的菜单如图6所示,可通过K1和K2键来向上或向下来选取播放内容,K3键为播放确认键。在播放时,可是通过K1和K2键来调节音量。
图6 菜单形式
4.2 温湿度检测
温湿度传感器DHT22是一款单总线器件,它以一条线就可实现数据的收发。
切换所用引脚工作模式的2个函数如下:
<pre>void DHT11_IN()
{
GPIO_Handle.Mode = GPIO_MODE_INPUT;
GPIO_Handle.Pin = GPIO_PIN_7;
gpio_init(GPIOB, &GPIO_Handle);
}
void DHT11_OUT()
{
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Handle.Pin = GPIO_PIN_7;
gpio_init(GPIOB, &GPIO_Handle);
}
</pre>复制代码
读取温湿度值的函数为:
<pre>int DHT11_Read_Data(char *temp,char *humi)
{
char buf[5],i;
DHT11_Reset();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=(buf[0]*256+buf[1])/10;
*temp=(buf[2]*256+buf[3])/10;
}
}
else return 1;
return 0;
}
</pre>复制代码
图7环境状态检测
4.3 光照强度检测
光照强度检测是一种I2C器件,是在时钟信号的作用下来收发数据,其中时钟信号是单向的,而数据信号则是双向的。
读取并以串口输出检测值的函数为:
<pre>void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
delay_ms(180);
Multiple_Read_BH1750();
for(i=0;i<3;i++) dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float)dis_data/1.2;
sd=temp;
printf("light=%d\r\n",sd);
}</pre>复制代码
图8 光照强度调节
4.4 模拟信号采集
模拟信号传感器的信号采集是建立在模数转换的基础上,实现多通道数据采集的程序为:
<pre>void ADC()
{
saradc_InitConfig_t InitConfig;
saradc_LoopConfig_t LoopConfig;
saradc_QueueConfig_t QueueConfig;
pmu_adc_power_ctrl(true);
__SYSTEM_ADC_CLK_ENABLE();
InitConfig.saradc_reference = SARADC_REF_IOLDO;
InitConfig.saradc_sampling_cycle = 16;
InitConfig.saradc_clock_div = 24;
InitConfig.saradc_interval_clock_div = 10;
InitConfig.saradc_voltage_divider = SARADC_VOLTAGE_DIVIDER_BYPASS;
InitConfig.saradc_mode = SARADC_LOOP_MODE;
saradc_init(&InitConfig);
LoopConfig.loop_triggerMode = SARADC_TRIGGER_HARDWARE;
LoopConfig.loop_max_channel = 3;
LoopConfig.loop_interval = 4000;
LoopConfig.loop_FIFO_enable = SARADC_FIFO_DISABLE;
saradc_loop_config(&LoopConfig);
saradc_channel_single_config(SARADC_CHANNEL_0, ADC_CH_MAP_PMU_IO2);
saradc_channel_single_config(SARADC_CHANNEL_1, ADC_CH_MAP_PMU_IO3);
saradc_channel_single_config(SARADC_CHANNEL_2, ADC_CH_MAP_PMU_IO4);
saradc_loop_convert_start();
while(1==pmu_get_pin_value(PMU_PIN_0))
{
if (saradc_get_int_raw_status() & SARADC_INT_STATUS_LOOP)
{
saradc_int_status_clear(SARADC_INT_STATUS_LOOP);
printf("logic channel0: %d\r\n", saradc_get_channel_data(SARADC_CHANNEL_0));
printf("logic channel1: %d\r\n", saradc_get_channel_data(SARADC_CHANNEL_1));
printf("logic channel2: %d\r\n", saradc_get_channel_data(SARADC_CHANNEL_2));
}
}
}</pre>复制代码
图9 波形显示
4.5 步进电机控制
为进行窗帘的定时开合及准确控制,是采用步进电机为动力并实现双向的正确定位控制。
控制电机正反转的函数为:
<pre>void zx(uint32_t n)
{
unsigned char X,Y;
for(X=0;X<64;X++)
{
for(Y=0;Y<8;Y++)
{
MDL;
MAH;
delay_ms(n);
MBH;
delay_ms(n);
MAL;
delay_ms(n);
MCH;
delay_ms(n);
MBL;
delay_ms(n);
MDH;
delay_ms(n);
MCL;
delay_ms(n);
MAH;
delay_ms(n);
}
}
}
void fx(uint32_t n)
{
unsigned char X,Y;
for(X=0;X<64;X++)
{
for(Y=0;Y<8;Y++)
{
MDH;
MAH;
delay_ms(n);
MAL;
delay_ms(n);
MCH;
delay_ms(n);
MDL;
delay_ms(n);
MBH;
delay_ms(n);
MCL;
delay_ms(n);
MAH;
delay_ms(n);
MBL;
delay_ms(n);
}
}
}
</pre>复制代码4.6 电子时钟与控制
在智能家具管控中,时间是多时段控制的基准。为了便于灵活地进行控制,采用了定时器的秒计时与中断相配合的形式来实现电子时钟的功能及多时段的控制处理。
图10 电子时钟与多时段控制
图11 时钟调整
实现多时段音乐播报提示的处理程序为:
<pre>void dzsz()
{
LCD_Clear(WHITE);
show_tbh(136,45,2);
POINT_COLOR=RED;
BACK_COLOR=WHITE;
LCD_DrawLine(55, 10, 55, 304);
LCD_ShowStringh(25,200,"Timed control");
LCD_ShowStringh(80,100,"2025-2-22");
LCD_ShowCharh(100,80,':',0);
LCD_ShowCharh(100,50,':',0);
LCD_ShowStringh(70,275, "Curtain: 7:05");
LCD_ShowStringh(90,275, "prompt1: 8:10");
LCD_ShowStringh(110,275,"prompt2: 13:10");
LCD_ShowStringh(130,275,"regulate: 18:30");
LCD_ShowStringh(150,275,"prompt3: 20:10");
LCD_ShowStringh(170,275,"Curtain: 20:30");
LCD_ShowStringh(190,275,"heater: 21:30");
hh=sy;
mm=sm;
ss=sd;
__SYSTEM_TIMER3_CLK_ENABLE();
NVIC_ClearPendingIRQ(TIMER3_IRQn);
NVIC_EnableIRQ(TIMER3_IRQn);
timer_init(Timer3, 24000/3*3000);
timer_int_enable(Timer3);
timer_start(Timer3);
while(1==pmu_get_pin_value(PMU_PIN_3))
{
if((hh==8)&&(mm==10)&&(ss==0))
{
playn(1);
uart_transmit(&Uart3_handle, cmd3, 10);
}
if((hh==13)&&(mm==10)&&(ss==0))
{
playn(2);
uart_transmit(&Uart3_handle, cmd3, 10);
}
if((hh==20)&&(mm==10)&&(ss==0))
{
playn(3);
uart_transmit(&Uart3_handle, cmd3, 10);
}
if((hh==7)&&(mm==5)&&(ss==0))
{
timer_stop(Timer3);
clkz(0);
ss=ss+1;
timer_start(Timer3);
}
if((hh==20)&&(mm==30)&&(ss==0))
{
timer_stop(Timer3);
clkz(1);
ss=ss+1;
timer_start(Timer3);
}
if((hh==18)&&(mm==30)&&(ss==0))
{
gpio_write_pin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
}
if((hh==21)&&(mm==30)&&(ss==0))
{
gpio_write_pin(GPIOD, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
}
__SYSTEM_TIMER3_CLK_DISABLE();
uart_transmit(&Uart3_handle, cmd5, 10);
}
</pre>复制代码
4.7 界面与功能选择
为便于用户的使用,其各项功能的使用是在桌面化的管控下,通过K1和K2键可向前或向后来选取功能项,在以K3键进行确认后,即进入相应的界面进行操作和观察。
<pre>void gnxz()
{
uint8_t i;
LCD_Clear(WHITE);
jm();
i=f;
i=0;
while(1==pmu_get_pin_value(PMU_PIN_3))
{
if(0==pmu_get_pin_value(PMU_PIN_0))
{
if(i<7)
{
i++;
if(i==1)
{
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowCharh(80,220,'P',0);
LCD_ShowCharh(80,212,'W',0);
LCD_ShowCharh(80,204,'M',0);
showhanzi16h(80,280,3,1);
showhanzi16h(80,264,4,1);
}
if(i==2)
{
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowCharh(80,160,'R',0);
LCD_ShowCharh(80,152,'T',0);
LCD_ShowCharh(80,144,'C',0);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,220,'P',0);
LCD_ShowCharh(80,212,'W',0);
LCD_ShowCharh(80,204,'M',0);
}
if(i==3)
{
showhanzi16h(80,100,5,0);
showhanzi16h(80,84,6,0);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,160,'R',0);
LCD_ShowCharh(80,152,'T',0);
LCD_ShowCharh(80,144,'C',0);
}
if(i==4)
{
showhanzi16h(80,100,5,1);
showhanzi16h(80,84,6,1);
showhanzi16h(180,280,13,0);
showhanzi16h(180,264,14,0);
}
if(i==5)
{
showhanzi16h(180,280,13,1);
showhanzi16h(180,264,14,1);
showhanzi16h(180,220,11,0);
showhanzi16h(180,204,12,0);
}
if(i==6)
{
showhanzi16h(180,220,11,1);
showhanzi16h(180,204,12,1);
showhanzi16h(180,160,9,0);
showhanzi16h(180,144,10,0);
}
if(i==7)
{
showhanzi16h(180,160,9,1);
showhanzi16h(180,144,10,1);
showhanzi16h(180,100,7,0);
showhanzi16h(180,84,8,0);
}
}
else
{
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
i=0;
}
}
if(0==pmu_get_pin_value(PMU_PIN_2))
{
if(i>0)
{
i--;
if(i==0)
{
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,220,'P',0);
LCD_ShowCharh(80,212,'W',0);
LCD_ShowCharh(80,204,'M',0);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
}
if(i==1)
{
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowCharh(80,220,'P',0);
LCD_ShowCharh(80,212,'W',0);
LCD_ShowCharh(80,204,'M',0);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,160,'R',0);
LCD_ShowCharh(80,152,'T',0);
LCD_ShowCharh(80,144,'C',0);
}
if(i==2)
{
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowCharh(80,160,'R',0);
LCD_ShowCharh(80,152,'T',0);
LCD_ShowCharh(80,144,'C',0);
showhanzi16h(80,100,5,1);
showhanzi16h(80,84,6,1);
}
if(i==3)
{
showhanzi16h(80,100,5,0);
showhanzi16h(80,84,6,0);
showhanzi16h(180,280,13,1);
showhanzi16h(180,264,14,1);
}
if(i==4)
{
showhanzi16h(180,280,13,0);
showhanzi16h(180,264,14,0);
showhanzi16h(180,220,11,1);
showhanzi16h(180,204,12,1);
}
if(i==5)
{
showhanzi16h(180,220,11,0);
showhanzi16h(180,204,12,0);
showhanzi16h(180,160,9,1);
showhanzi16h(180,144,10,1);
}
if(i==6)
{
showhanzi16h(180,160,9,0);
showhanzi16h(180,144,10,0);
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
}
if(i==7)
{
showhanzi16h(180,100,7,0);
showhanzi16h(180,84,8,0);
showhanzi16h(80,280,3,1);
showhanzi16h(80,264,4,1);
}
}
else
{
showhanzi16h(80,280,3,1);
showhanzi16h(80,264,4,1);
showhanzi16h(180,100,7,0);
showhanzi16h(180,84,8,0);
i=7;
}
}
system_delay_us(100000);
}
f=i;
}
</pre>复制代码 为了控制常规得照明和风扇,配备了控制功能,它既可手动控制也可提供手机以无线得方式来控制,器界面如图12所示。
图12 控制界面
此外,还预留了AI功能接口,来接收AI识别装置所反馈得信息以辅助进行管控。
图13 AI接口
5 集成与测试
5.1 系统集成
在完成各功能模块的基础上,进行各项功能的集成是一项十分关键的工作。在各模块的设计时,会随意地使用各种引脚资源,但在功能集成时,就会发现部分引脚被重复使用的情况,此时就需要适当地加以取舍及重新加以分配。
5.2 功能测试
在模块整合后,进行功能的重新测试也是十分必要的,因为在设计过程中,往往会出现变量名称被多次使用的情况,有时它会影响到功能的正常执行,因此对功能的再次测试是系统能够正常运行的可靠保障。
6 感想与期待
6.1 改进方向
这次的设计工作终于可以告一段落了,受时间的限制尽管完成了主体的设计功能,但还存在不少细节的内容需要去雕琢和完善。此外,所预留的AI识别与处理功能还在修改中,它会使整体的功能更加强大,还使值得期待的。
6.2 体会与感想
在此次设计过程中,对富芮坤FR3068x-C开发板的性能进行了学习和了解,并利用它完成了作品的开发设计。但在使用也发现了一些问题有待完善和改进,如对例程的使用缺少详细的测试说明,部分例程的引脚使用与开发板的引脚使用严重不服,功能无法实现,这些都影响到设计的正常展开与按期实现。此外,对于显示屏缺少基本的驱动例程支持,使得设计作品必须依赖LVGI例程进行修修补补的将就式使用。尽管还存在一些有待完善的地方,但在此还是对厂家和社区举办这次活动表示感谢,也期待以后能继续举办这样的活动,以使的我们的产品品质更高更好!
演示视频:
功能选择与音乐播放:
电子时钟校正与计时:
语音定时提示:
定时开启窗帘:
光照检测与PWM调节效果
温湿度检测:
控制处理: