[수상사례] 지능형 고양이 사료 제어 시스템

——DWIN 개발자 포럼에서

이번 호에서는 DWIN 개발자 포럼에서 수상 경력이 있는 오픈 소스 사례인 지능형 고양이 사료 제어 시스템을 소개하겠습니다.엔지니어들은 DWIN 스마트 스크린을 이용해 고양이 사료의 온도, 습도, 남은 양을 모니터링하고 고양이의 사료 섭취 기록을 저장했습니다.또한 터치 피드백에 대한 시각적 인식을 향상시키기 위해 잉크 페인팅 스타일 UI 세트와 손가락으로 터치할 때 잉크 클릭 효과를 독특하게 디자인했습니다.

소개:

1.UI 이미지 자료

DWIN 스마트 스크린은 화면 표시 내용에 따라 사전 준비가 필요한 사진, 오디오 및 기타 자료를 기반으로 UI 개발을 완료합니다.

asv (2)

2.인터페이스 개발

DGUS 소프트웨어는 레이어 오버레이를 통해 UI 효과를 복원하고, 준비된 자료를 DGUS 소프트웨어에서 완전한 그림으로 결합하고, 디스플레이 및 터치 기능을 설정합니다.

asv (1)

3. 클릭 효과 및 음향 효과 구현

터치 위치는 51 프로그램을 통해 얻어지며 누르는 효과는 손가락의 움직임을 따르며 키 반주 음향 효과도 달성됩니다.

(1) 터치 위치 코드를 감지하고 오디오를 재생합니다.

무효 터치 감지()

{

    u16 Va[3] = 0;

    u8i = 0;

 

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

    {

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

        if(Va[0] == 0x5A01)

        {

        }

        또 다른

        {

            부서지다;

        }

    }

    if(i != 0) //입력하려면 먼저 클릭하세요.

    {

        u16 플레이[2] = {0x0001, 0x4000};

        touchAnimationFlag = 1;

        touchAnimationCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, 재생, 2);

    }

}

 

(2) 터치 효과 표시를 위한 코드는 다음과 같습니다.

무효 터치스타트()

{

    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를 통해 고양이 사료 컨트롤러에 데이터를 전송하여 고양이 사료의 자동 공급 기능을 실현하는 것입니다.구체적인 코드는 다음과 같습니다.

//버튼 상태 가져오기

무효 get_key_status()

{

    int i = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    if(Va != 0x0000)

    {

        //S타투스 페이지

        if(Va == 0x0103) //g의 수를 배치합니다.

        {

            u16 스위치페이지[2] = {0x5A01, 19};

            setNum = placeGramNum;

            백페이지 = 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 스위치페이지[2] = {0x5A01, 3};

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

            {

                만약(나는 == 0)

                {

                    Write_Dgus(0x3070 + i * 0x10 + 0, currentTime[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, currentTime[i] % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 2, 현재시간[i] / 10 % 10);

                }

            }

            write_dgus_vp(0x0084, 스위치 페이지, 2);//설정 페이지로 들어갑니다.

        }

        else if(Va == 0x0100) //R에코코드 페이지

        {

            u16 스위치페이지[2] = {0x5A01, 2};

            for(i = 0;i < 6;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);//기록 페이지 입력

        }

        //R에코코드 페이지

        else if(Va == 0x0201) //이전 페이지 기록

        {

            if(lookEatCnt > 0)

            {

                봐EatCnt--;

                for(i = 0;i < 6;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)

            {

                봐EatCnt++;

                for(i = 0;i < 6;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)

        {

            if(시간모드 == 1)

            {

                시간모드 = 0;

                Write_Dgus(0x3A12, 139);

            }

        }

        그렇지 않은 경우(Va == 0x0303)

        {

            if(시간모드 == 0)

            {

                시간모드 = 1;

                Write_Dgus(0x3A12, 242);

            }

        }

        그렇지 않은 경우(Va >= 0x0304 && Va <= 0x0309)

        {

            u16 스위치페이지[2] = {0x5A01, 19};

            백페이지 = 3;

            백넘버 = 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 스위치페이지[2] = {0x5A01, 19};

            백페이지 = 3;

            백넘버 = 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, 스위치 페이지, 2);

        }

        //A데이터 페이지 조정

        else if(Va == 0x0400) //확인하다

        {

            u16 스위치페이지[2] = {0x5A01, 0x0000};

            스위치페이지[1] = 뒤로페이지;

            if(backPage == 1) //상태 페이지로 돌아가기

            {

                placeGramNum = setNum;

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

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

            }

            그렇지 않은 경우(뒤페이지 == 3)

            {

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

                {

                    u16 선택 = 0;

                    선택 = (backNum - 0x0304) * 0x10;

                    timrIntervalHour[backNum - 0x0304] = setNum;

                    Write_Dgus(0x3010 + 선택 + 0, setNum % 10);

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

                }

                else if(backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 선택 = 0;

                    선택 = (backNum - 0x0304) * 0x10;

                    currentTime[backNum - 0x030A] = setNum;

                    

                    if(backNum == 0x030A)

                    {

                        Write_Dgus(0x3010 + 선택 + 0, setNum % 10);

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

                        Write_Dgus(0x3010 + 선택 + 4, setNum / 100 % 10);

                        Write_Dgus(0x3010 + 선택 + 6, setNum / 1000 % 10);

                    }

                    또 다른

                    {

                        Write_Dgus(0x3010 + 선택 + 0, setNum % 10);

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

                    }

                }

            }

            write_dgus_vp(0x0084, 스위치 페이지, 2);

        }

        else if(Va == 0x0401) //뒤쪽에

        {

            u16 스위치페이지[2] = {0x5A01, 0x0000};

            스위치페이지[1] = 뒤로페이지;

            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(세트번호 > 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);

    }

}


게시 시간: 2023년 9월 19일