——Z DWIN Developer Forum
Open source projekt DWIN developer forum tentokrát doporučený všem je velmi zajímavou rutinou pro simulaci pohybu lidských očí.Inženýr použil několik obrazových materiálů lidského oka k realizaci funkcí, jako je pohyb oční bulvy, mrkání, rozpoznávání obličeje a sledování.
Úvod do open source řešení:
1. Obrazový materiál uživatelského rozhraní
Poznámka editora: Inteligentní obrazovka DWIN je založena na obrázcích pro dokončení vývoje uživatelského rozhraní, které může snadno realizovat různé efekty zobrazení.
2. Vývoj rozhraní
Vývoj rozhraní pomocí softwaru DGUS je poměrně jednoduchý a jsou potřeba pouze dva grafické ovládací prvky.V této rutině inženýr zvolil 2,1palcovou kulatou inteligentní obrazovku.
3. Realizujte animaci mrknutí
Nechte obrázky očních víček postupně zobrazovat v intervalech:
//Blikání animace
void blink_animat(void)
{
if(blink_flag == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flag = 1;
}
}
jiný
{
blink_cnt–;
if(blink_cnt <= 0)
{
blink_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void blink_run()
{
statický u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
blink_animat();
Delay_ms(30);
}
}
4. Uvědomte si, že oční bulvy vypadají přirozeně vlevo a vpravo.
Je to podobné mrkání, ale pro ovládání pohybu očí je potřeba porovnat čas krystalového oscilátoru.Po mnoha časech ladění inženýr navrhl následující sadu kódů.
//Animace oční bulvy
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt < 51)
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt < 52)
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt < 53)
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt < 103)
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt < 104)
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt < 105)
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt < 106)
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
else if(eyeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 161)
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Pohyb doleva a doprava
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// vlajka oční bulvy = 1;
// }
// }
// jinak
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// příznak_oční bulvy = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
jiný
{
eyeball_pos[0] = 0xFF;
eyeball_pos[1] = (eyeball_cnt & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
void eyeball_run()
{
statický u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Přidejte rozpoznávání obličeje ESP32, abyste si uvědomili pohyb očí sledujících obličej.
Metoda zpracování zde spočívá v tom, že když je detekován obličej, oči se samy nepohybují a ve smyčce while je definována proměnná, která se má zvyšovat.Když přírůstek dosáhne určité hodnoty, oční bulvy se budou samy pohybovat.Když sériový port přijme data, tato proměnná se vymaže a pak už jen pohybujte očima podle polohy obličeje.Hlavní kód je následující:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
jiný
{
eyeball_run();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
void Communication_CMD(u8 st)
{
if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))
{
rec_data_timer_cnt = 0;
eyeball_timer_cnt = 0;
#if(Type_Communication==1)
Describe_8283(st);
#elif(Type_Communication==2)
Describe_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Čas odeslání: 26. června 2023