es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Enviando múltiples datos de sensores desde arduino a python, alguna idea?

Tengo este problema, estoy tratando de enviar datos de sensor desde Arduino a Python a través de la comunicación serial. Pero la salida es un poco extraña. ¿Alguien tiene alguna idea sobre esto?

Código de Arduino: para enviar datos de sensor

void setup(){
Serial.begin(9600);
}

void loop(){
int sensor1 = 20;
int sensor2 = 40;
int sensor3 = 60;
Serial.write(sensor1);
}

Código de Python: para recibir datos enviados de Arduino

import serial,time
ser = serial.Serial(“/dev/ttyACM1”,9600,timeout=1)
while True:
data = ser.read()
time.sleep(1)
print(“datos:”,data)

Salida:

datos: b’\x14′

Objetivo:

datos: 20

Segundo objetivo: enviar varios datos de sensor en un solo serial.write().

datos: 20 40 60

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que los datos recibidos en Python no están en el formato esperado. La salida muestra una cadena de bytes (indicada por la “b” delante de los datos), que no se interpreta directamente como un valor entero.

    Una posibilidad es cambiar el código de Arduino para enviar los datos del sensor en formato ASCII legible por humanos usando Serial.print(), en lugar de Serial.write(). Por ejemplo:

        Serial.print(sensor1);
        Serial.print(” “);
        Serial.print(sensor2);
        Serial.print(” “);
        Serial.println(sensor3);

    Esto debería enviar los datos del sensor como una cadena de enteros separados por espacios, terminados por un carácter de nueva línea.

    Luego, en el código de Python, puede leer la cadena entrante y analizarla para extraer los valores individuales del sensor:

        while True:
            data = ser.readline().decode().strip()  # lea una línea de datos ASCII
            if data:
                sensores = [int(x) para x en data.split()]
                print(“sensores:”, sensores)

    Este código lee una línea de datos ASCII del puerto serie, la decodifica como una cadena, elimina cualquier espacio en blanco al principio o al final, la divide en tokens individuales usando el espacio como delimitador, convierte cada token en un entero, y almacena la lista resultante de enteros en la variable “sensores”.

    Si desea mantener el protocolo de comunicación basado en bytes, puede modificar el código de Python para interpretar el byte entrante como un entero utilizando la función “ord()”:

        while True:
            data = ser.read()
            if data:
                valor_sensor = ord(data)
                print(“sensor:”, valor_sensor)

    Este código lee un solo byte del puerto serie, lo convierte en un entero usando ord(), e imprime el valor resultante. Sin embargo, este método solo le permite recibir un valor del sensor a la vez, por lo que si desea enviar múltiples valores del sensor en un solo mensaje, deberá utilizar un carácter delimitador (por ejemplo, coma) y analizar la secuencia de bytes entrantes en consecuencia.

    En resumen, la solución depende del protocolo de comunicación específico que desea utilizar y del nivel de complejidad que necesita para la transmisión de datos del sensor.

Comments are closed.