[Trường hợp đạt giải thưởng] Hệ thống kiểm soát thức ăn cho mèo thông minh

--Từ Diễn đàn nhà phát triển DWIN

Trong số này, chúng tôi sẽ giới thiệu với bạn trường hợp nguồn mở từng đoạt giải thưởng từ Diễn đàn nhà phát triển DWIN: Hệ thống kiểm soát thức ăn cho mèo thông minh.Các kỹ sư đã sử dụng màn hình thông minh DWIN để theo dõi nhiệt độ, độ ẩm và lượng thức ăn còn lại cho mèo, đồng thời lưu hồ sơ ăn thức ăn của mèo.Họ cũng thiết kế độc đáo một bộ giao diện người dùng theo phong cách vẽ mực, cũng như hiệu ứng nhấp chuột khi chạm bằng ngón tay, để nâng cao nhận thức trực quan về phản hồi chạm.

Giới thiệu:

1. Chất liệu hình ảnh UI

Màn hình thông minh DWIN hoàn thiện quá trình phát triển giao diện người dùng dựa trên hình ảnh, âm thanh và các tài liệu khác cần được chuẩn bị trước theo nội dung hiển thị trên màn hình.

asv (2)

2. Phát triển giao diện

Phần mềm DGUS khôi phục hiệu ứng giao diện người dùng thông qua lớp phủ, kết hợp các tài liệu đã chuẩn bị thành một bức tranh hoàn chỉnh trong phần mềm DGUS, đồng thời thiết lập các chức năng hiển thị và cảm ứng.

asv (1)

3. Triển khai hiệu ứng nhấp chuột và hiệu ứng âm thanh

Vị trí cảm ứng có được thông qua chương trình 51, hiệu ứng nhấn theo chuyển động của ngón tay và hiệu ứng âm thanh đệm phím cũng đạt được.

(1) Phát hiện mã vị trí cảm ứng và phát âm thanh:

khoảng trống TouchDetect()

{

    u16 Va[3] = 0;

    u8 tôi = 0;

 

    vì(i = 0;i < 3;i++)

    {

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

        nếu(Va[0] == 0x5A01)

        {

        }

        khác

        {

            phá vỡ;

        }

    }

    if(i != 0) //Click đầu tiên để vào

    {

        u16 chơi[2] = {0x0001, 0x4000};

        touchAnimationFlag = 1;

        touchAnimationCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, chơi, 2);

    }

}

 

(2) Mã hiển thị hiệu ứng cảm ứng như sau:

làm mất hiệu lực 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. Bước tiếp theo là thiết lập các thông số tương ứng thông qua màn hình, sau đó truyền dữ liệu đến bộ điều khiển thức ăn cho mèo thông qua ESP32 để thực hiện chức năng cho thức ăn cho mèo tự động.Mã cụ thể như sau:

//Nhận trạng thái nút

void get_key_status()

{

    int tôi = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    nếu(Va != 0x0000)

    {

        //Strang hình xăm

        if(Va == 0x0103) //Đặt số g

        {

            trang chuyển mạch u16[2] = {0x5A01, 19};

            setNum = địa điểmGramNum;

            trang sau = 1;//Trở về trang trạng thái

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

        }

        khác nếu (Va == 0x0102)

        {

            OneSendData3(placeGramNum);//Địa điểmthức ăn cho mèomột lần

        }

        else if(Va == 0x0101) //Trang cài đặt

        {

            trang chuyển mạch u16[2] = {0x5A01, 3};

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

            {

                nếu (tô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);

                }

                khác

                {

                    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);//Vào trang cài đặt

        }

        khác nếu(Va == 0x0100) //Rtrang sinh thái

        {

            trang chuyển mạch u16[2] = {0x5A01, 2};

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

            {

                nếu (tô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);

                }

                khác

                {

                    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);//Nhập trang bản ghi

        }

        //Rtrang sinh thái

        else if(Va == 0x0201) //Ghi lại trang trước

        {

            if(lookEatCnt > 0)

            {

                lookEatCnt--;

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

                {

                    nếu (tô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);

                    }

                    khác

                    {

                        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) //Ghi trang tiếp theo

        {

            if(lookEatCnt < eatCnt - 1)

            {

                lookEatCnt++;

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

                {

                    nếu (tô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);

                    }

                    khác

                    {

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

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

                    }

                }

            }

        }

        // Trang cài đặt

        khác nếu (Va == 0x0302)

        {

            if(timeMode == 1)

            {

                thời gianMode = 0;

                Write_Dgus(0x3A12, 139);

            }

        }

        khác nếu (Va == 0x0303)

        {

            if(timeMode == 0)

            {

                thời gianMode = 1;

                Write_Dgus(0x3A12, 242);

            }

        }

        khác nếu(Va >= 0x0304 && Va <= 0x0309)

        {

            trang chuyển mạch u16[2] = {0x5A01, 19};

            trang sau = 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);

        }

        khác nếu(Va >= 0x030A && Va <= 0x030F)

        {

            trang chuyển mạch u16[2] = {0x5A01, 19};

            trang sau = 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);

        }

        //Atrang dữ liệu điều chỉnh

        khác nếu(Va == 0x0400) //Xác nhận

        {

            trang chuyển mạch u16[2] = {0x5A01, 0x0000};

            switchpage[1] = backPage;

            if(backPage == 1) //Quay lại trang trạng thái

            {

                địa điểmGramNum = setNum;

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

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

            }

            khác nếu(backPage == 3)

            {

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

                {

                    u16 chọn = 0;

                    chọn = (backNum - 0x0304) * 0x10;

                    timrIntervalHour[backNum - 0x0304] = setNum;

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

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

                }

                khác nếu(backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 chọn = 0;

                    chọn = (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);

                    }

                    khác

                    {

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

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

                    }

                }

            }

            write_dgus_vp(0x0084, switchpage, 2);

        }

        khác nếu(Va == 0x0401) //Mặt sau

        {

            trang chuyển mạch u16[2] = {0x5A01, 0x0000};

            switchpage[1] = backPage;

            write_dgus_vp(0x0084, switchpage, 2);

        }

        else if(Va == 0x0402) //Tăng số

        {

            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) //Giảm số

        {

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

        }

        

        Viết_Dgus(0x1000, 0);

    }

}


Thời gian đăng: 19-09-2023