Raspberry Pi (3): Weerrobot en MySql

Weerrobot en MySql

Inleiding
weerrobotSinds de introductie van de Raspberry Pi in 2012 kon niemand bedenken hoe populair deze op een ARM-processor gebaseerde microcomputer zou worden. Voor nog geen veertig euro voor de hardware en een gratis Linux distributie via internet erop gedownload, wordt de Raspberry een volwaardige computer. De afmetingen van de Pi zijn zeer gering en zijn vergelijkbaar met de grootte van een betaalpas. Ondanks de afmetingen is er een HDMI aansluiting aanwezig voor een beeldscherm, een ethernetaansluiting voor het netwerkverkeer en meerdere USB poorten voor het aansluiten van een toetsenbord, muis of andere USB device zoals een externe schijf of geluidskaart.

Verder is een aantal vrij te programmeren in- output pinnen (GPIO’S) op de computer beschikbaar. Extra pinnen voor gebruik van het I2C protocol en een SPI interface zijn eveneens aanwezig. Hierdoor zijn de mogelijkheden voor regel- en besturingsdoeleinden bijna onbegrensd. Op internet zijn talloze voorbeelden en implementaties te vinden en te gebruiken als startpunt voor een eigen ontwerp. Het kan dan ook niet uitblijven dat de elektronica hobbyist de eigenschappen van de Raspberry Pi onbenut laat.

In dit voorbeeld wordt de Raspberry ingezet als een weerrobot; een weerstation met mogelijkheden om ook besturingsfuncties uit te voeren zoals bijvoorbeeld een thermostaat, een vochtigheids-regeling in de kamer, het bedienen van gordijnen bij invallende duisternis of dalende temperatuur of het sluiten van rolluiken bij storm.

Dit werkende prototype beperkt zich tot het meten van de temperatuur, luchtvochtigheid, luchtdruk en licht. Het actuatorgedeelte wordt als een idee gelanceerd en is in dit voorbeeld niet uitgevoerd. Met de hier gepresenteerde software is het echter een kleine stap om deze functionaliteit alsnog te implementeren zodat er een echte ‘weerrobot’ ontstaat.

Weerrobot uitgangspunten

  1. Het I2C protocol is gekozen om de sensoren en de actuatoren te verbinden met de Pi. Ook een klein display is op basis van I2C toegevoegd om de resultaten te kunnen uitlezen. I2C is een tweedraads bussysteem waarop elke component een eigen adres heeft die wordt aangesproken door de software. Na activering van het adres wordt over dezelfde bus de meet- en regeldata opgestuurd. Het grote voordeel is het feit dat er relatief weinig externe elektronica nodig is, er weinig elektrische verbindingen nodig zijn en dat het protocol universeel en gestandaardiseerd is en dus ook eenvoudig te programmeren is.
    1. De meeste Linux distributies voor de Pi zijn standaard voorzien van de programmeeromgeving ‘Python’. Een relatief eenvoudige, maar zeer krachtig , object georiënteerde programmeertaal. Een andere programmeeromgeving is natuurlijk ook mogelijk maar er zijn vele voorbeelden te vinden in Python. Dus het wiel hoeft niet opnieuw te worden uitgevonden.
    2. De weerrobot moet de gemeten data centraal en voor langere tijd kunnen opslaan. Via een webpagina op een PC, notebook, tablet of smartphone, moet vervolgens die data, bijvoorbeeld als functie van de tijd te benaderen zijn voor presentatie. Ook moet de status van de actuatoren (aan, uit en of waarde van een actuator) eveneens worden opgeslagen. De keuze van gebruik van een (gratis) MYSQL database is dan snel gemaakt. In dit ontwerp is gekozen voor een externe database, die aanwezig is binnen hetzelfde computernetwerk waarin de weerrobot opereert. De database kan echter ook op de Raspberry zelf draaien maar dan kan de opslagcapaciteit van de SD kaart in de Pi een beperking vormen.
    3. Communicatie tussen de weerrobot en de database verloopt via een Wi-Fi verbinding. Deze verbinding wordt ook gebruikt om de weerrobot te kunnen onderhouden en te kunnen programmeren met behulp van een ‘remote desktop’ toepassing op de Pi, waardoor het toetsenbord, de muis en het beeldscherm komen te vervallen. De Pi wordt als het ware direct bestuurd/overgenomen door een PC of laptop in hetzelfde computernetwerk.
    4. De weerrobot wordt uitgerust met een klein LCD display om de gemeten waarden te kunnen bekijken, zonder daarvoor een andere computer of internet device te hoeven inschakelen.
    5. Het besturen van apparatuur op basis van de gemeten meetwaarden kan worden uitgevoerd door de Pi die als webserver kan worden ingericht. Via te bedienen knoppen op deze website kan dan bijvoorbeeld apparatuur worden aan- of uitgeschakeld. De Pi kan ook als zelfstandige regelaar worden geprogrammeerd die reageert op de gemeten weer condities. Maar omdat alle gegevens in de centrale database worden opgeslagen kan de besturing ook plaats vinden vanuit een applicatie, een website of algoritme die niet draait op de Pi. De Pi hoeft dan alleen maar de database te raadplegen en vervolgens de GPIO’s overeenkomstig de (gewenste) status uit de database te besturen.

