#include <LoRa.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
// Define I2C buses
TwoWire I2C_BMP = TwoWire(0); // I2C bus 0 for BMP280
TwoWire I2C_OLED = TwoWire(1); // I2C bus 1 for OLED
// Define pins for I2C buses
#define SDA_BMP 21 // I2C0 SDA pin for BMP280
#define SCL_BMP 22 // I2C0 SCL pin for BMP280
#define SDA_OLED 33 // I2C1 SDA pin for OLED
#define SCL_OLED 32 // I2C1 SCL pin for OLED
// Define DHT22
#define DHTPIN 4 // Changed from 21 since it was used for I2C
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// BMP280
Adafruit_BMP280 bmp(&I2C_BMP); // Use I2C_BMP bus
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &I2C_OLED, -1); // Use I2C_OLED bus
// LoRa
#define LORA_CS 5
#define LORA_RST 14
#define LORA_IRQ 26
#define LORA_BAND 433E6
void setup() {
// Serial Monitor
Serial.begin(9600);
// Initialize I2C buses
I2C_BMP.begin(SDA_BMP, SCL_BMP); // Initialize I2C0 for BMP280
I2C_OLED.begin(SDA_OLED, SCL_OLED); // Initialize I2C1 for OLED
// DHT Initialization
dht.begin();
// BMP280 Initialization
if (!bmp.begin(0x76)) {
Serial.println("BMP280 not found! Check wiring or I2C address.");
while (1);
}
// OLED Initialization
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found! Check wiring or I2C address.");
while (1);
}
display.clearDisplay();
display.display();
// LoRa Initialization
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
if (!LoRa.begin(LORA_BAND)) {
Serial.println("Starting LoRa failed! Check wiring or frequency.");
while (1);
}
Serial.println("LoRa Initialized!");
}
void loop() {
// Read sensors
float temperature = dht.readTemperature();
if (isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
temperature = 0.0; // Assign default value
}
float pressure = bmp.readPressure() / 100.0F; // in hPa
int gasLevel = analogRead(34); // MQ2 on analog pin
// Prepare LoRa packet
String dataPacket = "{";
dataPacket += "\"temperature\":" + String(temperature, 2) + ",";
dataPacket += "\"pressure\":" + String(pressure, 2) + ",";
dataPacket += "\"gas_level\":" + String(gasLevel);
dataPacket += "}";
// Send data via LoRa
LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();
// Display on OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.println("Sensor Readings:");
display.println("----------------");
display.print("Temp: ");
display.print(temperature);
display.println(" C");
display.print("Pressure: ");
display.print(pressure);
display.println(" hPa");
display.print("Gas: ");
display.println(gasLevel);
display.display();
// Debugging
Serial.println(dataPacket);
delay(5000); // Delay for next reading
}