Estoy usando un Arduino para las lecturas del sensor y las envío a una Raspberry Pi a través de USB, usando PySerial para la recepción de datos.
Funciona muy bien, excepto por el hecho de que los datos recibidos se modifican de manera incómoda (y se establecen como constantes). Por ejemplo, estoy leyendo voltajes y calculando corrientes. Los resultados en la serie Arduino son los siguientes:
Volt Current
4.93 0.38
4.92 0.37
4.92 0.37
4.92 0.36
... ...
Sin embargo, en la Raspberry Pi, se lee constantemente de la siguiente manera (observe cómo los dígitos se cambian a cero):
Volt Current
4.99 0.30
4.99 0.30
4.99 0.30
4.99 0.30
... ...
He intentado varias vueltas, pero sin suerte. No estoy seguro de dónde está el problema, ya que estoy muy seguro de que mi código es perfecto. Incluso convertí las lecturas en cadenas antes de enviarlas y, sin embargo, siguen apareciendo lecturas constantes y dígitos en cero. Agregué un entero de contador que se envió correctamente sin problemas.
¿Alguien ha intentado esto antes? ¿Alguna idea sobre cómo resolver esto?
Código Pi de frambuesa:
from time import gmtime, strftime
import time
import serial
import struct
ser = serial.Serial('/dev/ttyACM1', 19200)
f = open('results.txt','w')
while 1:
temp=strftime("%Y-%m-%d %H:%M:%S", gmtime())+'\t'+ser.readline()
print(temp)
f.write(temp)
f.close()
f = open('results.txt','a')
time.sleep(5)
Código Arduino:
...
double volt = 5.0*(analogRead(A0))/1023.0;
double current = 5.18 - temp; //Resistance ~= 1 Ohm if you are wondering
buffer += d2s(volt,2)+'\t'+d2s(current,2)+'\t'+ d2s(count,0) +'\t' + d2s(minCount,0);
Serial.println(buffer);
...
//I got this from the web
String d2s(double input,int decimalPlaces){
String string;
if(decimalPlaces!=0){
string = String((int)(input*pow(10,decimalPlaces)));
if(abs(input)<1){
if(input>0)
string = "0"+string;
else if(input<0)
string = string.substring(0,1)+"0"+string.substring(1);
}
return string.substring(0,string.length()-
decimalPlaces)+"."+string.substring(string.length()-decimalPlaces);
}
else {
return String((int)input);
}
}