Smart Eye Berdasarkan DWIN Circular Screen

——Dari Forum Pengembang DWIN

Proyek open source forum pengembang DWIN yang direkomendasikan untuk semua orang kali ini adalah rutinitas yang sangat menarik untuk mensimulasikan pergerakan mata manusia.Insinyur menggunakan beberapa bahan gambar mata manusia untuk mewujudkan fungsi seperti gerakan bola mata, kedipan, pengenalan wajah, dan mengikuti.

Pengantar solusi open source:

1. Bahan gambar UI

Catatan editor: Layar pintar DWIN didasarkan pada gambar untuk melengkapi pengembangan UI, yang dapat dengan mudah mewujudkan berbagai efek tampilan.

ditrgf (1)

2. Pengembangan antarmuka

Relatif sederhana untuk mengembangkan antarmuka melalui perangkat lunak DGUS, dan hanya diperlukan dua kontrol grafis.Dalam rutinitas ini, sang insinyur memilih layar pintar bundar 2,1 inci.

ditrgf (2)

3. Sadarilah animasi berkedip

Biarkan gambar kelopak mata ditampilkan secara bergantian dengan interval:

// Animasi kedip

batal blink_animat(batal)

{

jika(blink_flag == 0)

{

blink_cnt++;

jika(blink_cnt >= 4)

{

bendera_kedip = 1;

}

}

kalau tidak

{

blink_cnt–;

jika(blink_cnt <= 0)

{

bendera kedip = 0;

}

}

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

}

batal blink_run()

{

run_timer_cnt u32 statis = 0;

run_timer_cnt++;

jika(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. Sadari bola mata terlihat kiri dan kanan secara alami.

Ini mirip dengan kedipan, tetapi perlu membandingkan waktu osilator kristal untuk mengontrol gerakan mata.Setelah berkali-kali melakukan debug, insinyur merancang kumpulan kode berikut.

// Animasi bola mata

batal eyeball_animat(batal)

{

eyeball_timer_cnt++;

jika(eyeball_timer_cnt < 50)

{

bola mata_cnt = 20;

}

lain jika(eyeball_timer_cnt < 51)

{

bola mata_cnt = 50;

}

lain jika(eyeball_timer_cnt < 52)

{

bola mata_cnt = 80;

}

lain jika(eyeball_timer_cnt < 53)

{

bola mata_cnt = 94;

}

lain jika(eyeball_timer_cnt < 103)

{

bola mata_cnt = 94;

}

lain jika(eyeball_timer_cnt < 104)

{

bola mata_cnt = 80;

}

lain jika(eyeball_timer_cnt < 105)

{

bola mata_cnt = 50;

}

lain jika(eyeball_timer_cnt < 106)

{

bola mata_cnt = 20;

}

lain jika(eyeball_timer_cnt < 107)

{

bola mata_cnt = -10;

}

lain jika(eyeball_timer_cnt < 108)

{

bola mata_cnt = -40;

}

lain jika(eyeball_timer_cnt < 158)

{

bola mata_cnt = -54;

}

lain jika(eyeball_timer_cnt < 159)

{

bola mata_cnt = -40;

}

lain jika(eyeball_timer_cnt < 160)

{

bola mata_cnt = -10;

}

lain jika(eyeball_timer_cnt < 161)

{

bola mata_cnt = 20;

eyeball_timer_cnt = 0;

}

// Bergerak ke kiri dan ke kanan

// jika(bendera_bola mata == 0)

// {

// bola mata_cnt++;

// jika(eyeball_cnt >= 94)

// {

// bendera_bola mata = 1;

// }

// }

// kalau tidak

// {

// bola mata_cnt–;

// jika(eyeball_cnt <= -54)

// {

// bendera_bola mata = 0;

// }

// }

jika(bola mata_cnt >= 0)

{

bola mata_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

kalau tidak

{

bola mata_pos[0] = 0xFF;

bola mata_pos[1] = (bola mata_cnt & 0xFF);

}

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

}

batal eyeball_run()

{

run_timer_cnt u32 statis = 0;

run_timer_cnt++;

jika(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

bola mata_animat();

}

}

5. Tambahkan pengenalan wajah ESP32 untuk mewujudkan gerakan mata mengikuti wajah.

Metode pemrosesan di sini adalah ketika wajah terdeteksi, mata tidak bergerak dengan sendirinya, dan sebuah variabel didefinisikan untuk bertambah dalam while loop.Saat inkremen mencapai nilai tertentu, bola mata akan bergerak dengan sendirinya.Saat port serial menerima data, variabel ini akan dihapus, lalu hanya menggerakkan mata sesuai dengan posisi wajah.Kode utamanya adalah sebagai berikut:

jika(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

kalau tidak

{

bola mata_lari();

}

extern u32 rec_data_timer_cnt;

extern u16 eyeball_timer_cnt;

batal Communication_CMD (u8 st)

{

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

{

rec_data_timer_cnt = 0;

eyeball_timer_cnt = 0;

#jika(Jenis_Komunikasi==1)

Jelaskan_8283(st);

#elif(Jenis_Komunikasi==2)

Jelaskan_Modbus(st);

#berakhir jika

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Waktu posting: Jun-26-2023