De hardware
Het hele ontwerp bestaat uit ‘kant en klare’ modules en is in bijlage 1 schematisch (grafisch) weergegeven. Alle toegepaste modules hebben een I2C interface. -Voedingsspanning Alle sensoren hebben een voedingsspanning van 3.3 volt. Pin 1 op de Pi levert 3.3 volt met maximaal 50 mA. Dit is niet voldoende om alle sensoren te voorzien van stroom. Daarom wordt er gebruik gemaakt van een LD1117V33. Deze spanningsregelaar gebruikt de 5 volt (pin 2, max. 500 mA) van de Pi om de voeding van 3.3 volt te leveren voor alle I2C componenten.

Het I2C display is een uitzondering. Deze heeft een voedingsspanning van 5 volt en de I2C bus van het display zal dus ook op 5 volt werken. Om de spanning van de I2C bus aan te passen aan de 3.3 volt van de Pi wordt er een bi-directionele level convertor toegepast (BOB 12009). Deze zorgt ervoor dat de I2C signalen SCL en SDA worden aangepast aan de busspanning van 3.3 volt.

-Luchtdruk en temperatuur (T5403)
De T5403 is een luchtdruksensor en meet de absolute luchtdruk met een bereik tussen 300hPa – 1100hPa (0.3 -1.1 bar). De module is uitgerust met een temperatuursensor. Via een 16 bit analoog naar digitaal convertor worden de druk en temperatuurwaarden gedigitaliseerd en op de I2C bus aangeboden. Het basisadres van de sensor op de I2C bus is 0x77.

Omdat de luchtdruk ook van de hoogte afhankelijk is zou deze sensor ook als hoogtemeter kunnen worden gebruikt.

-Luchtvochtigheid sensor (HYT221)
De HYT221 is een robuuste luchtvochtigheidsensor, verpakt in een spatwater dichte behuizing. De sensor meet de absolute luchtvochtigheid met een nauwkeurigheid van ±1.8% . De vochtigheid is afhankelijk van de temperatuur. De sensor meet daarom eveneens de temperatuur om hiermee de luchtvochtigheid te compenseren. Deze temperatuurwaarde kan worden uitgelezen maar wordt in dit project niet gebruikt. Het bereik van de sensor is 0..100% relatieve vochtigheid met een gevoeligheid van 0.02%. Het basisadres van de sensor op de I2C bus is 0x..

-Lichtsensor (TSL2561)
De TSL2561 is een digitale lichtsensor die geschikt is om de gemeten lichtwaarden nauwkeurig om te rekenen naar een Lux waarde tussen 0.1 en 40.000 Lux. De Lux is de eenheid waarin licht gemeten wordt. De sensor is in staat om alleen infrarood licht (IR) te meten of alleen het door mensen zichtbare licht. De ADDR pin van de module kan worden gebruikt om het I2C adres te wijzigen (aan massa 0x29, aan 3.3v 0x49, en zwevend 0x39). De INT pin is een output pin die via een pullup weerstand van 10k is verbonden met de voedingsspanning van 3.3V. Indien geprogrammeerd dan levert deze output een signaal als het lichtnivo zich wijzigt. Het stroomverbruik van de sensor is erg laag en bedraagt maximaal 0.5mA.

Alle sensoren + display

Software
In bijlage 2 is het complete programma weergegeven, geschreven in Python 2.6. Het programma is voorzien van commentaar en is daarom eenvoudig te volgen. Twee delen van het programma worden hieronder extra toegelicht.

– de main loop

#====================================
#============== MAIN LOOP                =======
#====================================
var = 1
t = time.time()
while var == 1:
begin()
displayTimeOnLCD():
var1=getTemperature()
var2=getPressure(MODE_ULTRA)
var3=getLight()
var4=getLightIR()
var5=getHumidity()
var6=getTHumidity()
print ‘Temperature=’,var1
print ‘Air Pressure=’,var2 # mBar
print ‘Light=’,var3,’ IR=’, var4
print ‘Humidity=’,round(var5,2)
#print ‘Temperature=’,var6
displayOnLcd()
if db == “false”:
displayErrorOnLcd()
if time.time() – t > 60*10

t=0
writeTodatabase()

