——Dal forum degli sviluppatori DWIN
In questo numero vi presenteremo il pluripremiato caso open source del DWIN Developer Forum: Intelligent Cat Food Control System.Gli ingegneri hanno utilizzato lo schermo intelligente DWIN per monitorare la temperatura, l'umidità e la quantità rimanente di cibo per gatti e per salvare i registri del consumo di cibo del gatto.Hanno inoltre progettato in modo univoco una serie di interfacce utente in stile pittura a inchiostro, nonché un effetto clic dell'inchiostro quando viene toccato con un dito, per migliorare la percezione visiva del feedback tattile.
Introduzione:
1. Materiale fotografico dell'interfaccia utente
Lo schermo intelligente DWIN completa lo sviluppo dell'interfaccia utente in base a immagini, audio e altri materiali che devono essere preparati in anticipo in base al contenuto visualizzato sullo schermo.
2.Sviluppo dell'interfaccia
Il software DGUS ripristina l'effetto dell'interfaccia utente attraverso la sovrapposizione di livelli, combina i materiali preparati in un'immagine completa nel software DGUS e imposta le funzioni di visualizzazione e tocco.
3. Implementa effetti di clic ed effetti sonori
La posizione del tocco si ottiene tramite il programma 51, l'effetto della pressione segue il movimento del dito e si ottiene anche l'effetto sonoro dell'accompagnamento dei tasti.
(1) Rileva il codice di posizione del tocco e riproduci l'audio:
vuoto TouchDetect()
{
u16 Va[3] = 0;
u8 io = 0;
for(i = 0;i < 3;i++)
{
Va[i] = Leggi_Dgus(0x0016 + i);
se(Va[0] == 0x5A01)
{
}
altro
{
rottura;
}
}
if(i != 0) //Primo clic per accedere
{
u16 riproduci[2] = {0x0001, 0x4000};
touchAnimationFlag = 1;
touchAnimationCnt = 0;
touchPosX = Va[1];
touchPosY = Va[2];
write_dgus_vp(0x00A0, riproduci, 2);
}
}
(2) Il codice per la visualizzazione dell'effetto touch è il seguente:
vuoto TouchStart()
{
if(touchAnimationFlag == 1)
{
if(touchAnimationCnt == 0)
{
Write_Dgus(0x5011, touchPosX - 100);
Write_Dgus(0x5012, touchPosY - 100);
}
Write_Dgus(0x5000, touchAnimationCnt);
touchAnimazioneCnt++;
if(touchAnimationCnt == 6)
{
toccoAnimazioneFlag = 0;
Write_Dgus(0x5011, 1024);
Write_Dgus(0x5012, 600);
}
}
}
4. Il passo successivo è impostare i parametri corrispondenti sullo schermo, quindi trasmettere i dati al controller del cibo per gatti tramite ESP32 per realizzare la funzione di alimentazione automatica del cibo per gatti.Il codice specifico è il seguente:
//Ottieni lo stato del pulsante
void get_key_status()
{
int io = 0;
//u16 Va=Leggi_Dgus(ind);
u16 Va=Leggi_Dgus(0x1000);
se(Va!= 0x0000)
{
//Spagina tato
if(Va == 0x0103) //Inserisci il numero di g
{
u16 cambio pagina[2] = {0x5A01, 19};
setNum = luogoGramNum;
indietroPagina = 1;//Torna alla pagina di stato
Write_Dgus(0x4000 + 0, setNum % 10);
Write_Dgus(0x4000 + 2, setNum / 10 % 10);
Write_Dgus(0x4000 + 4, setNum / 100 % 10);
Write_Dgus(0x4000 + 6, setNum / 1000 % 10);
write_dgus_vp(0x0084, cambio pagina, 2);
}
altrimenti se(Va == 0x0102)
{
OneSendData3(luogoGramNum);//Postocibo per gattiuna volta
}
else if(Va == 0x0101) //Pagina di impostazione
{
u16 cambio pagina[2] = {0x5A01, 3};
per(i = 0;i < 6;i++)
{
se(i == 0)
{
Write_Dgus(0x3070 + i * 0x10 + 0, currentTime[i] % 10);
Write_Dgus(0x3070 + i * 0x10 + 2, currentTime[i] / 10 % 10);
Write_Dgus(0x3070 + i * 0x10 + 4, currentTime[i] / 100 % 10);
Write_Dgus(0x3070 + i * 0x10 + 6, currentTime[i] / 1000 % 10);
}
altro
{
Write_Dgus(0x3070 + i * 0x10 + 0, currentTime[i] % 10);
Write_Dgus(0x3070 + i * 0x10 + 2, currentTime[i] / 10 % 10);
}
}
write_dgus_vp(0x0084, cambio pagina, 2);//Entra nella pagina delle impostazioni
}
altrimenti se(Va == 0x0100) //Rpagina della registrazione
{
u16 cambio pagina[2] = {0x5A01, 2};
per(i = 0;i < 6;i++)
{
se(i == 0)
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[0][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[0][i] / 10 % 10);
Write_Dgus(0x2000 + i * 0x10 + 4, eatFeedList[0][i] / 100 % 10);
Write_Dgus(0x2000 + i * 0x10 + 6, eatFeedList[0][i] / 1000 % 10);
}
altro
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[0][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[0][i] / 10 % 10);
}
}
write_dgus_vp(0x0084, cambio pagina, 2);//Inserisci la pagina di registrazione
}
//Rpagina della registrazione
else if(Va == 0x0201) //Registra la pagina precedente
{
se(lookEatCnt > 0)
{
guardaMangiaCnt--;
per(i = 0;i < 6;i++)
{
se(i == 0)
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);
Write_Dgus(0x2000 + i * 0x10 + 4, eatFeedList[lookEatCnt][i] / 100 % 10);
Write_Dgus(0x2000 + i * 0x10 + 6, eatFeedList[lookEatCnt][i] / 1000 % 10);
}
altro
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);
}
}
}
}
else if(Va == 0x0202) //Registra la pagina successiva
{
if(guardaCntMangia < mangiaCnt - 1)
{
guardaMangiaCnt++;
per(i = 0;i < 6;i++)
{
se(i == 0)
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);
Write_Dgus(0x2000 + i * 0x10 + 4, eatFeedList[lookEatCnt][i] / 100 % 10);
Write_Dgus(0x2000 + i * 0x10 + 6, eatFeedList[lookEatCnt][i] / 1000 % 10);
}
altro
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);
}
}
}
}
//Pagina delle impostazioni
altrimenti se(Va == 0x0302)
{
if(Modalitàtempo == 1)
{
modalitàtempo = 0;
Write_Dgus(0x3A12, 139);
}
}
altrimenti se(Va == 0x0303)
{
if(Modalitàtempo == 0)
{
modalitàtempo = 1;
Write_Dgus(0x3A12, 242);
}
}
altrimenti se(Va >= 0x0304 && Va <= 0x0309)
{
u16 cambio pagina[2] = {0x5A01, 19};
indietroPagina = 3;
backNum = Va;
setNum = timrIntervalHour[Va - 0x0304];
Write_Dgus(0x4000 + 0, setNum % 10);
Write_Dgus(0x4000 + 2, setNum / 10 % 10);
Write_Dgus(0x4000 + 4, setNum / 100 % 10);
Write_Dgus(0x4000 + 6, setNum / 1000 % 10);
write_dgus_vp(0x0084, cambio pagina, 2);
}
altrimenti se(Va >= 0x030A && Va <= 0x030F)
{
u16 cambio pagina[2] = {0x5A01, 19};
indietroPagina = 3;
backNum = Va;
setNum = OraCorrente[Va - 0x030A];
Write_Dgus(0x4000 + 0, setNum % 10);
Write_Dgus(0x4000 + 2, setNum / 10 % 10);
Write_Dgus(0x4000 + 4, setNum / 100 % 10);
Write_Dgus(0x4000 + 6, setNum / 1000 % 10);
write_dgus_vp(0x0084, cambio pagina, 2);
}
//Aregolare la pagina dei dati
altrimenti se(Va == 0x0400) //Confermare
{
u16 cambio pagina[2] = {0x5A01, 0x0000};
switchpage[1] = backPage;
if(backPage == 1) //Torna alla pagina di stato
{
luogoGramNum = setNum;
Write_Dgus(0x1140 + 0, placeGramNum % 10);
Write_Dgus(0x1140 + 2, placeGramNum / 10 % 10);
}
altrimenti se(backPage == 3)
{
if(backNum >= 0x0304 && backNum <= 0x0309)
{
selezione u16 = 0;
seleziona = (backNum - 0x0304) * 0x10;
timrIntervalHour[backNum - 0x0304] = setNum;
Write_Dgus(0x3010 + seleziona + 0, setNum % 10);
Write_Dgus(0x3010 + seleziona + 2, setNum / 10 % 10);
}
altrimenti se(backNum >= 0x030A && backNum <= 0x030F)
{
selezione u16 = 0;
seleziona = (backNum - 0x0304) * 0x10;
currentTime[backNum - 0x030A] = setNum;
if(backNum == 0x030A)
{
Write_Dgus(0x3010 + seleziona + 0, setNum % 10);
Write_Dgus(0x3010 + seleziona + 2, setNum / 10 % 10);
Write_Dgus(0x3010 + seleziona + 4, setNum / 100 % 10);
Write_Dgus(0x3010 + seleziona + 6, setNum / 1000 % 10);
}
altro
{
Write_Dgus(0x3010 + seleziona + 0, setNum % 10);
Write_Dgus(0x3010 + seleziona + 2, setNum / 10 % 10);
}
}
}
write_dgus_vp(0x0084, cambio pagina, 2);
}
altrimenti se(Va == 0x0401) //Indietro
{
u16 cambio pagina[2] = {0x5A01, 0x0000};
switchpage[1] = backPage;
write_dgus_vp(0x0084, cambio pagina, 2);
}
else if(Va == 0x0402) //Aumento numerico
{
setNum++;
Write_Dgus(0x4000 + 0, setNum % 10);
Write_Dgus(0x4000 + 2, setNum / 10 % 10);
Write_Dgus(0x4000 + 4, setNum / 100 % 10);
Write_Dgus(0x4000 + 6, setNum / 1000 % 10);
}
else if(Va == 0x0403) //Diminuzione numerica
{
se(Numeroimpostato > 0)
setNum--;
Write_Dgus(0x4000 + 0, setNum % 10);
Write_Dgus(0x4000 + 2, setNum / 10 % 10);
Write_Dgus(0x4000 + 4, setNum / 100 % 10);
Write_Dgus(0x4000 + 6, setNum / 1000 % 10);
}
Write_Dgus(0x1000, 0);
}
}
Orario di pubblicazione: 19 settembre 2023