Ohjelmointia Pythonilla

Tänään kirjoitan asiasta josta tiedän jotain, mutta en todellakaan paljoa – saatikka että väittäisin olevani minkääntasoinen asiantuntija. Eli hieman siis liikutaan epämukavuusalueella.

Kyse on siis ohjelmoinnista. Ja nimenomaan perinteisestä ”soft”-ohjelmoinnista, eikä laitteisto-ohjelmoinnista (VHDL, Verilog, SystemVerilog), jota kyllä osaan kattavasti työn puolesta. Olen käynyt pakolliset C++ -kurssit opiskeluaikoina ~20 vuotta sitten, eikä kurssinumerot olleet silloin mitenkään ylihyviä. HW-puolelle suuntauduttuani ja työsarkaa sillä puolella koluttuani, alkoi vähäisetkin koodaamistaidot jäädä unholaan ainakin C++-kielen osalta. Työelämässä olen toki tarvinut alusta asti skriptauskieliä kuten sh, csh, bash, Perl, Tcl, html, awk jne. Myöskin Assembly-kieli tuli tutuksi mikrokontrollerin ohjelmoinnissa. Perl ja Tcl ovat toki paljon enemmänkin kuin skriptauskieliä, mutta siihen tarkoitukseen minä niitä lähes yksinomaan käytin. Skriptausohjelma on siis tyypillisesti pieni ohjelmanpätkä, joka hoitaa joko yhden tai muutamia asioita kerrallaan. Jos vaikka jokin tulostiedosto näyttää sekavalta, voi esim. Perlillä saada sen näyttämään järkevämmältä.

Python-kieleen tutustuin nykyisessä työpaikassani 4,5 vuotta sitten. Työkaverilla oli hienoja Python-skriptejä, joilla hän muutti tulostusta kätevästi. Python syntaksi näytti paljon helpommalta kuin Perl-totetus, joten kipinä Pythonista jäi mieleen itämään. Otinkin Pythonin käyttöön skriptaamisessa ja muutamia arkea helpottavia pikkuohjelmia tuli tehtyä. Ilokseni huomasin että Python tukee Tcl/Tk-GUI rajapintaa, josta minulla oli jo aiempaa kokemusta. Tk -lisäystä kutsutaan Pythonissa Tkinter-nimellä, jolla olen siis tehnyt aiemmassa postauksessa olleet GUI-harjoitelmat.

Raspberryä voisi ohjelmoida monella muullakin kielellä, mutta Python on ilmeisesti suosituin ei-web-pohjaiseen ohjelmointiin. Raspberry-palstoilla web-pohjaiseen ohjelmointiin suositeltiin Node-RED:iä, joka generoi JavaScriptiä. Jotkut käyttävät ilmeisesti C++-kieltä tai kirjoittavat suoraan Javaa. Myös täysin graafista Scratch-ohjelmointiympäristöä voi käyttää, taikka sitten Rubyä, jota wikipedian mukaan pidetään maailman helpoimpana ohjelmointikielenä. Sitä ilmeisesti opetataan jo peruskoulussa?

Mutta takaisin Pythoniin! Hehkutan sitä kieltä tässä eniten, koska sitä osaan parhaiten – mikä siis ei tarkoita että täydellisesti. Python on tulkkaava ohjelmointikieli, eli välittömästi ohjelman kirjoitettuani voin ajaa sen ja saada virheilmoitukset heti näkyviin. Python myös etenee koodissa iloisesti aina sinne saakka, kunnes ensimmäinen virhe koodista löytyy. C++-ohjelma sen sijaan pitää kääntää erikseen – mikä ei sekään ole iso steppi, mutta vaatii enemmän aikaa kuin Pythonin välitön palaute. Tulkkaavilla ohjelmointikielillä on kääntöpuolensa – ne eivät ole yhtä suorituskykyisiä kuin kääntävillä kielillä kirjoitetut ohjelmat.

Ohjelmointiprojekti on edennyt seuraavasti:

  • Kosteuden mittaus: 10 riviä koodia
  • Kodinonnen ja Nukkumatin kastelu (pumpun ohjaus): 34 riviä koodia
  • Kosteuden mittaus ajastetusti ja tallennus tiedostoon: 70 riviä koodia
  • Kosteuden mittaus ja kastelu ajastetusti kahtena päivänä viikossa ja tallennus tiedostoon: 180 riviä koodia
  • Kosteuden mittaus ja kastelu ajastetusti kahtena päivänä viikossa ja tallennus tiedostoon. Viikkomittaus päivittäin 4h välein ja tallennus tiedostoon. Testiversio GUI:sta (näkyvissä aiemmassa postauksessa), Kasvivalo-ohjaus: 400 riviä koodia
  • Nykyinen versio: Kaikki edelliset ominaisuudet + päiväkohtaiset kastelumääräasetukset, kuivuusraja, kosteustilanne näyttö, manuaalikastelu, logitiedoston teko, on/of statusvalot, kasteluhistorian ikkuna, jossa pv-viikko-kohtainen tulostus. Ohjelmien järjestely luokkakohtaisesti omiin tiedostoihin. GUI 650 riviä + filehandler 150 riviä + manual_controls 35 riviä + history_plot 35 riviä = 870 riviä koodia.

