Išmanioji akis, pagrįsta DWIN apskritu ekranu

——Iš DWIN kūrėjų forumo

Šį kartą visiems rekomenduojamas DWIN kūrėjų forumo atvirojo kodo projektas yra labai įdomi žmogaus akių judėjimo imitavimo rutina.Inžinierius panaudojo kelias žmogaus akies vaizdo medžiagas, kad įgyvendintų tokias funkcijas kaip akies obuolio judėjimas, mirksėjimas, veido atpažinimas ir sekimas.

Įvadas į atvirojo kodo sprendimus:

1. UI vaizdo medžiaga

Redaktoriaus pastaba: DWIN išmanusis ekranas yra pagrįstas paveikslėliais, kad užbaigtų vartotojo sąsajos kūrimą, kuri gali lengvai realizuoti įvairius ekrano efektus.

dytrgf (1)

2. Sąsajos kūrimas

Sukurti sąsają naudojant DGUS programinę įrangą gana paprasta, reikia tik dviejų grafinių valdiklių.Šioje rutinoje inžinierius pasirinko 2,1 colio apvalų išmanųjį ekraną.

dytrgf (2)

3. Sukurkite mirksėjimo animaciją

Tegul akių vokų nuotraukos bus rodomos paeiliui intervalais:

//Blink animacija

negalioja blink_animat(tuščia)

{

if(mirksėjimo_vėliava == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

Kitas

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

negalioja blink_run()

{

statinis 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. Įsivaizduokite, kad akių obuoliai natūraliai atrodo į kairę ir į dešinę.

Tai panašu į mirksėjimą, tačiau norint valdyti akių judesius, reikia palyginti kristalinio osciliatoriaus laiką.Po daugelio derinimo kartų inžinierius sukūrė šį kodų rinkinį.

//Akių obuolio animacija

void eyeball_animat(tuščia)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

akies obuolio_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

akies obuolio_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

akies obuolio_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

akies obuolio_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

akies obuolio_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

akies obuolio_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

akies obuolio_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

akies obuolio_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

akies obuolio_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

akies obuolio_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

akies obuolio_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

akies obuolio_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

akies obuolio_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

akies obuolio_cnt = 20;

eyeball_timer_cnt = 0;

}

//Perkelti į kairę ir į dešinę

// if(akies obuolio_vėliava == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// akies obuolio_vėliava = 1;

// }

// }

// Kitas

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// akies obuolio_vėliava = 0;

// }

// }

if(akies obuolio_cnt >= 0)

{

akies obuolio poza[0] = 0×00;

eyeball_pos[1] = akies obuolio_cnt;

}

Kitas

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statinis u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Pridėkite ESP32 veido atpažinimo funkciją, kad suprastumėte akių judesius po veidą.

Apdorojimo metodas yra toks, kad, aptikus veidą, akys nejuda pačios, o kintamasis apibrėžiamas, kad padidėtų while kilpa.Kai prieaugis pasiekia tam tikrą vertę, akių obuoliai judės patys.Kai nuoseklusis prievadas gauna duomenis, šis kintamasis bus išvalytas, o tada tik judinkite akis pagal veido padėtį.Pagrindinis kodas yra toks:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

Kitas

{

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)

Aprašyti_8283(st);

#elif(Type_Communication==2)

Aprašyti_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Paskelbimo laikas: 2023-06-26