transmission code
#include "DHT.h"
#include <Wire.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <CRC32.h>
#define DHT11_PIN A1 // pin connected to the DHT11 sensor
#define DHTTYPE DHT11 // DHT11 sensor type
#define irLedPin 13 // pin connected to IR LED
#define slave_address 9 // I2C slave address
CRC32 crc;
DHT dht(DHT11_PIN, DHTTYPE);
IRsend irsend;
int counter = 0;
void setup() {
dht.begin();
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(6, INPUT); // Setup for leads off detection LO +
pinMode(2, INPUT); // Setup for leads off detection LO -
pinMode(irLedPin, OUTPUT);
Wire.begin(); // Initialize I2C communication
}
void loop() {
int sensorValue = analogRead(A0); // Read the sensor value
delay(1);
counter++;
if (counter == 5000) {
int temperature = dht.readTemperature();
if (!isnan(temperature)) {
sendTemperatureIR(temperature);
Serial.print("Temperatura: ");
Serial.println(temperature);
}
float humidity = dht.readHumidity();
if (!isnan(humidity)) {
senddataI2C(humidity,temperature);
}
counter = 0;
}
}
void sendTemperatureIR(int temperature) {
// Convert temperature to a 16-bit value (0x0000 to 0xFFFF)
unsigned int tempValue = map(temperature, 0, 100, 0, 0xFFFF);
// Calculate CRC32 checksum for temperature value
crc.reset();
crc.update((uint8_t *)&tempValue, sizeof(tempValue));
uint32_t checksum = crc.finalize();
// Send temperature data along with CRC32 checksum using Sony IR protocol
irsend.sendSony(tempValue, 16);
delay(50); // Add a small delay between transmission of temperature and checksum
irsend.sendSony(checksum, 32);
// Blink LED to indicate transmission
digitalWrite(LED_BUILTIN, HIGH);
delay(100); // Blink duration
digitalWrite(LED_BUILTIN, LOW);
}
void senddataI2C(float humidity,int temp) {
int humidityInt = static_cast<int>(humidity);
Wire.beginTransmission(slave_address);
Wire.write("Umidita=");
Wire.write(String(humidityInt).c_str());//per convertire il valore in una stringa
Wire.write("\n");
Wire.write("Temperatura=");
Wire.write(String(temp).c_str());
Wire.endTransmission();
}
receiving code
#include <Wire.h>
#include <IRremote.h>
#define irReceiverPin 13 // Pin connected to IR receiver
IRrecv irrecv(irReceiverPin);
decode_results results;
int slave_address=9;
int receivedTemperature = 0;
int receivedTemperature1 = 0;
void servizio(int a){
String dataReceived = "";
while(Wire.available()){
char c = Wire.read();
dataReceived += c;
}
Serial.println(dataReceived);
receivedTemperature = dataReceived.toInt();
}
void receiveIR() {
if (irrecv.decode(&results)) {
receivedTemperature1 = results.value;
Serial.print("Received Temperature (Hex): 0x");
Serial.println(receivedTemperature1, HEX); // Print received value in hexadecimal format
irrecv.resume(); // Receive the next value
}
void setup() {
Wire.begin(slave_address); // Join I2C bus with address 9
Serial.begin(9600);
irrecv.enableIRIn();
Wire.onReceive(servizio);
}
void loop() {
receiveIR();
delay(1000);
}