Python - Leer módulo HC-05 (bluetooth) de Arduino con un Script Python

 
Vista:
Imágen de perfil de Gustavo
Val: 13
Ha disminuido su posición en 9 puestos en Python (en relación al último mes)
Gráfica de Python

Leer módulo HC-05 (bluetooth) de Arduino con un Script Python

Publicado por Gustavo (7 intervenciones) el 01/10/2019 03:14:03
Buenas tardes, estoy atascado con la escritura de un script en python que me permita leer los datos de tres sensores de Arduino.
El Arduino esta conectado a la Raspberry py vía cable USB y solo puedo leer los 2 primeros datos de un conjunto de 5 datos, los datos son de distancia (HC-SR04), temperatura (LM35) y temperatura/humedad (DHT11), este último me envía 3 datos (temperatura °C, temperatura °F y humedad).
Al tratar de leer los datos con un script python me da error, me dice que la posición del último elemento está fuera de rango.
Les adjunto los programas Arduino y python a ver si por ahí me logran ayudar con este problema.


Código Arduino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//Librería SoftwareSerial
#include <SoftwareSerial.h>
 
//Libreria DHT
#include <DHT.h>
 
//Pines y variables del HC-SR04
#define pin_trig 2
#define pin_echo 3
float duracion;
float distancia;
 
//Pines y variables del LM35
#define pin_lm35 A0
float temperatura_lm35;
 
//Define el sensor como DHT11 o DHT22
#define pin_dht 4
//#define DHTTYPE DHT22
#define DHTTYPE DHT11
DHT dht(pin_dht, DHTTYPE);
long tiempoUltimaLectura = 0;
 
//Pines (10|11 - Arduino) a (RX|TX - moduloHC05)
#define pin_rx 10
#define pin_tx 11
SoftwareSerial moduloHC05(pin_rx, pin_tx);
 
//Creamos Array para almacenar valores
float valores[25];
 
void setup() {
  pinMode(pin_trig, OUTPUT);
  pinMode(pin_echo, INPUT);
  pinMode(pin_dht, OUTPUT);
  digitalWrite(pin_trig, LOW);  //Inicio Pin Trigger en Low
  Serial.begin(9600);           //Inicio puerto serial
  //moduloHC05.begin(38400);      //Inicio módulo bluetooth
  dht.begin();
}
 
void loop() {
 
  //Solicito valores a las funciones
  mideDistancia();
  mideTemperatura();
  mideTempHumedad();
 
  //Imprime en monitor serial
  Serial.print(valores[0]);
  Serial.print(",");
  Serial.print(valores[1]);
  Serial.print(",");
  Serial.print(valores[2]);
  Serial.print(",");
  Serial.print(valores[3]);
  Serial.print(",");
  Serial.print(valores[4]);
  Serial.print("\n");
 
  //Lee moduloHC05 y envía datos al puerto serial
  //if(moduloHC05.available()){
  //  Serial.write(moduloHC05.read());
  //}
 
  //Lee puerto serial y envía datos por móduloHC05
  //if(Serial.available()){
  //  moduloHC05.println(Serial.read());
  //}
 
  delay(1000);
}
 
//Función mide distancia (HCSR-04)
int mideDistancia(){
  digitalWrite(pin_trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pin_trig, LOW);
  duracion = pulseIn(pin_echo, HIGH);
  distancia = duracion / 58.2;
  valores[0] = distancia;
}
 
//Función mide temperatura agua cisterna (LM35)
int mideTemperatura(){
  float suma = 0.0;
  //Lectura del Pin Analógico A0
  float lectura_lm35 = analogRead(pin_lm35);
  //Se toman 10 muestras de temperatura
  for(int i=1; i < 10; i++){
    temperatura_lm35 = ((lectura_lm35 * 5000.0 / 1023) / 10);
    suma = temperatura_lm35 + suma;
    delay(100);
  }
  //Promedio de las 10 muestras
  temperatura_lm35 = suma / 10;
  valores[1] = temperatura_lm35;
}
 
//Funcion mide temperatura y humedad ambiente (DHT11)
int mideTempHumedad(){
  if(millis() - tiempoUltimaLectura > 2000) {
    //Lee y registra la temperatura en °C
    valores[2] = dht.readTemperature();
    //Lee y registra la temperatura en °F
    valores[3] = dht.readTemperature(true);
    //Lee y registra la humedad
    valores[4] = dht.readHumidity();
    //Actualiza tiempo última lectuta
    tiempoUltimaLectura = millis();
  }
}


Este código me devuelve los 5 valores flotantes leidos:

50.15,19.35,21.60,70.88,79.00
49.30,18.91,21.50,70.70,79.00
50.05,19.35,21.50,70.70,79.00


Código Python completo con la línea de error

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#importando librerías
import serial, time
 
#Conectando con puerto serial de Arduino
puertoSerial = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(2)   #Espera 2 segundos para conectar puerto serial
 
while 1:
    try:
 
        #Recive y almacenes cadena ASCII
        recive_datos = puertoSerial.readline()
 
        #Convertimos caracteres ASCII a String
        convierte_datos = ""
        for valor in recive_datos:
            convierte_datos = convierte_datos + chr(valor)
 
        #Agrupamos caracteres según separador
        separador = ","
        nueva_lista = convierte_datos.split(separador)
        print(nueva_lista[0]
              , nueva_lista[1]
              , nueva_lista[2]
              , nueva_lista[3]
              , nueva_lista[4])
 
    except KeyboardInterrupt:
        break
 
#Cerrando puerto serial
puertoSerial.close()


Código de error de Python

1
2
3
4
Traceback (most recent call last):
  File "/var/www/html/proyectoSensores/pythonLecturaPuertoSerial_ejemplo.py", line 26, in <module>
    , nueva_lista[4])
IndexError: list index out of range


Pero si comento las 3 últimas lineas de la función print() puedo leer los 2 primeros datos:

49.66 25.51
49.74 24.19
49.31 25.07


Modifique el Array de código Arduino de "float" a "int" y con esa variación el sript Python ya lee los 5 datos pero enteros:

49 18 21 70 79
49 19 21 70 79
49 18 21 69 79

Necesito de su ayuda para lograr escribir los datos en "float", hay algo que de repente no estoy considerando y se esta escando por ahí.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder