STONE Progetto ventilatore TFT Screen: progettazione HMI, creazione controlli, connessione hardware e test comandi

Introduzione: Questa interfaccia dello schermo del ventilatore del sonno utilizza un 5.6 pollici STONE schermo seriale, con la propria retroilluminazione, colori ricchi, una porta seriale per facilitare la comunicazione con la scheda di controllo principale, l'input touch elimina anche la tastiera, l'aspetto dell'intero ventilatore è più semplice e generoso. Il valore di pressione regolabile e il tempo di ritardo sono opzioni scorrevoli, il che rende l'operazione più conveniente.

Ricordi "Incontra i woofer"? Come mostrato nell'immagine (1), in questa lunga storia, l'autore Roku Mu Xue scrive del vecchio solitario Li Keng Chen e di sua figlia Dabao e del cane Dumbao. A Li Keng Chen all'inizio non piaceva il cane Dumbao, sua figlia ha lasciato la casa per lavorare nel nord, è il cane che Dumbao è stato con lui; ma il cane lo svegliava sempre nel cuore della notte, e in seguito venne a sapere che il vecchio Li Keng Chen soffriva di sindrome da apnea parossistica del sonno, il cane Dumbao si svegliò per salvargli la vita!

Incontra i woofer
Incontra i woofer

Se non hai un CANE così intelligente, puoi ottenere un ventilatore per il sonno Angel, Figura (2). Può aiutare a prevenire l'apnea aprendo le vie aeree bloccate durante il sonno con una pressione positiva continua — Modalità CPAP con diversi valori di regolazione della pressione del peso, vedere la figura (3). Puoi anche impostare un aumento di pressione ritardato di 15-60 minuti (puoi usare sec invece di min per visualizzare l'effetto durante la demo) per aumentare gradualmente la pressione dell'aria solo dopo esserti addormentato per evitare di iniziare con una pressione dell'aria alta che influenzerà il tuo sonno

Figura (2) Interfaccia principale del ventilatore del sonno
Figura (2) Interfaccia principale del ventilatore del sonno
Figura (3) Valori di riferimento per la regolazione della pressione dell'aria in modalità CPAP
Figura (3) Valori di riferimento per la regolazione della pressione dell'aria in modalità CPAP

L'interfaccia di visualizzazione di questo ventilatore per il sonno utilizza a 5.6 " STONE touch screen seriale con una retroilluminazione, colori intensi e una porta seriale per una facile comunicazione con la scheda di controllo principale, e l'ingresso touch elimina anche la tastiera, rendendo l'intero ventilatore più semplice e generoso nell'aspetto. Il valore della pressione regolabile e il tempo di ritardo sono opzioni scorrevoli – Figura (4), funzionamento più conveniente. Inoltre, il conto alla rovescia del tempo di ritardo e il valore di visualizzazione del manometro sono mostrati in un'interfaccia speciale — Figura (5), che è intuitiva e chiara. Il processo di sviluppo è registrato come segue.

Figura (4) Interfaccia di regolazione dei parametri
Figura (4) Interfaccia di regolazione dei parametri
Figura (5) Schermata di visualizzazione dell'aumento della pressione e del conto alla rovescia
Figura (5) Schermata di visualizzazione dell'aumento della pressione e del conto alla rovescia

DESCRIZIONE

  • Istruzioni per la creazione di HMI e controllo
  • Scarica interfaccia
  • Connessione hardware e test dei comandi
  • codice di debug

1, istruzioni per la progettazione dello schermo del ventilatore e la creazione del controllo

Come nella figura (2), accedere all'interfaccia di regolazione dei parametri del ventilatore tramite il pulsante di invio, scorrere su e giù per regolare il valore della pressione dell'aria a sinistra e anche scorrere su e giù per regolare il tempo di boost ritardato a destra. Fare clic su "Inizia” per iniziare l'aumento, o ritardare l'aumento, con un rosso “STOP” per uscire o altro deve interrompere l'aumento in qualsiasi momento. Premi il "Manometro” per accedere alla visualizzazione della pressione e alla visualizzazione del conto alla rovescia del ritardo.

È possibile regolare il parametro: round_rsdius: 50 nella pagina delle proprietà del pulsante per ottenere pulsanti rotondi e a forma di arco. La figura (6) mostra uno screenshot delle proprietà del "STOP"Pulsante.

Figura (6) Progettazione dei parametri del pulsante circolare
Figura (6) Progettazione dei parametri del pulsante circolare

Il carattere apparirà minuscolo nel file STONE display e più grande nel PC, quindi progetta la dimensione del carattere più grande possibile nel PC in modo che non sembri troppo piccola quando viene scaricata sullo schermo, con conseguenti regolazioni multiple della versione per la dimensione del carattere.

