Es primera vez que uso la Plataforma, requiero ayuda con un proyecto de mis practicas.
Estoy tratando de enviar datos de un esclavo a un maestro por I2C, el esclavo envia un texto de Char y dos datos Int (lectura digital y analogica), el esclavo trabaja correctamente, el problema radica a la hora de que el maestro reciba los datos, recibe bien los datos del texto Char, sin embargo la lectura analogica y digital no son los correctos (Dispositivo encontrado en la dirección 0x8 - Sensor de Flama, -16777216, -1), Quisiera saber si alguien ha tenido este problema o como solucionarlo
Codigo del Esclavo:
#include <Wire.h>
char charData[] = "Sensor de Flama";
int analogData = 0;
int digitalData = 0;
void setup() {
Serial.begin(9600);
Wire.begin(0x08); // Inicia el I2C con la dirección 0x08
Wire.onRequest(requestEvent); // Registra la función de solicitud
pinMode(27, INPUT);
}
void loop() {
// Simular la obtención de datos
analogData = analogRead(26); // Lectura analógica
digitalData = digitalRead(27); // Lectura digital en el pin 5 (por ejemplo)
Serial.println(digitalData);
Serial.println(analogData);
Serial.println(charData);
delay(200);
}
void requestEvent() {
// Enviar datos al maestro cuando sea solicitado
byte charLength = strlen(charData); // Longitud de la cadena de caracteres
byte buffer[charLength + sizeof(analogData) + sizeof(digitalData)];
// Copiar dato char a buffer
memcpy(buffer, charData, charLength);
// Copiar dato analógico a buffer después del dato char
memcpy(buffer + charLength, &analogData, sizeof(analogData));
// Copiar dato digital a buffer después del dato analógico
memcpy(buffer + charLength + sizeof(analogData), &digitalData, sizeof(digitalData));
Wire.write(buffer, charLength + sizeof(analogData) + sizeof(digitalData));
}
Codigo del Maestro:
#include <Wire.h>
#define SLAVE_ADDRESS 0x08
#define SLAVE_ADDRESS_2 0x07
char receivedChar[20]; // Se asume una longitud máxima para la cadena de caracteres
int receivedAnalog;
int receivedDigital;
void setup() {
Serial.begin(9600);
Wire.begin(); // Inicia el I2C como maestro
Serial.println("Buscando dispositivos I2C...");
}
void loop() {
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("\nDispositivo encontrado en la dirección 0x");
Serial.println(address, HEX);
Wire.requestFrom(address, sizeof(receivedChar) + sizeof(receivedAnalog) + sizeof(receivedDigital));
while (Wire.available() < sizeof(receivedChar) + sizeof(receivedAnalog) + sizeof(receivedDigital)) {
// Espera a que todos los bytes estén disponibles
}
byte buffer[sizeof(receivedChar) + sizeof(receivedAnalog) + sizeof(receivedDigital)];
// Leer dato char
Wire.readBytes(buffer, sizeof(receivedChar));
memcpy(receivedChar, buffer, sizeof(receivedChar));
// Leer dato analógico
Wire.readBytes(buffer + sizeof(receivedChar), sizeof(receivedAnalog));
memcpy(&receivedAnalog, buffer + sizeof(receivedChar), sizeof(receivedAnalog));
// Leer dato digital
Wire.readBytes(buffer + sizeof(receivedChar) + sizeof(receivedAnalog), sizeof(receivedDigital));
memcpy(&receivedDigital, buffer + sizeof(receivedChar) + sizeof(receivedAnalog), sizeof(receivedDigital));
Serial.print(receivedChar);
Serial.print(", ");
Serial.print(receivedAnalog);
Serial.print(", ");
Serial.println(receivedDigital);
}
}
delay(2000); // Espera 2 segundos antes de Volver a escanear
}