[Caz premiat] Sistem inteligent de control al hranei pentru pisici

——De la DWIN Developer Forum

În acest număr, vă vom prezenta cazul premiat cu sursă deschisă de la Forumul dezvoltatorilor DWIN: Sistem inteligent de control al hranei pentru pisici.Inginerii au folosit ecranul inteligent DWIN pentru a monitoriza temperatura, umiditatea și cantitatea rămasă de hrană pentru pisici și pentru a salva înregistrările de mâncare ale pisicii.De asemenea, au proiectat în mod unic un set de interfață de utilizare în stil de pictură cu cerneală, precum și un efect de clic de cerneală atunci când este atins de un deget, pentru a îmbunătăți percepția vizuală a feedback-ului tactil.

Introducere:

1.Material de imagine UI

Ecranul inteligent DWIN completează dezvoltarea interfeței de utilizare pe baza imaginilor, audio și alte materiale care trebuie pregătite în prealabil în funcție de conținutul afișat pe ecran.

asv (2)

2. Dezvoltarea interfeței

Software-ul DGUS restabilește efectul UI prin suprapunerea stratului, combină materialele pregătite într-o imagine completă în software-ul DGUS și setează funcțiile de afișare și atingere.

asv (1)

3. Implementați efecte de clic și efecte sonore

Poziția tactilă se obține prin programul 51, efectul de apăsare urmărește mișcarea degetului și se realizează și efectul sonor de acompaniament al tastelor.

(1) Detectează codul locației tactile și redă sunet:

void TouchDetect()

{

    u16 Va[3] = 0;

    u8 i = 0;

 

    pentru(i = 0;i < 3;i++)

    {

        Va[i] = Read_Dgus(0x0016 + i);

        dacă(Va[0] == 0x5A01)

        {

        }

        altfel

        {

            pauză;

        }

    }

    if(i != 0) //Primul dați clic pentru a intra

    {

        u16 play[2] = {0x0001, 0x4000};

        touchAnimationFlag = 1;

        touchAnimationCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, redare, 2);

    }

}

 

(2) Codul pentru afișarea cu efect tactil este următorul:

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. Următorul pas este să setați parametrii corespunzători prin intermediul ecranului și apoi să transmiteți datele către controlerul hranei pentru pisici prin ESP32 pentru a realiza funcția de hrănire automată a hranei pentru pisici.Codul specific este următorul:

//Obține starea butonului

void get_key_status()

{

    int i = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    dacă(Va != 0x0000)

    {

        //Spagina tatus

        if(Va == 0x0103) //Plasează numărul de g

        {

            u16 switchpage[2] = {0x5A01, 19};

            setNum = placeGramNum;

            BackPage = 1;//Revenire la pagina de stare

            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);

        }

        else if(Va == 0x0102)

        {

            OneSendData3(placeGramNum);//LocMâncare pentru pisicio singura data

        }

        else if(Va == 0x0101) //Pagina de setare

        {

            u16 switchpage[2] = {0x5A01, 3};

            pentru(i = 0;i < 6;i++)

            {

                dacă (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);

                }

                altfel

                {

                    Write_Dgus(0x3070 + i * 0x10 + 0, currentTime[i] % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 2, currentTime[i] / 10 % 10);

                }

            }

            write_dgus_vp(0x0084, switchpage, 2);//Intră în pagina de setări

        }

        else if(Va == 0x0100) //Rpagina ecord

        {

            u16 switchpage[2] = {0x5A01, 2};

            pentru(i = 0;i < 6;i++)

            {

                dacă (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);

                }

                altfel

                {

                    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);//Intră în pagina de înregistrare

        }

        //Rpagina ecord

        else if(Va == 0x0201) //Înregistrează pagina precedentă

        {

            if(lookEatCnt > 0)

            {

                uiteEatCnt--;

                pentru(i = 0;i < 6;i++)

                {

                    dacă (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);

                    }

                    altfel

                    {

                        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) //Înregistrează pagina următoare

        {

            if(lookEatCnt < eatCnt - 1)

            {

                lookEatCnt++;

                pentru(i = 0;i < 6;i++)

                {

                    dacă (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);

                    }

                    altfel

                    {

                        Write_Dgus(0x2000 + i * 0x10 + 0, eatFeedList[lookEatCnt][i] % 10);

                        Write_Dgus(0x2000 + i * 0x10 + 2, eatFeedList[lookEatCnt][i] / 10 % 10);

                    }

                }

            }

        }

        //Pagina de setare

        else if(Va == 0x0302)

        {

            if(timeMode == 1)

            {

                timeMode = 0;

                Write_Dgus(0x3A12, 139);

            }

        }

        else if(Va == 0x0303)

        {

            if(timeMode == 0)

            {

                timeMode = 1;

                Write_Dgus(0x3A12, 242);

            }

        }

        else if(Va >= 0x0304 && Va <= 0x0309)

        {

            u16 switchpage[2] = {0x5A01, 19};

            BackPage = 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, switchpage, 2);

        }

        altfel dacă (Va >= 0x030A && Va <= 0x030F)

        {

            u16 switchpage[2] = {0x5A01, 19};

            BackPage = 3;

            backNum = Va;

            setNum = currentTime[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);

        }

        //Aajustați pagina de date

        else if(Va == 0x0400) //A confirma

        {

            u16 switchpage[2] = {0x5A01, 0x0000};

            switchpage[1] = BackPage;

            if(backPage == 1) //Revenire la pagina de stare

            {

                placeGramNum = setNum;

                Write_Dgus(0x1140 + 0, placeGramNum % 10);

                Write_Dgus(0x1140 + 2, placeGramNum / 10 % 10);

            }

            else if(backPage == 3)

            {

                if(backNum >= 0x0304 && backNum <= 0x0309)

                {

                    u16 select = 0;

                    select = (backNum - 0x0304) * 0x10;

                    timrIntervalHour[backNum - 0x0304] = setNum;

                    Write_Dgus(0x3010 + select + 0, setNum % 10);

                    Write_Dgus(0x3010 + select + 2, setNum / 10 % 10);

                }

                else if(backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 select = 0;

                    select = (backNum - 0x0304) * 0x10;

                    currentTime[backNum - 0x030A] = setNum;

                    

                    if(backNum == 0x030A)

                    {

                        Write_Dgus(0x3010 + select + 0, setNum % 10);

                        Write_Dgus(0x3010 + select + 2, setNum / 10 % 10);

                        Write_Dgus(0x3010 + select + 4, setNum / 100 % 10);

                        Write_Dgus(0x3010 + select + 6, setNum / 1000 % 10);

                    }

                    altfel

                    {

                        Write_Dgus(0x3010 + select + 0, setNum % 10);

                        Write_Dgus(0x3010 + select + 2, setNum / 10 % 10);

                    }

                }

            }

            write_dgus_vp(0x0084, switchpage, 2);

        }

        else if(Va == 0x0401) //Înapoi

        {

            u16 switchpage[2] = {0x5A01, 0x0000};

            switchpage[1] = BackPage;

            write_dgus_vp(0x0084, switchpage, 2);

        }

        else if(Va == 0x0402) //Mărire numerică

        {

            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) //Scădere numerică

        {

            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);

    }

}


Ora postării: 19-sept-2023