各部分详细介绍:
电源部分:外部使用12vDC电源给冰箱供电,控制电路使用AMS1117-3.3 ldo稳压电源芯片,带载电流1.2A,且电源能效高,将外部输入12v电源转化为3.3V电源给芯片和各个模块供电。
人机交互部分:使用STM32F746DISCOVERY开发板板载触摸屏,并结合TouchGFX进行开发,大大缩短了开发周期和产品上市时间,且制作动画精美炫酷,符合人机交互应用要求。
物联网部分:使用乐鑫ESP8266模块进行WiFi连接,连接稳定性良好,且传输速率高。
温度检测模块:使用NTC热敏电阻实时检测温度,并使用STM32片内ADC精准采集。
冷鲜控制部分:使用继电器和硬件驱动电路,当温度达到阈值后自动断开冷气电源。也可手动操作开启和关闭
设计软件:
软件使用STM32CUBEIDE和Arduino;ui界面设计使用的TOUCHGFX;硬件设计使用的KICAD;项目框图使用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
当箱内温度达到设定温度后,继电器电路断开制冷电源,将温度保持在设定温度值范围内。
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;
}
本次设计重难点完成度较高。
项目中的小BUG:
时间系统只能在选中到当前页面下时正常运作,推算可能是FREERTOS未调用全局
(本人才疏学浅,如有知道解决方法的大佬请评论区指教)
[/i]