2014-02-13 2 views
0

Я играю с ардуино. В книге проектов есть проект для получения температуры от датчика температуры. Я зацепил, как он говорит, и написал следующий простой код:arduino serial и pySerial

const int sensorPin = A0; 
void loop(){ 
    int sensorVal = analogRead(sensorPin); 
    float voltage = (sensorVal/1024.0)* 5.0; 
    float temperature = (voltage - .5) * 100; 
    Serial.println(temperature); 
} 

для печати температуры на последовательном мониторе. Я использовал pySerial, чтобы получить температуру от Arduino, как этот

try: 
    ser = serial.Serial('/dev/ttyACM0', 9600) 
except serial.SerialException as se: 
    print se 
    exit() 

while True: 
    temperature = ser.readline() 
    print "Temp from arduino", temperature 
    try: 
     temperature = float(temperature) 
     print "FLoat temperature", temperature 
    except ValueError as ve: 
     print ve 
     continue 

Но проблема в том, что в то время как серийный монитор от Arduino язя показывает температуру нормально (22.3 например) обычный поплавок номер, который питон имеет номер деленная на 10

Temp from arduino 2.27 
FLoat temperature 2.27 

Как я могу справиться с этим?

+0

Ваши выходы идентичны? Кроме того, вы захотите сделать 'float()' much ealier, beacause после получения данных. Вы уже испортили его, не рассматривая его как 'float()' с самого начала. Например, вы не можете выполнить 'x = 10.15; x = int (x); x = float (x); 'потому что это закончится« 10 », даже если вы попытаетесь его вернуть. Не то, чтобы это помогло, но вместо этого сделало 'temperature = float (ser.readline()'. – Torxed

+0

Странно иметь разницу между выходом в последовательном мониторе и во входном pySerial. Я не вижу причин для этого - оба из них показать текст, поступающий из последовательного интерфейса. У меня есть два вопроса и одно предложение. Почему бы вам не разделить на 1023 вместо 1024? Почему это '- .5'? Попробуйте напечатать значение« напряжение »для серийного просмотра –

+0

@Torxed ValueError: недействительный литерал для float(): 22.73.24 это то, что я получаю для float (ser.readline()). Как будто он читает строку и что-то из следующей строки ... Должен ли я синхронизировать arduino Serial.println() и serial.readline()? python? – Apostolos

ответ

0

Это шов, что-то другое, за исключением того, что температура печатается на последовательном интерфейсе вашим Arduino. Попробуйте префикс температуры с некоторым тегом и разобрать его в сторону питона:

Serail.print('Temp:') 
Serial.println(temperature); 

И в клиенте:

input = ser.readline() 
print "Input from arduino", input 
try: 
    if input.startswith('Temp:') 
    temperature = float(input[len('Temp'):]) 
     print "Float temperature", temperature