Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO I2C Environmental Monitoring System with OLED Display and Buzzer Alert

View and Edit Project In Cirkit DesignerImage of Arduino UNO I2C Environmental Monitoring System with OLED Display and Buzzer Alert

Circuit Documentation

Summary

This circuit integrates two Arduino UNO microcontrollers, a 0.96" OLED display, an HC-SR04 Ultrasonic Distance Sensor, a red LED with a resistor, and a buzzer. One Arduino acts as a master, interfacing with the OLED to display temperature and humidity data. The other Arduino functions as a slave, equipped with a DHT sensor to measure temperature and humidity, and communicates this data to the master via I2C. The circuit also includes a buzzer controlled by the master Arduino and an LED indicator with a current-limiting resistor.

Component List

Microcontrollers

Display

Sensors

Indicators

Passive Components

Wiring Details

Arduino UNO (Master)

Arduino UNO (Slave)

0.96" OLED

HC-SR04 Ultrasonic Distance Sensor

LED (Red)

Resistor (200 Ohms)

Buzzer

Documented Code

MASTER.ino (Arduino UNO Master)

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Wire.begin(); // Join I2C bus as master
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Initialize OLED display with I2C address 0x3C
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Initializing...");
  display.display();
  delay(2000);
}

void loop() {
  Wire.requestFrom(8, 4); // Request 4 bytes from slave device #8

  if (Wire.available() == 4) {
    int temperature = Wire.read(); // Read temperature
    int humidity = Wire.read();    // Read humidity
    int tempDecimal = Wire.read(); // Read temperature decimal part
    int humDecimal = Wire.read();  // Read humidity decimal part

    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Temp: ");
    display.print(temperature);
    display.print(".");
    display.print(tempDecimal);
    display.println(" C");
    display.print("Humidity: ");
    display.print(humidity);
    display.print(".");
    display.print(humDecimal);
    display.println(" %");
    display.display();
  }

  delay(2000); // Wait for 2 seconds before next request
}

SLAVE.ino (Arduino UNO Slave)

#include <Wire.h>
#include <DHT.h>

#define DHTPIN 2     // Pin where the DHT11 is connected
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Wire.begin(8); // Join I2C bus with address #8
  Wire.onRequest(requestEvent); // Register event
  dht.begin();
}

void loop() {
  // Nothing to do here, everything is handled in the requestEvent function
}

void requestEvent() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  int tempInt = (int)temperature;
  int humInt = (int)humidity;
  int tempDecimal = (int)((temperature - tempInt) * 100);
  int humDecimal = (int)((humidity - humInt) * 100);

  Wire.write(tempInt);
  Wire.write(humInt);
  Wire.write(tempDecimal);
  Wire.write(humDecimal);
}

This concludes the documentation for the described circuit. The code provided for the master and slave Arduinos facilitates the communication and display of sensor data, while the wiring details outline the connections necessary for the circuit's functionality.