Паметно око засновано на кружен екран DWIN

——Од форумот за програмери на DWIN

Проектот со отворен код на форумот за програмери DWIN препорачан за сите овој пат е многу интересна рутина за симулирање на движењето на човечките очи.Инженерот користел неколку материјали за сликање на човечки очи за да реализира функции како што се движење на очното јаболко, трепкање, препознавање лице и следење.

Вовед во решенија со отворен код:

1. Материјал за слика на интерфејсот

Забелешка на уредникот: паметниот екран на DWIN се базира на слики за да се заврши развојот на интерфејсот, кој лесно може да реализира различни ефекти на приказот.

dytrgf (1)

2. Развој на интерфејс

Релативно е едноставно да се развие интерфејсот преку софтверот DGUS, а потребни се само две графички контроли.Во оваа рутина, инженерот избра кружен паметен екран од 2,1 инчи.

dytrgf (2)

3. Реализација на анимација со трепкање

Нека сликите на очните капаци се прикажуваат наизменично во интервали:

//Анимација за трепкање

void blink_animat (празнина)

{

ако (трепкање_знаме == 0)

{

blink_cnt++;

ако (blink_cnt >= 4)

{

трепкање_знаме = 1;

}

}

друго

{

blink_cnt–;

if(blink_cnt <= 0)

{

трепкање_знаме = 0;

}

}

write_dgus_vp (0×3000, (u8 *)&blink_cnt, 2);

}

void blink_run()

{

статичен u32 run_timer_cnt = 0;

run_timer_cnt++;

if (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. Сфатете дека очните јаболка изгледаат природно лево и десно.

Ова е слично на трепкањето, но треба да се спореди времето на кристалниот осцилатор за да се контролира движењето на очите.По многу пати дебагирање, инженерот го дизајнираше следниов сет на кодови.

//Анимација на очното јаболко

празни очно јаболко_анимат(празнина)

{

очното јаболко_тајмер_cnt++;

ако (очното јаболко_тајмер_cnt < 50)

{

очното јаболко_cnt = 20;

}

друго ако(очното јаболко_тајмер_cnt < 51)

{

очното јаболко_cnt = 50;

}

друго ако(очното јаболко_тајмер_cnt < 52)

{

очното јаболко_cnt = 80;

}

друго ако(очното јаболко_тајмер_cnt < 53)

{

очното јаболко_cnt = 94;

}

друго ако(очно_тајмер_cnt < 103)

{

очното јаболко_cnt = 94;

}

друго ако(очно_тајмер_cnt < 104)

{

очното јаболко_cnt = 80;

}

друго ако(очно_тајмер_cnt < 105)

{

очното јаболко_cnt = 50;

}

друго ако (очното јаболко_тајмер_cnt < 106)

{

очното јаболко_cnt = 20;

}

друго ако (очното јаболко_тајмер_cnt < 107)

{

очното јаболко_cnt = -10;

}

друго ако(очното јаболко_тајмер_cnt < 108)

{

очното јаболко_cnt = -40;

}

друго ако(очното јаболко_тајмер_cnt < 158)

{

очното јаболко_cnt = -54;

}

друго ако(очното јаболко_тајмер_cnt < 159)

{

очното јаболко_cnt = -40;

}

друго ако (очното јаболко_тајмер_cnt < 160)

{

очното јаболко_cnt = -10;

}

друго ако(очното јаболко_тајмер_cnt < 161)

{

очното јаболко_cnt = 20;

очното јаболко_тајмер_cnt = 0;

}

//Движете се лево и десно

// ако(очното_знаме == 0)

// {

// очното јаболко_cnt++;

// ако (очното јаболко_cnt >= 94)

// {

// очното јаболко_знаме = 1;

// }

// }

// друго

// {

// очното јаболко_cnt–;

// ако(очното јаболко_cnt <= -54)

// {

// очното јаболко_знаме = 0;

// }

// }

ако (очното јаболко_cnt >= 0)

{

очното јаболко_pos[0] = 0×00;

очното јаболко_pos[1] = очното јаболко_cnt;

}

друго

{

очното јаболко_pos[0] = 0xFF;

очното јаболко_pos[1] = (очното јаболко_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

void eyeball_run()

{

статичен u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

очното јаболко_анимат();

}

}

5. Додадете ESP32 препознавање лице за да го реализирате движењето на очите по лицето.

Методот на обработка овде е дека кога ќе се открие лицето, очите не се движат сами по себе, а променливата се дефинира за да се зголемува во јамката while.Кога зголемувањето ќе достигне одредена вредност, очните јаболка ќе се движат сами.Кога сериската порта ќе прими податоци, оваа променлива ќе се исчисти, а потоа ќе ги движите очите само според положбата на лицето.Главниот код е како што следува:

ако (rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

друго

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

надворешен u16 eyeball_timer_cnt;

void Communication_CMD(u8 st)

{

ако ((арт[ст].Rx_F==1 )&&(арт[ст].Rx_T==0))

{

rec_data_timer_cnt = 0;

очното јаболко_тајмер_cnt = 0;

#ако (Тип_Комуникација==1)

Describe_8283(st);

#elif(Тип_Комуникација==2)

Describe_Modbus(st);

#крај

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Време на објавување: 26 јуни 2023 година