——Från DWIN Developer Forum
I det här numret kommer vi att presentera det prisbelönta fallet med öppen källkod från DWIN Developer Forum: Intelligent Cat Food Control System. Ingenjörer använde DWINs smarta skärm för att övervaka temperatur, luftfuktighet och återstående mängd kattmat, och för att spara kattens matuppteckningar. De har också unikt designat en uppsättning av gränssnitt för bläckmålningsstil, samt en bläckklickeffekt när de berörs av ett finger, för att förbättra den visuella uppfattningen av beröringsfeedback.
Introduktion:
1.UI bildmaterial
DWIN smart skärm slutför UI-utveckling baserat på bilder, ljud och annat material måste förberedas i förväg enligt skärmens innehåll.
![usa (2)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96bce84b7f87048.jpg)
2.Gränssnittsutveckling
DGUS-mjukvaran återställer UI-effekten genom lageröverlagring, kombinerar de förberedda materialen till en komplett bild i DGUS-mjukvaran och ställer in display- och pekfunktionerna.
![usa (1)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96bd07e78a77806.jpg)
3. Implementera klickeffekter och ljudeffekter
Anslagspositionen erhålls genom programmet 51, tryckningseffekten följer fingrets rörelse och ljudeffekten för tangentackompanjemanget uppnås också.
(1) Upptäck pekkod och spela upp ljud:
void TouchDetect()
{
u16 Och[3] = 0;
u8i = 0;
för(i = 0;i
{
Va[i] = Read_Dgus(0x0016 + i);
if(Va[0] == 0x5A01)
{
}
annan
{
ha sönder;
}
}
if(i != 0) //Klicka först för att komma in
{
u16 play[2] = {0x0001, 0x4000};
touchAnimationFlag = 1;
touchAnimationCnt = 0;
touchPosX = Va[1];
touchPosY = Va[2];
write_dgus_vp(0x00A0, spela, 2);
}
}
(2) Koden för pekeffektdisplay är följande:
void TouchStart()
{
if(touchAnimationFlag == 1)
{
if(touchAnimationCnt == 0)
{
Write_Dgus(0x5011, touchPosX - 100);
Write_Dgus(0x5012, touchPosY - 100);
}
Write_Dgus(0x5000, touchAnimationCnt);
touchAnimationCnt++;
if(touchAnimationCnt == 6)
{
touchAnimationFlag = 0;
Write_Dgus(0x5011, 1024);
Write_Dgus(0x5012, 600);
}
}
}
4. Nästa steg är att ställa in motsvarande parametrar genom skärmen och sedan överföra data till kattmatskontrollen via ESP32 för att realisera den automatiska matningsfunktionen för kattmat. Den specifika koden är som följer:
//Hämta knappstatus
void get_key_status()
{
int i = 0;
//u16 Va=Read_Dgus(addr);
u16 Va=Read_Dgus(0x1000);
if(Va != 0x0000)
{
//Sdold sida
if(Va == 0x0103) //Placera antalet g
{
u16 switchpage[2] = {0x5A01, 19};
setNum = placeGramNum;
baksida = 1; //Återgå till statussidan
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, switchpage, 2);
}
annat om(Va == 0x0102)
{
OneSendData3(placeGramNum); //Platskattmaten gång
}
else if(Va == 0x0101) //Inställningssida
{
u16 switchpage[2] = {0x5A01, 3};
för(i = 0;i
{
om(i == 0)
{
Write_Dgus(0x3070 + i * 0x10 + 0, aktuellTid[i] % 10);
Write_Dgus(0x3070 + i * 0x10 + 2, aktuellTid[i] / 10 % 10);
Write_Dgus(0x3070 + i * 0x10 + 4, aktuellTid[i] / 100 % 10);
Write_Dgus(0x3070 + i * 0x10 + 6, aktuellTid[i] / 1000 % 10);
}
annan
{
Write_Dgus(0x3070 + i * 0x10 + 0, aktuellTid[i] % 10);
Write_Dgus(0x3070 + i * 0x10 + 2, aktuellTid[i] / 10 % 10);
}
}
write_dgus_vp(0x0084, switchpage, 2); //Öppna inställningssidan
}
annat om(Va == 0x0100) //Record sida
{
u16 switchpage[2] = {0x5A01, 2};
för(i = 0;i
{
om(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);
}
annan
{
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, switchpage, 2); // Gå in på postsidan
}
//Record sida
else if(Va == 0x0201) //Record page föregående sida
{
if(lookEatCnt > 0)
{
lookEatCnt--;
för(i = 0;i
{
om(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);
}
annan
{
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) //Record page next page
{
if(lookEatCnt
{
lookEatCnt++;
för(i = 0;i
{
om(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);
}
annan
{
Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);
Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);
}
}
}
}
//Inställningssida
annat om(Va == 0x0302)
{
if(timeMode == 1)
{
timeMode = 0;
Write_Dgus(0x3A12, 139);
}
}
annat om(Va == 0x0303)
{
if(timeMode == 0)
{
timeMode = 1;
Write_Dgus(0x3A12, 242);
}
}
annat om(Va >= 0x0304 && Va
{
u16 switchpage[2] = {0x5A01, 19};
baksida = 3;
backNum = And;
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, switchpage, 2);
}
annat om(Va >= 0x030A && Va
{
u16 switchpage[2] = {0x5A01, 19};
baksida = 3;
backNum = And;
setNum = aktuellTid[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, switchpage, 2);
}
//Ajustera datasidan
annat om(Va == 0x0400) //Bekräfta
{
u16 switchpage[2] = {0x5A01, 0x0000};
switchpage[1] = baksida;
if(backPage == 1) //Återgå till statussidan
{
placeGramNum = setNum;
Write_Dgus(0x1140 + 0, placeGramNum % 10);
Write_Dgus(0x1140 + 2, placeGramNum / 10 % 10);
}
else if(backPage == 3)
{
if(backNum >= 0x0304 && backNum
{
u16 välj = 0;
välj = (backNum - 0x0304) * 0x10;
timrIntervalHour[backNum - 0x0304] = setNum;
Write_Dgus(0x3010 + välj + 0, setNum % 10);
Write_Dgus(0x3010 + välj + 2, setNum / 10 % 10);
}
else if(backNum >= 0x030A && backNum
{
u16 välj = 0;
välj = (backNum - 0x0304) * 0x10;
currentTime[backNum - 0x030A] = setNum;
if(backNum == 0x030A)
{
Write_Dgus(0x3010 + välj + 0, setNum % 10);
Write_Dgus(0x3010 + välj + 2, setNum / 10 % 10);
Write_Dgus(0x3010 + välj + 4, setNum / 100 % 10);
Write_Dgus(0x3010 + välj + 6, setNum / 1000 % 10);
}
annan
{
Write_Dgus(0x3010 + välj + 0, setNum % 10);
Write_Dgus(0x3010 + välj + 2, setNum / 10 % 10);
}
}
}
write_dgus_vp(0x0084, switchpage, 2);
}
annat om(Va == 0x0401) //Tillbaka
{
u16 switchpage[2] = {0x5A01, 0x0000};
switchpage[1] = baksida;
write_dgus_vp(0x0084, switchpage, 2);
}
annars if(Va == 0x0402) //Numerisk ökning
{
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);
}
annars if(Va == 0x0403) //Numerisk minskning
{
if(setNum > 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);
}
}
Posttid: 2023-09-19