——З форуму распрацоўшчыкаў DWIN
Праект з адкрытым зыходным кодам на форуме распрацоўшчыкаў DWIN, рэкамендаваны ўсім на гэты раз, - гэта вельмі цікавая праграма для мадэлявання руху чалавечых вачэй. Інжынер выкарыстаў некалькі малюнкаў чалавечага вока, каб рэалізаваць такія функцыі, як рух вочнага яблыка, мірганне, распазнаванне твару і сачэнне.
Уводзіны ў рашэнні з адкрытым зыходным кодам:
1. Матэрыял малюнка карыстацкага інтэрфейсу
Заўвага рэдактара: разумны экран DWIN заснаваны на малюнках для завяршэння распрацоўкі карыстацкага інтэрфейсу, які можа лёгка рэалізаваць розныя эфекты адлюстравання.
2. Распрацоўка інтэрфейсу
Распрацаваць інтэрфейс з дапамогай праграмнага забеспячэння DGUS адносна проста, патрэбныя толькі два графічных элементы кіравання. У гэтай працэдуры інжынер абраў 2,1-цалевы круглы разумны экран.
3. Рэалізуйце анімацыю мігцення
Няхай выявы стагоддзе адлюстроўваюцца па чарзе з інтэрваламі:
//Мірганне анімацыі
пустата blink_animat(пуста)
{
калі (blink_flag == 0)
{
blink_cnt++;
калі (blink_cnt >= 4)
{
blink_flag = 1;
}
}
яшчэ
{
blink_cnt–;
калі (blink_cnt
{
blink_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
несапраўдны blink_run()
{
статычны u32 run_timer_cnt = 0;
run_timer_cnt++;
калі (run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
blink_animated();
Затрымка_мс(30);
}
}
4. Зразумейце, што вочныя яблыкі глядзяць налева і направа натуральным чынам.
Гэта падобна на мірганне, але для кіравання рухам вачэй трэба параўноўваць час кварцавага генератара. Пасля шматразовай адладкі інжынер распрацаваў наступны набор кодаў.
//Анімацыя вочнага яблыка
пустата eyeball_animat(пустата)
{
eyeball_timer_cnt++;
if(yeyeball_timer_cnt
{
вочны яблык_cnt = 20;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = 50;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = 80;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = 94;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = 94;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = 80;
}
інакш, калі (yeyeball_timer_cnt
{
eyeball_cnt = 50;
}
інакш, калі (eyeball_timer_cnt
{
вочны яблык_cnt = 20;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = -10;
}
інакш, калі (yeyeball_timer_cnt
{
eyeball_cnt = -40;
}
інакш, калі (yeyeball_timer_cnt
{
eyeball_cnt = -54;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = -40;
}
інакш, калі (eyeball_timer_cnt
{
eyeball_cnt = -10;
}
інакш, калі (eyeball_timer_cnt
{
вочны яблык_cnt = 20;
eyeball_timer_cnt = 0;
}
// Рух налева і направа
// калі (сьцяг_вочнага яблыка == 0)
// {
// eyeball_cnt++;
// калі (eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
//}
//}
// яшчэ
// {
// eyeball_cnt–;
// калі(eyeball_cnt
// {
// eyeball_flag = 0;
//}
//}
калі (eyeball_cnt >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos [1] = eyeball_cnt;
}
яшчэ
{
eyeball_pos [0] = 0xFF;
eyeball_pos[1] = (eyeball_cnt & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
несапраўдны eyeball_run()
{
статычны u32 run_timer_cnt = 0;
run_timer_cnt++;
калі (run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
animated_eyeball();
}
}
5. Дадайце функцыю распазнання твару ESP32, каб усвядоміць рух вачэй, якія сочаць за тварам.
Метад апрацоўкі тут заключаецца ў тым, што пры выяўленні твару вочы не рухаюцца самі па сабе, а зменная вызначаецца для павелічэння ў цыкле while. Калі прырост дасягне пэўнага значэння, вочныя яблыкі будуць рухацца самі. Калі паслядоўны порт атрымае дадзеныя, гэтая зменная будзе ачышчана, а затым толькі рухаць вачыма ў адпаведнасці з становішчам твару. Асноўны код выглядае наступным чынам:
калі (rec_data_timer_cnt
{
rec_data_timer_cnt++;
}
яшчэ
{
бег_вочнага яблыка();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
несапраўдны 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(Тып_сувязі==1)
Апісаць_8283(ст);
#elif(Тып_сувязі==2)
Апісаць_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Час публікацыі: 26 чэрвеня 2023 г