ITEAD lança nova linha aprimorada de seus painéis IHM de Nextion Os representantes da empresa me forneceram uma cópia desta linha para integrar novos recursos do painel ao programa FLProg. Na versão 2.2, isso foi implementado. Nesta lição, consideraremos os novos recursos do painel e, por exemplo, criaremos um timer programável para cinco canais.Para começar, considere as características do painel. A linha Enhanced possui um relógio de tempo real embutido, 1024 bytes de memória não volátil, 8 entradas / saídas digitais. Cada um deles pode ser configurado como uma entrada ou uma saída. Quatro deles (do 4º ao 7º) podem ser configurados como saídas PWM.
Além da própria linha Nextion HMI Enhanced, também foi lançada a placa de expansão, que
possui controles e displays conectados ao painel GPIO.
Essas oportunidades permitem criar um dispositivo quase completo com base neste painel. Nesta lição, vou me concentrar na programação do próprio painel, pois há pouca informação sobre esse assunto, mas há muitas armadilhas. Um link para o projeto para o programa Nextion Editor está no final da postagem.O início do trabalho com o Nextion Editor, seu lançamento, a escolha inicial de codificação, tipo de painel foi discutido em meus posts anteriores tyts , tyts e tyts . Portanto, não vamos insistir nisso.O programa consiste em três tela do painel Home ( Principal ), Definir o temporizador ( o SetTimer ) e Time Setting ( SetCurrentTime ).Vamos começar na tela principal.
Essa tela exibe as configurações para ativar, desativar, o status de cada canal, o botão para alterar o status dos canais e o botão para alternar para a tela para definir a hora atual. Quando você clica no texto que exibe as configurações do canal, você acessa as configurações deste canal. Além disso, nesta tela, existem quatro botões ocultos necessários para vincular aos botões físicos localizados na placa de expansão. .
Considere o código contido na tela principal.Evento Preinitialilize o evento (a tela é chamado antes da inicialização).cfgpio 0,1,b0
cfgpio 2,1,b8
cfgpio 3,1,b7
cfgpio 4,1,b6
cfgpio 5,1,b9
SelTim.val=1
Aqui, vinculamos os botões físicos localizados no Painel de expansão aos botões virtuais na tela.Mais sobre o comando cfgpio - configurando entradas e saídas físicas do painel (somente os painéis aprimorados possuem esse comando).:
cfgpio id,state,cmp:
id: / (0-7)
state: (0-4)
cmp: ( 1, — 0).
.
cfgpio .
:
| | |
---|
0 | + 5 ( 50 ). pio0 – pio7 ( 0- 7 / | cfgpio 0,0,0 / GPIO0 , +5. : n0.val = pio0
|
1 | + 5 ( 50 ) . pio0 – pio7 ( 0- 7 / ). . 1 , . 0 . Preinitialilize Event , , . | cfgpio 2,1,b0 / GPIO2 , +5 b0. , b0 , – .
|
2 | . pio0 – pio7 ( 0- 7 / ). | cfgpio 1,2,0 / GPIO1 . : pio1=1
|
3 | . 4-7 /. 0 100. – 50. pwm4- pwm7 ( 4- 7 / ). pwmf . 1 65536. – 1000. | cfgpio 4,3,0 / GPIO4 . : pwm4=20 – 2000 . pwmf=2000
|
4 | . pio0 – pio7 ( 0- 7 / ). | cfgpio 5,4,0 / GPIO5 . : pio5=1
|
Evento toque de Imprensa Evento botão b0 - «Set tempo»page 2
É tudo auto-explicativoevento Toque Imprensa Evento botões b1 - estado «Chave do primeiro canal"repo TempB.val,0
if(TempB.val==1)
{
if(tsr1.val==1)
{
tsr1.val=2
}else
{
tsr1.val=1
}
}
Primeiro, lemos a atividade do canal na EEPROM. Cada canal pode ser desligado do trabalho na página de configurações do canal. O comando repo "lendo da EEPROM" será discutido em mais detalhes abaixo. Então, se o canal estiver ativo, mude de estado. O estado atual dos canais é armazenado nas variáveis tsr1 - tsr5 para cada um dos canais, respectivamente.Recursos na sintaxe da expressão if elseif(TempB.val==1) – .
. .
}else
, . , else , .
Para os botões restantes para alterar o status do canal ( b2 - b5 ), o código de evento do Touch Press é o mesmo. Somente o endereço na EEPROM e a variável de estado do canal são alterados.Evento toque de Imprensa Evento botão B6 - «Escolha o canal anterior ". O botão está invisível. Modo de renderização ( sta ) - imagem cortada (imagem cortada). Como uma imagem no estado não pressionado ( picc ) e no estado pressionado ( picc2 ), a imagem de fundo da janela é selecionada. Devido a isso, o botão não é exibido, mas funciona. Este botão nesta tela está vinculado ao botão físico Up (IO4) na placa de expansão .if(SelTim.val<2)
{
SelTim.val=5
}else
{
SelTim.val=SelTim.val-1
}
A variável SelTim contém o número do timer selecionado no momento. Tudo o resto, eu acho, está claro nos comentários. Evento toque de Imprensa Evento botão B7 - «para seleccionar o canal seguinte ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico Down (IO3) na placa de expansão . if(SelTim.val>4)
{
SelTim.val=1
}else
{
SelTim.val=SelTim.val+1
}
Aqui eu acho que a mesma coisa está clara.Evento toque de Imprensa Evento botão B8 - «Editar o canal selecionado ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico direito (IO2) na placa de expansão .if(SelTim.val==1)
{
click TimerText1,1
}
if(SelTim.val==2)
{
click TimerText2,1
}
if(SelTim.val==3)
{
click TimerText3,1
}
if(SelTim.val==4)
{
click TimerText4,1
}
if(SelTim.val==5)
{
click TimerText5,1
}
Detalhes do comando Click - simule clicar ou liberar um elemento:
click cmpID,event
:
cmpID: ID .
event: 0 – ; 1 –
. click .
Evento toque de Imprensa Evento botão B9 - «status da chave do canal selecionado ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico esquerdo (IO5) na placa de expansão .if(SelTim.val==1)
{
click b1,1
}
if(SelTim.val==2)
{
click b2,1
}
if(SelTim.val==3)
{
click b3,1
}
if(SelTim.val==4)
{
click b4,1
}
if(SelTim.val==5)
{
click b5,1
}
O evento Touch Press da caixa de texto TimerText1 é "Exibir status do canal 1".sys0=1
sys1=1
page 1
Para outros campos de texto ( TimerText2 - TimerText5 ), o código do evento Touch Press é o mesmo. Somente na variável do sistema sys0 é inserido o número do canal correspondente.sys0, sys1, sys2 são variáveis numéricas globais que não precisam ser criadas ou definidas. Eles podem ser usados em qualquer tela. O valor padrão para essas três variáveis é 0, elas podem ser lidas e gravadas, seu intervalo de valores é 0 ~ 4294967295. Recomendado para passar valores entre páginas.O cronômetro tm0 está definido nesta tela . Este timer dispara a cada 200 milissegundos (parâmetro tim), quando a página está ativa. O código para monitorar o status dos cronômetros e redesenhar os componentes na página está localizado no Evento do Timer deste cronômetro.Código sob spoler
temp.val=rtc2
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=tempText.txt+TT1.txt
temp.val=rtc1
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt
temp.val=rtc0
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+"-"+TT1.txt
temp.val=rtc3
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+" "+tempText.txt+TT1.txt
temp.val=rtc4
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt
temp.val=rtc5
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt
for(i.val=0;i.val<5;i.val++)
{
temp.val=i.val*52
temp2.val=temp.val+4
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts1.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc2)
{
ts1.val=1
}else
{
ts1.val=2
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=Var0txt.txt+tempText.txt+"-"
temp2.val=temp.val+8
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts2.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc1)
{
ts2.val=1
}else
{
ts2.val=2
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-"
temp2.val=temp.val+12
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts3.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc0)
{
ts3.val=1
}else
{
ts3.val=0
}
cov temp1.val,tempText.txt,0
}
TT1.txt=TT1.txt+tempText.txt+" "
temp2.val=temp.val+16
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts4.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc3)
{
ts4.val=1
}else
{
ts4.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"
temp2.val=temp.val+20
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts5.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc4)
{
ts5.val=1
}else
{
ts5.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"
temp2.val=temp.val+24
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts6.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc5)
{
ts6.val=1
}else
{
ts6.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+" / "
temp2.val=temp.val+28
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts7.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc2)
{
ts7.val=1
}else
{
ts7.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-"
temp2.val=temp.val+32
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts8.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc1)
{
ts8.val=1
}else
{
ts8.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+"-"
temp2.val=temp.val+36
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts9.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc0)
{
ts9.val=1
}else
{
ts9.val=0
}
cov temp1.val,tempText.txt,0
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+" "
temp2.val=temp.val+40
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts10.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc3)
{
ts10.val=1
}else
{
ts10.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"
temp2.val=temp.val+44
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts11.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc4)
{
ts11.val=1
}else
{
ts11.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt+":"
temp2.val=temp.val+48
Var0txt.txt=""
repo temp1.val,temp2.val
if(temp1.val==10000)
{
ts12.val=1
tempText.txt="X"
}else
{
if(temp1.val==rtc5)
{
ts12.val=1
}else
{
ts12.val=0
}
cov temp1.val,tempText.txt,0
if(temp1.val<10)
{
Var0txt.txt="0"
}
}
TT1.txt=TT1.txt+Var0txt.txt+tempText.txt
repo temp1.val,temp.val
tsrOn.val=0
if(temp1.val==1)
{
if(ts1.val==1)
{
if(ts2.val==1)
{
if(ts3.val==1)
{
if(ts4.val==1)
{
if(ts5.val==1)
{
if(ts6.val==1)
{
tsrOn.val=1
}
}
}
}
}
}
}
tsrOf.val=0
if(temp1.val==1)
{
if(ts7.val==1)
{
if(ts8.val==1)
{
if(ts9.val==1)
{
if(ts10.val==1)
{
if(ts11.val==1)
{
if(ts12.val==1)
{
tsrOf.val=1
}
}
}
}
}
}
}else
{
tsrOf.val=1
}
if(i.val==0)
{
if(tsr1.val==1)
{
if(tsrOf.val==1)
{
tsr1.val=2
}
}else
{
if(tsrOn.val==1)
{
tsr1.val=1
}
}
if(tsr1.val==1)
{
TimerText1.pco=63488
}else
{
if(temp1.val==1)
{
TimerText1.pco=65504
}else
{
TimerText1.pco=50712
}
}
TimerText1.txt=TT1.txt
}
if(i.val==1)
{
if(tsr2.val==1)
{
if(tsrOf.val==1)
{
tsr2.val=2
}
}else
{
if(tsrOn.val==1)
{
tsr2.val=1
}
}
if(tsr2.val==1)
{
TimerText2.pco=63488
}else
{
if(temp1.val==1)
{
TimerText2.pco=65504
}else
{
TimerText2.pco=50712
}
}
TimerText2.txt=TT1.txt
}
if(i.val==2)
{
if(tsr3.val==1)
{
if(tsrOf.val==1)
{
tsr3.val=2
}
}else
{
if(tsrOn.val==1)
{
tsr3.val=1
}
}
if(tsr3.val==1)
{
TimerText3.pco=63488
}else
{
if(temp1.val==1)
{
TimerText3.pco=65504
}else
{
TimerText3.pco=50712
}
}
TimerText3.txt=TT1.txt
}
if(i.val==3)
{
if(tsr4.val==1)
{
if(tsrOf.val==1)
{
tsr4.val=2
}
}else
{
if(tsrOn.val==1)
{
tsr4.val=1
}
}
if(tsr4.val==1)
{
TimerText4.pco=63488
}else
{
if(temp1.val==1)
{
TimerText4.pco=65504
}else
{
TimerText4.pco=50712
}
}
TimerText4.txt=TT1.txt
}
if(i.val==4)
{
if(tsr5.val==1)
{
if(tsrOf.val==1)
{
tsr5.val=2
}
}else
{
if(tsrOn.val==1)
{
tsr5.val=1
}
}
if(tsr5.val==1)
{
TimerText5.pco=63488
}else
{
if(temp1.val==1)
{
TimerText5.pco=65504
}else
{
TimerText5.pco=50712
}
}
TimerText5.txt=TT1.txt
}
}
if(SelTim.val==1)
{
b1.txt="+"
}else
{
b1.txt=""
}
if(SelTim.val==2)
{
b2.txt="+"
}else
{
b2.txt=""
}
if(SelTim.val==3)
{
b3.txt="+"
}else
{
b3.txt=""
}
if(SelTim.val==4)
{
b4.txt="+"
}else
{
b4.txt=""
}
if(SelTim.val==5)
{
b5.txt="+"
}else
{
b5.txt=""
}
Recursos na sintaxe de um para expressãofor(n0.val=0; n0.val<100; n0.val++) — .
. .
Leia mais sobre o comando cov - conversão entre string e dados numéricos.:
cov att1,att2,lenth
:
att1:
att2:
lenth: ( 0 – )
:
cov number.val,text.txt,0
number text.
cov text.txt,number.val,5
text.
. cov .
Considere a localização dos dados no painel EEPROM. Cada canal possui 52 bytes. Para cada valor - 4 bytes.Endereço EEPROM Offset inicial = (número do canal começando em 0) * 52
| Valor |
---|
Iniciar deslocamento | Atividade do canal (0 - canal desativado, 1 - canal ativado) |
Deslocamento inicial + 4 | Dia de inclusão do canal. Se não for levado em consideração - 10.000 |
Deslocamento inicial + 8 | Mês de inclusão no canal. Se não for levado em consideração - 10.000 |
Deslocamento inicial + 12 | . — 10000 |
+ 16 | . — 10000 |
+ 20 | . -10000 |
+ 24 | . – 10000 |
+ 28 | . — 10000 |
+ 32 | . – 10000 |
+ 36 | . -10000 |
+ 40 | . -10000 |
+ 44 | . -10000 |
+ 48 | Canal desligado em segundo. Se não for levado em consideração -10000 |
Na tela principal terminar, passar para a tela, o ajuste do temporizador ( o SetTimer ID = 1 )
Evento Preinitialilize do Evento (a tela é chamado antes da inicialização).cfgpio 0,1,b2
cfgpio 1,1,BYE
cfgpio 2,1,b0
cfgpio 3,1,BYM
cfgpio 4,1,BYP
cfgpio 5,1,b1
StAddr.val=sys0-1
StAddr.val=StAddr.val*52
repo Enable.val,StAddr.val
Aqui redefinimos a ligação dos botões físicos localizados no Painel de expansão às necessidades dessa tela e pré-lemos os dados.Evento toque de Imprensa Evento botão b0 - «Vá para o próximo campo ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico direito (IO2) na placa de expansão .if(sys1>11)
{
sys1=1
}else
{
sys1=sys1+1
}
Evento toque de Imprensa Evento botões b1 - «Vá para o campo anterior ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico esquerdo (IO5) na placa de expansão .if(sys1<2)
{
sys1=12
}else
{
sys1=sys1-1
}
Evento toque de Imprensa Evento botão b2 - "canal Activar / Desactivar" ou "Exit" (hold 2 seg). O botão está invisível. Este botão nesta tela está vinculado ao botão Esc físico (IO0) na placa de expansão.tm1.en=1
Aqui iniciamos o temporizador auxiliar. Se você pressionar o botão físico Esc (IO0) sobre a placa de expansão para 2 segundos (propriedade tim temporizador), o rebaixamento acontecer temporizador (chamada evento Event Timer Temporizador TM1 ), se o botão for liberado antes do evento é devido Toque lançamento Evento botão b2tm1.en=0
if(Enable.val==1)
{
Enable.val=0
}else
{
Enable.val=1
}
Evento Event Timer Temporizador TM1 click b11,1 // b11 ("")
Evento toque de Imprensa Evento botão uma BYE - «Activar / Desactivar do Registro é de operação" do campo selecionado.if(sys1==1)
{
temp2.val=rtc2
}
if(sys1==2)
{
temp2.val=rtc1
}
if(sys1==3)
{
temp2.val=rtc0
}
if(sys1==4)
{
temp2.val=rtc3
}
if(sys1==5)
{
temp2.val=rtc4
}
if(sys1==6)
{
temp2.val=rtc5
}
if(sys1==7)
{
temp2.val=rtc2
}
if(sys1==8)
{
temp2.val=rtc1
}
if(sys1==9)
{
temp2.val=rtc0
}
if(sys1==10)
{
temp2.val=rtc3
}
if(sys1==11)
{
temp2.val=rtc4
}
if(sys1==12)
{
temp2.val=rtc5
}
temp3.val=sys1*4
temp.val=StAddr.val+temp3.val
repo temp1.val,temp.val
if(temp1.val==10000)
{
temp1.val=temp2.val
}else
{
temp1.val=10000
}
wepo temp1.val,temp.val
Leia mais sobre os comandos wepo - escreva na EEPROM e repo - leia a partir da EEPROM (apenas os painéis aprimorados possuem esses comandos).wepo
:
wepo att,add
:
att:
add: EEPROM
:
wepo number.val,10
number EEPROM 10. EEPROM 0. . wepo .
repo
:
repo att,add
:
att:
add: EEPROM
:
repo number.val,10
number EEPROM , 10. , 4 , . – txt_maxl att +1
. repo .
Evento toque de Imprensa Evento botão BYP - «Adicionar 1 para o campo selecionado ".if(sys1==1)
{
temp2.val=31
}
if(sys1==2)
{
temp2.val=12
}
if(sys1==3)
{
temp2.val=9999
}
if(sys1==4)
{
temp2.val=23
}
if(sys1==5)
{
temp2.val=59
}
if(sys1==6)
{
temp2.val=59
}
if(sys1==7)
{
temp2.val=31
}
if(sys1==8)
{
temp2.val=12
}
if(sys1==9)
{
temp2.val=9999
}
if(sys1==10)
{
temp2.val=23
}
if(sys1==11)
{
temp2.val=59
}
if(sys1==12)
{
temp2.val=59
}
temp3.val=sys1*4
temp.val=StAddr.val+temp3.val
repo temp1.val,temp.val
if(temp1.val!=10000)
{
if(temp1.val!=temp2.val)
{
temp1.val=temp1.val+1
wepo temp1.val,temp.val
}
}
Evento toque de Imprensa Evento botão BYM - «subtraia 1 do campo escolhido ".temp2.val=0
if(sys1==1)
{
temp2.val=1
}
if(sys1==2)
{
temp2.val=1
}
if(sys1==3)
{
temp2.val=2016
}
if(sys1==7)
{
temp2.val=1
}
if(sys1==8)
{
temp2.val=1
}
if(sys1==9)
{
temp2.val=2016
}
temp3.val=sys1*4
temp.val=StAddr.val+temp3.val
repo temp1.val,temp.val
if(temp1.val!=10000)
{
if(temp1.val!=temp2.val)
{
temp1.val=temp1.val-1
wepo temp1.val,temp.val
}
}
Evento toque de Imprensa Evento botão b11 - «Voltar para a página inicial ".wepo Enable.val,StAddr.val
sys0=0
sys1=0
page 0
O evento Touch Press da caixa de texto StartD é "Day Set Point Trigger ".sys1=1
Para campos de texto com outras configurações, o código do Touch Press Event é o mesmo, exceto o número do campo.Os números dos campos dos valores de ajuste são:StartMo - 2 (“Mês do ponto de ajuste da operação”).InícioY - 3 (“Ano da viagem do ponto de ajuste”).StartH - 4 (“Hora da configuração de operação”).StartMi - 5 (" Ponto de ajuste de minutos de operação").StartS - 6 (“Segundo do ponto de ajuste da operação”).StopD - 7 ("Dia da configuração da viagem").StopMo - 8 ("Mês da configuração da viagem").StopY - 9 (“Ano da configuração da viagem”).StopH - 10 (“Hora da configuração da viagem”).Stopmi- 11 (“Configuração de viagem de minuto„).StopS - 12 (“Segundos do ponto de ajuste de trip„).O temporizador tm0 também é definido nesta tela com um período de viagem de 200 milissegundos. No evento Timer deste timer, os valores dos campos de configuração são atualizados.Código sob o spoiler
temp1.val=StAddr.val+4
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==1)
{
vis BYP,0
vis BYM,0
}
StartD.txt="X"
}else
{
if(sys1==1)
{
vis BYP,1
vis BYM,1
}
StartD.txt=tempStr1.txt
}
temp1.val=StAddr.val+8
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==2)
{
vis BYP,0
vis BYM,0
}
StartMo.txt="X"
}else
{
if(sys1==2)
{
vis BYP,1
vis BYM,1
}
StartMo.txt=tempStr1.txt
}
temp1.val=StAddr.val+12
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==3)
{
vis BYP,0
vis BYM,0
}
StartY.txt="X"
}else
{
if(sys1==3)
{
vis BYP,1
vis BYM,1
}
StartY.txt=tempStr1.txt
}
temp1.val=StAddr.val+16
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==4)
{
vis BYP,0
vis BYM,0
}
StartH.txt="X"
}else
{
if(sys1==4)
{
vis BYP,1
vis BYM,1
}
StartH.txt=tempStr1.txt
}
temp1.val=StAddr.val+20
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==5)
{
vis BYP,0
vis BYM,0
}
StartMi.txt="X"
}else
{
if(sys1==5)
{
vis BYP,1
vis BYM,1
}
StartMi.txt=tempStr1.txt
}
temp1.val=StAddr.val+24
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==6)
{
vis BYP,0
vis BYM,0
}
StartS.txt="X"
}else
{
if(sys1==6)
{
vis BYP,1
vis BYM,1
}
StartS.txt=tempStr1.txt
}
temp1.val=StAddr.val+28
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==7)
{
vis BYP,0
vis BYM,0
}
StopD.txt="X"
}else
{
if(sys1==7)
{
vis BYP,1
vis BYM,1
}
StopD.txt=tempStr1.txt
}
temp1.val=StAddr.val+32
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==8)
{
vis BYP,0
vis BYM,0
}
StopMo.txt="X"
}else
{
if(sys1==8)
{
vis BYP,1
vis BYM,1
}
StopMo.txt=tempStr1.txt
}
temp1.val=StAddr.val+36
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==9)
{
vis BYP,0
vis BYM,0
}
StopY.txt="X"
}else
{
if(sys1==9)
{
vis BYP,1
vis BYM,1
}
StopY.txt=tempStr1.txt
}
temp1.val=StAddr.val+40
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==10)
{
vis BYP,0
vis BYM,0
}
StopH.txt="X"
}else
{
if(sys1==10)
{
vis BYP,1
vis BYM,1
}
StopH.txt=tempStr1.txt
}
temp1.val=StAddr.val+44
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==11)
{
vis BYP,0
vis BYM,0
}
StopMi.txt="X"
}else
{
if(sys1==11)
{
vis BYP,1
vis BYM,1
}
StopMi.txt=tempStr1.txt
}
temp1.val=StAddr.val+48
repo temp.val,temp1.val
cov temp.val,tempStr.txt,0
if(temp.val<10)
{
tempStr1.txt="0"+tempStr.txt
}else
{
tempStr1.txt=tempStr.txt
}
if(temp.val==10000)
{
if(sys1==12)
{
vis BYP,0
vis BYM,0
}
StopS.txt="X"
}else
{
if(sys1==12)
{
vis BYP,1
vis BYM,1
}
StopS.txt=tempStr1.txt
}
if(sys1==1)
{
StartD.pco=63488
}else
{
StartD.pco=65535
}
if(sys1==2)
{
StartMo.pco=63488
}else
{
StartMo.pco=65535
}
if(sys1==3)
{
StartY.pco=63488
}else
{
StartY.pco=65535
}
if(sys1==4)
{
StartH.pco=63488
}else
{
StartH.pco=65535
}
if(sys1==5)
{
StartMi.pco=63488
}else
{
StartMi.pco=65535
}
if(sys1==6)
{
StartS.pco=63488
}else
{
StartS.pco=65535
}
if(sys1==7)
{
StopD.pco=63488
}else
{
StopD.pco=65535
}
if(sys1==8)
{
StopMo.pco=63488
}else
{
StopMo.pco=65535
}
if(sys1==9)
{
StopY.pco=63488
}else
{
StopY.pco=65535
}
if(sys1==10)
{
StopH.pco=63488
}else
{
StopH.pco=65535
}
if(sys1==11)
{
StopMi.pco=63488
}else
{
StopMi.pco=65535
}
if(sys1==12)
{
StopS.pco=63488
}else
{
StopS.pco=65535
}
Mais sobre o comando vis - alterando a visibilidade do elemento:
vis obj,state
:
obj: ID .
state: 1- , 0 –
. vis .
Com a tela de configurações do canal finalizada, vá para a tela de configurações da hora atual ( SetCurrentTime ID = 2 ).
Aqui, como em outras telas no evento Preinitialilize (chamado antes da inicialização da tela), ligamos novamente os botões físicos aos botões virtuais nessa tela.cfgpio 0,1,b11
cfgpio 1,1,b10
cfgpio 2,1,b14
cfgpio 3,1,b13
cfgpio 4,1,b12
cfgpio 5,1,b15
sel.val=1
Evento toque de Imprensa Evento botão b0 - «Acrescentar ao tempo do dia atual ".if(rtc2<31)
{
rtc2=rtc2+1
}
Evento toque de Imprensa Evento botão b2 - «Adicionar mês para o tempo atual ".if(rtc1<12)
{
rtc1=rtc1+1
}
Evento toque de Imprensa Evento botão B4 - «Adicionar o ano para o tempo atual ".rtc0=rtc0+1
Evento toque de Imprensa Evento botão B6 - «Adicionar uma hora para o tempo atual ". if(rtc3<23)
{
rtc3=rtc3+1
}
Evento toque de Imprensa Evento botão B8 - «Adicionar ao momento atual de tempo ".if(rtc4<59)
{
rtc4=rtc4+1
}
Evento toque de Imprensa Evento botões b1 - «Tira o dia a partir do momento atual ".if(rtc2>1)
{
rtc2=rtc2-1
}
O evento Touch Press do botão b3 é "Subtrair o mês da hora atual".if(rtc1>1)
{
rtc1=rtc1-1
}
O evento Touch Press do botão b5 é "Subtrair o ano da hora atual".if(rtc0>2016)
{
rtc0=rtc0-1
}
O evento Touch Press do botão b7 é "Subtrai uma hora da hora atual".if(rtc3>0)
{
rtc3=rtc3-1
}
Evento toque de Imprensa Evento botão B9 - «Tira o minuto do tempo atual ".if(rtc4>0)
{
rtc4=rtc4-1
}
O evento Touch Press do botão b10 é "Defina segundos para 0".rtc5=0
O evento Touch Press do botão b11 é "Sair".page 0
O evento Touch Press do botão b12 é "Vá para o campo anterior". O botão está invisível. Este botão nesta tela está vinculado ao botão físico Up (IO4) na placa de expansão .if(sel.val<2)
{
sel.val=5
}else
{
sel.val=sel.val-1
}
Evento toque de Imprensa Evento botão b13 - «Vá para o próximo campo ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico Down (IO3) na placa de expansão .if(sel.val>4)
{
sel.val=1
}else
{
sel.val=sel.val+1
}
Evento toque de Imprensa Evento botão b14 - «Adicionar 1 ao valor do campo escolhido ". O botão está invisível. Este botão nesta tela está vinculado ao botão físico direito (IO2) na placa de expansão .if(sel.val==1)
{
click b0,1
}
if(sel.val==2)
{
click b2,1
}
if(sel.val==3)
{
click b4,1
}
if(sel.val==4)
{
click b6,1
}
if(sel.val==5)
{
click b8,1
}
Evento toque de lançamento Evento botão b14if(sel.val==1)
{
click b0,0
}
if(sel.val==2)
{
click b2,0
}
if(sel.val==3)
{
click b4,0
}
if(sel.val==4)
{
click b6,0
}
if(sel.val==5)
{
click b8,0
}
O evento Touch Press do botão b15 é "Subtrai 1 do valor do campo selecionado". O botão está invisível. Este botão nesta tela está vinculado ao botão físico esquerdo (IO5) na placa de expansão . if(sel.val==1)
{
click b1,1
}
if(sel.val==2)
{
click b3,1
}
if(sel.val==3)
{
click b5,1
}
if(sel.val==4)
{
click b7,1
}
if(sel.val==5)
{
click b9,1
}
Evento toque de lançamento Evento botão b15if(sel.val==1)
{
click b1,0
}
if(sel.val==2)
{
click b3,0
}
if(sel.val==3)
{
click b5,0
}
if(sel.val==4)
{
click b7,0
}
if(sel.val==5)
{
click b9,0
}
Bem, como nas outras janelas, o timer tm0 é definido nesta janela com um período de resposta de 200 milissegundos. No evento Timer deste timer, os valores dos campos de texto são atualizados.Código sob o spoiler
temp.val=rtc2
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=tempText.txt+TT1.txt
temp.val=rtc1
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt
temp.val=rtc0
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+"-"+tempText.txt+TT1.txt
temp.val=rtc3
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+" "+tempText.txt+TT1.txt
temp.val=rtc4
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt
temp.val=rtc5
tempText.txt=""
if(temp.val<10)
{
tempText.txt="0"
}
cov temp.val,TT1.txt,0
CurrentTime1.txt=CurrentTime1.txt+":"+tempText.txt+TT1.txt
if(sel.val==1)
{
t1.pco=63488
}else
{
t1.pco=65535
}
if(sel.val==2)
{
t2.pco=63488
}else
{
t2.pco=65535
}
if(sel.val==3)
{
t3.pco=63488
}else
{
t3.pco=65535
}
if(sel.val==4)
{
t4.pco=63488
}else
{
t4.pco=65535
}
if(sel.val==5)
{
t5.pco=63488
}else
{
t5.pco=65535
}
Sobre isso, terminamos com o painel. Em princípio, resultou em um sistema autônomo que pode funcionar sem equipamento adicional. Mas não podemos usar as respostas do canal. Temos apenas duas entradas gratuitas - saídas. Aqui o arduinka virá em socorro.Na versão 2.2 do FLProg, o suporte aos painéis Nextion HMI foi atualizado. Existem novos blocos para ela.- Bloco " Clicar em um item " - permite simular um clique e soltar em qualquer item na tela do painel.
- Os blocos " Obter o valor da variável do sistema " e " Definir o valor da variável do sistema " permitem ler e gravar os valores de quase todas as variáveis do sistema do painel
- O bloco “ GPIO Settings ” - permite configurar os modos de operação de E / S do painel a qualquer momento
Bem, nesta lição (como ainda é mais dedicado à programação do próprio painel), apenas lemos o status dos canais do timer (variáveis tsr1 - tsr5 ) e os transmitimos para os LEDs.Resumo do projeto do Arduino no programa FLProg.
Um pequeno vídeo da operação do dispositivo (este ainda é um projeto de treinamento, por isso é montado temporariamente)Aplicações:- Projeto para o Nextion Editor (firmware para o painel)
- Projeto para o programa FLProg (firmware para arduino)