In bovenstaande while-loop wordt allereerst de tijd gepresenteerd op het LCD display (displayTimeOnLCD()). Vervolgens worden de meetwaarden (var1 t.m. var6) een voor een opgehaald.
Indien er een terminal sessie is geopend via een PC naar de weerrobot dan worden de printopdrachten daarop zichtbaar. Vervolgens worden de meetwaarden op het LCD display gepresenteerd (displayOnLCD()).
Wanneer er 10 minuten zijn verstreken dan worden de waarden ook nog eens naar de database weggeschreven.

– het wegschrijven naar de database
Voor het installeren van een MySql database op een systeem zijn vele voorbeelden te vinden. In dit project is gekozen om een Wamp pakket te installeren (zie extra bronnen) op een windows computer, die in een thuisnetwerk aanwezig is. Google eventueel op ‘Wamp server’ voor windows of ‘Lamp server’ voor Linux systemen voor extra informative.
Het pakket installeert een apache webserver, PHP en MySql op de computer. Zoals eerder aangegeven is het mogelijk om een Lamp te installeren op de Pi.

Vervolgens moet de Pi elke 10 minuten naar de MySql database wegschrijven. Voor elke programmeertaal is daarvoor een standaard aanroep beschikbaar. In Python gaat dat met de volgende commando regels:

#===========================================
#============== connect mysql database    ======
#===========================================
def writeTodatabase():
now = time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime())
try:
con = mdb.connect(‘192.168.1.1’, ‘weerrobot’, ‘weerrobot’, ‘*********’)
db=”true”
with con:
 cur = con.cursor()
 cur.execute(“INSERT INTO metingen(tijd,Data1,Data2,Data3,Data4,Data5,Data6,) \
                         VALUES (%s,%s,%s,%s,%s,%s,%s)” , ( now, var1,var2,var3,var4,var5,var6))
print now, “Data weggeschreven JVS1 in database weerrobot”
cur.close()
except ValueError:
print ‘Er is geen verbinding met JVS’
db=”false”

Eerst wordt de tijd opgehaald en vervolgens wordt er gekeken of de database met de naam ‘weerrobot’ beschikbaar is op de computer 192.168.1.1. Vervolgens wordt er ingelogd met inlognaam ‘weerrobot’ en wachtwoord *******. Indien dit lukt dan worden de eerder verkregen var1 t.m. var6 samen met de tijd weggeschreven in de tabel ‘metingen’.

Uitlezen data uit de MySql database
De weerrobot data is nu veilig weggeschreven in de database. De volgende stap is om deze weer uit te lezen en te presenteren. Elke programmeertaal ondersteunt het connecten met een MySql database. In dit voorbeeld is gebruik gemaakt van Visual Basic. Het uitlezen van de database ziet er dan bijvoorbeeld zo uit:

strSQL = “SELECT tijd, ” & “” & plot & ” ” & “as plotdata ” & “FROM metingen ” & “WHERE tijd between ” & “‘” & starttijd & “‘” & ” and ‘” & eindtijd & “‘”
myConnection = New MySqlConnection(“server=192.168.1.1; user id=weerrobot; password=******; database=weerrobot; pooling=false;”)
myDataAdapter = New MySqlDataAdapter(strSQL, myConnection)
myDataSet = New DataSet()
myDataAdapter.Fill(myDataSet, “mySetNaam”)

De Dataset bevat nu alle data uit de database, die je in het strSQL select kriterium hebt opgegeven.
Volgens kun je deze data in een grafiek zetten of op een andere manier presenteren. Zie live www.zenot.nl/weerrobot of in onderstaande figuur:

Temperatuurverloop

Temperatuurverloop

Actuatorgedeelte weerrobot

control.php

control.php

Tot nu toe is er alleen data gemeten en opgeslagen.
Hieronder volgen een paar ideeën om de weerrobot ook daadwerkelijk iets te laten besturen.
Hiervoor wordt in bijlage 3 een schema voorgesteld met een PCF8574. Via pin P0 t.m. P7 kunnen uiteindelijk signalen naar buiten worden gestuurd en kunnen apparaten worden aan/uit geschakeld.
Met een PCF8591 kunnen via de I2C bus eenvoudig vier analoge signalen worden ingelezen. Ook kan dit IC een analoge waarde via AOUT uitsturen.

De software aansturing in Python is net zo eenvoudig als die van de andere I2C componenten die in dit project worden genoemd. Door het aanroepen van het juiste adres kunnen de signalen worden ingesteld of ingelezen.

Wanneer de PI is geconfigureerd als webserver dan kunnen de poorten van de PCF8574 eenvoudig via deze server worden bediend. Hiervoor is een scriptje in PHP gevonden die dit zou kunnen uitvoeren. Maar de status van de IO poorten is ook eenvoudig op te slaan in de MySql database, zodat deze informatie weer makkelijk te gebruiken is in een ander programma/applicatie die de database uitleest.

 

 

 

 

