概述
界面内容比较多,这个项目我们就不一一讲述了,这里重点讲述两个页面,分别是:
- 开机界面,需要关注初始化
- 主界面,关注测温控制
开机界面
开机界面有一大段在start()函数前的代码:
if (bind_getbinlen("烙铁校准")<8)
{ //默认没有设置,则需要设置
bs=newbin(22);
defbin(bs,0,"00 00 7a 00 93 01 77 02 F0 02 E0 03 FE 04 CA 06 77 08 18 0c c0 0f");
bind_readbin("烙铁校准",bs,22);
memaddkey("烙铁校准");
memsave();
echo("new\r\n");
}
else{ //有设置
bs=bind_writebin("烙铁校准");
}
app.initT12();
app.create(); //重新读取校准数据
app.setWD(bind_get("DEFVAL")); //设置存储的对应温度
bind(l4.text,"NAME");
app.T12sw(1); //开启烙铁
这段代码初始化系统,首先判断是否有正确的校准参数,如果没有,则初始化一个。然后,调用appbase中的方法(函数),完成初始化:
app.initT12();
初始化E1-E6各个端口
app.create();
读取校准值,确保每个页面有值可用,注意正常的app.creat会在start()函数执行之后才能被执行,而我们现在就需要用,因此手动调用
app.setWD(bind_get("DEFVAL"));
读取上一次烙铁设置的默认温度,并设置;就是保持上一次用户使用的温度;
app.T12sw(1);
开启烙铁加热
主界面
初始化:
主界面也有一堆start()函数前的代码:
showb(); //显示快捷按钮的内容
app.create(); //提前执行,获取校准参数
t1.val=bind_get("DEFVAL");//设置目标温度
app.setWD(t1.val); //重新设置目标温度
bind_set("oldval",t1.val); //oldval用于比对温度是否发生改变
app.T12sw(1); //开启烙铁,开始加热
测温以及回显刷新:
首先,我们再设计appbase.cc中给app的status属性设置了一秒50次的定时器,设置代码:
int status=131072;#defattr(status,status,"状态寄存器");//1秒50次
具体参见:控件的属性详解
定时器每秒50次调用ontimer方法:
int VAD=0; //输入电压值
int TAD=0; //温度AD值
int vin=0; //输入电压:单位 mv
int wd=0; //温度,单位0.1度
int pwm=327; //占空比一半
int setupAD=900; //设置的AD值
void ontimer()
{ js++;if (js<18){return;}
if (js==18){
gpio_mode(5,1);gpio_out(5,0);//关闭烙铁加热,开始读AD
return;
}
js=0;
VAD=gpio_ad(2);//获取外部电压AD值
vin=VAD*36300/4095;//按1:10分压计算电压值
TAD=gpio_ad(3);//获取热电偶温度值
if (on==1){ //如果开机则计算PWM值并控温
ctrl0(); //控温核心算法,计算PWM值
wd=getvalbyad(0,500,50,bs,TAD);//热电偶计算出温度显示值
if (mode>1) wd=getwdmix(wd); //如果稳定优先,则打开滤波算法
}
gpio_mode(5,4); //开启加热模式,按PWM模式输出
gpio_pwmset(5,pwm); //开始加热
pagedata(); //调用页面可继承函数来刷新界面
}
由于T12的热电偶和烙铁芯并联,因此在测量温度的时候必须关闭加热,因此我们设计一个定时逻辑,把1秒50次分成每20次一个循环,在第18次的时候关闭烙铁加热,在第19次的时候读取AD值(开始时做的是关闭热电偶后立即读取AD值,发现由于电容效应,读取不出准确值,因此采用多次定时算法解决);
因此在主界面page代码中,我们继承pagedata方法完成控制显示:
void app.pagedata(){
int per;
l1.num=app.wd;
l3.text="电压:"+itos(app.vin,4,0)+"V";
per=app.pwm*100/65535;
l4.text="PWM:"+per+"%";
}
关于为什么要继承,请阅读:控件方法的继承做什么用
于是,我们完成了测量值的页面刷新;
界面操作温度变更:
当t1控件: 发生操作引发数值变化时,系统会自动调用:
void t1.onchange()
{ app.setWD(t1.val);
}
可以看到,一旦控件值由用户操作变化,将会直接改变温度设定,而在appbase中:
void setWD(int w){ //设置目标温度
setupAD=getadbyval(0,500,50,bs,w);
bind_set("DEFVAL",w);
}
实际上是设置了setupAD的值,并将w存到DEFVAL之中;考虑到flash有擦除寿命的,也就是说我们不能每次改变都擦除一次flash;考虑到用户调节温度有一个过程性,因此我们设定了一个定时器来检测,也就是我们随便在页面上找了一个label控件l2,将其status值设置为:16711680,也就是2.55秒定时一次,然后在页面中继承定时器函数
void l2.ontimer()
{ //2.55秒检测一次,如果设置值发生变化,则存储起来
int t1;
int t2;
t1=bind_get("oldval");
t2=bind_get("DEFVAL");
if (t1!=t2){
bind_set("oldval",t2);
memsave();
echo("save "+t2+"\r\n");
}
}
可以看到,2.55秒的时候,如果oldval与当前设置值不符,则会完成一次存储;这样下次开机的时候依旧会保持当前温度设定。
其他界面展示