Smart Eye Basatu nantu à u Screen Circular DWIN

——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.

dytrgf (1)

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.

dytrgf (2)

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