Smart Eye gebaseerd op DWIN rond scherm

——Van DWIN Developer Forum

Het open source-project van het DWIN-ontwikkelaarsforum dat deze keer voor iedereen wordt aanbevolen, is een zeer interessante routine voor het simuleren van de beweging van menselijke ogen.De ingenieur gebruikte verschillende beeldmaterialen voor het menselijk oog om functies zoals oogbolbeweging, knipperen, gezichtsherkenning en volgen te realiseren.

Inleiding tot open source-oplossingen:

1. UI-beeldmateriaal

Noot van de redactie: DWIN smart screen is gebaseerd op afbeeldingen om de UI-ontwikkeling te voltooien, waarmee gemakkelijk verschillende weergave-effecten kunnen worden gerealiseerd.

dytrgf (1)

2. Interface-ontwikkeling

Het is relatief eenvoudig om de interface te ontwikkelen met behulp van DGUS-software en er zijn slechts twee grafische bedieningselementen nodig.In deze routine koos de ingenieur voor een rond smartscreen van 2,1 inch.

dytrgf (2)

3. Realiseer knipperende animatie

Laat de foto's van de oogleden beurtelings met tussenpozen worden weergegeven:

// Knipperende animatie

leegte blink_animat(ongeldig)

{

als(knipper_vlag == 0)

{

blink_cnt++;

als(blink_cnt >= 4)

{

blink_flag = 1;

}

}

anders

{

blink_cnt–;

als(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

leegte blink_run()

{

statisch u32 run_timer_cnt = 0;

run_timer_cnt++;

als(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

blink_animat();

Vertraging_ms(30);

}

}

4. Realiseer je dat de oogbollen er natuurlijk naar links en rechts uitzien.

Dit is vergelijkbaar met knipperen, maar het moet de tijd van de kristaloscillator vergelijken om de oogbeweging te regelen.Na vele malen debuggen, ontwierp de ingenieur de volgende reeks codes.

//Eyeball-animatie

leegte eyeball_animat (leegte)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

oogbol_cnt = 20;

}

anders als(eyeball_timer_cnt < 51)

{

oogbol_cnt = 50;

}

anders als(eyeball_timer_cnt < 52)

{

oogbol_cnt = 80;

}

anders als(eyeball_timer_cnt < 53)

{

oogbol_cnt = 94;

}

anders als(eyeball_timer_cnt < 103)

{

oogbol_cnt = 94;

}

anders als(eyeball_timer_cnt < 104)

{

oogbol_cnt = 80;

}

anders als(eyeball_timer_cnt < 105)

{

oogbol_cnt = 50;

}

anders als(eyeball_timer_cnt < 106)

{

oogbol_cnt = 20;

}

anders als(eyeball_timer_cnt < 107)

{

oogbol_cnt = -10;

}

anders als(eyeball_timer_cnt < 108)

{

oogbol_cnt = -40;

}

anders als(eyeball_timer_cnt < 158)

{

oogbol_cnt = -54;

}

anders als(eyeball_timer_cnt < 159)

{

oogbol_cnt = -40;

}

anders als(eyeball_timer_cnt < 160)

{

oogbol_cnt = -10;

}

anders als(eyeball_timer_cnt < 161)

{

oogbol_cnt = 20;

eyeball_timer_cnt = 0;

}

// Beweeg naar links en rechts

// als (oogbolvlag == 0)

// {

// eyeball_cnt++;

// als(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// anders

// {

// eyeball_cnt–;

// als(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

als(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

anders

{

eyeball_pos[0] = 0xFF;

eyeball_pos[1] = (eyeball_cnt & 0xFF);

}

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

}

leegte oogbol_run()

{

statisch u32 run_timer_cnt = 0;

run_timer_cnt++;

als(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Voeg ESP32-gezichtsherkenning toe om de beweging van ogen die het gezicht volgen te realiseren.

De verwerkingsmethode hier is dat wanneer het gezicht wordt gedetecteerd, de ogen niet vanzelf bewegen en dat er een variabele wordt gedefinieerd om te verhogen in de while-lus.Wanneer de toename een bepaalde waarde bereikt, zullen de oogbollen vanzelf bewegen.Wanneer de seriële poort gegevens ontvangt, wordt deze variabele gewist en bewegen de ogen alleen volgens de positie van het gezicht.De hoofdcode is als volgt:

als(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

anders

{

eyeball_run();

}

externe u32 rec_data_timer_cnt;

externe u16 eyeball_timer_cnt;

leegte 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_Communicatie==1)

Beschrijf_8283(st);

#elif(Type_Communicatie==2)

Beschrijf_Modbus(st);

#stop als

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Posttijd: 26 juni 2023