Langaton yhteys Arduino <-> PC:llä oleva Visual Studio
Lähettäminen UDP:lla Arduinoon
Dokumentaatiota yhteydelle löysimme täältä:
https://www.open-electronics.org/lets-program-arduino-with-microsoft-visual-studio-2017/
Arduinon esimerkki auttoi alkuun Arduinon päässä ja vb.netille tsekkasimme täältä:
https://www.codeproject.com/Articles/8877/UDP-Send-and-Receive-using-threads-in-VB-NET
Ensimmäinen tehtäväoli lisätä kirjastot projektiin:
Imports System.Net.Sockets
Imports System.Net
![]()
Määrittelimme Arduinon käyttämän portin ja IP:n. Sisäverkon IP:n osalta kannattaa tässä kohden mainita, että tuo IP kannattaa määritellä reitittimeen kiinteäksi MAC-osoituksella (ja mieluusti käytetyn sarjan loppupäästä), jolloin yhteys ei katoa reitittimen jakaman IP-osoitteen leasetimen tullessa vastaan ja osoitteen mahdollisesti muuttuessa.
Sitten laitoimme esimerkistä koodia ja Web Editorin sarjaportin monitoroinnissa ja GUIssamme näytti nyt tältä:

Lähetys siis toimi PC:ltä Arduinolle.
Vastaanotto UDP:lla Arduinosta
Arduinon puoli
Tämä paljastuikin sitten olevan astetta hankalampi rasti. Harhailimme aikamme ja huomasimme, että oikotietä ei tälläkään kertaa ollut, vaan ongelma on ratkottava pala kerrallaan ja nollasta. Projektin ongelmana oli,ettäsiinä oli kaksi erillistä liikkuvaa osaa ja kun koetti ratkoa molempia kerralla, niin ei tiennyt missä kohtaa mikäkin tökki. Eli oli Arduino ja sen koodi ja PC/vb.net ja sen koodi.
Löysimme esimerkkiprojektin, josta saimme UDP-kuuntelijan PC:n vb.netille.
https://www.codeguru.com/columns/vb/communication-using-udp-and-visual-basic.html
Näin saimme eliminoitua PC-puolen ongelmat tässä vaiheessa. Ainoat muutokset koodiin teimme määrittelemällä socketin.
Arduinon lähettäjäesimerkin saimme täältä:
https://forum.arduino.cc/index.php?topic=176669.0
Siellä oleellista tässä vaiheessa oli tämä:

Lisäsimme tuon koodinpätkän Arduinon luuppiin samaan suoritukseen UÄ-sensorin etäisyysilmoituksen kanssa, niin saimme helposti toistoa esimerkillemme.Kuitenkin niin että vaihdoimme näytettävän tekstin, PC:mme IP:n ja portin eli socketin.
Starttasimme ensin kuuntelun PC:ssä ja sitten tuuppasimme muunnetun koodin Arduinoon.
Nyt kuuntelija alkoi suoltaa tällaista:

