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

——Са ДВИН форума за програмере

У овом броју ћемо вам представити награђивани случај отвореног кода са ДВИН Девелопер Форума: Интелигентни систем за контролу хране за мачке.Инжењери су користили ДВИН паметни екран да надгледају температуру, влажност и преосталу количину хране за мачке, као и да сачувају евиденцију о једењу мачке.Такође су јединствено дизајнирали скуп корисничког интерфејса у стилу сликања мастилом, као и ефекат клика мастилом када се додирне прстом, како би побољшали визуелну перцепцију повратних информација о додиру.

Увод:

1.УИ сликовни материјал

ДВИН паметни екран завршава развој корисничког интерфејса на основу слика, звука и других материјала који се морају унапред припремити у складу са садржајем екрана.

асв (2)

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

Софтвер ДГУС враћа ефекат корисничког интерфејса преко слојева, комбинује припремљене материјале у комплетну слику у ДГУС софтверу и поставља функције екрана и додира.

асв (1)

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

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

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

воид ТоуцхДетецт()

{

    у16 Ва[3] = 0;

    у8 и = 0;

 

    фор(и = 0;и <3;и++)

    {

        Ва[и] = Реад_Дгус(0к0016 + и);

        иф(Ва[0] == 0к5А01)

        {

        }

        друго

        {

            пауза;

        }

    }

    иф(и != 0) //Први клик за улазак

    {

        у16 плаи[2] = {0к0001, 0к4000};

        тоуцхАниматионФлаг = 1;

        тоуцхАниматионЦнт = 0;

        тоуцхПосКс = Ва[1];

        тоуцхПосИ = Ва[2];

        врите_дгус_вп(0к00А0, плаи, 2);

    }

}

 

(2) Код за екран са ефектом додира је следећи:

воид ТоуцхСтарт()

{

    иф(тоуцхАниматионФлаг == 1)

    {

        иф(тоуцхАниматионЦнт == 0)

        {

            Врите_Дгус(0к5011, тоуцхПосКс - 100);

            Врите_Дгус(0к5012, тоуцхПосИ - 100);

        }

 

        Врите_Дгус(0к5000, тоуцхАниматионЦнт);

        тоуцхАниматионЦнт++;

 

        иф(тоуцхАниматионЦнт == 6)

        {

            тоуцхАниматионФлаг = 0;

            Врите_Дгус(0к5011, 1024);

            Врите_Дгус(0к5012, 600);

        }

    }

    

}

 

4. Следећи корак је постављање одговарајућих параметара кроз екран, а затим преношење података на контролер хране за мачке преко ЕСП32 да би се реализовала функција аутоматског храњења мачје хране.Конкретан код је следећи:

//Преузми статус дугмета

воид гет_кеи_статус()

