Pythonskole

CO2 og O2-målinger i veksthus

Klima har blitt et sentralt tema i læreplanen, så hvorfor ikke måle tettheten av CO2 og O2, sammen med luftfuktigheten og temperaturen, i en veksthus? Og logge alt i Python? Les videre og lære hvordan du kan gjøre samme forsøket. 

Innholdsfortegnelse

Her ser du resultatene av en litt enklere, men allikevel interessant lek, hvor en //code.Node blir brukt til varsle med farge-LED når CO2-nivået er OK. 

Utstyr

I dette forsøket har vi brukt PASCO sine CO2- og O2-sensorer til å logge gasstetthet, temperatur og luftfuktighet. Vi har plassert sensorene inne i et lite veksthus, hvor det står en liten grønn plante. 

Teorien

Dette forsøket kan brukes på flere måter. Den mest tradisjonelle er nok å sette en kraftig lampe på planten og veksthuset, slik at planten klarer å omdanne mye CO2 til O2 i løpet av kort tid. En annen variant er å blåse inn i kammeret, og dermed tilsette CO2, og se det sakt men sikkert bli borte. Dette er et fint forsøk for å vise sammenhengen mellom gasstetthetene (om CO2 øker, må nødvendigvis O2 minke) og temperatur og luftfuktighet, og det er fantasier som setter grense for hvordan du kan rigge forsøket. 

Forbered koden

Det meste av programmering i Python baserer seg på bruk av eksisterende biblioteker (kode andre har skrevet for deg), og her trenger vi noen vanlige (pylab, time og csv), samt de som er utviklet av PASCO til å kommunisere med deres sensorer. 

				
					import csv
import time
from pylab import *
from pasco.pasco_ble_device import PASCOBLEDevice
from pasco.code_node_device import CodeNodeDevice
				
			

Koble til sensorene

For å koble til sensorene, er vi nødt til å ha de nære PC’en, forsikre oss at Bluetooth er på, at indikator-lampene blinker rødt og at ID-kodene på hver enkelt sensor stemmer med det vi putter inn i koden. Finn fram dine sensorer, les av koden og erstatt der det står xxx-xxx på tre linjer. 

				
					#Koble til PASCO-sensorene
codenode = CodeNodeDevice()
codenode.connect_by_id('xxx-xxx')  #NB Endre til ID på din //code.Node
codenode.keepalive()
o2sensor = PASCOBLEDevice()
o2sensor.connect_by_id('xxx-xxx')  #NB Endre ID til din O2-sensor
o2sensor.keepalive()
co2sensor = PASCOBLEDevice()
co2sensor.connect_by_id('xxx-xxx')  #NB Endre ID til din CO2-sensor
co2sensor.keepalive()
				
			

Datalagring og skriving til fil

I denne koden ønsker vi både å plotte dataene, samt skrive de til en .csv-fil som vi kan lese inn i en Python-kode senere, eller inn i Excel. For å skrive ut til fil trenger vi biblioteket csv, mens for å lagre data i koden bruker vi en list per parameter som skal lagres. 

				
					# Åpne en fil hvor vi kan skrive data. 
# Denne vil kunne importeres i excel eller Python siden
f = open('co2o2-data.csv', 'w', newline='')
writer = csv.writer(f)

#Lag tomme lister hvor det er mulig å lagre data fra koden
tid = []
co2 = []
o2  = []
fukt= []
temp= []
				
			

Datalogging

Data leses så i for-løkken, som gjentas 600 ganger. Med ca. 5-7 sekunder mellom hvert måletidspunkt. Vi starter med å finne tidspunktet for når målingene tas, før vi leser av parameterne av CO2- og O2-sensorene. Disse kopieres så til siste element i listene, hvor parameterne lagres til bruk i plottingen. 

For å legge inn litt tilbakemelding til brukeren, har vi programmert innen kode som varsler ved hjelp av ulike farger og lyd i en //code.Node. En //code.Node er et lite apparat med flere måleinstrumenter og lyd og lys som elevene selv kan programmere. I dette eksempelet bruker //code.Node til å varsle når det CO2-nivåene er middels (700ppm-1200ppm) eller kritisk høye (over 1200pm).

