Smart Eye basado en pantalla circular DWIN

——Del foro de desarrolladores de DWIN

El proyecto de código abierto del foro de desarrolladores DWIN recomendado para todos en esta ocasión es una rutina muy interesante para simular el movimiento de los ojos humanos.El ingeniero utilizó varios materiales de imagen del ojo humano para realizar funciones como el movimiento del globo ocular, el parpadeo, el reconocimiento facial y el seguimiento.

Introducción a las soluciones de código abierto:

1. Material de la imagen de la interfaz de usuario

Nota del editor: la pantalla inteligente DWIN se basa en imágenes para completar el desarrollo de la interfaz de usuario, que puede realizar fácilmente varios efectos de visualización.

dytrgf (1)

2. Desarrollo de interfaz

Es relativamente simple desarrollar la interfaz a través del software DGUS y solo se necesitan dos controles gráficos.En esta rutina, el ingeniero eligió una pantalla inteligente redonda de 2,1 pulgadas.

dytrgf (2)

3. Realice la animación de parpadeo

Deje que las imágenes de los párpados se muestren a intervalos:

//Animación de parpadeo

vacío parpadear_animat (vacío)

{

si (parpadeo_bandera == 0)

{

parpadeo_cnt++;

si (blink_cnt >= 4)

{

parpadear_bandera = 1;

}

}

demás

{

parpadear_cnt–;

si (blink_cnt <= 0)

{

bandera_parpadeo = 0;

}

}

escribir_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);

}

vacío parpadear_ejecutar()

{

estático u32 run_timer_cnt = 0;

ejecutar_temporizador_cnt++;

si (run_timer_cnt >= 2000000)

{

ejecutar_temporizador_cnt = 0;

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

parpadear_animat();

Retardo_ms(30);

}

}

4. Date cuenta de que los globos oculares miran hacia la izquierda y hacia la derecha de forma natural.

Esto es similar al parpadeo, pero necesita comparar el tiempo del oscilador de cristal para controlar el movimiento del ojo.Después de muchas veces de depuración, el ingeniero diseñó el siguiente conjunto de códigos.

//Animación del globo ocular

vacío eyeball_animat (vacío)

{

globo ocular_timer_cnt++;

si (globo_objetivo_temporizador_cnt < 50)

{

ojo_cnt = 20;

}

si no (eyeball_timer_cnt < 51)

{

ojo_cnt = 50;

}

si no (eyeball_timer_cnt < 52)

{

ojo_cnt = 80;

}

si no (eyeball_timer_cnt < 53)

{

ojo_cnt = 94;

}

si no (eyeball_timer_cnt < 103)

{

ojo_cnt = 94;

}

si no (eyeball_timer_cnt < 104)

{

ojo_cnt = 80;

}

si no (eyeball_timer_cnt < 105)

{

ojo_cnt = 50;

}

si no (eyeball_timer_cnt < 106)

{

ojo_cnt = 20;

}

si no (eyeball_timer_cnt < 107)

{

ojo_cnt = -10;

}

si no (eyeball_timer_cnt < 108)

{

ojo_cnt = -40;

}

si no (eyeball_timer_cnt < 158)

{

ojo_cnt = -54;

}

si no (eyeball_timer_cnt < 159)

{

ojo_cnt = -40;

}

si no (eyeball_timer_cnt < 160)

{

ojo_cnt = -10;

}

si no (eyeball_timer_cnt < 161)

{

ojo_cnt = 20;

globo ocular_timer_cnt = 0;

}

// Mover a la izquierda y a la derecha

// if(ojo_bandera == 0)

// {

// ojo_cnt++;

// if(eyeball_cnt >= 94)

// {

// bandera_del_ojo = 1;

// }

// }

// demás

// {

// ojo_cnt–;

// si (globo_ocular_cnt <= -54)

// {

// bandera_del_ojo = 0;

// }

// }

si (globo_ocular_cnt >= 0)

{

ojo_pos[0] = 0×00;

ojo_pos[1] = ojo_cnt;

}

demás

{

ojo_pos[0] = 0xFF;

ojo_pos[1] = (ojo_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

vacío eyeball_run()

{

estático u32 run_timer_cnt = 0;

ejecutar_temporizador_cnt++;

si (run_timer_cnt >= 20000)

{

ejecutar_temporizador_cnt = 0;

ojo_animado();

}

}

5. Agregue el reconocimiento facial ESP32 para darse cuenta del movimiento de los ojos siguiendo la cara.

El método de procesamiento aquí es que cuando se detecta la cara, los ojos no se mueven solos y se define una variable para incrementar en el bucle while.Cuando el incremento alcanza un cierto valor, los globos oculares se moverán solos.Cuando el puerto serie reciba datos, esta variable se borrará y luego solo moverá los ojos según la posición de la cara.El código principal es el siguiente:

si (rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

demás

{

ojo_correr();

}

externo u32 rec_data_timer_cnt;

externo u16 eyeball_timer_cnt;

anular Communication_CMD(u8 st)

{

if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

globo ocular_timer_cnt = 0;

#if(Tipo_Comunicación==1)

Describe_8283(st);

#elif(Tipo_Comunicación==2)

Describe_Modbus(st);

#terminara si

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Hora de publicación: 26-jun-2023