——Nga Forumi i Zhvilluesve DWIN
Projekti me kod të hapur të forumit të zhvilluesve DWIN i rekomanduar për të gjithë këtë herë është një rutinë shumë interesante për simulimin e lëvizjes së syve të njeriut.Inxhinieri përdori disa materiale për fotografimin e syve të njeriut për të realizuar funksione të tilla si lëvizja e kokës së syrit, pulsimi, njohja e fytyrës dhe ndjekja.
Hyrje në zgjidhjet me burim të hapur:
1. Materiali i imazhit të UI
Shënim i redaktorit: Ekrani inteligjent DWIN bazohet në foto për të përfunduar zhvillimin e ndërfaqes së përdoruesit, i cili mund të realizojë lehtësisht efekte të ndryshme të ekranit.
2. Zhvillimi i ndërfaqes
Është relativisht e thjeshtë për të zhvilluar ndërfaqen përmes softuerit DGUS dhe nevojiten vetëm dy kontrolle grafike.Në këtë rutinë, inxhinieri zgjodhi një ekran inteligjent të rrumbullakët 2.1 inç.
3. Realizoni animacionin e ndezjes
Lërini fotografitë e qepallave të shfaqen me radhë në intervale:
//Animacioni Blink
void blink_animat(void)
{
nëse (flamuri_blink == 0)
{
blink_cnt++;
nëse (blink_cnt >= 4)
{
blink_flamur = 1;
}
}
tjetër
{
blink_cnt–;
if (blink_cnt <= 0)
{
ndezje_flamuri = 0;
}
}
shkrim_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
i pavlefshëm blink_run()
{
static u32 run_timer_cnt = 0;
run_timer_cnt++;
if (run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
blink_animat();
Vonesa_ms(30);
}
}
4. Kuptoni që kokërdhat e syrit duken majtas dhe djathtas natyrshëm.
Kjo është e ngjashme me vezullimin, por duhet të krahasohet koha e oshilatorit kristal për të kontrolluar lëvizjen e syve.Pas shumë herë korrigjimi, inxhinieri krijoi grupin e mëposhtëm të kodeve.
//Animacion i kokës së syrit
zbrazëti kokrra e syrit_animat(i zbrazët)
{
syri_timer_cnt++;
nëse (kohëmatësi_syri_cnt < 50)
{
kokrra e syrit_cnt = 20;
}
ndryshe if(bobël_kohës_cnt < 51)
{
kokrra e syrit_cnt = 50;
}
ndryshe if(bobël_kohës_syri_cnt < 52)
{
kokrra e syrit_cnt = 80;
}
ndryshe if(eyeball_timer_cnt < 53)
{
kokrra e syrit_cnt = 94;
}
ndryshe if(bobël_kohës_syri_cnt < 103)
{
kokrra e syrit_cnt = 94;
}
ndryshe if(syri_timer_cnt < 104)
{
kokrra e syrit_cnt = 80;
}
tjeter if(eyeball_timer_cnt < 105)
{
kokrra e syrit_cnt = 50;
}
ndryshe if(bobël_kohës_syri_cnt < 106)
{
kokrra e syrit_cnt = 20;
}
ndryshe if(bobël_kohës_syri_cnt < 107)
{
kokrra e syrit_cnt = -10;
}
ndryshe if(syri_timer_cnt < 108)
{
kokrra e syrit_cnt = -40;
}
ndryshe if(bobël_kohës_syri_cnt < 158)
{
kokrra e syrit_cnt = -54;
}
ndryshe if(bobël_kohës_syri_cnt < 159)
{
kokrra e syrit_cnt = -40;
}
tjetër if(bobël_kohës_syri_cnt < 160)
{
kokrra e syrit_cnt = -10;
}
ndryshe if(bobël_kohës_syri_cnt < 161)
{
kokrra e syrit_cnt = 20;
Kohëmatësi_syri_cnt = 0;
}
//Lëvizni majtas dhe djathtas
// nëse(flamuri_qelbës së syrit == 0)
// {
// syri_cnt++;
// if(bobël_eyes_cnt >= 94)
// {
// syri_flamur = 1;
// }
// }
// tjetër
// {
// syri_cnt–;
// if(bobël_cnt <= -54)
// {
// syri_flamur = 0;
// }
// }
nëse (bobël të syrit_cnt >= 0)
{
kokrra e syrit_pos[0] = 0×00;
kokrra e syrit_pos[1] = kokërr syri_cnt;
}
tjetër
{
kokrra e syrit_pos[0] = 0xFF;
kokshi i syrit_pos[1] = (bobëza e syrit_cnt & 0xFF);
}
shkruani_dgus_vp(0×3111, (u8 *)& syri_pos, 2);
}
zbrazëti kokrra e syrit_run()
{
static u32 run_timer_cnt = 0;
run_timer_cnt++;
if (run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
kokrra e syrit_animat();
}
}
5. Shtoni njohjen e fytyrës ESP32 për të realizuar lëvizjen e syve pas fytyrës.
Metoda e përpunimit këtu është që kur zbulohet fytyra, sytë nuk lëvizin vetvetiu dhe përcaktohet një variabël që rritet në ciklin while.Kur rritja arrin një vlerë të caktuar, kokërdhat e syrit do të lëvizin vetë.Kur porta serike merr të dhëna, kjo ndryshore do të pastrohet dhe më pas do të lëvizë sytë vetëm sipas pozicionit të fytyrës.Kodi kryesor është si më poshtë:
if (rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
tjetër
{
kokë_syri_run();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
Void Communication_CMD(u8 st)
{
nëse ((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))
{
rec_data_timer_cnt = 0;
Kohëmatësi_syri_cnt = 0;
#if(Lloji_Komunikimi==1)
Përshkruani_8283(st);
#elif (Tipi_Komunikimi==2)
Describe_Modbus(st);
#përfundim
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Koha e postimit: Qershor-26-2023