Selettore_testo il carattere evidenziato al centro del design del selettore rispetto ai due lati del carattere è più grande, il colore rosso è più evidente, come i parametri della proprietà ts11, vedere la Figura (7). L'effetto effettivo è mostrato nella Figura (4).

Figura (7) Progettazione del parametro del selettore della pressione dell'aria
Figura (7) Progettazione del parametro del selettore della pressione dell'aria
Figura (8) Proprietà del puntatore del manometro
Figura (8) Proprietà del puntatore del manometro

Lo stile dell'icona del puntatore gauge_pointer controllo è selezionato nell'immagine in Figura (8), il punto di ancoraggio del puntatore è impostato da ancora_x, anchor_y, intervallo 0.0 – 1.0. l'impostazione dell'angolo, attualmente impostata in PC -140, punta a una pressione dell'aria 0, sullo schermo, la posizione originale è a metà 0 gradi, è necessario il comando del programma per specificare nuovamente.

Le interfacce di Figura (2) e Figura (3) che coinvolgono il nome e la gamma di controlli e contenuti necessari per la programmazione sono visualizzate insieme in modo unificato per un facile accesso durante la programmazione.

Nome del controllo di programmazione

Figura (2) Interfaccia di regolazione dei parametri:

Nome del pulsante di avvio = b11
Nome del pulsante di arresto = b12
Nome del pulsante del manometro = b13
Nome del pulsante del selettore dell'aumento di pressione ritardato = cb1
Nome del selettore di pressione = ts11 intervallo 1-20
Nome del selettore del tempo di ritardo = ts12 intervallo 1-60

Figura (3) Schermata di visualizzazione della pressione e del conto alla rovescia:

Nome del puntatore del manometro = gp1 Pressure value 0: -140, 20: -110
Nome conto alla rovescia minimo = l21
Nome del conto alla rovescia di secondi = l22

2, Download dell'interfaccia

Cliccando debug — "scarica" nel menu principale, selezionare il respiratore cartella, e verrà generata una sottocartella con lo stesso nome del progetto (l'ultima cartella generata dovrebbe essere rinominata prima di ogni download, altrimenti restituirà un errore);

controlla il selettore sul retro del STONE schermata seriale al "dispositivo” posizione in alto, e utilizzare il cavo di comunicazione USB per collegare direttamente il PC e l'interfaccia USB del display, il PC visualizzerà la nuova cartella del disco, copierà la sottocartella omonima del progetto appena generato /predefinito/ al "crudo” della directory di archiviazione del display.

3, connessione hardware e test dei comandi

Verificare i comandi da utilizzare prima della programmazione. Collegare come mostrato in Figura (9), controllare il feedback da STONE, e verificare la validità dei comandi tramite l'assistente seriale.

Questo progetto prevede cinque tipi di controlli:

  • pulsante
  • etichetta
  • selettore_testo
  • gauge_pointer
  • casella di controllo

Li testeremo e verificheremo uno per uno.

Figura (9) Diagramma del ponticello della scheda dell'adattatore di test dell'assistente seriale
Figura (9) Diagramma del ponticello della scheda dell'adattatore di test dell'assistente seriale

pulsante relativo:

0x1001  pulsante-valore-chiave inviato attivamente

Valore-chiave (ultimo byte della sezione dati):

0x01  premere il pulsante premuto

0x02  premere il pulsante di rilascio (evento di clic di attivazione del pulsante completo)

Esempio:

Il pulsante di avvio della schermata dei parametri (nome = b11 ) viene premuto per emettere attivamente il comando.

ST0x10 0x01 0x00 0x04 b11 0x01> ET

L'assistente seriale restituisce dati esadecimali: Verifica OK

53 54 3C 10 01 00 04 62 31 31 01 3E 45 54 5C 0B

Comando attivo di rilascio del pulsante (completamento dell'azione del clic del pulsante) — come un modo per decodificare 62 31 31 02 fattibile!

ST0x10 0x01 0x00 0x04 b11 0x02> ET

L'assistente seriale restituisce dati esadecimali: Verifica OK

53 54 3C 10 01 00 04 62 31 31 02 3E 45 54 18 0B

Nota: Pulsante b11 (codice ASCII 0x62 0x31 0x31).

Correlati all'etichetta:

set_text Imposta il testo visualizzato dall'etichetta

Esempio:

Imposta testo: (nome conto alla rovescia minimo = l21)

ST<{“cmd_code”: “set_text”, “type”: “label”, “widget”: “l21”, “text”: “29”}>E Verifica che lo schermo superiore sia OK

selettore di testo relativo:

0x1081 viene inviato il valore del selettore di testo (tipo int Inserimento attivo: pubblicato non appena il selettore viene regolato)

Formato dei dati:

valore: gli ultimi quattro byte della sezione dati

Esempio: (tempo di boost ritardato nome controllo selettore min = ts12, opzioni: 1-60, corrente 16, riselezionare quando 20)

I dati esadecimali ricevuti dall'assistente seriale sono.

53 54 3C 10 81 00 08 74 73 31 32 00 00 00 14 3E 45 54 F8 4E OK

Lo schermo fornisce attivamente istruzioni, vale a dire.

ST0x10 0x81 0x00 0x08 ts12 0x00 0x00 0x00 0x00 0x14 > ET   ts11 valore corrente:20 = 0x14

gauge_pointer relazionato:

set_angle Imposta l'angolo di rotazione del puntatore (tipo int)

Esempio: (nome del puntatore del barometro = gp1)

Impostare il parametro dell'angolo del puntatore: i seguenti sono verificati OK

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:-140}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:30}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:30}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:130}>ET pointer”, “widget”: “gp1”, “angle”:130}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:-110}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:0}>E

