[Награден случај] Интелигентен систем за контрола на храна за мачки

——Од форумот за програмери на DWIN

Во ова издание, ќе ви го претставиме наградуваниот футрола со отворен код од Форумот за програмери на DWIN: Интелигентен систем за контрола на храна за мачки.Инженерите го користеа паметниот екран DWIN за да ја следат температурата, влажноста и преостанатата количина на храна за мачки и да ги зачуваат записите за јадење храна на мачката.Тие, исто така, уникатно дизајнираа сет на интерфејс во стилот на сликање со мастило, како и ефект на кликнување со мастило кога ќе се допре со прст, за да се подобри визуелната перцепција на повратните информации од допир.

Вовед:

Материјал за слика со 1.UI

Паметниот екран на DWIN го комплетира развојот на корисничкиот интерфејс врз основа на слики, аудио и други материјали што треба да се подготват однапред според содржината на екранот.

asv (2)

2. Развој на интерфејс

Софтверот DGUS го враќа ефектот на интерфејсот преку преклопување на слоеви, ги комбинира подготвените материјали во целосна слика во софтверот DGUS и ги поставува функциите на екранот и допирот.

asv (1)

3. Имплементирајте ефекти на кликнување и звучни ефекти

Позицијата на допир се добива преку програмата 51, ефектот на притискање го следи движењето на прстот, а се постигнува и звучниот ефект на придружба на клучот.

(1) Откријте го кодот за локација на допир и репродуцирајте аудио:

void TouchDetect()

{

    u16 Va[3] = 0;

    u8 i = 0;

 

    за(i = 0;i <3;i++)

    {

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

        ако (Va[0] == 0x5A01)

        {

        }

        друго

        {

            пауза;

        }

    }

    if(i != 0) //Прв кликнете за да влезете

    {

        u16 игра[2] = {0x0001, 0x4000};

        touchAnimationFlag = 1;

        touchAnimationCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp (0x00A0, игра, 2);

    }

}

 

(2) Кодот за приказ со ефект на допир е како што следува:

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. Следниот чекор е да ги поставите соодветните параметри преку екранот, а потоа да ги пренесете податоците до контролорот за храна за мачки преку ESP32 за да се реализира функцијата за автоматско хранење на храната за мачки.Специфичниот код е како што следува:

//Добиј статус на копчето

неважечки get_key_status()

{

    int i = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    ако (Va != 0x0000)

    {

        //Sтатус страница

        if(Va == 0x0103) //Поставете го бројот на g

        {

            u16 прекинувач[2] = {0x5A01, 19};

            setNum = местоGramNum;

            задна страна = 1;//Врати се на страницата за статус

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

        }

        друго ако (Va == 0x0102)

        {

            OneSendData3 (placeGramNum);//Местохрана за мачкиеднаш

        }

        друго ако (Va == 0x0101) //Страница за поставки

        {

            u16 прекинувач[2] = {0x5A01, 3};

            за(i = 0;i <6;i++)

            {

                ако (i == 0)

                {

                    Write_Dgus(0x3070 + i * 0x10 + 0, тековноВреме[i] % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 2, тековноВреме[i] / 10 % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 4, тековноВреме[i] / 100 % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 6, тековноВреме[i] / 1000 % 10);

                }

                друго

                {

                    Write_Dgus(0x3070 + i * 0x10 + 0, тековноВреме[i] % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 2, тековноВреме[i] / 10 % 10);

                }

            }

            write_dgus_vp (0x0084, switchpage, 2);//Внесете ја страницата за поставки

        }

        друго ако (Va == 0x0100) //Rевиденција страница

        {

            u16 преклопна страница[2] = {0x5A01, 2};

            за(i = 0;i <6;i++)

            {

                ако (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);

                }

                друго

                {

                    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);//Внесете ја страницата за запис

        }

        //Rевиденција страница

        друго ако (Va == 0x0201) //Сними ја претходната страница

        {

            if (lookEatCnt > 0)

            {

                lookEatCnt--;

                за(i = 0;i <6;i++)

                {

                    ако (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);

                    }

                    друго

                    {

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

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

                    }

                }

            }

        }

        друго ако (Va == 0x0202) //Сними ја следната страница

        {

            if(lookEatCnt < eatCnt - 1)

            {

                lookEatCnt++;

                за(i = 0;i <6;i++)

                {

                    ако (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);

                    }

                    друго

                    {

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

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

                    }

                }

            }

        }

        //Страница за поставки

        друго ако (Va == 0x0302)

        {

            ако (временски режим == 1)

            {

                временски режим = 0;

                Write_Dgus (0x3A12, 139);

            }

        }

        друго ако (Va == 0x0303)

        {

            ако (временски режим == 0)

            {

                временски режим = 1;

                Write_Dgus (0x3A12, 242);

            }

        }

        друго ако (Va >= 0x0304 && Va <= 0x0309)

        {

            u16 прекинувач[2] = {0x5A01, 19};

            задна страна = 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);

        }

        друго ако (Va >= 0x030A && Va <= 0x030F)

        {

            u16 прекинувач[2] = {0x5A01, 19};

            задна страна = 3;

            backNum = Va;

            setNum = сегашноВреме[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);

        }

        //Aприспособете ја страницата со податоци

        друго ако(Va == 0x0400) //Потврди

        {

            u16 прекинувач[2] = {0x5A01, 0x0000};

            прекинувач[1] = задна страна;

            if(backPage == 1) //Врати се на страницата за статус

            {

                placeGramNum = setNum;

                Write_Dgus(0x1140 + 0, местоGramNum % 10);

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

            }

            друго ако (задна страна == 3)

            {

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

                {

                    u16 изберете = 0;

                    изберете = (заден број - 0x0304) * 0x10;

                    timrIntervalHour[backNum - 0x0304] = setNum;

                    Write_Dgus(0x3010 + изберете + 0, setNum % 10);

                    Write_Dgus(0x3010 + изберете + 2, setNum / 10 % 10);

                }

                друго ако (backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 изберете = 0;

                    изберете = (заден број - 0x0304) * 0x10;

                    CurrentTime[backNum - 0x030A] = setNum;

                    

                    ако (заден број == 0x030A)

                    {

                        Write_Dgus(0x3010 + изберете + 0, setNum % 10);

                        Write_Dgus(0x3010 + изберете + 2, setNum / 10 % 10);

                        Write_Dgus(0x3010 + изберете + 4, setNum / 100 % 10);

                        Write_Dgus(0x3010 + изберете + 6, setNum / 1000 % 10);

                    }

                    друго

                    {

                        Write_Dgus(0x3010 + изберете + 0, setNum % 10);

                        Write_Dgus(0x3010 + изберете + 2, setNum / 10 % 10);

                    }

                }

            }

            write_dgus_vp (0x0084, switchpage, 2);

        }

        друго ако(Va == 0x0401) //Назад

        {

            u16 прекинувач[2] = {0x5A01, 0x0000};

            прекинувач[1] = задна страна;

            write_dgus_vp (0x0084, switchpage, 2);

        }

        друго ако(Va == 0x0402) //Нумеричко зголемување

        {

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

        }

        друго ако(Va == 0x0403) //Нумеричко намалување

        {

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

    }

}


Време на објавување: 19-ти септември 2023 година