IOT

STONE-sarja HMI Arduino varhaisen oppimisen lukutaidon esittely

Käyttäen Grafiikan perusohjaus STONE-sarjanäytöstä voit piirtää viivoja, kolmioita, polygoneja, suorakulmioita, neliöitä, ympyröitä, kaaria, täyttövärejä, leikata ja liittää ja niin edelleen.

Varhaisen oppimiskoneen suunnittelu sarjakosketusnäytöllä STVI056WT-01, muotojen tunnistaminen kuvia katsomalla, sanojen tunnistaminen värien mukaan ja viihdemuodon suunnittelu oikeiden virheiden määrittämiseksi, pisteytyksen tai tason läpäisemiseksi, jotta lapset oppivat tunnistamaan värejä, ymmärtämään perusmuotoja ja oppimaan niitä vastaavat sanat rennosti ja leikkisästi.

Virallinen videoesitys ei kerro Basic-grafiikkaohjaimen todellista vaikutusta, joten tämä demo täydentää sitä. Piirustusohjeet välitetään kommunikoinnin kautta arduino ohjauskortti ja STONE sarjatason.

Lisäksi tämä huomautus ei sisällä Basic-grafiikkaohjauksen täydellistä toiminnallista sisältöä, vain kehittelyn käytössä käytetyt toiminnot, tallennetut testataan koneella OK, voit ladata demoajon suoraan.

Demon laitteistoympäristö on esitetty kuvassa 1, kuva 2 ja kuva 3.

STONE:n mukana tulee virallisesti 2 korttia, joista neliönmuotoinen on USB-latauskortti ja pitkä on USB-sarjaviestintäkortti (ja DC12V-virtalähde sarjanäytölle).

(Kuva 1: STONE-sarjanäytön tiedonsiirto- ja virtaliitäntä) (Kuva 2: Kytkentäkaavio Basic Graphics -ohjaustiedostojen lataamiseen STONE-näytöstä)

(Kuva 3: TX, RX, GND-yhteys STONE-sarjanäytön viestintäkortin ja arduino-kehityskortin välillä)

(Kuva 4: Grafiikkaohjauksen peruspiirustusalue ja muuttuva osoite ja muut parametriasetukset)

Kun olet valinnut Basicgraphics-säätimen STONE TOOLBox(GUI Design software) -valikosta Variable Configuration (D) ja asettanut piirustusalueen ja muuttuvan osoitteen parametrit, 0x82-käskyä käytetään kirjoitettaessa asetettuun Variable-muistiosoitteeseen (0x1000 asetetaan tässä). Piirustusalueen ja muuttuvan osoitteen parametrien asettamisen jälkeen 0x82-käskyllä ​​kirjoitetaan CMD + Data_pack_Num_Max + Data asetettuun muuttuvan muistin osoitteeseen (tässä tapauksessa 0x1000) piirustustoimintojen toteuttamiseksi. Tarkka toimintokoodi on esitetty kuvassa 6, jossa on viivapiirroskäsky 0x0002 seuraavan esimerkin avulla.

(Kuva 5: Perusgrafiikkaohjausdatan komentomuoto)

(Kuva 6: Kuva viiva- ja suorakaidekomennoista perusgraafista ohjausta varten)

Viivapiirrosohje 0x0002, käyttöesimerkki.

Mustan viivan yhdistämiseksi koordinaateista (340, 200) koordinaatteihin (585, 200), ohje on

A5 5A 11 82 10 00 00 02 00 01 00 00 01 54 00 C8 02 49 00 C8

Piirrä kolme mustaa viivaa, jotka on suljettu kolmioksi, jossa on kolme kärkeä koordinaateissa (200, 200), (300, 200), (250, 100), ja ohje on

A5 5A 19 82 10 00 00 02 00 03 00 00 00 00 C8 00 C8 01 2C 00 C8 00 FA 00 64 00 C8 00 C8

Yllä oleva 0x1000 on perusgrafiikkaohjauksen muuttuva osoite, 0x0002 on ohjekoodi, 0x0001 ja 0x0003 ovat 1 rivi ja 3 riviä, 0x0000 on värikoodi, arvo 0000 on musta ja arvo ffff on kirkkaan valkoinen. Muut kunkin pisteen välittömät XY-koordinaatit.

Esimerkki suorakulmion piirtämisestä.