ST<{“cmd_code”: “set_angle”, “type”: “gauge_pointer”, “widget”: “gp1”, “angle”:270}>E

casella di controllo relazionato:

Il pulsante di selezione multipla viene attivamente abbassato quando lo stato cambia.

0x1020  Registrazione attiva dopo la modifica del valore del pulsante di controllo

Esempio: (nome manopola del selettore boost ritardato = cb1)

L'assistente seriale "non selezionato" ricevuto quando il valore è cambiato.

53 54 3C 10 20 00 04 63 62 31 00 3E 45 54 CA 46

Equivale a una direttiva:

ST0x10 0x20 0x00 0x0D cb1 0x00 > ET  Non verificato

Quando il valore viene modificato, l'assistente seriale "selezionato" riceve.

53 54 3C 10 20 00 04 63 62 31 01 3E 45 54 50 47

Equivale a una direttiva:

ST0x10 0x20 0x00 0x0D cb1 0x01 > ET  selezionato

Con il comando precedente testato, il passaggio successivo consiste nel programmare la funzione con sicurezza. Naturalmente, la prima cosa è ancora la connessione hardware. Stiamo usando il ESP32 consiglio di sviluppo per implementare la comunicazione con il STONE schermo seriale.

Come in Figura (10), la scheda di sviluppo NodeMCU-32S TX0, RX0 e GND è necessaria per connettersi con il STONE scheda adattatore schermo corrispondente per completare l'interazione con le informazioni HMI.

STONE l'interfaccia dello schermo è di 232 segnali, attraverso la scheda dell'adattatore nell'interfaccia MCU sono necessari segnali TX e RX, al fine di livellare la partita.

La figura (10) a sinistra è il Scheda NodeMCU-32S, filo blu (TX0), rosso (RX0) collegato alla posizione del ponticello della scheda adattatore (accanto al ponticello blu rimosso), nero anche GND.

Figura (10) Schema di collegamento della comunicazione della scheda di sviluppo NodeMCU-32S e della scheda adattatore
Figura (10) Schema di collegamento della comunicazione della scheda di sviluppo NodeMCU-32S e della scheda adattatore

4、Codice di debug

Questo progetto si concentra sulla decodifica di pulsanti, pulsanti multi-selettori e selettori di testo, nonché sull'algoritmo del puntatore del barometro, del timer per il conto alla rovescia e dell'aumento ritardato.

Avviare il processo di aumento del ritardo della pressione dell'aria, il LED blu della scheda ESP32 lampeggerà, il puntatore della pressione dell'aria dell'interfaccia del display del barometro simulerà l'aumento uniformemente ruotando verso la posizione della pressione dell'aria target (tabella 16 cm H2O con 160 invece), il conto alla rovescia del ritardo verrà visualizzato dinamicamente al secondo in diminuzione ( per un conto alla rovescia intuitivo di 1 minuto, l'uso effettivo del set generale 15 minuti - 60 minuti).

Il codice del programma sotto la registrazione è stato verificato, fare riferimento al video per l'effetto dell'operazione.

