Интелигентно око, базирано на DWIN Circular Screen

——От форума за разработчици на 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();

Закъснение_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 г