——Da u Forum di sviluppatori DWIN
U prughjettu di u foru di sviluppatore di DWIN hè cunsigliatu per tutti sta volta hè una rutina assai interessante per simule u muvimentu di l'ochji umani.L'ingegnere hà utilizatu parechji materiali di l'imaghjini di l'ochju umanu per realizà funzioni cum'è u muvimentu di u globu oculare, lampeggiante, ricunniscenza di a faccia è seguitu.
Introduzione à e soluzioni open source:
1. Materiale image UI
Nota di l'editore: u screnu intelligente DWIN hè basatu annantu à l'imaghjini per cumpletà u sviluppu di l'UI, chì ponu facilmente realizà diversi effetti di visualizazione.
2. Sviluppu di l'interfaccia
Hè relativamente simplice di sviluppà l'interfaccia attraversu u software DGUS, è solu dui cuntrolli grafici sò necessarii.In questa rutina, l'ingegnere hà sceltu una schermu intelligente tonda di 2.1-inch.
3. Realize blink animation
Chì l'imaghjini di e palpebre si mostranu à turnu à intervalli:
//Blink animazione
void blink_animat (void)
{
if(blink_flag == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flag = 1;
}
}
altru
{
blink_cnt–;
if(blink_cnt <= 0)
{
blink_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void blink_run()
{
static 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. Realize chì i globi oculari guardanu a manca è a diritta naturali.
Questu hè simili à lampeggiante, ma ci vole à paragunà u tempu di l'oscillatore di cristalli per cuntrullà u muvimentu di l'ochji.Dopu parechje volte di debugging, l'ingegnere hà designatu u seguitu set di codici.
// Animazione di u globu oculare
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;
}
// Move a manca è a diritta
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// altru
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos [0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
altru
{
eyeball_pos [0] = 0xFF;
eyeball_pos [1] = (eyeball_cnt & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
void eyeball_run()
{
static u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt>= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Aghjunghjite u ricunniscenza facciale ESP32 per realizà u muvimentu di l'ochji chì seguitanu a faccia.
U metudu di trasfurmazioni quì hè chì quandu a faccia hè rilevata, l'ochji ùn si movenu micca da elli, è una variabile hè definita per incrementà in u ciclu mentri.Quandu l'incrementu righjunghji un certu valore, i globi oculari si movenu da elli stessi.Quandu u portu seriale riceve dati, sta variabile serà sguassata, è dopu solu move l'ochji secondu a pusizione di a faccia.U codice principale hè u seguente:
if (rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
altru
{
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(Tipus_Communication==1)
Descrive_8283 (st);
#elif(Tipus_Communication==2)
Descrive_Modbus (st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Tempu di post: 26-jun-2023