概述

界面内容比较多,这个项目我们就不一一讲述了,这里重点讲述两个页面,分别是:

开机界面

开机界面有一大段在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与当前设置值不符,则会完成一次存储;这样下次开机的时候依旧会保持当前温度设定。

其他界面展示