ArduinoIoT Hardwares

Smart Weather Station using Arduino Board

Introduction

A Smart Weather Station is an electronic device that collects and displays real-time weather data such as temperature, humidity, pressure, and more. This project utilizes an Arduino board along with various sensors to create a compact, cost-effective, and efficient weather monitoring system.

Components Required

To build this smart weather station, you will need the following components:

  • Arduino Uno (or any compatible board)
  • DHT11/DHT22 Sensor (for temperature and humidity measurement)
  • BMP180/BMP280 Sensor (for barometric pressure)
  • LDR (Light Dependent Resistor) (for measuring light intensity)
  • Rain Sensor (to detect rain)
  • Anemometer (for wind speed measurement)
  • LCD Display (16×2 or OLED Display) (to display the readings)
  • Wi-Fi Module (ESP8266) (to send data to the cloud)
  • Jumper Wires and Breadboard
  • Power Supply (5V battery or adapter)

Pin Connections:

1. DHT11 Sensor (Temperature and Humidity)

  • VCC5V on Arduino
  • GNDGND on Arduino
  • DataDigital Pin 2 on Arduino

2. BMP180 Sensor (Pressure)

  • VCC3.3V on Arduino
  • GNDGND on Arduino
  • SCLA5 (SCL) on Arduino
  • SDAA4 (SDA) on Arduino

3. LDR Sensor (Light Intensity)

  • One LegA0 on Arduino (analog input)
  • Other LegGND on Arduino (with a 10kΩ resistor in parallel)

4. Rain Sensor

  • VCC5V on Arduino
  • GNDGND on Arduino
  • DO (Digital Output)Digital Pin 3 on Arduino

5. Anemometer (Wind Speed)

  • Signal PinDigital Pin 4 on Arduino (interrupt pin)
  • VCC5V on Arduino
  • GNDGND on Arduino

6. I2C LCD Display

  • VCC5V on Arduino
  • GNDGND on Arduino
  • SDAA4 (SDA) on Arduino
  • SCLA5 (SCL) on Arduino

7. ESP8266 Wi-Fi Module

  • VCC3.3V on Arduino
  • GNDGND on Arduino
  • TXRX on Arduino
  • RXTX on Arduino (use a voltage divider to step down 5V to 3.3V for RX)

Notes:

  1. Voltage Divider for ESP8266 RX:
    • The ESP8266 is a 3.3V module, so you need to step down the 5V TX signal from the Arduino to 3.3V for the ESP8266 RX pin. Use a voltage divider with resistors (e.g., 1kΩ and 2kΩ).
  2. Power Supply:
    • Ensure your power supply (5V battery or adapter) can handle the current requirements of all components.
  3. I2C Address:
    • If your I2C LCD doesn’t work, check its I2C address using an I2C scanner sketch and update the address in the code (0x27 is the default for most LCDs).
  4. Anemometer Calibration:
    • The anemometer pulse count needs to be calibrated to convert it into wind speed (m/s). You may need to adjust the formula in the code based on your specific anemometer.

Programming the Arduino

Installing Required Libraries

Before coding, install the following libraries in the Arduino IDE:

  • DHT.h for the DHT11/22 sensor
  • Adafruit_BMP280.h for the BMP280 sensor
  • ESP8266WiFi.h for cloud communication
  • LiquidCrystal_I2C.h for the LCD display
  • wire.h
  • ESP8266HTTPClient.h

Sample Code

C
#include <Wire.h>
#include <Adafruit_BMP085.h> // BMP180 library
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

// Define sensor pins
#define DHTPIN 2          // DHT11 data pin
#define DHTTYPE DHT11     // DHT11 sensor type
#define LDR_PIN A0        // LDR analog pin
#define RAIN_PIN 3        // Rain sensor digital pin
#define ANEMOMETER_PIN 4  // Anemometer pulse-counting pin

// Wi-Fi credentials
const char* ssid = "YOUR_WIFI_SSID";       // Replace with your Wi-Fi SSID
const char* password = "YOUR_WIFI_PASSWORD"; // Replace with your Wi-Fi password

// ThingSpeak API details
const char* serverUrl = "http://api.thingspeak.com/update";
const char* apiKey = "YOUR_THINGSPEAK_API_KEY"; // Replace with your ThingSpeak API key

// Initialize sensors and LCD
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16x2 LCD

// Variables for sensor data
float temperature = 0;
float humidity = 0;
float pressure = 0;
int lightIntensity = 0;
bool isRaining = false;
volatile unsigned int windPulseCount = 0; // For anemometer pulse counting
float windSpeed = 0;

// Interrupt service routine for anemometer
void countPulses() {
  windPulseCount++;
}

void setup() {
  // Initialize serial communication
  Serial.begin(9600);

  // Initialize sensors
  dht.begin();
  if (!bmp.begin()) {
    Serial.println("Could not find BMP180 sensor, check wiring!");
    while (1);
  }

  // Initialize LCD
  lcd.begin();
  lcd.backlight();
  lcd.print("Weather Station");

  // Initialize Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Wi-Fi connected");

  // Set up anemometer interrupt
  pinMode(ANEMOMETER_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(ANEMOMETER_PIN), countPulses, FALLING);

  // Set up rain sensor
  pinMode(RAIN_PIN, INPUT);
}

