Smart Eye Basert på DWIN Circular Screen

——Fra DWIN Developer Forum

DWIN utviklerforum åpen kildekode-prosjektet anbefalt for alle denne gangen er en veldig interessant rutine for å simulere bevegelsen av menneskelige øyne.Ingeniøren brukte flere bildematerialer for menneskelige øyne for å realisere funksjoner som øyeeplebevegelse, blinking, ansiktsgjenkjenning og følge.

Introduksjon til åpen kildekode-løsninger:

1. UI bildemateriale

Redaktørens merknad: DWIN-smartskjerm er basert på bilder for å fullføre UI-utvikling, som enkelt kan realisere ulike skjermeffekter.

dytrgf (1)

2. Grensesnittutvikling

Det er relativt enkelt å utvikle grensesnittet gjennom DGUS-programvare, og det trengs kun to grafiske kontroller.I denne rutinen valgte ingeniøren en 2,1-tommers rund smartskjerm.

dytrgf (2)

3. Realiser blink-animasjon

La bildene av øyelokkene vises etter tur med intervaller:

//Blink-animasjon

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

ellers

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

void blink_run()

{

statisk 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. Innse at øyeeplene ser naturlig til venstre og høyre.

Dette ligner på å blinke, men det må sammenlignes med tiden til krystalloscillatoren for å kontrollere øyebevegelsen.Etter mange ganger med feilsøking, designet ingeniøren følgende sett med koder.

//Øyeeplet-animasjon

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;

}

//Flytt til venstre og høyre

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// annet

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

ellers

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statisk u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Legg til ESP32 ansiktsgjenkjenning for å oppdage bevegelsen til øynene som følger ansiktet.

Behandlingsmetoden her er at når ansiktet oppdages, beveger ikke øynene seg av seg selv, og en variabel er definert til å øke i while-løkken.Når økningen når en viss verdi, vil øyeeplene bevege seg av seg selv.Når den serielle porten mottar data, vil denne variabelen bli slettet, og deretter flyttes bare øynene i henhold til ansiktsposisjonen.Hovedkoden er som følger:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

ellers

{

eyeball_run();

}

ekstern u32 rec_data_timer_cnt;

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

Beskriv_8283(st);

#elif(Type_Communication==2)

Beskriv_Modbus(st);

#slutt om

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Innleggstid: 26. juni 2023