/*
Frank for Sleep Ventilator in 2022.05.03
use ESP32 of NodeMCU-32s in arduino 1.8.13
use STONE HMI in shenzhen
int (-32768,32767) unsigned int(0,65535)
button:
start---"b11"---0x62 0x31 0x31
stop---"b12"---0x
text_selector:
pressure---"ts11"---0x74 0x73 0x31 0x31
delay time--"ts12"---
checkbox:
delay boost---"cb1"---0x63 0x62 0x31
label:
min---"l21"---
sec - "l22" -
gauge pointer:---"gp1"--
*/
//------Sleep Ventilator use----------2022.05.03------
int delayTimeMin = 1; //the min of delayed pressure boost
int delayTimeSec = 0;
int inPressure = 20; // cmH2O set
int nowPressure = 0; // now cmH2O
int start = 0; // 1 = start, 0 = stop
int dealyedPressure = 1; // 1 = selector, 0 = not delay
int minShow,secShow,pointerShow;
float m1,m2,m3;
int i1,i2,i3;
//------time++ use------
int timeON = 0; // 0 = off, 1 = ON
int ii = 0;
unsigned int time_1s=0;
unsigned int time_1m=0;
unsigned int time_1h=0;
int iii = 0;
int LED_blue = 2; // IO2, turn the LED on (HIGH is the voltage level)
void setup() {
Serial.begin(115200);
pinMode(LED_blue, OUTPUT);
}
void loop() {
int inChar;
// Read the information sent by the serial port and simply decode it:
if (Serial.available() > 0) {inChar = Serial.read();}
if (inChar == 0x62) // 2 pcs button
{
if (Serial.available() > 0){inChar = Serial.read();}
if (inChar == 0x31)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x31)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
if(dealyedPressure == 1 && start == 0)
{
time_1s = 0;
time_1m = 0;
timeON = 1;
}
start = 1; //62 31 31 02 is start ok!
}
} else if (inChar == 0x32)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x02)
{
start = 0; //62 31 32 02 is stop ok!
timeON = 0;
}
}
}
}else if(inChar == 0x63) // 1 pcs checkbox
{
if (Serial.available() > 0){inChar = Serial.read();}
if (inChar == 0x62)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x31)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
dealyedPressure = 0; // 0 = not delay
timeON = 0;
}else if(inChar == 0x01)
{
dealyedPressure = 1; // 1 = selector,
if(start == 1)
{
time_1s = 0;
time_1m = 0;
timeON = 1;
}
}
}
}
}else if(inChar == 0x74) //2 pcs text selector
{
if (Serial.available() > 0){inChar = Serial.read();}
if (inChar == 0x73)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x31)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x31) // 74 73 31 31 is proessure
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
inPressure = inChar;
}
}
}
}else if (inChar == 0x32) // 74 73 31 32 is delay min
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
if (inChar == 0x00)
{
if (Serial.available() > 0){ inChar = Serial.read();}
delayTimeMin = inChar;
}
}
}
}
}
}
}
//---------show------- min-------- sec---------
if(time_1m < delayTimeMin)
{
minShow = delayTimeMin - time_1m - 1;
secShow = 59 - time_1s;
}else
{
timeON = 0;
}
if(start == 1 && dealyedPressure == 1)
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l21\",\"text\":\"");
Serial.print(minShow);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l22\",\"text\":\"");
Serial.print(secShow);
Serial.println("\"}>ET");
}else //stop or dealyedPressure == 0
{
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l21\",\"text\":\"");
Serial.print(delayTimeMin);
Serial.println("\"}>ET");
Serial.print("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"l22\",\"text\":\"");
Serial.print(delayTimeSec);
Serial.println("\"}>ET");
}
//-----------show------pressure--------
if(dealyedPressure == 0 || timeON == 0)
{
pointerShow = inPressure*17 -145;
}else
{
i1 = time_1m*60 + time_1s;
m1 = (float)delayTimeMin*60.0;
m2 = (float)i1/m1;
m3 = (float)inPressure*17.0*m2;
pointerShow = int(m3) -145;
}
if(start == 1)
{
Serial.print("ST<{\"cmd_code\":\"set_angle\",\"type\":\"gauge_pointer\",\"widget\":\"gp1\",\"angle\":");
Serial.print(pointerShow);
Serial.println("}>ET");
}else //stop
{
Serial.println("ST<{\"cmd_code\":\"set_angle\",\"type\":\"gauge_pointer\",\"widget\":\"gp1\",\"angle\":-145}>ET");
}
//------------------time ++ --------begin---------
if(timeON == 1)
{
delay(10);
ii += 1;
if(ii > 29) //sec++
{
ii = 0;
time_1s += 1;
if(time_1s >= 60) //min++
{
time_1s = 0;
time_1m += 1;
if(time_1m >= 60) //hour++
{
time_1m = 0;
time_1h += 1;
}
}
if(iii == 0){
iii = 1;
digitalWrite(LED_blue, HIGH); // turn the LED on (HIGH is the voltage level)
}else
{
iii = 0;
digitalWrite(LED_blue, LOW); // turn the LED off by making the voltage LOW
}
}
}
//------------------time ++ --------end---------
}

Istruzioni per la decodifica.

L'algoritmo di guida del puntatore del barometro utilizza operazioni tra numeri interi e numeri in virgola mobile ed è necessario prestare attenzione per utilizzare la seguente specifica del formato dell'operazione, altrimenti non otterrai il risultato corretto.

Figura (11) Regole per l'aritmetica a virgola mobile e intera
Figura (11) Regole per l'aritmetica a virgola mobile e intera

Video dell'HMI dello schermo del ventilatore

 

Scorrere fino a Top