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.

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out /  Muuta )

Google photo

Olet kommentoimassa Google -tilin nimissä. Log Out /  Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out /  Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out /  Muuta )

Muodostetaan yhteyttä palveluun %s