Arduino UNO R4 Wifi IOT Weather Station

I have the following things

DHT 22

Rain sensor

MQ 135

I want help creating a Weather Station with these

My code

#include <WiFiS3.h>
#include <Arduino_LED_Matrix.h>
#include <DHT.h>

// ------------------- WiFi Credentials -------------------
char ssid[] = "ssid";   // your WiFi SSID
char pass[] = "passwoerd";   // your WiFi password

// ------------------- Pins -------------------
#define DHT_SENSOR_PIN 2
#define MQ135_PIN A0
#define RAIN_SENSOR_PIN A1

// ------------------- Objects -------------------
DHT_Unified dht(2, DHT22);
WiFiServer server(80);
ArduinoLEDMatrix matrix;

// ------------------- Timing -------------------
unsigned long lastSensorUpdate = 0;
unsigned long lastWiFiCheck = 0;

// ------------------- Variables -------------------
float temperature = 0.0;
float humidity = 0.0;
int airQuality = 0;
int rainValue = 0;

// ------------------- Matrix Icons -------------------
const uint32_t no_wifi[] = {
  0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};
const uint32_t wifi_connected[] = {
  0x3C,0x42,0x81,0xA5,0x81,0x99,0x42,0x3C
};

// ------------------- Functions -------------------
void wifi_connect() {
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("WiFi module not detected!");
    matrix.loadFrame(no_wifi);
    while (true); // halt
  }

  Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);
  matrix.loadSequence(LEDMATRIX_ANIMATION_WIFI_SEARCH);
  matrix.play(true);

  while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }

  matrix.loadFrame(wifi_connected);
  Serial.println("\nConnected to WiFi!");

  // give DHCP some breathing room
  delay(2000);

  IPAddress ip = WiFi.localIP();
  Serial.print("DHCP IP Address: ");
  Serial.println(ip);

  // if still invalid, fallback to static IP
  if (ip == IPAddress(0, 0, 0, 0)) {
    Serial.println("⚠ DHCP failed. Assigning static IP...");
    IPAddress local_IP(192, 168, 1, 177);   // pick unused IP
    IPAddress gateway(192, 168, 1, 1);      // your router IP
    IPAddress subnet(255, 255, 255, 0);

    WiFi.config(local_IP, gateway, subnet);
    WiFi.begin(ssid, pass);

    delay(2000); // wait for connection again
    ip = WiFi.localIP();

    Serial.print("Static IP Address: ");
    Serial.println(ip);
  }

  server.begin();
}

void read_sensor_data() {
  sensors_event_t event;

  dht.temperature().getEvent(&event);
  if (!isnan(event.temperature)) {
    temperature = event.temperature;
  }

  dht.humidity().getEvent(&event);
  if (!isnan(event.relative_humidity)) {
    humidity = event.relative_humidity;
  }

  airQuality = analogRead(MQ135_PIN);
  rainValue = analogRead(RAIN_SENSOR_PIN);

  // Print to Serial Monitor
  Serial.println("---- Sensor Data ----");
  Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C");
  Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");
  Serial.print("Air Quality (MQ135): "); Serial.println(airQuality);
  Serial.print("Rain Sensor: "); Serial.println(rainValue);
  Serial.println("---------------------");
}

void run_local_webserver() {
  WiFiClient client = server.available();
  if (!client) return;

  while (!client.available()) delay(1);

  // simple HTTP response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<h1>Arduino UNO R4 Weather Station</h1>");
  client.print("<p>Temperature: "); client.print(temperature); client.println(" &deg;C</p>");
  client.print("<p>Humidity: "); client.print(humidity); client.println(" %</p>");
  client.print("<p>Air Quality (MQ135): "); client.print(airQuality); client.println("</p>");
  client.print("<p>Rain Sensor: "); client.print(rainValue); client.println("</p>");
  client.println("</html>");
}

// ------------------- Setup -------------------
void setup() {
  Serial.begin(115200);
  matrix.begin();
  dht.begin();

  wifi_connect();
}

// ------------------- Loop -------------------
void loop() {
  unsigned long currentMillis = millis();

  // Update sensors every 2s
  if (currentMillis - lastSensorUpdate >= 2000) {
    read_sensor_data();
    lastSensorUpdate = currentMillis;
  }

  // Check WiFi status every 10s
  if (currentMillis - lastWiFiCheck >= 10000) {
    if (WiFi.status() != WL_CONNECTED) {
      wifi_connect();
    }
    lastWiFiCheck = currentMillis;
  }

  // Handle client requests
  run_local_webserver();
}

start by testing each device in a separate program
when you know they work start building your weather station

do a web search for examples and libraries which support the devices, e.g. arduino-dht22

I mean they are working but i want a better code

Which is good

  • Arduino Cloud
  • Blynk
  • Local Webserver Creation
0 voters

Better in what respect, faster, uses less memory, easy to understand?

easy to understand fast