——От форума за разработчици на 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
{
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_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
blink_animated();
Закъснение_ms(30);
}
}
4. Осъзнайте, че очните ябълки изглеждат естествено наляво и надясно.
Това е подобно на мигането, но трябва да сравни времето на кристалния осцилатор, за да контролира движението на очите. След многократно отстраняване на грешки, инженерът проектира следния набор от кодове.
//Анимация на очната ябълка
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt
{
eyeball_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;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = 50;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = 20;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = -10;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = -40;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = -54;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = -40;
}
иначе ако (eyeball_timer_cnt
{
eyeball_cnt = -10;
}
иначе ако (eyeball_timer_cnt
{
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
// {
// 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;
animated_eyeball();
}
}
5. Добавете ESP32 лицево разпознаване, за да осъзнаете движението на очите, следващи лицето.
Методът на обработка тук е, че когато лицето бъде открито, очите не се движат сами и се дефинира променлива, която да се увеличава в цикъла while. Когато нарастването достигне определена стойност, очните ябълки ще се движат сами. Когато серийният порт получи данни, тази променлива ще бъде изчистена и след това само ще преместите очите според позицията на лицето. Основният код е както следва:
ако (rec_data_timer_cnt
{
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 г