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

{

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

{

globul ocular_cnt = 20;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 80;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 80;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 20;

}

else if(eyeball_timer_cnt

{

globul_ocular = -10;

}

else if(eyeball_timer_cnt

{

globul_ocular = -40;

}

else if(eyeball_timer_cnt

{

globul_ocular = -54;

}

else if(eyeball_timer_cnt

{

globul_ocular = -40;

}

else if(eyeball_timer_cnt

{

globul_ocular = -10;

}

else if(eyeball_timer_cnt

{

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

// {

// 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;

globul_ocular 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

{

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