[Випадок, що отримав нагороду] Інтелектуальна система контролю їжі для котів

——З форуму розробників DWIN

У цьому випуску ми познайомимо вас із відзначеним нагородами кейсом з відкритим кодом від форуму розробників DWIN: розумна система контролю корму для котів.Інженери використовували інтелектуальний екран DWIN, щоб контролювати температуру, вологість і кількість котячого корму, що залишилася, а також зберігати записи про споживання ними їжі.Вони також унікально розробили набір інтерфейсу користувача в стилі малювання чорнилом, а також ефект клацання чорнилом при дотику пальцем, щоб покращити візуальне сприйняття зворотного зв’язку дотиком.

Вступ:

1.Інтерфейс зображення матеріалу

Розумний екран DWIN завершує розробку інтерфейсу користувача на основі зображень, аудіо та інших матеріалів, які потрібно підготувати заздалегідь відповідно до вмісту екрана.

asv (2)

2. Розробка інтерфейсу

Програмне забезпечення DGUS відновлює ефект інтерфейсу користувача за допомогою накладення шарів, об’єднує підготовлені матеріали в повну картинку в програмному забезпеченні DGUS і налаштовує функції відображення та дотику.

asv (1)

3. Реалізуйте ефекти клацання та звукові ефекти

Позиція дотику визначається за допомогою програми 51, ефект натискання слідує за рухом пальця, а також досягається звуковий ефект клавішного супроводу.

(1) Визначити код місця дотику та відтворити аудіо:

void TouchDetect()

{

    u16 Va[3] = 0;

    u8 i = 0;

 

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

    {

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

        якщо (Va[0] == 0x5A01)

        {

        }

        інше

        {

            перерва;

        }

    }

    if(i != 0) //Спершу натисніть, щоб увійти

    {

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

        touchAnimationFlag = 1;

        touchAnimationCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, відтворення, 2);

    }

}

 

(2) Код для відображення сенсорного ефекту виглядає наступним чином:

void TouchStart()

{

    якщо (touchAnimationFlag == 1)

    {

        якщо (touchAnimationCnt == 0)

        {

            Write_Dgus(0x5011, touchPosX - 100);

            Write_Dgus(0x5012, touchPosY - 100);

        }

 

        Write_Dgus(0x5000, touchAnimationCnt);

        touchAnimationCnt++;

 

        якщо (touchAnimationCnt == 6)

        {

            touchAnimationFlag = 0;

            Write_Dgus(0x5011, 1024);

            Write_Dgus(0x5012, 600);

        }

    }

    

}

 

4. Наступним кроком є ​​встановлення відповідних параметрів на екрані, а потім передача даних на контролер котячого корму через ESP32 для реалізації функції автоматичного годування котячого корму.Конкретний код виглядає наступним чином:

//Отримати статус кнопки

void get_key_status()

{

    int i = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    якщо (Va != 0x0000)

    {

        //Sсторінка татус

        if(Va == 0x0103) //Поставте число g

        {

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

            setNum = placeGramNum;

            backPage = 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, сторінка перемикання, 2);

        }

        інакше якщо (Va == 0x0102)

        {

            OneSendData3(placeGramNum);//Місцекотячий кормодин раз

        }

        else if(Va == 0x0101) //Сторінка налаштування

        {

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

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

            {

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

                }

                інше

                {

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

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

                }

            }

            write_dgus_vp(0x0084, сторінка перемикання, 2);//Вхід на сторінку налаштувань

        }

        інакше якщо (Va == 0x0100) //Record сторінка

        {

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

            for(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, сторінка перемикання, 2);//Вхід на сторінку запису

        }

        //Record сторінка

        else if(Va == 0x0201) //Запис попередньої сторінки

        {

            якщо (lookEatCnt > 0)

            {

                lookEatCnt--;

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

                    }

                }

            }

        }

        else if(Va == 0x0202) //Запис наступної сторінки

        {

            if(lookEatCnt < eatCnt - 1)

            {

                lookEatCnt++;

                for(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)

        {

            якщо (timeMode == 1)

            {

                timeMode = 0;

                Write_Dgus(0x3A12, 139);

            }

        }

        інакше якщо (Va == 0x0303)

        {

            якщо (timeMode == 0)

            {

                timeMode = 1;

                Write_Dgus(0x3A12, 242);

            }

        }

        інакше, якщо (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, сторінка перемикання, 2);

        }

        інакше, якщо (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, сторінка перемикання, 2);

        }

        //Adjust сторінка даних

        інакше якщо (Va == 0x0400) //Підтвердити

        {

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

            switchpage[1] = BackPage;

            if(backPage == 1) //Повернутися до сторінки стану

            {

                placeGramNum = setNum;

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

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

            }

            інакше якщо (backPage == 3)

            {

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

                {

                    u16 вибір = 0;

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

                    timrIntervalHour[backNum - 0x0304] = setNum;

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

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

                }

                інакше якщо (backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 вибір = 0;

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

                    currentTime[backNum - 0x030A] = setNum;

                    

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

                    }

                    інше

                    {

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

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

                    }

                }

            }

            write_dgus_vp(0x0084, сторінка перемикання, 2);

        }

        інакше якщо (Va == 0x0401) //Назад

        {

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

            switchpage[1] = BackPage;

            write_dgus_vp(0x0084, сторінка перемикання, 2);

        }

        else if(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);

        }

        else if(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 р