Smart Eye gebaseerd op het ronde DWIN-scherm

——Van het DWIN-ontwikkelaarsforum

Het open source-project van het DWIN-ontwikkelaarsforum dat deze keer aan 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: het slimme DWIN-scherm 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 via DGUS-software en er zijn slechts twee grafische bedieningselementen nodig. Bij deze routine koos de ingenieur voor een rond smart-scherm van 2,1 inch.

dytrgf (2)

3. Realiseer knipperanimatie

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

// Knipperanimatie

leegte blink_animat(ongeldig)

{

als(knipper_vlag == 0)

{

blink_cnt++;

als(blink_cnt >= 4)

{

knipperen_vlag = 1;

}

}

anders

{

blink_cnt–;

als(blink_cnt

{

knipperen_vlag = 0;

}

}

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

}

ongeldig blink_run()

{

statische u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

blink_animated();

Vertraging_ms(30);

}

}

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

Dit is vergelijkbaar met knipperen, maar dan moet de tijd van de kristaloscillator worden vergeleken om de oogbeweging te controleren. Na vele malen foutopsporing ontwierp de ingenieur de volgende reeks codes.

//Oogbolanimatie

ongeldig oogbol_animat(nietig)

{

oogbol_timer_cnt++;

als(oog_timer_cnt

{

oogbol_cnt = 20;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 50;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 80;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 94;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 94;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 80;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 50;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 20;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = -10;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = -40;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = -54;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = -40;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = -10;

}

anders als(eyeball_timer_cnt

{

oogbol_cnt = 20;

oogbol_timer_cnt = 0;

}

//Beweeg naar links en rechts

// if(oogbol_vlag == 0)

// {

// oogbol_cnt++;

// if(eyeball_cnt >= 94)

// {

// oogbol_vlag = 1;

// }

// }

// anders

// {

// oogbol_cnt–;

// if(eyeball_cnt

// {

// oogbol_vlag = 0;

// }

// }

als(oogbol_cnt >= 0)

{

oogbol_pos[0] = 0×00;

oogbol_pos[1] = oogbol_cnt;

}

anders

{

oogbol_pos[0] = 0xFF;

oogbol_pos[1] = (oogbol_cnt & 0xFF);

}

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

}

ongeldig eyeball_run()

{

statische u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

geanimeerde_oogbol();

}

}

5. Voeg ESP32-gezichtsherkenning toe om de beweging van de 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 die in de while-lus wordt verhoogd. Wanneer de stap een bepaalde waarde bereikt, zullen de oogbollen vanzelf bewegen. Wanneer de seriële poort gegevens ontvangt, wordt deze variabele gewist en worden de ogen alleen verplaatst op basis van de positie van het gezicht. De hoofdcode is als volgt:

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

anders

{

oogbol_run();

}

externe u32 rec_data_timer_cnt;

externe u16 eyeball_timer_cnt;

ongeldig Communicatie_CMD(u8 st)

{

als((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

oogbol_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