Suorakulmion vasemman yläpisteen koordinaatit (340, 237), oikean alakulman koordinaatit (585, 340) väri musta, komento on

A5 5A 11 82 10 00 00 03 00 01 01 54 00 ED 02 49 01 54 00 00

Piirrä samanaikaisesti kaksi suorakulmiota (340, 237) – (585, 340), (324, 221) – (601, 356), komento on

A5 5A 1B 82 10 00 00 03 00 02 01 54 00 ED 02 49 01 54 00 00 01 44 00 DD 02 59 01 64 FF FF

Yllä oleva 0x1000 on perusgrafiikkaohjauksen muuttujaosoite, 0x0003 on suorakulmion komentokoodi, 0x0001, 0x0002 on 1 suorakulmio, 2 suorakulmiota, 0x0000, 0xffff on värikoodi, arvo 0000 on musta, kirkas arvo on fff. valkoinen. Muut ovat kunkin suorakulmion vasemman yläpisteen ja oikean alakulman XY-koordinaatit.

(Kuva 7: Suorakulmion täyttö- ja piirrosympyräkomennot perusgrafiikkaohjaukseen)

Esimerkki suorakaiteen täytöstä.

Mustan suorakulmion täyttö (470, 200) ~ (550) -komento on

A5 5A 11 82 10 00 00 04 00 01 01 D6 00 C8 02 26 00 FF 00 00 00

Esimerkki ympyrän piirtämisestä.

Ympyrän keskipiste (470, 200), R = 50 musta, ohje on

A5 5A 0F 82 10 00 00 05 00 01 01 D6 00 C8 00 32 00 00

Piirrä kaksi ympyrää samanaikaisesti, keskipiste A (470, 200) R=50 ja keskipiste B (256, 200) R=80, molemmat mustalla, komento on

A5 5A 17 82 10 00 00 05 00 02 01 D6 00 C8 00 32 00 00 01 00 00 C8 00 50 00 00

(Kuva 8: Kaarikomento perusnäytönohjaimelle)

Kaaren resoluutio on 0.5 astetta, 360 astetta vastaa 720:aa ja 0 astetta on pystysuorassa ylöspäin.

Kaari esimerkki.

Yläkaari 315 astetta alussa – 45 astetta loppuun, ympyrän keskipiste (300, 200) R = 80, musta, komento on

A5 5A 13 82 10 00 00 0B 00 01 00 00 01 2C 00 C8 00 50 02 76 00 5A

Värien suhteen.

0x0000 on musta 0xffff on valkoinen 0x00ff on sininen 0xf000 on punainen 0xfd60 on oranssi

0xff60 on keltainen 0x2f60 on vihreä

(Kuva 9: ​​Grafiikkaohjauksen peruspiirustustaulun parametrit ja osoitteet)

(Kuva 10: Perusgrafiikkaohjaimen väriliitännän piirustustaulun parametrit ja osoitteet)

Muuttujan osoitteen mukaan komento täyttää vihreä väri kohteille (10, 80) ~ (630, 400) on

A5 5A 11 82 60 00 00 04 00 01 00 0A 00 50 02 76 01 90 2f 60

Muita yhtäläisyyksiä, katso lisätietoja ohjelmakoodista.

Videolla esitetty koodi on seuraava.

/*

frank10

STONE ja arduino COMM, perusgrafiikka pelaa ohjelmassa..

Sytyttää LEDin yhdeksi sekunniksi, sitten sammuu sekunniksi toistuvasti. LED kertoo, että pehmeä toiminta on ok!

Esimerkissä on kaksi sivua. Sivu1 on muotoinen, sivu2 on värillinen!

Tämä esimerkkikoodi on frank-tiedostossa. 20210625

*/

// Nastassa 13 on LED -valo, joka on kytketty useimpiin Arduino -levyihin.

// anna sille nimi:

int led = 13;

int iYePian = 0; //0x0020: The num of YePian!

//int iGongLu = 0; //0x0180 GongLulle!

//int iLiuLiang = 0; //0x0160 for The now LiuLiang!

int iJiao = 0; // 0x0260 for JieJuJiao!

int iGongLuWater = 0; //0x0280 The Water GongLulle! arvo on 0-50000!

int iLed = 1; //viiveaika num.

int iLed2 = 1; //viiveaika num. 50 ms tekee pisteen.

int iLed3 = 0; //viiveaika num. 50 ms tekee pisteen.

