Buenas noches!
Acudo a vosotros porque necesito ayuda. Llevo poco tiempo con Arduino y estoy dando mis primeros pasos, no controlo mucho de programación y hay cosas que voy aprendiendo a medida que voy haciendo, pero aquí me he estancado un poco. Os explico:
tengo una Shield de e-Health que permite medir la temperatura corporal con un sensor que le conectas mediante un jack. Esto funciona bien y la temperatura es correcta, copio el código por si alguno lo necesita:
#include <eHealth.h>
#include <eHealthDisplay.h>
void setup() {
Serial.begin(9600);
}
void loop() {
float temperatura = eHealth.getTemperature();
Serial.print(temperatura);
delay(500);
}
Quiero enviar ese dato, el float de la temperatura, a un servidor mediante el protocolo MQTT. Al principio pensé en conectar encima del arduino la Shield de e-Health, y encima de esta Shield conectar también la Shield de la wifi. ¿Cuál es el problema? Que la Shield de la wifi necesita el pin 7 para hacer el handshake, y la Shield de e-Health necesita casi todos los pines así que no se puede hacer lo que había pensado.
Como el proyecto que estamos haciendo consta de varios arduinos, he pensado: bueno, pues mando la variable de la temperatura a otro Arduino que tenga la Shield de la wifi, y que este último se encargue de mandar el dato al servidor MQTT.
#include <SPI.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
//Datos de red y defiir status como apagado
char ssid[] = "ssid";
char pass[] = "password";
int status = WL_IDLE_STATUS;
//MQTT
char mqttUsername[] = ""; //Nombre de usuario MQTT
char mqttPassword[] = ""; //Contraseña MQTT
WiFiClient arduino;
void callback(char*topic, byte*payload, unsigned int length);
PubSubClient mqttClient("servidor",puerto,callback,arduino);
void callback(char*topic, byte*payload, unsigned int length) {
// Allocate the correct amount of memory for the payload copy
char*almacen;
almacen=new char[length+1];
int i=0;
for(i=0;i<length;i++) {
almacen[i]=payload[i];
}
almacen[i]='\0';
//FIN DEL MENSAJE
String msg=almacen;
Serial.println(msg);
if(msg == "ON"){
digitalWrite(8,HIGH);
mqttClient.publish("from/arduino","LED ON");
}
if(msg == "OFF"){
digitalWrite(8,LOW);
mqttClient.publish("from/arduino","LED OFF");
}
if(msg == "TEMPERATURA") {
while(!Serial.available());
float tempfl = Serial.parseFloat();
char temp[5];
dtostrf(temperatura_fl,4,2,temperatura);
mqttClient.publish("from/arduino",temperatura);
}
}
void reconnect() {
// Loop until we're reconnected
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
mqttClient.connect("arduino",mqttUsername,mqttPassword);
if (mqttClient.connected()) {
Serial.println("connected");
// Once connected, publish an announcement...
mqttClient.publish("from/arduino","hello world");
// ... and resubscribe
mqttClient.subscribe("to/arduino");
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup()
{
Serial.begin(9600);
pinMode(8,OUTPUT);
//WIFI
Serial.println("Intentando conectarse a la red...");
status = WiFi.begin(ssid,pass);
//Si no te has conectado, párate aquí
if (status != WL_CONNECTED) {
Serial.println("No se ha podido conectar a la red");
while(true);
}
//Si te conectas...
else {
Serial.println("Conectado a la red");
}
//WIFI
}
void loop()
{
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
}
El problema lo tengo en esta parte:
if(msg == "TEMPERATURA") {
while(!Serial.available());
float tempfl = Serial.parseFloat();
char temp[5];
dtostrf(temperatura_fl,4,2,temperatura);
mqttClient.publish("from/arduino",temperatura);
}
mqttClient.publish() pide que el payload que mande sea un char, y tras estar un rato investigando he escrito ese código. El problema es que la temperatura que me manda, al principio es de 28 grados, y tras esto me empieza a marear dándome valores de 0º, 0.1 etc., valores que no corresponden con la realidad.
A ver si alguno me puede echar una mano, que me estoy volviendo loco!
Pongo también el link de la librería que uso para enviar datos mediante MQTT, se llama PubSubClient y la página oficial es esta: http://pubsubclient.knolleary.net
Un saludo y gracias de antemano.