Med hjälp av Arduino och Python till handling/spara data (3 / 5 steg)
Steg 3: Python code
Python kod läser inkommande seriella data och avgränsar varje rad längs flikarna ger du separata värden för X, Y och Z data. Någon bearbetning är gjort för att sätta värden i sina egna variabler.Om du vill rita variabler, används "matplotlib" biblioteket för att skapa en animerad graf. Detta resulterar i en någorlunda korrekt "levande foder", men stora mängder sensor aktivitet kommer att orsaka grafen att släpa lite.
Slutligen, data sparas till en txt-fil i en angiven plats. Data kan sedan läsas tillbaka när behövs med hjälp av numpy.loadtxt() fungerar (se nästa steg för kod). Dock är denna filtyp mest lätt läsa in Python, så om du vill öppna data i ett annat program du behöver använda en annan skrivfunktion. (ex. använda CSV-filformat öppna data i Excel) Glöm inte att ändra platsen för filen för att matcha datorns katalog.
Se koden för mer detaljerad kommentarer (eller Google eller fråga och jag ska göra mitt bästa för att förklara eller hänvisa dig till en förklaring)
{{{
'''
Läser in data över en seriell anslutning och tomter resultaten live. Innan du stänger sparas data till en txt-fil.
'''
importera följetong
importera matplotlib.pyplot som plt
importera numpy som np
importera win32com.client
anslutna = False
#finds COM port som Arduino är på (förutsätter endast en Arduino är ansluten)
WMI = win32com.client.GetObject("winmgmts:")
för port i wmi. InstancesOf("Win32_SerialPort"):
#print port. Namnet #port. DeviceID, port. Namn
om "Arduino" i hamn. Namn:
comPort = port. DeviceID
Skriv ut comPort, "är Arduino"
ser = följetong. Serial(comPort, 9600) #sets seriell anslutning (göra säker överföringshastigheten är korrekt - matchar Arduino)
även om inte ansluten:
serin = ser.read()
anslutna = sant
PLT.ion() #sets handling till animering
längd = 500 #determines längden på data som session (i datapunkter)
x = [0] * Längd #create empty-variabel längd för test
y = [0] * Längd
z = [0] * Längd
xline, = plt.plot(x) #sets upp framtida linjer ändras
yline, = plt.plot(y)
zline, = plt.plot(z)
PLT.ylim(400,700) #sets y axeln gränser
för i i range(length): #while du tar data
data = ser.readline() #reads tills det blir en vagn RETUR. SE TILL ATT DET FINNS EN VAGNRETUR ELLER DEN LÄSER FOREVER
sep = data.split() #splits sträng till en lista på flikarna
#print sep
x.append(int(sep[0])) #add nytt värde som int till aktuell lista
y.append(int(sep[1]))
z.append(int(sep[2]))
del x [0]
del y [0]
del z [0]
xline.set_xdata(np.arange(len(x))) #sets xdata till ny lista längd
yline.set_xdata(np.arange(len(y)))
zline.set_xdata(np.arange(len(z)))
xline.set_ydata(x) #sets ydata till nya listan
yline.set_ydata(y)
zline.set_ydata(z)
PLT.PAUSE(0.001) #in sekunder
PLT.draw() #draws nya tomt
rader = zip (x, y, z) #combines listor tillsammans
row_arr = np.array(rows) #creates array från lista
np.savetxt ("C:\\Users\\mel\\Documents\\Instructables\\test_radio2.txt", row_arr) #save data i filen (belastning w/np.loadtxt())
ser.Close() #closes seriell anslutning (mycket viktigt att göra detta! om du har ett fel partway igenom koden, skriver in i cmd lina att stänga anslutningen)
}}}