int iLed4 = 0; //viiveaika num. 50 ms tekee pisteen.

int iCurve0 = 0; //käyrän0 arvo. 50 ms tekee pisteen.

int iCurve1 = 0; //käyrän1 arvo,. 50 ms tekee pisteen.

int iFlag0 = 1; // Käyrän lippu0 + tai -; .1 on ylöspäin, 0 on alaspäin.

int iFlag1 = 1; // Käyrän lippu1 + tai -; .1 on ylöspäin, 0 on alaspäin.

int inNum = 0; //lue char num.

int iNum2 = 0; //lue char num2 ShuiDianZhanille!

//int iPower = 2; //avainpatsas 0x0009

//int iMode = 2; //avainpatsas 0x000A

int iPowerWater = 2; //avainpatsas 0x0039

// asennusohjelma suoritetaan kerran, kun painat nollauspainiketta:

tyhjä asennus () {

// alustetaan digitaalinen nasta lähtöön.

pinMode(led, OUTPUT);

Serial.begin(115200); // Avaa sarjaliikennetoiminto ja odota, että sarjaportti avautuu

while (!Serial) {

; // odota, että sarjaportti muodostaa yhteyden. Tarvitaan vain Leonardolle

}

}

// silmukkarutiini jatkuu yhä uudelleen ja uudelleen ikuisesti:

void loop () {

inChar;

/*———————————————————————————-*/

if (iLed == 800) {

//——- lue 0x0039 arvo———-

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x04); //pituus

Serial.write(0x83); // lukea!

Serial.write(0x00); // ShuiDianZhanin virtanäppäimen osoite!

Serial.write(0x39); // ShuiDianZhan-virtanäppäimen osoite!

Serial.write(0x01); // 0x0039 (virtapainike)

//———STONE-palautusarvo on "A5 5A 06 83 00 39 01 00 01"——

}

// Lue sarjaportin lähettämät tiedot:

if (Serial.available() > 0) { inChar = Serial.read(); }

/*

säästää bak.

koska sillä voi olla lukuavain ja avaimen työ.

Ohjelma on käyttöliittymä, jonka syötteen avain tekee peplose-työn.

*/

//—————————————————————————————

//—————————-0x0039 avaimen luku alkaa————————————–

if (inChar == 0x39) { inNum2 = 1 ; }

if ((inChar == 0x01)&&(iNum2 == 1)) { iNum2 = 2 ; }

if ((inChar == 0x00)&&(iNum2 == 2)) { iNum2 = 3 ; }

if ((inChar == 0x01)&&(iNum2 == 3)) {

iNum2 = 0;

if(iPowerWater != 1){

iPowerWater = 1; //virta päälle!

iJiao = 0;

iGongLuWater = 0;

}

}

if ((inChar == 0x02)&&(iNum2 == 3)) {

iNum2 = 0;

iPowerWater = 2; //virta pois!

}

//——————0x0039-avain lue ok! iPowerWater ok!—————————--

//—————————————————————————————

viive (1);

iLed += 1;

iLed2 += 1; // 50 ms tekee pisteen.

//———————————————————————————————–

//———————————50 ms aloittaa pisteen—————————————–

if (iLed2 == 50) {

iLed2 = 1;

iLed4 += 1; // 50 ms tekee pisteen.

if(iFlag0 == 1){

iCurve0 += 1; // 50 ms tekee pisteen.

if(iCurve0 >= 150){

iFlag0 = 0; // iCurve0 sammuu!.

}

}

if(iFlag0 == 0){

iCurve0 -= 1; // 50 ms tekee pisteen.

if(iCurve0 <= 1){

iFlag0 = 1; // iCurve0 ilmestyy!.

}

}

if(iFlag1 == 1){

if(iLed4 >= 3){

iCurve1 += 1; // 50 ms tekee pisteen.

iLed4 = 0;

}

if(iCurve1 >= 50){

iFlag1 = 0; // iCurve1 sammuu!.

}

}

if(iFlag1 == 0){

if(iLed4 >= 3){

iLed4 = 0;

iCurve1 -= 1; // 50 ms tekee pisteen.

}

if(iCurve1 <= 1){

iFlag1 = 1; // iCurve1 ilmestyy!.

}

}

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x06);

Serial.write(0x84); //kirjoita käyrälle!

Serial.write(0x03); // Kaareva polku,

