[Βραβευμένη θήκη] Έξυπνο σύστημα ελέγχου τροφής για γάτες

——Από το Φόρουμ προγραμματιστών DWIN

Σε αυτό το τεύχος, θα σας παρουσιάσουμε τη βραβευμένη θήκη ανοιχτού κώδικα από το DWIN Developer Forum: Intelligent Food Control System.Οι μηχανικοί χρησιμοποίησαν την έξυπνη οθόνη DWIN για να παρακολουθούν τη θερμοκρασία, την υγρασία και την υπολειπόμενη ποσότητα τροφής για γάτες και να αποθηκεύουν τα αρχεία κατανάλωσης τροφής της γάτας.Σχεδίασαν επίσης μοναδικά ένα σετ διεπαφής χρήστη σε στυλ ζωγραφικής με μελάνι, καθώς και ένα εφέ κλικ μελανιού όταν αγγίζεται με ένα δάχτυλο, για να βελτιώσει την οπτική αντίληψη της ανάδρασης αφής.

Εισαγωγή:

Υλικό εικόνας 1.UI

Η έξυπνη οθόνη 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);

        if(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, play, 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 για να πραγματοποιήσετε τη λειτουργία αυτόματης σίτισης της τροφής για γάτες.Ο συγκεκριμένος κωδικός είναι ο εξής:

//Λήψη κατάστασης κουμπιού

void get_key_status()

{

    int i = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    εάν (Va != 0x0000)

    {

        //Sσελίδα tatus

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

        }

        else if(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, τρέχουσαΏρα[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 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, switchpage, 2);//Εισαγωγή σελίδας εγγραφής

        }

        //Rηχογραφημένη σελίδα

        else if(Va == 0x0201) //Εγγραφή σελίδας προηγούμενης σελίδας

        {

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

                    }

                }

            }

        }

        //Σελίδα ρυθμίσεων

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

        }

        αλλιώς εάν(Va >= 0x030A && Va <= 0x030F)

        {

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

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

            }

            else if(backPage == 3)

            {

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

                {

                    u16 επιλέξτε = 0;

                    επιλέξτε = (backNum - 0x0304) * 0x10;

                    timrIntervalHour[backNum - 0x0304] = setNum;

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

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

                }

                αλλιώς if(backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 επιλέξτε = 0;

                    επιλέξτε = (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);

                    }

                    αλλού

                    {

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

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

                    }

                }

            }

            write_dgus_vp(0x0084, switchpage, 2);

        }

        αλλιώς εάν(Va == 0x0401) //Πίσω

        {

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

            switchpage[1] = backPage;

            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