Deretter skrives dataene ut til fil med funksjonen writerow() og til skjerm, før koden tar en 5 sekunders pause. 

				
					#Finn ut tidspunktet når målingene starter
tid_start = time.time()

#Skriv ut kolonne-overskrifter for skjermutskrift
print("   Tid   O2         CO2     Fukt    Temp")

#Gjenta følgende kode (med innrykk) flere ganger
for i in range(0,600):
    
    #Les data fra Pasco-sensorene
    tid_verdi  = time.time() - tid_start
    o2_verdi   = o2sensor.read_data('OxygenGasConcentration') 
    co2_verdi  = co2sensor.read_data('CO2Concentration')
    fukt_verdi = o2sensor.read_data('RelativeHumidity')
    temp_verdi = o2sensor.read_data('Temperature')
    
     # Lagre målte verdier i lister, til bruk i plotting
    tid.append(tid_verdi)
    o2.append(o2_verdi)
    co2.append(co2_verdi)
    fukt.append(fukt_verdi)
    temp.append(temp_verdi)
    
    #Bruk //code.Node til å vasle med farget lys avhengig av CO2-nivå
    if co2_verdi < 700:
        codenode.set_rgb_led(0, 255, 0)  #GREEN
        codenode.set_sound_frequency(0)
    elif co2_verdi > 700 and co2_verdi < 1200:
        codenode.set_rgb_led(255, 255, 0) #YELLOW 
        codenode.set_sound_frequency(0)
    else: 
        codenode.set_rgb_led(255, 0, 0) #RED
        codenode.set_sound_frequency(440)
    
    #Skriv data til fil (ny rad for hver måling og tid)
    writer.writerow([tid_verdi, o2_verdi, co2_verdi, fukt_verdi, temp_verdi])
 
    #Skriv ut data til skjerm
    print("{:5.1f}s {:5.1f}% {:7.0f}ppm   {:5.1f}% {:5.1f}C".format(
        tid_verdi,o2_verdi,co2_verdi,fukt_verdi,temp_verdi))
    time.sleep(5)
				
			

Lukking av filer og frakobling av sensorer

Sensorer som vi har lest fra, og filer vi har skrevet til, må lukkes på skikkelig vis. 

				
					#Lukk filene på en ryddig måte når vi er ferdig med å skrive
f.close()
codenode.disconnect()
o2sensor.disconnect()
co2sensor.disconnect()
				
			

Plotting

Helt til sist plotter vi de målte dataene, med en graf-ramme til hver parameter (til sammen 4 graframmer til oppgaven). 

				
					#Plott dataene i et vindu med flere grafer (subplots)
fig,ax = subplots(4)
ax[0].plot(tid,co2)
ax[0].set_ylabel('CO2 (ppm)')
ax[1].plot(tid,o2)
ax[1].set_ylabel('O2 (%)')
ax[2].plot(tid,fukt)
ax[2].set_ylabel('Fukt (%)')
ax[3].plot(tid,temp)
ax[3].set_xlabel('Tid (s)')
ax[3].set_ylabel('Temp (C)')

#Lagre plot-filen i en PNG-fil og vis på skjerm
savefig('co2o2-graf.png')
show()
				
			

Les og kopier hele koden

				
					# pasco-co2o2-plot.py
# Skrevet av Vegard Rekaa 17.11.2021
# kontakt@pythonskole.no

# For å gjennomføre denne øvelsen trenger du: 
#   - En PASCO //code.Node
#   - En PASCO CO2 sensor (trådløs, hvit)
#   - En PASCO O2 sensor (trådløs, hvit)
# husk å gjøre endringer i koden der vi kaller funksjonen
# connect_by_id() og endre ID til dine sensorer.

#Importer bibliotekene vi skal bruke i denne koden
import csv
import time
from pylab import *
from pasco.pasco_ble_device import PASCOBLEDevice
from pasco.code_node_device import CodeNodeDevice

