Pythonskole

Plotting med //code.Node

PASCOs //code.Node er utviklet for å undervise koding i grunnskole og videregående skole og  er en alt-i-ett sensor med bl.a. akselerometer, lysmåler, lydmåler, termometer og magnetometer. Her viser vi hvordan du kan koble opp dine code.Node til en Python-kode og plotte data fra denne i sanntid. 

Innholdsfortegnelse

Installere Pasco biblioteket

For å få en //code.Node til å snakke med din Python-kode, må du først installere biblioteket Pasco PyPI på din maskin, og for å gjøre dette må du også ha verktøyet pip.

Se disse veiledningene hvordan du installerer disse to, før du går videre. 

Forbered koden

Først importer vi de relevante funksjonene fra Pasco PyPI, som vi trenger for å lese data fra vår //code.Node.

Siden vi skal prøve oss på litt avansert plotting, hvor grafen oppdaterer seg automatisk hver gang //code.Node gjør en måling, trenger vi de andre linjene som vises i kodesnutten til høyre.

				
					# Documentation: https://pypi.org/project/pasco/
from pasco.code_node_device import CodeNodeDevice

# Documentation: https://pypi.org/project/pasco/
from pasco.pasco_ble_device import PASCOBLEDevice
from pasco.code_node_device import CodeNodeDevice
from pasco.character_library import Icons
				
			

Flere avsnitt kommer siden

Dokumentasjon

				
					kodesnutt
				
			

Hele koden

Hele koden kan leses eller lastes ned her (bruk «Copy» oppe til høyre)

				
					#LIVE PLOTTING WITH PASCO PYTHON MODULE
#CONTACT: vegard@astronomen.no
#Version 15.10.2021

# Documentation: https://pypi.org/project/pasco/
from pasco.pasco_ble_device import PASCOBLEDevice
from pasco.code_node_device import CodeNodeDevice
from pasco.character_library import Icons

from matplotlib import animation
import matplotlib.pyplot as plt
import time
import numpy as np


##############################################################
#Edit this section: 
##############################################################
# Say what data you want to plot from the code-node. 
# These are your options: 
# 'Temperature', 'Brightness', 'Loudness', 'MagneticFieldStrength', 
# 'Accelerationx', 'Accelerationy', 'TiltAngleX', 'TiltAngleY', 
# 'CartPosition', 'CartVelocity', 'Button1', 'Button2'
data    = 'Accelerationy'   #Choose from the list above
measure_time = 60.0         #Say how many seconds you want to measure
ymin = -12                  #What max/min y-values do you expect
ymax =  12
max_iterations = 200        #At how many iterations do you wish to abort?


#################################################################
################  EDIT THIS AT YOUR OWN RISK ####################
#################################################################

#Setup data storage and plotting parameters
xdata   = []
ydata   = []
t_start = time.time()
t_stop  = t_start+measure_time
xdata_range = [0,measure_time]
ydata_range = [ymin,ymax]

# Create a code element, through which we can handle the instrument
codenode = CodeNodeDevice()
# List all code.Node-devices
codenode_list = codenode.scan('//code.Node')
if codenode_list:  # Go forth if some devices are found
    # Print the list of devices
    for i, dev in enumerate(codenode_list):
        print(str(i)+":"+str(dev))
    # Get user input which device you want. 
    # If there is only one, select that device automatically
    select = input('Select a codenode: ') if len(codenode_list) > 1 else 0
    select_codenode = codenode_list[int(select)]
    print("Connecting to:"+str(select_codenode))
    codenode.connect(select_codenode)
else:
    print("No codenode found")
    exit(0)

if not codenode.is_connected():
    print("Connection failed")
    exit(0)

#Prevent the device to disconnect after 5 minutes
codenode.keepalive()

#Set up figure, axis and plot element
fig = plt.figure()
ax  = plt.axes()
ax.set_xlim(xdata_range)
ax.set_ylim(ydata_range)
line, = ax.plot([], [])

# initialization function: plot the background
def init():
    line.set_data([],[])
    return line,

# animation function.  This is called sequentially
def animate(i):
    tid = time.time()-t_start
    print("Frame={0:3d} tid={1:6.2f}s  fps={2:4.1f}".format(i,tid,i/tid))
    xdata.append(tid)
    ydata.append(codenode.read_data(data))
    line.set_data(xdata,ydata)
    return line,

# call the animator.  blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
            frames=max_iterations, interval=1, blit=True, repeat=False)
plt.show()

# My experience is that this is needed to avoid 
# bluetooth-issues at connection-time
codenode.disconnect()
				
			

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