Comunicacion de 2 Arduinos por I2C, enviar datos con decimales.

Hola, esperando que esten bien solicito ayuda en un proyecto que tengo.

La situación es la siguiente, tengo dos sensores DS18B20, conectados por un solo punto, estos sensores me van a controlar en un futuro dos relés, yo voy a elegir un rango de 23.50 a 24 grados para que se activen los reles, estos datos adicionales de los sensores los voy a subir a un servidor IoT (Ubidots) me ha funcionado todo perfecto, problema es que ahora quiero independizarlos.

Quiero que los datos le lleguen a un arduino y sea de control, en el solo estarán los reles y leyendo datos en el siguiente arduino sera para subir los datos a Ubidots y para mostrarlos en un lcd, de esta manera si me falla el que sube los datos no deje de funcional el de control. Puedo recibir los datos procesar el control y luego enviar los datos a el otro arduino para que los suba a la nube y muestre en el lcd.
Mi problema viene aca, estoy haciendo por I2C entonces cuando trabajo con Wire.write solo me deja enviar bytes y cuando lo recibo en el arduino de datos solo me aparecen valores enteros entonces ya no puedo subir la nube los cambios de decimales si no que numeros enteros.
Dejo por aca la programacion base de el maestro, el que lee el sensor y sera de control y estara conectado a los reles.

#include <Wire.h>
#include <DallasTemperature.h>
const int pinDatosDQ = 9;
OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);
void setup() {
  
  Wire.begin();
  sensorDS18B20.begin();
}

void loop() {
 
    Wire.beginTransmission(1);  // Transmite al Esclavo 1
    Wire.write((byte)sensorDS18B20.getTempCByIndex(1));
    Wire.write((byte)sensorDS18B20.getTempCByIndex(0));
    Wire.endTransmission();

     
    delay (1000);
    
}

Y por aca esta el del esclavo, que es el que va a subir los datos e imprimir en la lcd, lo he simulado con Serial.println

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
//INICIAMOS LA COMUNICACION SERIAL
  Serial.begin(9600);
  //INICIAMOS EL BUS 1-WIRE
  // Unimos este dispositivo al bus I2C con dirección 1 (Esclavo 1)
  Wire.begin(1);
  // Registramos el evento al recibir datos
  Wire.onReceive(llegaDato);
  /* Inicializar el LCD
  lcd.begin();
  //Encender la luz de fondo.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("SISTEMA DE TEMP");
  lcd.setCursor(2,1);
  lcd.print("INICIANDOSE");
  delay(1000);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("T1      T2");
*/
}
void loop()  {
 delay(30);
}

void llegaDato() {
 
  int pinOut = 0;
  int estado = 0;
  
  // Si hay dos bytes disponibles
 if (Wire.available() == 2)
   pinOut = Wire.read();
 if (Wire.available() == 1) 
    estado = Wire.read();

  // Activamos/desactivamos salida
  Serial.println ("Sensor 1");
  Serial.println (pinOut);
  Serial.println ("Sensor 2");
  Serial.println (estado);
  
}

Ponerlo en la LCD lo puedo hacer de cualquier arduino, lo que si necesito es que el arduino esclavo me reciba los decimales de las temperaturas.
Esta ha sido una solucion para un problema que me encontre, si saben como puedo hacer lo mismo de independizar las acciones manteniendo decimales y poder subir los datos seria perfecto. No soy muy experto en esto y he pasado investigando y no logro dar con algo que me sirva. Muchas gracias por la ayuda que pueda ser brindada

El tema ya ha sido respondido varias veces, solo debes buscar (arriba derecha) I2C float y encontrarás la respuesta, es mas estoy seguro que fue entre Diciembre y Enero de este año.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.