Serial.write(iCurve0); // N=1,

Serial.write(0x00);

Serial.write(iCurve1);

Serial.write(0x00);

}

//——————————-50ms tekee pisteen loppuun——————————————

//———————————————————————————————--

if (iLed == 500) {

digitalWrite(led, HIGH); // laita LED päälle (HIGH on jännitetaso)

//viive(500); // odota hetki, Alue:200-2000

}

if (iLed >= 1000) {

digitalWrite(led, LOW); // sammuta LED asettamalla jännitteen LOW

//viive(500); // odota hetki, alue:200-2000

iLed = 1;

if( iNum <= 6 ) iNum += 1; //muodon käännös!

if(iNum == 6) iNum = 0; //muodon käännös!

//—————————————Punainen alkaa——————————————–

if( iNum == 1){ // kolmio! ja punainen!

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x19);

Serial.write(0x82);

Serial.write(0x10); // Perusgrafiikan osoiteH

Serial.write(0x00); // Perusgrafiikan osoiteL

Serial.write(0x00); // Tee rivi CMD

Serial.write(0x02); // Tee rivi CMD

Serial.write(0x00); // rivin numero

Serial.write(0x03); // Rivin numero.

Serial.write(0x00); //väriH musta

Serial.write(0x00); //väriL

Serial.write(0x00); // piste X1H

Serial.write(0xc8); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0xc8); // pisteY1L

Serial.write(0x01); // piste X2H

Serial.write(0x2C); // pisteX2L.

Serial.write(0x00); // piste Y2H

Serial.write(0xC8); // pisteY2L

Serial.write(0x00); // piste X3H

Serial.write(0xFA); // pisteX3L

Serial.write(0x00); // piste Y3H

Serial.write(0x64); // pisteY3L

Serial.write(0x00); // piste X1H

Serial.write(0xc8); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0xc8); // pisteY1L

//täyttää--

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x60); // Perusgrafiikkasivun osoiteH2

Serial.write(0x00); // Basic graphics pabe2:n osoiteL

Serial.write(0x00); // Älä täytä suorakulmio CMD

Serial.write(0x04); // Älä täytä suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x00); // piste X1H

Serial.write(0x0A); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x50); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x76); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x90); // pisteY2L

Serial.write(0xF0); // Punainen väriH

Serial.write(0x00); // Punainen väriL

}

//—————————————Punainen on loppu——————————————–

//—————————————Keltainen ja kaari alkaa——————————————–

if( iNum == 2){ // kaari! ja keltainen!

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x13);

Serial.write(0x82);

Serial.write(0x10); // Perusgrafiikkasivun osoiteH1

Serial.write(0x00); // Basic graphics pabe1:n osoiteL

Serial.write(0x00); // Tee kaari CMD

Serial.write(0x0B); // Tee kaari CMD

Serial.write(0x00); // kaaren numero

Serial.write(0x01); // Kaaren numero.

Serial.write(0x00); // väri H musta

Serial.write(0x00); // väriL tyhjä

Serial.write(0x01); // ympyrän XH keskus

Serial.write(0x2c); // XL ympyrän keskipiste

Serial.write(0x00); // ympyrän keskusta YH

Serial.write(0xc8); // ympyrän keskus YL

Serial.write(0x00); // RH

Serial.write(0x50); // RL.

Serial.write(0x02); // Kulma1H

Serial.write(0x76); // Kulma1L

Serial.write(0x00); // Kulma2H

Serial.write(0x5A); // Kulma2L

//täyttää--

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x60); // Perusgrafiikkasivun osoiteH2

Serial.write(0x00); // Basic graphics pabe2:n osoiteL

Serial.write(0x00); // Älä täytä suorakulmio CMD

Serial.write(0x04); // Älä täytä suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x00); // piste X1H

Serial.write(0x0A); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x50); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x76); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x90); // pisteY2L

Serial.write(0xFF); // Keltainen väriH

Serial.write(0x60); // Keltainen väriL

}

//—————————————Keltainen ja kaari on loppu——————————————–

//—————————————Vihreä ja suorakulmio alkavat——————————————–

if( iNum == 3){ // suorakulmio! ja vihreä!

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x10); // Perusgrafiikkasivun osoiteH1

Serial.write(0x00); // Basic graphics pabe1:n osoiteL

Serial.write(0x00); // Tee suorakulmio CMD

