Smart Eye на основі круглого екрана DWIN

——З форуму розробників DWIN

Проект з відкритим кодом на форумі розробників DWIN, рекомендований усім цього разу, є дуже цікавою програмою для моделювання руху людських очей.Інженер використовував кілька зображень людського ока, щоб реалізувати такі функції, як рух очного яблука, моргання, розпізнавання обличчя та слідування.

Вступ до рішень з відкритим кодом:

1. Інтерфейс зображення матеріалу

Примітка редактора: розумний екран DWIN базується на зображеннях для завершення розробки інтерфейсу користувача, який може легко реалізувати різні ефекти відображення.

dytrgf (1)

2. Розробка інтерфейсу

Розробити інтерфейс за допомогою програмного забезпечення DGUS відносно просто, і потрібні лише два графічні елементи керування.У цій рутині інженер вибрав 2,1-дюймовий круглий смарт-екран.

dytrgf (2)

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();

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. Усвідомте, що очні яблука дивляться вліво і вправо природним чином.

Це схоже на моргання, але для контролю руху очей потрібно порівнювати час кварцевого генератора.Після багаторазового налагодження інженер розробив наступний набір кодів.

//Анімація очного яблука

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

eyeball_cnt = 20;

}

інакше якщо (yeball_timer_cnt < 51)

{

eyeball_cnt = 50;

}

інакше якщо (yeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

інакше якщо (yeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

інакше якщо (yeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

інакше якщо (yeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

інакше якщо (yeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

інакше якщо (yeball_timer_cnt < 106)

{

eyeball_cnt = 20;

}

інакше якщо (yeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

інакше якщо (yeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

інакше якщо (yeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

інакше якщо (yeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

інакше якщо (yeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

інакше якщо (yeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//Переміщення вліво і вправо

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// якщо (yeball_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.Коли приріст досягне певного значення, очні яблука рухатимуться самі.Коли послідовний порт отримує дані, ця змінна буде очищена, а потім лише рухайте очі відповідно до положення обличчя.Основний код виглядає наступним чином:

if(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(Type_Communication==1)

Описати_8283(st);

#elif(Type_Communication==2)

Описати_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Час публікації: 26 червня 2023 р