Pametno oko, ki temelji na krožnem zaslonu DWIN

——Iz foruma razvijalcev DWIN

Odprtokodni projekt foruma razvijalcev DWIN, ki ga tokrat priporočamo vsem, je zelo zanimiva rutina za simulacijo gibanja človeških oči.Inženir je uporabil več slikovnih materialov človeškega očesa za uresničitev funkcij, kot so gibanje zrkla, mežikanje, prepoznavanje obraza in sledenje.

Uvod v odprtokodne rešitve:

1. Slikovno gradivo uporabniškega vmesnika

Opomba urednika: pametni zaslon DWIN temelji na slikah za dokončanje razvoja uporabniškega vmesnika, ki zlahka realizira različne učinke prikaza.

dytrgf (1)

2. Razvoj vmesnika

Vmesnik je relativno preprosto razviti s programsko opremo DGUS, potrebni pa so le dve grafični kontroli.V tej rutini je inženir izbral 2,1-palčni okrogel pametni zaslon.

dytrgf (2)

3. Uresničite animacijo mežikanja

Slike vek naj bodo prikazane izmenično v intervalih:

//Animacija mežikanja

void blink_animat(void)

{

če (blink_flag == 0)

{

blink_cnt++;

če (blink_cnt >= 4)

{

utripajoča zastavica = 1;

}

}

drugače

{

blink_cnt–;

če(blink_cnt <= 0)

{

utripajoča zastavica = 0;

}

}

write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);

}

void blink_run()

{

statični u32 run_timer_cnt = 0;

run_timer_cnt++;

če(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

blink_animat();

Zakasnitev_ms(30);

}

}

4. Zavedajte se, da zrkla naravno gledajo levo in desno.

To je podobno mežikanju, vendar mora za nadzor gibanja oči primerjati čas kristalnega oscilatorja.Po večkratnem odpravljanju napak je inženir oblikoval naslednji niz kod.

//Animacija zrkla

void eyeball_animat(void)

{

eyeball_timer_cnt++;

če(eyeball_timer_cnt < 50)

{

zrklo_cnt = 20;

}

sicer če(eyeball_timer_cnt < 51)

{

eyeball_cnt = 50;

}

sicer če (eyeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

sicer če(eyeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

sicer če (eyeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

sicer če (eyeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

sicer če (eyeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

sicer če (eyeball_timer_cnt < 106)

{

zrklo_cnt = 20;

}

sicer če (eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

sicer če (eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

sicer če (eyeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

sicer če(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

sicer če (eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

sicer če(eyeball_timer_cnt < 161)

{

zrklo_cnt = 20;

eyeball_timer_cnt = 0;

}

//Premik levo in desno

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// zastavica zrkla = 1;

// }

// }

// drugače

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// zastavica zrkla = 0;

// }

// }

če(eyeball_cnt >= 0)

{

zrklo_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

drugače

{

položaj_očnice[0] = 0xFF;

eyeball_pos [1] = (eyeball_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

void eyeball_run()

{

statični u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

zrklo_animat();

}

}

5. Dodajte prepoznavanje obraza ESP32, da spoznate gibanje oči, ki sledi obrazu.

Metoda obdelave tukaj je, da se oči, ko je zaznan obraz, ne premaknejo same od sebe, spremenljivka pa je definirana za povečanje v zanki while.Ko prirastek doseže določeno vrednost, se zrkla premaknejo sama.Ko serijska vrata prejmejo podatke, se ta spremenljivka počisti, nato pa samo premaknite oči glede na položaj obraza.Glavna koda je naslednja:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

drugače

{

zrklo_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)

Opišite_8283(st);

#elif(Type_Communication==2)

Opišite_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Čas objave: 26. junija 2023