Täytyy huomioida että rivien määrä ei kerro mitään koodin hyvyydestä ja valmiusasteesta. Välissä on paljon erilaisia testitulostuksia ja ihan joka paikassa en ole käyttänyt looppeja. Välillä teen myös turhia tietotyyppimuunnoksia, jotka olen tajunnut vasta myöhemmin, mutta en ole jaksanut korjata. Optimointia siis riittää!

Mitä seuraavaksi? Nykyisessä GUI:ssa alkaa olla jo kaikki perusominaisuudet mitä alunperin ajattelin. Pystyn aikataulutetusti kastelemaan (yhtä kasvia) halutun määrän haluttuun aikaan – mikäli kasvi on tarpeeksi kuiva. Näen GUI:sta onko automaatio päällä ja mikä on viimeisin kosteustilanne. Näen myöskin graafin minkä tahansa päivän tai viikon tilanteesta. Tarvittaessa pystyn kastelemaan manuaalisesti halutun määrän. Ja jos jokin menee vikaan, niin näen logitiedostosta johtolankoja.

Seuraavaksi siis: kopioidaan toiminnot toisiin sheetteihin ”Nukkumatti, Chilit jne”. Sen jälkeen pidän tauon GUI:n kanssa ja alan testaamaan ilmankosteus-, valo- ja vuoto-antureita sekä niiden integroimista järjestelmään. Odotan myös jo innolla seuraavaa lähetystä Kiinasta. Sieltä pitäisi tulla lisää pumppuja, raja-antureita vesisäiliöihin, letkuliittimiä, vuoto-anturi ja kaikkea muuta kivaa. 🙂

The latest GUI. All the basic features (for one plant) starts to be ready. Now it’s mainly about copying the features for the other plants.

Graafisen käyttöliittymän ohjelmointi aloitettu

Lentsu iski eilen ja oon ollut aika zombiena pari päivää. Sain viikonloppuna – kun olin vielä terve – aloitettua GUI:n rakentamisen alla näkyvin tuloksin. On vähän hullunkurista tehdä suomenkielistä GUI:ta, kun yleisesti on niin tottunut englanninkielisiin nimiin; start, stop, exit jne. Mutta haluan tehdä GUI:n ehdottomasti suomeksi, sillä englanninkielen ylivalta välillä vähän tympäisee. Sitä paitsi meillä kutsutaan kasveja suomenkielisillä nimillä, joten suomi sopii siinäkin mielessä.

I’ve been sick for the last couple of days. I started GUI design in the weekend and early results are visible below. I also translated couple of strange plant names for you:

Nukkumatti = prayer plant (Maranta leuconeura)

Kodinonni = baby’s tears, angel’s tears, bits and pieces (Soleirolia soleirolii)

This is how my working area looks like. I’ve been using Thonny IDE as Python programming interface. In the front you can see a first test version of the GUI. Another irrigation python program is running on the terminal behind – it’s creating measurement log and irrigates according to the schedule.
The second version. But not a final… not even close.

Lopuksi vinkki seuraajille: Kannattaa painaa ”subscribe” -nappia alhaalla ja antaa sähköpostiosoite. Saatte sitten viestin aina kun päivitän uusia höpinöitä tai kuvia.

Kiitokset kaikille seuraajille ja vierailijoille tähän mennessä! En tiedä keitä olette ja milloin käytte, mutta näköjään tämä porukoita kiinnostaa. Sen verran statistiikkaa näen, että kävijöitä on joka päivä yli viidestä kymmeniin ympäri maailmaa. Enimmäkseen kuitenkin Suomesta.

A hint for the followers: If you press ”subscribe” button and give your email, you’ll be informed when I update something wild and crazy. And also the boring stuff…

I also want to thank all visitors so far! I’ve been surprised that so many have been interested in my experiments. Of course this will not compare to any fashion blogs, but who knows if I start publishing some fashion hints also… or maybe not! 😀