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
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
Código de error de Python
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.
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


0