Conclusie
Het werken met het I2C protocol in combinatie met de programmeeromgeving Python op de Raspberry Pi is een robuuste en prettige manier om sensoren en actuatoren aan te sturen. In combinatie met een MySql database en een (apache) webserver is een degelijk data-acquisitiesysteem te realiseren wat is te gebruiken voor diverse domotica projecten.
Met de metingen van temperatuur, vochtigheid, luchtdruk en licht is er een weerstation gerealiseerd waarvan de data voor onbeperkte tijd kan worden opgeslagen. Door de gemeten data te combineren met verschillende besturingen is een echte ‘’weerrobot’ te realiseren van een Raspberry Pi microcontroller.

Extra bronnen, informatie en tips
-Hardware weerrobot
Spanningsstabilisator LD1117 : link
Handleiding levelshifter sparkfun (BOB-12009): link

-Sensoren
Luminosity Sensor TSL2561: link           I2C         3 Volt
Temperature sensor TMP102: link         I2C         3 volt
Barometric sensor T5403: link                I2C         3 volt
Humidity HYT221: link                             I2C         3.3 Volt

 -Actuatoren
PCF 8591: link                                             I2C         3.3 Volt
PCF 8574: link                                             I2C         3.3 Volt

-Lamp
Raspberry Pi: http://www.penguintutor.com/linux/raspberrypi-webserver
Install apache webserver, Install mysql en Install PHP

-Wamp
Windows system: http://www.wampserver.com

-Software I2C installeren: http://www.learn.adafruit.com : install i2c tools utility
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
sudo nano /etc/modprobe.d/raspi-blacklist.conf en voeg # toe

nu kun je op de i2c bus aanwezige adressen vinden met commando i2cdetect -y 0

toegevoegd i2c-dev aan de kernel:
sudo nano /etc/modules
sudo adduser pi i2c
sudo reboot
iscdetect –y 0

Map delen met windows (makkelijk) http://ccollins.wordpress.com/2013/02/05/how-to-share-a-folder-on-linux/
– installeer samba: apt-get install samba samba-common-bin
– map gebruiken zonder inloggen: sudo smbpasswd -an nobody
– Open /etc/samba/smb.conf met commando sudo nano /etc/samba/smb.conf
– voeg toe onder [global]

[global]
security = user
guest account = nobody
map to guest = bad password

– voeg toe op einde:

[sharenaam]
comment=sharenaam Share
browseable=yes
path=/pi/sharemap
public=yes
writable=yes
guest ok=yes

-sla bestand op (ctrl O) en restart samba: sudo service samba start
Kijk in de netwerkomgeving van windows. De sharenaam is nu aanwezig en je kunt nu in de map lezen en schrijven

 

7 reacties

Comments RSS
  1. fulco

    is voor de humidity hyt221 de sensor van Sensiron SHT31-D Sensor (adafruit) te gebruiken?
    Daar deze gemakelijk te krijgen is

    • zotten

      Dag Fulco
      Zolang de sensor werkt op 3.3 volt en I2C ondersteunt kun je deze sensor zeker gebruiken.
      Uiteraard moet wel de software worden aangepast om met deze sensor via I2C de gegevens te kunnen uitlezen.
      Succes.
      met vriendelijk groet
      Zeno Otten

      • Fulco

        Zeno,
        hoe heb jij de mysql draaiende gekregen onder phyton, bij mij blijft python fouten geven.
        op de druk/themp sensor na draait het zover.
        De lcd wordt bij mij anders aan geroepen, RPi_lcd_driver (2×16)

    • zotten

      Fijn te horen. Binnenkort een http:\\adres\naam.php met resultaten?
      Ben benieuwd.
      Zeno

      • Fulco

        dat zal nog even duren eerst testen.
        Mysql zaten wat problemen in, draait nu met de mariadb.
        Wil je SQL connector (ODBC) met W7 hebben gebruik de orcale MYSQL connector. in Excel direct verbinding. Er staat wel op de pi in de shared directory een symbolic link naar de DB.
        hebt u een voorbeeld van een site, zou u die eventueel kunnen sturen?
        bvd
        fulco

  2. fulco

    Hallo zeno,
    de php en de database geven nog al wat problemen, genoeg te vinden op het net maar hoofdzakelijk de oudere versie van php. de php 6 en hoger werken niet meer met mysql wegens onveiligheden als ik het goed begrepen heb.

    de bot heeft een upgrade gehad waardoor de python veel eenvoudiger is geworden. 2 sensoren
    de nieuwe gy-bme280, (luchtdruk, temp en vochtigheid) en tsl2591 voor het licht aspect.
    en een uitgebreidere timer. verder de lcd display verwijderd, de bot gaat in een vogelhuisje tegen de gevel. dan blijven 180 regels over.

    gr.

    fulco

Plaats een reactie