Mata Pintar Berdasarkan Skrin Pekeliling DWIN

——Dari Forum Pembangun DWIN

Projek sumber terbuka forum pembangun DWIN yang disyorkan untuk semua orang kali ini adalah rutin yang sangat menarik untuk mensimulasikan pergerakan mata manusia.Jurutera itu menggunakan beberapa bahan gambar mata manusia untuk merealisasikan fungsi seperti pergerakan bola mata, berkelip, pengecaman muka dan mengikut.

Pengenalan kepada penyelesaian sumber terbuka:

1. Bahan imej UI

Nota editor: Skrin pintar DWIN adalah berdasarkan gambar untuk melengkapkan pembangunan UI, yang boleh merealisasikan pelbagai kesan paparan dengan mudah.

dytrgf (1)

2. Pembangunan antara muka

Ia agak mudah untuk membangunkan antara muka melalui perisian DGUS, dan hanya dua kawalan grafik diperlukan.Dalam rutin ini, jurutera memilih skrin pintar bulat 2.1 inci.

dytrgf (2)

3. Realisasikan animasi berkelip

Biarkan gambar kelopak mata dipaparkan secara bergilir pada selang waktu:

//Animasi berkelip

batal blink_animat(kosong)

{

if(blink_flag == 0)

{

blink_cnt++;

jika(blink_cnt >= 4)

{

blink_flag = 1;

}

}

lain

{

blink_cnt–;

jika(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

batal blink_run()

{

statik 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. Menyedari bebola mata memandang kiri dan kanan secara semula jadi.

Ini sama seperti berkelip, tetapi ia perlu membandingkan masa pengayun kristal untuk mengawal pergerakan mata.Selepas banyak kali nyahpepijat, jurutera mereka bentuk set kod berikut.

//Animasi bola mata

kosong bola mata_animat(kosong)

{

eyeball_timer_cnt++;

jika(eyeball_timer_cnt < 50)

{

bola mata_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

bola mata_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

bola mata_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

bola mata_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

bola mata_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

bola mata_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

bola mata_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

bola mata_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

bola mata_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

bola mata_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

bola mata_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

bola mata_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

bola mata_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

bola mata_cnt = 20;

eyeball_timer_cnt = 0;

}

//Gerak kiri dan kanan

// jika (bendera_mata == 0)

// {

// eyeball_cnt++;

// jika(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// lain

// {

// eyeball_cnt–;

// jika(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

jika(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

lain

{

eyeball_pos[0] = 0xFF;

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

}

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

}

kosongkan eyeball_run()

{

statik u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Tambah pengecaman muka ESP32 untuk merealisasikan pergerakan mata mengikut muka.

Kaedah pemprosesan di sini ialah apabila muka dikesan, mata tidak bergerak dengan sendirinya, dan pembolehubah ditakrifkan untuk meningkat dalam gelung sementara.Apabila kenaikan mencapai nilai tertentu, bola mata akan bergerak dengan sendirinya.Apabila port bersiri menerima data, pembolehubah ini akan dikosongkan, dan kemudian hanya menggerakkan mata mengikut kedudukan muka.Kod utama adalah seperti berikut:

jika(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

lain

{

bola mata_lari();

}

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)

Describe_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Masa siaran: Jun-26-2023