——От форума за разработчици на DWIN
Проектът с отворен код на форума за разработчици DWIN, препоръчан за всички този път, е много интересна рутина за симулиране на движението на човешки очи.Инженерът е използвал няколко материала за изображения на човешко око, за да реализира функции като движение на очната ябълка, мигане, разпознаване на лица и следване.
Въведение в решенията с отворен код:
1. Материал за изображение на потребителския интерфейс
Бележка на редактора: Интелигентният екран на DWIN се основава на снимки за завършване на разработването на потребителски интерфейс, който може лесно да реализира различни ефекти на дисплея.
2. Разработка на интерфейс
Сравнително лесно е да се разработи интерфейс чрез софтуер DGUS и са необходими само две графични контроли.В тази рутина инженерът избра 2,1-инчов кръгъл смарт екран.
3. Реализиране на мигаща анимация
Нека снимките на клепачите се показват последователно на интервали:
//Анимация на мигане
void blink_animat(void)
{
if(blink_flag == 0)
{
blink_cnt++;
ако (blink_cnt >= 4)
{
blink_flag = 1;
}
}
друго
{
blink_cnt–;
ако (blink_cnt <= 0)
{
blink_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void blink_run()
{
статичен u32 run_timer_cnt = 0;
run_timer_cnt++;
ако (run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
blink_animat();
Закъснение_ms(30);
}
}
4. Осъзнайте, че очните ябълки изглеждат наляво и надясно естествено.
Това е подобно на мигането, но трябва да сравни времето на кристалния осцилатор, за да контролира движението на очите.След многократно отстраняване на грешки, инженерът проектира следния набор от кодове.
//Анимация на очната ябълка
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
eyeball_cnt = 20;
}
иначе ако (eyeball_timer_cnt < 51)
{
eyeball_cnt = 50;
}
иначе ако (eyeball_timer_cnt < 52)
{
eyeball_cnt = 80;
}
иначе ако (eyeball_timer_cnt < 53)
{
eyeball_cnt = 94;
}
иначе ако (eyeball_timer_cnt < 103)
{
eyeball_cnt = 94;
}
иначе ако (eyeball_timer_cnt < 104)
{
eyeball_cnt = 80;
}
иначе ако (eyeball_timer_cnt < 105)
{
eyeball_cnt = 50;
}
иначе ако (eyeball_timer_cnt < 106)
{
eyeball_cnt = 20;
}
иначе ако (eyeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
иначе ако (eyeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
иначе ако (eyeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
иначе ако (eyeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
иначе ако (eyeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
иначе ако (eyeball_timer_cnt < 161)
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Движете се наляво и надясно
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
//}
//}
// друго
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
//}
//}
if(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 *)&yeball_pos, 2);
}
void eyeball_run()
{
статичен u32 run_timer_cnt = 0;
run_timer_cnt++;
ако (run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Добавете ESP32 лицево разпознаване, за да осъзнаете движението на очите, следващи лицето.
Методът на обработка тук е, че когато лицето бъде открито, очите не се движат сами и се дефинира променлива, която да се увеличава в цикъла while.Когато увеличението достигне определена стойност, очните ябълки ще се движат сами.Когато серийният порт получи данни, тази променлива ще бъде изчистена и след това само ще преместите очите според позицията на лицето.Основният код е както следва:
ако (rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
друго
{
eyeball_run();
}
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(Тип_комуникация==1)
Опишете_8283(st);
#elif(Тип_комуникация==2)
Опишете_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Време на публикуване: 26 юни 2023 г