Hyvä! Se toimii, tosin merkistö on pielessä UTF8 vs. ANSI varmaan, mutta se ei ole tässä oleellista.
Seuraavaksi ajattelimme koettaa saada Arduino lähettämään ne etäisyys-, lämpötila- ja painiketiedot UDP:lla.
Etäisyystieto
Ja kun parin tunnin päästä saimme ensi kertaa jotain tolkullista etäisyysdataa UDP:lla näytölle tuntui se varsinaiselta työvoitolta. Tässä lyhyt selostus tämän ongelman ratkonnasta.
Huomasimme heti, ettei homma ole lähellekään yhtä simppeli kuin sarjaportin kanssa. Siinähän riitti, kun laittoi komennolla println aiemmin saatu desimaalinen etäisyysarvo (muuttujassa) ja halutut tekstit liitettynä menemään tyyliin:
Serial.println("Etaisyys: "+ String(distance)+ " cm");
Suoraviivaista ja selkeää. Mutta UDP:n kanssa, ehei. Saimme siis menemään tekstiä lainausmerkkien sisältä, mutta tuo sarjaporttityyli ei toimi.
Loimme ensin taulukon packetBuffer2[], johon meillä oli tarkoitus saada se etäisyystieto, vaikka sitten tekstinä. Saimme muutaman sata eri virheilmoitusta yhtä monella yrittämällä, koska C++:n logiikka poikkeaa täysin vb.netin vastaavasta. Mikään konsti ei tuntunut purevan. Mutta lopulta löysimme yrityksen ja erehdyksen kautta varsin lupaavan esimerkin:
https://arduino.stackexchange.com/questions/26832/how-do-i-convert-a-float-into-char
There is a function in the standard Arduino library called dtostrf(). I think of it as "Decimal to String Float". You pass in the float, how wide you want the whole number to be (if it will fit), the number of decimals of precision - and the buffer you want it to fill.
Ei kun kokeilemaan. Vaan ei, ilmoitti ettei tunne koko komentoa. Piti siis löytää vielä komennolle kirjasto. Google kertoili parin yrityksen jälkeen tällaista:
apparently dtostrf is available only on avr, I've added a function to emulate it, it will be available on the next IDE release by including <avr/dtostrf.h>.
Joten lisäsimme tuon kirjaston <avr/dtostrf.h> ja johan alkoi lyyti kirjoittamaan.
Laitoimme koodiin siis rivin:
![]()
Distance on se aiemman koodin antama desimaalilukema etäisyydelle.
Sitten data piti saada packetBufferiin. Ja tämäkin rassasi tovin aikaa. Löytyi tällainen uusi hieno komento kuin strcpy()
https://stackoverflow.com/questions/15286014/segmentation-fault-strcpy-c
Sen avulla saimme taas luotua rivin lisää koodia:
![]()
Ja lopulta itse asiaan:

Ja nyt!

Teksti tuli sieltä vb.netin koodista, mutta lukema etäisyysanturilta Arduinosta, jes.
Etäisyys sai olla oikeastaan tarkempikin lukema, joten lisäsimme desimaalit:

Kerralla nappiin, oho:

Tuo tulisi tarvitsemaan tunnisteita, jotta ei mene lämpötilan ja painikkeen kanssa sekaisin. Mutta katsomme sen myöhemmin.
Lämpötilatieto
Nyt meillä oli valmis sapluuna, joten lämpötilatiedon saaminen langattomasti ei oletuksemme mukaan pitänyt olla enää iso ongelma.
Lähdimme siis luomaan Arduinoon koodia luuppiin lämpötilasensorin kohdalle.
Ihan pikkuisen harha-askeleen jälkeen saimme koodin toimimaan. Meitä hämäsi, että tilanne oli nyt helpompi, muunnoksia ei tarvittu!
Laitoimme lämpötila-anturin sarjaporttikoodissa lasketun numberString-merkkitaulukon karvoineen kaikkineen suoraan lähetykseen ja toimi laakista.

PC:lle tuli kamaa nyt näin:

Eli joka toinen rivi etäisyyttä ja toinen lämpötilaa. Noille arvoille pitää tosiaan kehitellä fiksausta jompaan kumpaan päähän, parempi olisi ehdottomasti Arduinon pää.
Painonapin tila
Sitten vielä napin painallus. Lähdimme tsekkaamaan sen koodin ja kuinka siihen saadaan UDP-komponentti mukaan.
Tämä oli helppo, meillehän riitti, että lähetetään ennaltavalittu teksti, kun trigger laukeaa ja tämä triggerhän oli valmiina sarjaporttiosuuden koodissa, joten lisäsimme sen sinne, esimerkkikoodihan meillä oli jo alkujaan:

Ja sitten testaamaan, näytti tältä:

Pelasi kerrasta, huolestuttavaa.
Yhteenvetoa tilanteesta. Nyt toimivat siis kaikkien sensoreiden lähetys Arduinosta langattomasti lähiverkossa PC:lle ja lukemat saatiin vb.netillä tehdyllä ohjelmalla myös näkymään. Jo aiemmin oli saatu lähetettyä tekstimuotoista dataa langattomasti Arduinoon.
Arduinon pään lähettämän datan muodon virittäminen
Saimme nätisti lisättyä koodia, jotta ulostuonti saatiin tolkulliseksi. Lämpötilalukema oli muodoltaan hassu, mutta se olisi helposti korjattavissa PC:n/vb.netin päässä.
Ultraäänisensori:

Lämpötilasensori:

Ja kuuntelijan päässä näkymä nyt:

Sivu 8 / 16