Gå til innhold

RaspberryPi/Arduino - Logge til fil


Anbefalte innlegg

Hei!

 

Jeg er helt fersk på Python (og linux), så jeg mangler nok en del basiskunnskaper, men kanskje dere kan hjelpe allikevel?

 

Jeg har en Arduino som jeg har satt opp til å logge X-antall sensorer med jevne mellomrom (20 sekunder for øyeblikket)

 

I Raspberry PI har jeg klart å lese av verdiene i python-vinduet, men nå gjenstår det å få dette over i fil, og helst med et timestamp.

 

Dette er det jeg har:

 

------

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
 
Type "copyright", "credits" or "license()" for more information.
 
 
>>> import serial
 
>>> ser=serial.Serial('/dev/ttyACM0',9600)
 
>>> while 1:
 
        ser.readline()
 
 
 
Dette gir meg denne outputten:
 
'Sensor;0;23.06\r\n'
 
'Sensor;1;20.44\r\n'
 
'Sensor;2;19.06\r\n'
 
'Sensor;3;18.19\r\n'
 
'Sensor;4;30.00\r\n'
 
'Sensor;5;23.31\r\n'
 
'UtskriftSlutt\r\n'                (her venter den i X-antall sekunder, før det kommer mer)
 
'Sensor;0;23.06\r\n'
 
'Sensor;1;20.44\r\n'
 
'Sensor;2;19.00\r\n'
 
'Sensor;3;18.12\r\n'
 
'Sensor;4;30.00\r\n'
 
'Sensor;5;23.31\r\n'
 
'UtskriftSlutt\r\n'           (her venter den i X-antall sekunder, før det kommer mer)
 
'Senso...osv...osv...
 
 
 
 
Sikkert enkelt, men jeg ønsker at dette skal skrives til fil som ligger et spesifisert sted, og da helst med timestamp før hver linje.
 
Tips?
Lenke til kommentar
Videoannonse
Annonse
Sikkert enkelt, men jeg ønsker at dette skal skrives til fil som ligger et spesifisert sted, og da helst med timestamp før hver linje.
Tips?

Det er flere måter og gjøre dette på.

Kan skive ned noe rask,bruker JSON i dette eksemplet.

import time
import datetime
import json

data = '''\
'Sensor;0;23.06\r\n'
'Sensor;1;20.44\r\n'
'Sensor;2;19.06\r\n'
'Sensor;3;18.19\r\n'
'Sensor;4;30.00\r\n'''.replace('\r\n', '')

d = {}
for line in data.split('\n'):
    time.sleep(2) # Simulate some delay
    d[datetime.datetime.utcnow().strftime("%c")] = line

with open('data.json', 'wb') as f_out:
    json.dump(d, f_out)
with open('data.json') as f:
    data = json.load(f)

Se på data:

>>> data
{u'04/16/15 21:14:43': u"'Sensor;0;23.06'",
 u'04/16/15 21:14:45': u"'Sensor;1;20.44'",
 u'04/16/15 21:14:47': u"'Sensor;2;19.06'",
 u'04/16/15 21:14:49': u"'Sensor;3;18.19'",
 u'04/16/15 21:14:51': u"'Sensor;4;30.00"}

>>> data['04/16/15 21:14:45']
u"'Sensor;1;20.44'"
>>> print(data['04/16/15 21:14:49'])
'Sensor;3;18.19'
Endret av snippsat
Lenke til kommentar

Hei, og takk for svar!

 

Jeg må innrømme at jeg nok ikke skjønte alt det der.  Ser du har skrevet opp litt av eksempel-outputten i koden din, det skjønte jeg ikke hvorfor, siden det den infoen jeg skal logge, ikke "hardkode i koden?  (Jeg har sikkert misforstått noe her)

Ser ikke helt hvor selve input'en fra Arduinoen kommer inn i koden? Altså, den delen som logger USB-deviceen

Heller ikke hvor i koden jeg velger filnavn?

 

Som sagt, er helt ny på dette.  Programmert litt C++ og vba på lavt nivå, men ikke python før i dag.

Lenke til kommentar
 Ser du har skrevet opp litt av eksempel-outputten i koden din, det skjønte jeg ikke hvorfor, siden det den infoen jeg skal logge, ikke "hardkode i koden?  

Jeg gjorde det bare for og simulere data du får fra serial port.

 

Ser ikke helt hvor selve input'en fra Arduinoen kommer inn i koden? Altså, den delen som logger USB-deviceen

Heller ikke hvor i koden jeg velger filnavn?

Kan lage en versjon til der jeg forklare litt mer.

Forenkler litt og skriver rett til en logg-fil.

import time
import datetime

