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

—— С форума разработчиков DWIN

Рекомендуемый всем на этот раз с открытым исходным кодом форум разработчиков DWIN представляет собой очень интересную рутину для имитации движения человеческого глаза.Инженер использовал несколько изображений человеческого глаза, чтобы реализовать такие функции, как движение глазного яблока, моргание, распознавание лиц и отслеживание.

Введение в решения с открытым исходным кодом:

1. Материал изображения пользовательского интерфейса

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

дитргф (1)

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

Разработать интерфейс с помощью программного обеспечения DGUS относительно просто, и необходимы только два графических элемента управления.В этой процедуре инженер выбрал 2,1-дюймовый круглый смарт-экран.

дитргф (2)

3. Реализовать мигающую анимацию

Пусть картинки век отображаются по очереди через промежутки времени:

//Анимация моргания

пустота blink_animat (пустота)

{

если (blink_flag == 0)

{

мигание_cnt++;

если (blink_cnt >= 4)

{

мигающий_флаг = 1;

}

}

еще

{

blink_cnt–;

если (blink_cnt <= 0)

{

мигающий_флаг = 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;

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

мигание_анимат();

Задержка_мс (30);

}

}

4. Осознайте, что глазные яблоки естественно смотрят влево и вправо.

Это похоже на моргание, но для управления движением глаз необходимо сравнить время кварцевого генератора.После многократных отладок инженер разработал следующий набор кодов.

//Анимация глазного яблока

пустота eyeball_animat (пустота)

{

глазное яблоко_timer_cnt++;

если (eyeball_timer_cnt < 50)

{

глазное яблоко_cnt = 20;

}

иначе если (eyeball_timer_cnt < 51)

{

глазное яблоко_cnt = 50;

}

иначе если (eyeball_timer_cnt < 52)

{

глазное яблоко_cnt = 80;

}

иначе если (eyeball_timer_cnt < 53)

{

глазное яблоко_cnt = 94;

}

иначе если (eyeball_timer_cnt < 103)

{

глазное яблоко_cnt = 94;

}

иначе если (eyeball_timer_cnt < 104)

{

глазное яблоко_cnt = 80;

}

иначе если (eyeball_timer_cnt < 105)

{

глазное яблоко_cnt = 50;

}

иначе если (eyeball_timer_cnt < 106)

{

глазное яблоко_cnt = 20;

}

иначе если (eyeball_timer_cnt < 107)

{

глазное яблоко_cnt = -10;

}

иначе если (eyeball_timer_cnt < 108)

{

глазное яблоко_cnt = -40;

}

иначе если (eyeball_timer_cnt < 158)

{

глазное яблоко_cnt = -54;

}

иначе если (eyeball_timer_cnt < 159)

{

глазное яблоко_cnt = -40;

}

иначе если (eyeball_timer_cnt < 160)

{

глазное яблоко_cnt = -10;

}

иначе если (eyeball_timer_cnt < 161)

{

глазное яблоко_cnt = 20;

глазное яблоко_timer_cnt = 0;

}

//Движение влево и вправо

// если (eyeball_flag == 0)

// {

// глазное яблоко_cnt++;

// если(eyeball_cnt >= 94)

// {

// флаг_глаза = 1;

// }

// }

// еще

// {

// глазное яблоко_cnt–;

// если(eyeball_cnt <= -54)

// {

// флаг_глаза = 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;

глазное яблоко_анимат();

}

}

5. Добавьте распознавание лица ESP32, чтобы реализовать движение глаз вслед за лицом.

Метод обработки здесь заключается в том, что при обнаружении лица глаза не двигаются сами по себе, и определяется переменная для увеличения в цикле while.Когда приращение достигает определенного значения, глазные яблоки будут двигаться сами по себе.Когда последовательный порт получит данные, эта переменная будет очищена, а затем только перемещать глаза в соответствии с положением лица.Основной код выглядит следующим образом:

если (rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

еще

{

глазное яблоко_run();

}

внешний u32 rec_data_timer_cnt;

внешний 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;

глазное яблоко_timer_cnt = 0;

#if(Type_Communication==1)

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

#elif(Type_Communication==2)

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

#endif

UART[st].Rx_F=0;

UART[st].Rx_Num=0;

}

}


Время публикации: 26 июня 2023 г.