void loop() {
  // Read sensor data
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();
  pressure = bmp.readPressure() / 100.0F; // Convert Pa to hPa
  lightIntensity = analogRead(LDR_PIN);
  isRaining = digitalRead(RAIN_PIN) == LOW; // LOW means rain detected

  // Calculate wind speed (pulses per second = wind speed in m/s)
  windPulseCount = 0;
  delay(1000); // Measure pulses for 1 second
  windSpeed = windPulseCount * 0.34; // Convert pulses to m/s (calibration needed)

  // Display data on LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T:");
  lcd.print(temperature);
  lcd.print("C H:");
  lcd.print(humidity);
  lcd.print("%");

  lcd.setCursor(0, 1);
  lcd.print("P:");
  lcd.print(pressure);
  lcd.print("hPa L:");
  lcd.print(lightIntensity);

  // Send data to ThingSpeak
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    String url = String(serverUrl) + "?api_key=" + String(apiKey) +
                 "&field1=" + String(temperature) +
                 "&field2=" + String(humidity) +
                 "&field3=" + String(pressure) +
                 "&field4=" + String(lightIntensity) +
                 "&field5=" + String(isRaining) +
                 "&field6=" + String(windSpeed);
    http.begin(url);
    int httpCode = http.GET();
    if (httpCode > 0) {
      Serial.println("Data sent to ThingSpeak");
    } else {
      Serial.println("Error sending data");
    }
    http.end();
  }

  // Wait before next reading
  delay(5000);
}

Explanation of the Code:

  1. DHT11 Sensor:
    • Reads temperature and humidity using the DHT library.
  2. BMP180 Sensor:
    • Reads barometric pressure using the Adafruit_BMP085 library.
  3. LDR Sensor:
    • Measures light intensity using an analog pin.
  4. Rain Sensor:
    • Detects rain by reading a digital pin (LOW means rain is detected).
  5. Anemometer:
    • Uses an interrupt to count pulses, which are then converted to wind speed.
  6. I2C LCD:
    • Displays the sensor data on a 16×2 LCD.
  7. ESP8266 Wi-Fi Module:
    • Sends data to ThingSpeak using an HTTP GET request.
  8. ThingSpeak Integration:
    • The data is sent to ThingSpeak using the API key and fields.

Libraries Required:

  • DHT Sensor Library: For DHT11/DHT22.
  • Adafruit BMP085 Library: For BMP180.
  • LiquidCrystal_I2C Library: For I2C LCD.
  • ESP8266WiFi Library: For Wi-Fi connectivity.

Calibration:

  • Anemometer: You may need to calibrate the wind speed calculation (windPulseCount * 0.34) based on your specific anemometer.
  • Rain Sensor: Adjust the sensitivity of the rain sensor using its onboard potentiometer.

Next Steps:

  1. Replace YOUR_WIFI_SSID, YOUR_WIFI_PASSWORD, and YOUR_THINGSPEAK_API_KEY with your actual credentials.
  2. Upload the code to your Arduino.
  3. Monitor the data on your LCD and ThingSpeak dashboard.

Features and Functionalities

  • Real-Time Monitoring: Displays temperature, humidity, and pressure on an LCD screen.
  • Cloud Integration: Sends data to ThingSpeak for remote monitoring.
  • Weather Forecasting: Uses pressure readings to predict weather changes.
  • Wireless Communication: ESP8266 enables IoT functionality.
  • Expandable: Additional sensors like a gas sensor, UV sensor, and GPS can be integrated.

Applications

  • Home Automation: Helps regulate indoor climate control.
  • Agriculture: Assists farmers in monitoring environmental conditions.
  • Disaster Management: Helps predict storms and rainfall intensity.
  • Educational Projects: Ideal for learning IoT and environmental monitoring.

Conclusion

Building a Smart Weather Station using Arduino is an exciting project that enhances our understanding of weather conditions while integrating IoT capabilities. By connecting sensors, displaying data, and transmitting it to the cloud, we create a fully functional and expandable weather monitoring system. With further enhancements, it can be transformed into a professional-grade weather station for various applications.

10 Exciting Arduino Projects for Beginners and Enthusiasts

Click here: https://iotbyhvm.ooo/10-exciting-arduino-projects-for-beginners-and-enthusiasts/

Harshvardhan Mishra

Hi, I'm Harshvardhan Mishra. Tech enthusiast and IT professional with a B.Tech in IT, PG Diploma in IoT from CDAC, and 6 years of industry experience. Founder of HVM Smart Solutions, blending technology for real-world solutions. As a passionate technical author, I simplify complex concepts for diverse audiences. Let's connect and explore the tech world together! If you want to help support me on my journey, consider sharing my articles, or Buy me a Coffee! Thank you for reading my blog! Happy learning! Linkedin

Leave a Reply

Your email address will not be published. Required fields are marked *