[Caso pluripremiato] Sistema di controllo intelligente degli alimenti per gatti

——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.

asv (2)

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.

asv (1)

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