项目介绍
基于STM32F746DISCOVERY开发板,使用TouchGFX,制作一个可以触摸交互的家用智能冰箱。
各部分详细介绍:
电源部分:外部使用12vDC电源给冰箱供电,控制电路使用AMS1117-3.3 ldo稳压电源芯片,带载电流1.2A,且电源能效高,将外部输入12v电源转化为3.3V电源给芯片和各个模块供电。
人机交互部分:使用STM32F746DISCOVERY开发板板载触摸屏,并结合TouchGFX进行开发,大大缩短了开发周期和产品上市时间,且制作动画精美炫酷,符合人机交互应用要求。
物联网部分:使用乐鑫ESP8266模块进行WiFi连接,连接稳定性良好,且传输速率高。
温度检测模块:使用NTC热敏电阻实时检测温度,并使用STM32片内ADC精准采集。
冷鲜控制部分:使用继电器和硬件驱动电路,当温度达到阈值后自动断开冷气电源。也可手动操作开启和关闭
设计软件:
软件使用STM32CUBEIDE和Arduino;ui界面设计使用的TOUCHGFX;硬件设计使用的KICAD;项目框图使用Scheme-it工具进行框图设计。
链接如下:https://www.digikey.cn/schemeit/project/新项目-2023-10-08-1043-a85acb34194d4c87828a14157ddcc74a
Scheme-it工具介绍:
Scheme-it工具提供了许多模板,并且操作非常方便,只需要在网页上直接拖动即可。最大的亮点在于无需安装,只需登录网页即可开始使用。
Scheme-it还附带了一个符号库,其中包含超过700个通用符号,方便用户进行图形化设计。而且,Scheme-it与Digi-Key元件目录相连,用户可以直接访问超过400万种元件,进一步方便了设计和元件的选择。
Scheme-it是一个功能强大且易于使用的在线工具,它提供了丰富的模板和符号库,同时与Digi-Key元件目录连接,为用户提供了便捷的设计资源和选择。对于初次尝试使用的用户来说,Scheme-it无疑是一个很好的选择。
方案中用到的规定厂商元器件和其功能介绍
1.意法半导体STM32F746-DISOCOVERY
使用STM32F746G-DISCO探索板作为人机交互和温度检测部分。使用Touchgfx开发ui交互设计,将PA0口设为ADC采集接口,开启DMA通道。对采集到的温度值进行中值滤波后,显示到屏幕UI上的同时,用串口发送给ESP8266。
void MainView::handleTickEvent()
{
tickCounter++;
if ((tickCounter % 100 == 0) && (AdcDmaOverFlag == 1)) //判断采样是否结束
{
for(uint16_t i=0;i<100;i++) //使用100个采样点
{
AdcAllValue+=AdcConvertedValue[i];
}
AdcValue=AdcAllValue/100;//均值滤波
TempValue=(AdcValue-100)/2;
graph.addDataPoint((float)TempValue);
HAL_UART_Transmit_DMA(&huart7,(uint8_t*)txbuffer,LENGTH);//使用串口发送数据给8266
AdcDmaOverFlag=0; //标志位复位
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)AdcConvertedValue,100); //重新开始下一轮采集
}
}
冰箱有工作时间计算系统,可以计算无人监视的时候冰箱有无断电,以及推算出断电时间。
void timeView::setupScreen()
{
timeViewBase::setupScreen();
digitalHours = digitalClock1.getCurrentHour();
digitalMinutes = digitalClock1.getCurrentMinute();
digitalSeconds = digitalClock1.getCurrentSecond();
}
void timeView::handleTickEvent()
{
tickCounter++;
if (tickCounter % 60 == 0)
{
if (++digitalSeconds >= 60)
{
digitalSeconds = 0;
if (++digitalMinutes >= 60)
{
digitalMinutes = 0;
if (++digitalHours >= 24)
{
digitalHours = 0;
}
}
}
// Update the clock
digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
}
}
//此部分可参考TOUCHGFX官方文档:https://support.touchgfx.com/zh-CN/docs/development/ui-development/ui-components/miscellaneous/digital-clock
当箱内温度达到设定温度后,继电器电路断开制冷电源,将温度保持在设定温度值范围内。
2.乐鑫esp8266
使用esp8266通过串口接收温度值,并通过串口发送到手机上。
PCB设计:
PCB部分使用KICAD设计,主要设计了冰箱冷鲜继电器的控制电路,同时预留出stm32板卡的arduino uno r3接口,并集成了一片ESP8266作为物联网传输部分。
继电器驱动电路使用一片S8050以放大单片机IO口的输出电流,并用IN4007作为续流二极管稳定继电器两边的电压。使得继电器能稳定工作。
该项目的重难点:
1.全系统使用freeRTOS布局,需要准确的分配线程栈。
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for TouchGFXTask */
osThreadId_t TouchGFXTaskHandle;
const osThreadAttr_t TouchGFXTask_attributes = {
.name = "TouchGFXTask",
.stack_size = 4096 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for videoTask */
osThreadId_t videoTaskHandle;
const osThreadAttr_t videoTask_attributes = {
.name = "videoTask",
.stack_size = 1000 * 4,
.priority = (osPriority_t) osPriorityLow,
};//这里可以参考TouchGFX官方的DEMO。
2.使用C++和TouchGFX软件编写人机交互的按键、图像和时间功能。
3.NTC热敏电阻的温度准确转换
float tempValueTrans(uint_t16 ADC_value)
{
float Rt=0;
float VR=0;
VR=(float) (ADC_value/4096*3.3); //转换成电压值
Rt=(3.3-VR)*10000/VR;//计算Rt
temp=1/(1/298.15+log(Rt/10000)/3950)-273.15+0.5; //计算温度
return temp;
}
本次设计重难点完成度较高。
链接:F746NG_ICEBOX_FastBond2: 基于stm32f746的智能冰箱实物设计 https://www.eetree.cn/project/2493 (gitee.com)
项目中的小BUG:
时间系统只能在选中到当前页面下时正常运作,推算可能是FREERTOS未调用全局
(本人才疏学浅,如有知道解决方法的大佬请评论区指教)
项目总结:
本项目是作者的大三上学期课设, 也是本人学习freeRTOS和TOUCHGFX的一个阶段性小总结,其中学到了很多嵌入式开发的经验,也踩了许多的坑。
感谢得捷电子和电子森林对本项目的大力支持,同时感谢硬禾科技的Lucia同学的帮助。同时也感谢各位帮助过我的老师和同学们。
祝愿得捷电子和电子森林越办越好!
主要参考资料:
[1] 严学文、高伟等. 电子信息类课程设计[M]. 西安:西安交通大学出版社, 2022.
[2] 漆强 .嵌入式系统设计[M].北京: 高等教育出版社,2022.
[3] 刘火良,杨森. FreeRTOS内核实现与应用开发实战指南[M]. 北京: 机械工业出版社.2019