[Caso premiado] Sistema inteligente de control de alimentos para gatos

——Del foro de desarrolladores de DWIN

En este número, le presentaremos el caso de código abierto galardonado del Foro de desarrolladores DWIN: Sistema inteligente de control de alimentos para gatos.Los ingenieros utilizaron la pantalla inteligente DWIN para controlar la temperatura, la humedad y la cantidad restante de comida para gatos, y para guardar los registros de alimentación del gato.También diseñaron de forma única un conjunto de interfaz de usuario con estilo de pintura con tinta, así como un efecto de clic de tinta cuando se toca con un dedo, para mejorar la percepción visual de la respuesta táctil.

Introducción:

1.Material de imagen de la interfaz de usuario

La pantalla inteligente DWIN completa el desarrollo de la interfaz de usuario basándose en imágenes, audio y otros materiales que deben prepararse con anticipación de acuerdo con el contenido de la pantalla.

asv (2)

2.Desarrollo de interfaz

El software DGUS restaura el efecto de la interfaz de usuario mediante la superposición de capas, combina los materiales preparados en una imagen completa en el software DGUS y configura las funciones táctiles y de visualización.

asv (1)

3. Implementar efectos de clic y efectos de sonido.

La posición táctil se obtiene a través del programa 51, el efecto de presión sigue el movimiento del dedo y también se logra el efecto de sonido de acompañamiento de teclas.

(1) Detectar código de ubicación táctil y reproducir audio:

anular TouchDetect()

{

    u16 Va[3] = 0;

    u8 i = 0;

 

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

    {

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

        si(Va[0] == 0x5A01)

        {

        }

        demás

        {

            romper;

        }

    }

    if(i != 0) //Primer clic para ingresar

    {

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

        toqueAnimationFlag = 1;

        toqueAnimaciónCnt = 0;

        touchPosX = Va[1];

        touchPosY = Va[2];

        write_dgus_vp(0x00A0, reproducir, 2);

    }

}

 

(2) El código para la visualización del efecto táctil es el siguiente:

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

        {

            toqueAnimationFlag = 0;

            Write_Dgus(0x5011, 1024);

            Write_Dgus(0x5012, 600);

        }

    }

    

}

 

4. El siguiente paso es configurar los parámetros correspondientes a través de la pantalla y luego transmitir los datos al controlador de comida para gatos a través de ESP32 para realizar la función de alimentación automática de la comida para gatos.El código específico es el siguiente:

//Obtener estado del botón

anular get_key_status()

{

    int yo = 0;

    //u16 Va=Read_Dgus(addr);

    u16 Va=Read_Dgus(0x1000);

    si(Va!= 0x0000)

    {

        //Spagina de estado

        if(Va == 0x0103) //Coloca el número de g

        {

            u16 página de cambio[2] = {0x5A01, 19};

            setNum = placeGramNum;

            contraportada = 1;//Volver a la página de estado

            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, cambiar de página, 2);

        }

        de lo contrario si (Va == 0x0102)

        {

            OneSendData3(placeGramNum);//Lugarcomida de gatouna vez

        }

        else if(Va == 0x0101) //Página de configuración

        {

            u16 página de cambio[2] = {0x5A01, 3};

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

            {

                si(yo == 0)

                {

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

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

                    Write_Dgus(0x3070 + i * 0x10 + 4, horaactual[i] / 100 % 10);

                    Write_Dgus(0x3070 + i * 0x10 + 6, horaactual[i] / 1000 % 10);

                }

                demás

                {

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

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

                }

            }

            write_dgus_vp(0x0084, cambiar de página, 2);//Ingresa a la página de configuración

        }

        de lo contrario si(Va == 0x0100) //Rpágina de registro

        {

            u16 página de cambio[2] = {0x5A01, 2};

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

            {

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

                }

                demás

                {

                    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, cambiar de página, 2);//Ingresar a la página de registro

        }

        //Rpágina de registro

        else if(Va == 0x0201) //Registrar página página anterior

        {

            si(miraComerCnt > 0)

            {

                lookEatCnt--;

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

                {

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

                    }

                    demás

                    {

                        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) //Registrar página página siguiente

        {

            si(miraComerCnt < comerCnt - 1)

            {

                mirarComerCnt++;

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

                {

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

                    }

                    demás

                    {

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

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

                    }

                }

            }

        }

        //Página de configuración

        de lo contrario si (Va == 0x0302)

        {

            si(modotiempo == 1)

            {

                modotiempo = 0;

                Write_Dgus(0x3A12, 139);

            }

        }

        de lo contrario si (Va == 0x0303)

        {

            si(modotiempo == 0)

            {

                modotiempo = 1;

                Write_Dgus(0x3A12, 242);

            }

        }

        de lo contrario si(Va >= 0x0304 && Va <= 0x0309)

        {

            u16 página de cambio[2] = {0x5A01, 19};

            contraportada = 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, cambiar de página, 2);

        }

        de lo contrario si (Va >= 0x030A && Va <= 0x030F)

        {

            u16 página de cambio[2] = {0x5A01, 19};

            contraportada = 3;

            backNum = Va;

            setNum = horaactual[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, cambiar de página, 2);

        }

        //Apágina de datos justa

        de lo contrario si(Va == 0x0400) //Confirmar

        {

            u16 página de cambio[2] = {0x5A01, 0x0000};

            cambiarpágina[1] = backPage;

            if(backPage == 1) //Volver a la página de estado

            {

                placeGramNum = setNum;

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

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

            }

            de lo contrario si (contraportada == 3)

            {

                if(núm atrás >= 0x0304 && núm atrás <= 0x0309)

                {

                    u16 seleccionar = 0;

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

                    timrIntervalHour[backNum - 0x0304] = setNum;

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

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

                }

                de lo contrario si(backNum >= 0x030A && backNum <= 0x030F)

                {

                    u16 seleccionar = 0;

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

                    horaactual[backNum - 0x030A] = setNum;

                    

                    si (Número atrás == 0x030A)

                    {

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

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

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

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

                    }

                    demás

                    {

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

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

                    }

                }

            }

            write_dgus_vp(0x0084, cambiar de página, 2);

        }

        de lo contrario si(Va == 0x0401) //Atrás

        {

            u16 página de cambio[2] = {0x5A01, 0x0000};

            cambiarpágina[1] = backPage;

            write_dgus_vp(0x0084, cambiar de página, 2);

        }

        else if(Va == 0x0402) //Aumento numérico

        {

            establecerNum++;

            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) //Disminución numérica

        {

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

    }

}


Hora de publicación: 19-sep-2023