Serial.write(0x03); // Tee suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x01); // piste X1H

Serial.write(0x54); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0xED); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x49); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x54); // pisteY2L

Serial.write(0x00); // väri H musta

Serial.write(0x00); // väriL tyhjä

//täyttää--

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x60); // Perusgrafiikkasivun osoiteH2

Serial.write(0x00); // Basic graphics pabe2:n osoiteL

Serial.write(0x00); // Älä täytä suorakulmio CMD

Serial.write(0x04); // Älä täytä suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x00); // piste X1H

Serial.write(0x0A); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x50); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x76); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x90); // pisteY2L

Serial.write(0x2F); // Vihreä väriH

Serial.write(0x60); // Vihreä väriL

}

//————————————— Vihreä ja suorakulmio on loppu——————————————–

//—————————————Oranssi ja neliö alkavat——————————————–

if( iNum == 4){ // neliö! ja oranssi!

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x10); // Perusgrafiikkasivun osoiteH1

Serial.write(0x00); // Basic graphics pabe1:n osoiteL

Serial.write(0x00); // Tee suorakulmio CMD

Serial.write(0x03); // Tee suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x01); // piste X1H

Serial.write(0x54); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x91); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x49); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x86); // pisteY2L

Serial.write(0x00); // väri H musta

Serial.write(0x00); // väriL tyhjä

//täyttää--

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x60); // Perusgrafiikkasivun osoiteH2

Serial.write(0x00); // Basic graphics pabe2:n osoiteL

Serial.write(0x00); // Älä täytä suorakulmio CMD

Serial.write(0x04); // Älä täytä suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x00); // piste X1H

Serial.write(0x0A); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x50); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x76); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x90); // pisteY2L

Serial.write(0xFD); // oranssi väriH

Serial.write(0x60); // oranssi väriL

}

//—————————————Oranssi ja neliö on loppu——————————————–

//————————————– Sininen ja ympyrä alkaa——————————————–

if( iNum == 5){ // ympyrä! ja sininen!

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x0F);

Serial.write(0x82);

Serial.write(0x10); // Perusgrafiikkasivun osoiteH1

Serial.write(0x00); // Basic graphics pabe1:n osoiteL

Serial.write(0x00); // Ympyröi CMD

Serial.write(0x05); // Ympyröi CMD

Serial.write(0x00); // ympyrän numero

Serial.write(0x01); // Ympyrän numero

Serial.write(0x01); // ympyrän XH keskus

Serial.write(0xD6); // XL ympyrän keskipiste

Serial.write(0x00); // ympyrän keskusta YH

Serial.write(0xc8); // ympyrän keskus YL

Serial.write(0x00); // RH

Serial.write(0x32); // RL.

Serial.write(0x00); // väri H musta

Serial.write(0x00); // väriL tyhjä

//täyttää--

Serial.write(0xA5); //"A5" on 165

Serial.write(0x5A); //"5A" on 90

Serial.write(0x11);

Serial.write(0x82);

Serial.write(0x60); // Perusgrafiikkasivun osoiteH2

Serial.write(0x00); // Basic graphics pabe2:n osoiteL

Serial.write(0x00); // Älä täytä suorakulmio CMD

Serial.write(0x04); // Älä täytä suorakulmio CMD

Serial.write(0x00); // suorakulmion numero

Serial.write(0x01); // Suorakulmion numero

Serial.write(0x00); // piste X1H

Serial.write(0x0A); // pisteX1L

Serial.write(0x00); // piste Y1H

Serial.write(0x50); // pisteY1L

Serial.write(0x02); // piste X2H

Serial.write(0x76); // pisteX2L.

Serial.write(0x01); // piste Y2H

Serial.write(0x90); // pisteY2L

Serial.write(0x00); // sininen väriH

Serial.write(0xFF); // sininen väriL

}

//————————————— Sininen ja ympyrä on loppu——————————————–

Lopuksi verkkovirheenkorjaus.

STONE TOOLBox (GUI Design -ohjelmisto) muokkaa näytön tiedostojen latausta, arduino-kooditiedostojen latausta, kytkee virtalähteen, yhteyden, virran päälle tarkkailemaan kuvan piirustusta ja värin muutosta halutun vaikutuksen saavuttamiseksi.

Videolla esitetty koodi on seuraava.

(verkkoviritysyritykset)

Lähde: Platon Data Intelligence