{

    инт и = 0;

    //у16 Ва=Реад_Дгус(аддр);

    у16 Ва=Реад_Дгус(0к1000);

    иф(Ва != 0к0000)

    {

        //Sтатус паге

        иф(Ва == 0к0103) //Поставите број г

        {

            у16 свитцхпаге[2] = {0к5А01, 19};

            сетНум = плацеГрамНум;

            бацкПаге = 1;//Повратак на страницу са статусом

            Врите_Дгус(0к4000 + 0, сетНум % 10);

            Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);

            Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);

            Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);

            врите_дгус_вп(0к0084, свитцхпаге, 2);

        }

        иначе иф(Ва == 0к0102)

        {

            ОнеСендДата3(плацеГрамНум);//Местохрана за мачкеједном

        }

        елсе иф(Ва == 0к0101) //Страница подешавања

        {

            у16 свитцхпаге[2] = {0к5А01, 3};

            фор(и = 0;и < 6;и++)

            {

                иф(и == 0)

                {

                    Врите_Дгус(0к3070 + и * 0к10 + 0, цуррентТиме[и] % 10);

                    Врите_Дгус(0к3070 + и * 0к10 + 2, цуррентТиме[и] / 10 % 10);

                    Врите_Дгус(0к3070 + и * 0к10 + 4, цуррентТиме[и] / 100 % 10);

                    Врите_Дгус(0к3070 + и * 0к10 + 6, цуррентТиме[и] / 1000 % 10);

                }

                друго

                {

                    Врите_Дгус(0к3070 + и * 0к10 + 0, цуррентТиме[и] % 10);

                    Врите_Дгус(0к3070 + и * 0к10 + 2, цуррентТиме[и] / 10 % 10);

                }

            }

            врите_дгус_вп(0к0084, свитцхпаге, 2);//Уђите на страницу са подешавањима

        }

        елсе иф(Ва == 0к0100) //Rстраница са записима

        {

            у16 свитцхпаге[2] = {0к5А01, 2};

            фор(и = 0;и < 6;и++)

            {

                иф(и == 0)

                {

                    Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[0][и] % 10);

                    Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[0][и] / 10 % 10);

                    Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[0][и] / 100 % 10);

                    Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[0][и] / 1000 % 10);

                }

                друго

                {

                    Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[0][и] % 10);

                    Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[0][и] / 10 % 10);

                }

            }

            врите_дгус_вп(0к0084, свитцхпаге, 2);//Унесите страницу са записом

        }

        //Rстраница са записима

        елсе иф(Ва == 0к0201) //Сними претходну страницу

        {

            иф(лоокЕатЦнт > 0)

            {

                лоокЕатЦнт--;

                фор(и = 0;и < 6;и++)

                {

                    иф(и == 0)

                    {

                        Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[лоокЕатЦнт][и] / 100 % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[лоокЕатЦнт][и] / 1000 % 10);

                    }

                    друго

                    {

                        Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);

                    }

                }

            }

        }

        елсе иф(Ва == 0к0202) //Сними страницу следећу страницу

        {

            иф(лоокЕатЦнт < еатЦнт - 1)

            {

                лоокЕатЦнт++;

                фор(и = 0;и < 6;и++)

                {

                    иф(и == 0)

                    {

                        Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[лоокЕатЦнт][и] / 100 % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[лоокЕатЦнт][и] / 1000 % 10);

                    }

                    друго

                    {

                        Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);

                        Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);

                    }

                }

            }

        }

        //Страница подешавања

        иначе иф(Ва == 0к0302)

        {

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

            {

                тимеМоде = 0;

                Врите_Дгус(0к3А12, 139);

            }

        }

        иначе иф(Ва == 0к0303)

        {

            иф(тимеМоде == 0)

            {

                тимеМоде = 1;

                Врите_Дгус(0к3А12, 242);

            }

        }

        елсе иф(Ва >= 0к0304 && Ва <= 0к0309)

        {

            у16 свитцхпаге[2] = {0к5А01, 19};

            бацкПаге = 3;

            бацкНум = Ва;

            сетНум = тимрИнтервалХоур[Ва - 0к0304];

            Врите_Дгус(0к4000 + 0, сетНум % 10);

            Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);

            Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);

            Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);

            врите_дгус_вп(0к0084, свитцхпаге, 2);

        }

        елсе иф(Ва >= 0к030А && Ва <= 0к030Ф)

        {

            у16 свитцхпаге[2] = {0к5А01, 19};

            бацкПаге = 3;

            бацкНум = Ва;

            сетНум = ЦуррентТиме[Ва - 0к030А];

            Врите_Дгус(0к4000 + 0, сетНум % 10);

            Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);

            Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);

            Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);

            врите_дгус_вп(0к0084, свитцхпаге, 2);

        }

        //Aподеси страницу са подацима

        елсе иф(Ва == 0к0400) //Потврди

        {

            у16 свитцхпаге[2] = {0к5А01, 0к0000};

            свитцхпаге[1] = бацкПаге;

            иф(бацкПаге == 1) //Повратак на страницу са статусом

            {

                плацеГрамНум = сетНум;

                Врите_Дгус(0к1140 + 0, плацеГрамНум % 10);

                Врите_Дгус(0к1140 + 2, плацеГрамНум / 10 % 10);

            }

            елсе иф(бацкПаге == 3)

            {

                иф(бацкНум >= 0к0304 && бацкНум <= 0к0309)

                {

                    у16 селецт = 0;

                    селецт = (назадНум - 0к0304) * 0к10;

                    тимрИнтервалХоур[назадНум - 0к0304] = сетНум;

                    Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);

                    Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);

                }

                елсе иф(бацкНум >= 0к030А && бацкНум <= 0к030Ф)

                {

                    у16 селецт = 0;

                    селецт = (назадНум - 0к0304) * 0к10;

                    цуррентТиме[бацкНум - 0к030А] = сетНум;

                    

                    иф(назадНум == 0к030А)

                    {

                        Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);

                        Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);

                        Врите_Дгус(0к3010 + селецт + 4, сетНум / 100 % 10);

                        Врите_Дгус(0к3010 + селецт + 6, сетНум / 1000 % 10);

                    }

                    друго

                    {

                        Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);

                        Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);

                    }

                }

            }

            врите_дгус_вп(0к0084, свитцхпаге, 2);

        }

        елсе иф(Ва == 0к0401) //Назад

        {

            у16 свитцхпаге[2] = {0к5А01, 0к0000};

            свитцхпаге[1] = бацкПаге;

            врите_дгус_вп(0к0084, свитцхпаге, 2);

        }

        елсе иф(Ва == 0к0402) //Нумеричко повећање

        {

            сетНум++;

            Врите_Дгус(0к4000 + 0, сетНум % 10);

            Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);

            Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);

            Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);

        }

        елсе иф(Ва == 0к0403) //Нумеричко смањење

        {

            иф(сетНум > 0)

                сетНум--;

            Врите_Дгус(0к4000 + 0, сетНум % 10);

            Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);

            Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);

            Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);

        }

        

        Врите_Дгус(0к1000, 0);

    }

}


Време поста: 19.09.2023