# Åpne en fil hvor vi kan skrive data. 
# Denne vil kunne importeres i excel eller Python siden
f = open('co2o2-data.csv', 'w', newline='')
writer = csv.writer(f)

#Koble til PASCO-sensorene
codenode = CodeNodeDevice()
codenode.connect_by_id('354-873')  #NB Endre til ID på din //code.Node
codenode.keepalive()
o2sensor = PASCOBLEDevice()
o2sensor.connect_by_id('574-083')  #NB Endre ID til din O2-sensor
o2sensor.keepalive()
co2sensor = PASCOBLEDevice()
co2sensor.connect_by_id('429-980')  #NB Endre ID til din CO2-sensor
co2sensor.keepalive()

#Lag tomme lister hvor det er mulig å lagre data fra koden
tid = []
co2 = []
o2  = []
fukt= []
temp= []

#Finn ut tidspunktet når målingene starter
tid_start = time.time()

#Skriv ut kolonne-overskrifter for skjermutskrift
print("   Tid   O2         CO2     Fukt    Temp")

#Gjenta følgende kode (med innrykk) flere ganger
for i in range(0,600):
    
    #Les data fra Pasco-sensorene
    tid_verdi  = time.time() - tid_start
    o2_verdi   = o2sensor.read_data('OxygenGasConcentration') 
    co2_verdi  = co2sensor.read_data('CO2Concentration')
    fukt_verdi = o2sensor.read_data('RelativeHumidity')
    temp_verdi = o2sensor.read_data('Temperature')
    
    # Lagre målte verdier i lister, til bruk i plotting
    tid.append(tid_verdi)
    o2.append(o2_verdi)
    co2.append(co2_verdi)
    fukt.append(fukt_verdi)
    temp.append(temp_verdi)
    
    #Bruk //code.Node til å vasle med farget lys avhengig av CO2-nivå
    if co2_verdi < 700:
        codenode.set_rgb_led(0, 255, 0)  #GREEN
        codenode.set_sound_frequency(0)
    elif co2_verdi > 700 and co2_verdi < 1200:
        codenode.set_rgb_led(255, 255, 0) #YELLOW 
        codenode.set_sound_frequency(0)
    else: 
        codenode.set_rgb_led(255, 0, 0) #RED
        codenode.set_sound_frequency(440)
    
    #Skriv data til fil (ny rad for hver måling og tid)
    writer.writerow([tid_verdi, o2_verdi, co2_verdi, fukt_verdi, temp_verdi])
 
    #Skriv ut data til skjerm
    print("{:5.1f}s {:5.1f}% {:7.0f}ppm   {:5.1f}% {:5.1f}C".format(
        tid_verdi,o2_verdi,co2_verdi,fukt_verdi,temp_verdi))
    time.sleep(5)

#Lukk filene på en ryddig måte når vi er ferdig med å skrive
f.close()
codenode.disconnect()
o2sensor.disconnect()
co2sensor.disconnect()

#Plott dataene i et vindu med flere grafer (subplots)
fig,ax = subplots(4)
ax[0].plot(tid,co2)
ax[0].set_ylabel('CO2 (ppm)')
ax[1].plot(tid,o2)
ax[1].set_ylabel('O2 (%)')
ax[2].plot(tid,fukt)
ax[2].set_ylabel('Fukt (%)')
ax[3].plot(tid,temp)
ax[3].set_xlabel('Tid (s)')
ax[3].set_ylabel('Temp (C)')

#Lagre plot-filen i en PNG-fil og vis på skjerm
savefig('co2o2-graf.png')
show()
				
			

Takk for din bestilling!

Vi kontakter deg så snart vi har lest din bestilling. Om du er på jakt etter inspirasjon til hva det kurset du ønsker skal handle om, kan du se vår YouTube-kanal.

Om du blir utålmodig eller har travelt med å få bekreftet din bestilling, kontakt oss på 93024034 eller kontakt@pythonskole.no.

Vennlig hilsen Vegard & Co