[Cas primé] Système intelligent de contrôle des aliments pour chats

——Depuis le forum des développeurs DWIN

Dans ce numéro, nous vous présenterons le cas open source primé du forum des développeurs DWIN : Intelligent Cat Food Control System.Les ingénieurs ont utilisé l'écran intelligent DWIN pour surveiller la température, l'humidité et la quantité restante de nourriture pour chat, ainsi que pour enregistrer les enregistrements de consommation de nourriture du chat.Ils ont également conçu de manière unique un ensemble d'interfaces utilisateur de style de peinture à l'encre, ainsi qu'un effet de clic d'encre lorsqu'il est touché par un doigt, pour améliorer la perception visuelle du retour tactile.

Introduction:

Matériel d'image 1.UI

L'écran intelligent DWIN termine le développement de l'interface utilisateur basé sur des images, de l'audio et d'autres matériaux qui doivent être préparés à l'avance en fonction du contenu de l'affichage à l'écran.

asv (2)

2.Développement d'interfaces

Le logiciel DGUS restaure l'effet de l'interface utilisateur grâce à la superposition de couches, combine les matériaux préparés en une image complète dans le logiciel DGUS et définit les fonctions d'affichage et tactiles.

asv (1)

3. Implémentez des effets de clic et des effets sonores

La position tactile est obtenue grâce au programme 51, l'effet de pression suit le mouvement du doigt et l'effet sonore d'accompagnement des touches est également obtenu.

(1) Détecter le code de localisation tactile et lire l'audio :

annuler TouchDetect()

{

    u16Va[3] = 0;

    u8 je = 0;

 

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

    {

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

        si(Va[0] == 0x5A01)

        {

        }

        autre

        {

            casser;

        }

    }

    if(i != 0) //Cliquez d'abord pour entrer

    {

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

        touchAnimationFlag = 1 ;

        touchAnimationCnt = 0 ;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, jouer, 2);

    }

}

 

(2) Le code pour l’affichage de l’effet tactile est le suivant :

annuler TouchStart()

{

    si (touchAnimationFlag == 1)

    {

        si (touchAnimationCnt == 0)

        {

            Write_Dgus (0x5011, touchPosX - 100);

            Write_Dgus(0x5012, touchPosY-100);

        }

 

        Write_Dgus(0x5000, touchAnimationCnt);

        touchAnimationCnt++;

 

        si (touchAnimationCnt == 6)

        {

            touchAnimationFlag = 0 ;

            Write_Dgus(0x5011, 1024);

            Write_Dgus(0x5012, 600);

        }

    }

    

}

 

4. L'étape suivante consiste à définir les paramètres correspondants via l'écran, puis à transmettre les données au contrôleur de nourriture pour chat via ESP32 pour réaliser la fonction d'alimentation automatique de la nourriture pour chat.Le code spécifique est le suivant :

//Obtenir l'état du bouton

annuler get_key_status()

{

    entier je = 0 ;

    //u16 Va=Read_Dgus(adr);

    u16 Va=Read_Dgus(0x1000);

    si(Va != 0x0000)

    {

        //Spage d'état

        if(Va == 0x0103) //Placer le nombre de g

        {

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

            setNum = placeGramNum ;

            page arrière = 1 ;//Retour à la page d'état

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

        }

        sinon si(Va == 0x0102)

        {

            OneSendData3(placeGramNum);//Lieula nourriture pour chatune fois

        }

        sinon if(Va == 0x0101) //Page de configuration

        {

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

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

            {

                si(je == 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);

                }

                autre

                {

                    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);//Entrez dans la page des paramètres

        }

        sinon si(Va == 0x0100) //Rpage d'enregistrement

        {

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

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

            {

                si(je == 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);

                }

                autre

                {

                    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);//Entrer la page d'enregistrement

        }

        //Rpage d'enregistrement

        sinon if(Va == 0x0201) //Enregistrer la page page précédente

        {

            si (lookEatCnt > 0)

            {

                lookEatCnt--;

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

                {

                    si(je == 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);

                    }

                    autre

                    {

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

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

                    }

                }

            }

        }

        sinon if(Va == 0x0202) //Enregistrer la page page suivante

        {

            si (lookEatCnt < mangerCnt - 1)

            {

                lookEatCnt++;

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

                {

                    si(je == 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);

                    }

                    autre

                    {

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

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

                    }

                }

            }

        }

        //Page de configuration

        sinon si(Va == 0x0302)

        {

            si (timeMode == 1)

            {

                modetemps = 0 ;

                Write_Dgus(0x3A12, 139);

            }

        }

        sinon si(Va == 0x0303)

        {

            si (timeMode == 0)

            {

                modeheure = 1 ;

                Write_Dgus(0x3A12, 242);

            }

        }

        sinon si(Va >= 0x0304 && Va <= 0x0309)

        {

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

            page arrière = 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);

        }

        sinon si (Va >= 0x030A && Va <= 0x030F)

        {

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

            page arrière = 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);

        }

        //Aajuster la page de données

        sinon si(Va == 0x0400) //Confirmer

        {

            page de commutation u16[2] = {0x5A01, 0x0000} ;

            switchpage[1] = page arrière ;

            if(backPage == 1) //Retour à la page d'état

            {

                placeGramNum = setNum;

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

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

            }

            sinon si (backPage == 3)

            {

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

                {

                    u16 sélection = 0 ;

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

                    timrIntervalHour[backNum - 0x0304] = setNum;

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

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

                }

                sinon si (backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 sélection = 0 ;

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

                    currentTime[backNum - 0x030A] = setNum;

                    

                    si (numéroretour == 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);

                    }

                    autre

                    {

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

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

                    }

                }

            }

            write_dgus_vp(0x0084, switchpage, 2);

        }

        sinon si(Va == 0x0401) //Dos

        {

            page de commutation u16[2] = {0x5A01, 0x0000} ;

            switchpage[1] = page arrière ;

            write_dgus_vp(0x0084, switchpage, 2);

        }

        else if(Va == 0x0402) //Augmentation numérique

        {

            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) //Diminution numérique

        {

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

    }

}


Heure de publication : 19 septembre 2023