#simualte data from serial
data = '''\
'Sensor;0;23.06\r\n'
'Sensor;1;20.44\r\n'
'Sensor;2;19.06\r\n'
'Sensor;3;18.19\r\n'
'Sensor;4;30.00\r\n'''.replace('\r\n', '')

f_obj = open('log_file','w')
#Simulate the while 1 loop
for readline in data.split('\n'):
    time.sleep(2) # Simulate some delay
    #print to see whats happends
    print('{} --> {}'.format(datetime.datetime.utcnow().strftime("%c"), readline))
    temp = '{} --> {}'.format(datetime.datetime.utcnow().strftime("%c"), readline)
    f_obj.write('{}\n'.format(temp))
f_obj.close()

Resultat i "log_file" :

04/17/15 15:34:34 --> 'Sensor;0;23.06'
04/17/15 15:34:36 --> 'Sensor;1;20.44'
04/17/15 15:34:38 --> 'Sensor;2;19.06'
04/17/15 15:34:40 --> 'Sensor;3;18.19'
04/17/15 15:34:42 --> 'Sensor;4;30.00
Endret av snippsat
  • Liker 1
Lenke til kommentar

Alternativt kan du benytte logging modulen:

import logging

logging.basicConfig(logging.basicConfig(level=logging.INFO,       
             filename='logfil.txt',
             format='%(asctime)s %(message)s')

logging.info("hello world")

Da skal du kunne benytte noe slikt som logging.info(ser.readline()) i løkken din.

Endret av process
  • Liker 1
Lenke til kommentar

Hei, og takk for hjelpen begge to. Logging-modulen var litt lettere å få til uten syntaks-problemer. Mulig det var noe jeg skrev feil ,eller misforstod.

 

Her er koden som ser ut til å fungere fint for meg:

 

import serial
import logging
import time
 
ser=serial.Serial('/dev/ttyACM0',9600)
 
logging.basicConfig(level=logging.INFO,
    filename='Templogg.txt',
    format='%(asctime)s;%(message)s', datefmt='%d.%m.%Y;%H:%M:%S')
 
while 1:  
    logging.info(ser.readline())
    time.sleep(1)
 
 
Takk for hjelpen :)
Lenke til kommentar

Hei igjen.

 

Jeg har som dere ser "\r\n" på slutten av hver linje, dette skaper litt krøll senere i prosessen når jeg skal importere resultater i excel, får en ekstra tom rad ved import etter hver linje.

 

Ser at Snippsat hadde med en ".replace('\r\n', '')" i koden, men jeg finner ikke ut hvordan jeg får det inn i koden min her.

 

 

Tips til enkel modifikasjon av koden min over for å fjerne dette?
Lenke til kommentar

 

Hei igjen.

 

Jeg har som dere ser "\r\n" på slutten av hver linje, dette skaper litt krøll senere i prosessen når jeg skal importere resultater i excel, får en ekstra tom rad ved import etter hver linje.

 

Ser at Snippsat hadde med en ".replace('\r\n', '')" i koden, men jeg finner ikke ut hvordan jeg får det inn i koden min her.

 

 

Tips til enkel modifikasjon av koden min over for å fjerne dette?

 

 

Jeg er ikke så dreven på python, men det kan virke som at ser.readline() returnerer en string.

Forsøk logging.info(ser.readline().replace('\r\n', ''))

 

Ettersom du skal ha det inn i excel finnes det også en python modul XlsxWriter som skriver direkte i excel format.  Det er litt mer omstendelig, men det er dette som er så fint med python :)

Endret av process
Lenke til kommentar
men jeg finner ikke ut hvordan jeg får det inn i koden min her

Du bruker strip(),jeg brukte replace() fordi jeg skulle ta alle linjene med en gang.

ser.readline().strip()

Test:

>>> read_line = 'Sensor;0;23.06\r\n'
>>> read_line.strip()
'Sensor;0;23.06'
Ettersom du skal ha det inn i excel finnes det også en python modul XlsxWriter

Python har Pandas som kan gjøre det meste excel kan, og mere til.

Det er også lettere og bruke Pandas til og overføre til excel enn XlsWriter se her og her.

Endret av snippsat
  • Liker 1
Lenke til kommentar

 

men jeg finner ikke ut hvordan jeg får det inn i koden min her

Du bruker strip(),jeg brukte replace() fordi jeg skulle ta alle linjene med en gang.

ser.readline().strip()

Test:

>>> read_line = 'Sensor;0;23.06\r\n'
>>> read_line.strip()
'Sensor;0;23.06'
Ettersom du skal ha det inn i excel finnes det også en python modul XlsxWriter

Python har Pandas som kan gjøre det meste excel kan, og mere til.

Det er også lettere og bruke Pandas til og overføre til excel enn XlsWriter se her og her.

 

 

Jepp, det blir ryddigere.

 

Takk for tips om Pandas, det kan godt hende det blir nyttig.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...