本帖最后由 数码小叶 于 2022-9-6 21:11 编辑
上一篇已经可以获取SHT3x的温度和湿度数值,接下来就是把获取到的值显示到屏幕上,中间暂时省略了两大步骤,touchGFX和LTC的结合、屏幕UI,先达到显示的效果。要将数值显示到屏幕上,有N多种方式,既然使用了touchGFX,那最简单的肯定是遵循touchGFX的思想。touchGFX采用了MVP的设计思想,MVP即:Model-View-Presenter设计模式
MVP中定义了三个大类:
Model类:是一种接口,用于定义要在用户界面上显示或有其他形式操作的数据。
View类:是一种被动接口,用于显示数据(来自Model),并将用户指令(事件)传给Presenter以便根据该数据进行操作。
Presenter类:操作取决于Model和View。 它从存储库(Model)检索数据,并将其格式化以便在视图中显示。
因此MVP模型具有三个特点:将逻辑从图形中分离处理;使得独立测试更加简单;便于重用代码。之所以可以达到这样的效果是因为touchGFX将代码分成不同的部分提供,每部分有自己的任务。 这使得代码更简单、可重复使用性更高且更易于维护。由于UI的逻辑(Presenter)独立于视图(View),因此,单独测试这些部分会容易很多。
熟悉MVP模型后,要显示SHT3x的数值,就简单了,首先是Model类获取数据,这个数据肯定是来源于SHT3x的处理函数
void Model::tick()
{
tickcounter++;
if((tickcounter % 50) == 0)
{
if(modelListener !=0)
{
GetWenShiduValue();
modelListener -> NewWenShiduTempValue(SHT3x_Data.SHT3x_Temperature,SHT3x_Data.SHT3x_Humidity);
}
}
}
为了简化参数传递,用一个结构体将温度和湿度封装到一起,这样就不用分两次传输了,Model类获取数据后,就是Presenter去请求View去更新数据,因此调用了View的SetViewWenShiduValue方法
void Screen1Presenter:: NewWenShiduTempValue(float value1,int value2)
{
view.SetViewWenShiduValue(value1,value2);
}
最后是在View类中实现温度和湿度的更新,View类是直接和屏幕打交道的类
void Screen1View::SetViewWenShiduValue(float value1,int value2)
{
if(lastwendu != value1)
{
Unicode::snprintfFloat(textAreaWenduBuffer, TEXTAREAWendu_SIZE, "%.1f", value1);
textAreaWendu.invalidate();
lastwendu = value1;
}
if(lastshidu != value2)
{
Unicode::snprintf(textAreaShiduBuffer, TEXTAREAShidu_SIZE, "%2d", value2);
textAreaShidu.invalidate();
lastshidu = value2;
}
}
因为有了MVP这个设计思想,让数据交互有了流程化和标准化,最实际的意义就是让程序变得简单。程序编译,下载到STM32H750B-DK探索套件中,成功的显示了温度和湿度
这是界面一,这一页实际是设置温度和湿度的临界值,当温度达到这个临界值的时候,会采取相应的措施,比如报警、开启降温、除湿设备等,让温度和湿度回归正常范围。当前先用这一页显示数值,只有数值获取正常后才能进行下一步。
打火机加热,导致温度增加,湿度降低,喷水雾,导致湿度快速增高,从SHT3x底层传过来的数据已经可以在屏幕上正常显示了。
|