Smart Eye Bazita sur DWIN Cirkla Ekrano

——El Forumo por Programistoj de DWIN

La projekto malfermita fonto de DWIN por programistoj ĉi-foje rekomendita por ĉiuj estas tre interesa rutino por simuli la movadon de homaj okuloj.La inĝeniero uzis plurajn homajn bildmaterialojn por realigi funkciojn kiel okulgloba movo, palpebrumado, vizaĝrekono kaj sekvado.

Enkonduko al malfermfontaj solvoj:

1. UI-bilda materialo

Noto de Redaktoro: DWIN-inteligenta ekrano baziĝas sur bildoj por kompletigi UI-disvolviĝon, kiu povas facile realigi diversajn ekranefikojn.

dytrgf (1)

2. Disvolviĝo de interfaco

Estas relative simple evoluigi la interfacon per DGUS-programaro, kaj nur du grafikaj kontroloj estas bezonataj.En ĉi tiu rutino, la inĝeniero elektis 2.1-colan rondan inteligentan ekranon.

dytrgf (2)

3. Realigu palpebruman kuraĝigon

Lasu la bildojn de la palpebroj montriĝi laŭvice je intervaloj:

// Palpebruma animacio

malplena blink_animat(malplenigo)

{

se(palpebrumi_flago == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

palpebrumi_flago = 1;

}

}

alie

{

blink_cnt–;

se(palpebrumi_cnt <= 0)

{

palpebruma_flago = 0;

}

}

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

}

malplena blink_run()

{

statika u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

palpebrumi_animato();

Malfruo_ms(30);

}

}

4. Rimarku, ke la okulgloboj aspektas maldekstre kaj dekstre nature.

Ĉi tio similas palpebrumi, sed necesas kompari la tempon de la kristala oscilatoro por kontroli la okulmovon.Post multaj tempoj de senararigado, la inĝeniero dizajnis la sekvan aron de kodoj.

//Okulglobo-animacio

malplena okulglobo_animat(void)

{

okulglobo_timer_cnt++;

if(okulglobo_timer_cnt < 50)

{

okulglobo_cnt = 20;

}

else if(okulglobo_timer_cnt < 51)

{

okulglobo_cnt = 50;

}

else if(okula globo_timer_cnt < 52)

{

okulglobo_cnt = 80;

}

else if(okula globo_timer_cnt < 53)

{

okulglobo_cnt = 94;

}

else if(okula globo_timer_cnt < 103)

{

okulglobo_cnt = 94;

}

else if(okula globo_timer_cnt < 104)

{

okulglobo_cnt = 80;

}

else if(okula globo_timer_cnt < 105)

{

okulglobo_cnt = 50;

}

else if(okula globo_timer_cnt < 106)

{

okulglobo_cnt = 20;

}

else if(okula globo_timer_cnt < 107)

{

okulglobo_cnt = -10;

}

else if(okula_timer_cnt < 108)

{

okulglobo_cnt = -40;

}

else if(okulglobo_timer_cnt < 158)

{

okulglobo_cnt = -54;

}

else if(okulglobo_timer_cnt < 159)

{

okulglobo_cnt = -40;

}

else if(okulo_timer_cnt < 160)

{

okulglobo_cnt = -10;

}

else if(okulglobo_timer_cnt < 161)

{

okulglobo_cnt = 20;

okulglobo_timer_cnt = 0;

}

//Movu maldekstren kaj dekstren

// se (okula globo_flago == 0)

// {

// okulglobo_cnt++;

// if(okulo_cnt >= 94)

// {

// okulglobo_flago = 1;

//}

//}

// alie

// {

// okulglobo_cnt–;

// if(okulglobo_cnt <= -54)

// {

// okulglobo_flago = 0;

//}

//}

se (okulo_cnt >= 0)

{

okulglobo_pos[0] = 0×00;

eyeball_pos[1] = okulglobo_cnt;

}

alie

{

okulglobo_pos[0] = 0xFF;

okulglobo_pos[1] = (okula globo_cnt & 0xFF);

}

skribu_dgus_vp(0×3111, (u8 *)&okula_pos, 2);

}

malplena okulglobo_run()

{

statika u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

okulglobo_animat();

}

}

5. Aldonu ESP32-vizaĝan rekonon por realigi la movadon de okuloj sekvantaj la vizaĝon.

La pretigmetodo ĉi tie estas ke kiam la vizaĝo estas detektita, la okuloj ne moviĝas per si mem, kaj variablo estas difinita por pligrandigi en la dum-buklo.Kiam la pliigo atingas certan valoron, la okulgloboj moviĝos per si mem.Kiam la seria haveno ricevas datumojn, ĉi tiu variablo estos forigita, kaj tiam nur movos la okulojn laŭ la pozicio de la vizaĝo.La ĉefa kodo estas kiel sekvas:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

alie

{

okulglobo_kuru();

}

extern u32 rec_data_timer_cnt;

extern u16 eyeball_timer_cnt;

malplena Komunikado_CMD(u8 st)

{

se((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

okulglobo_timer_cnt = 0;

#if(Tipo_Komuniko==1)

Priskribu_8283(st);

#elif(Type_Communication==2)

Priskribu_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Afiŝtempo: Jun-26-2023