Smart Eye bazat pe ecran circular DWIN

——De la DWIN Developer Forum

Proiectul open source forum pentru dezvoltatori DWIN recomandat tuturor de data aceasta este o rutină foarte interesantă pentru simularea mișcării ochilor umani.Inginerul a folosit mai multe materiale de imagine pentru ochi umani pentru a realiza funcții precum mișcarea globului ocular, clipirea, recunoașterea feței și urmărirea.

Introducere în soluțiile open source:

1. Material de imagine UI

Nota editorului: ecranul inteligent DWIN se bazează pe imagini pentru a finaliza dezvoltarea interfeței de utilizare, care poate realiza cu ușurință diverse efecte de afișare.

dytrgf (1)

2. Dezvoltarea interfeței

Este relativ simplu să dezvoltați interfața prin software-ul DGUS și sunt necesare doar două controale grafice.În această rutină, inginerul a ales un ecran inteligent rotund de 2,1 inchi.

dytrgf (2)

3. Realizați animația clipit

Lasă imaginile pleoapelor să fie afișate pe rând la intervale:

// Animație clipită

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

altfel

{

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. Realizează-ți că globii oculari arată în stânga și în dreapta în mod natural.

Acest lucru este similar cu clipirea, dar trebuie să compare timpul oscilatorului cu cristal pentru a controla mișcarea ochilor.După multe ori de depanare, inginerul a proiectat următorul set de coduri.

//animație globul ocular

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)

{

globul_ocular = -10;

}

else if(eyeball_timer_cnt < 108)

{

globul_ocular = -40;

}

else if(eyeball_timer_cnt < 158)

{

globul_ocular = -54;

}

else if(eyeball_timer_cnt < 159)

{

globul_ocular = -40;

}

else if(eyeball_timer_cnt < 160)

{

globul_ocular = -10;

}

else if(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//Deplasați la stânga și la dreapta

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// altfel

// {

// globul ocular_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

altfel

{

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. Adăugați recunoașterea feței ESP32 pentru a realiza mișcarea ochilor care urmăresc fața.

Metoda de procesare aici este că atunci când fața este detectată, ochii nu se mișcă singuri și o variabilă este definită pentru a crește în bucla while.Când creșterea atinge o anumită valoare, globii oculari se vor mișca singuri.Când portul serial primește date, această variabilă va fi ștearsă și apoi mișcă ochii numai în funcție de poziția feței.Codul principal este următorul:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

altfel

{

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)

Descrie_8283(st);

#elif(Type_Communication==2)

Descriere_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Ora postării: 26-jun-2023