thanks sonofcy for your quick response. sorry i will do it now. Am also new in this of posting in a forum.
this is the code that actually works. this is without the RF module
#include <SPI.h>
#include <SD.h>
#include <RTClib.h>
#include <DHT.h>
#include <Adafruit_BMP085.h>
#include <BH1750.h>
// Sensor Pins
#define DHTPIN 7
#define DHTTYPE DHT11
#define UV_PIN A0
#define RAIN_PIN 3 // Reed switch input
#define WIND_PIN 2 // Hall effect sensor input
#define SD_CS_PIN 10
#define MQ135_PIN A1
// Rainfall and Wind Constants
#define RAIN_MM_PER_TICK 0.2
#define WIND_SPEED_FACTOR 2.4 // km/h per rotation/sec
// Sensor Objects
RTC_DS3231 rtc;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
BH1750 lightMeter;
// Rain & Wind Variables
volatile unsigned int rainTicks = 0;
volatile unsigned int windTicks = 0;
unsigned long lastWindCalc = 0;
float windSpeedKmh = 0.0;
float rainfallMm = 0.0;
File dataFile;
void countRain() {
rainTicks++;
}
void countWind() {
windTicks++;
}
void setup() {
Serial.begin(9600);
// Sensor Setup
dht.begin();
if (!bmp.begin()) {
Serial.println("BMP180 not found!");
//while (1);
}
lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
// RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
//while (1);
}
//if (rtc.lostPower()) {
//rtc.adjust(DateTime(F(DATE), F(TIME)));
//}
// Rain and Wind
pinMode(RAIN_PIN, INPUT_PULLUP);
pinMode(WIND_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RAIN_PIN), countRain, FALLING);
attachInterrupt(digitalPinToInterrupt(WIND_PIN), countWind, FALLING);
// SD Card
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD init failed!");
//while (1);
}
if (!SD.exists("weather.csv")) {
dataFile = SD.open("weather.csv", FILE_WRITE);
dataFile.println("Timestamp,Temp_C_DHT,Humid_%,Temp_C_BMP,Pressure_hPa,UV,Light_lux,Rain_mm,Wind_kmh,MQ135_PPM");
dataFile.close();
}
lastWindCalc = millis();
}
void loop() {
DateTime now = rtc.now();
float tempDHT = dht.readTemperature();
float humid = dht.readHumidity();
float tempBMP = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0;
float lux = lightMeter.readLightLevel();
float uvRaw = analogRead(UV_PIN);
float uvIndex = (uvRaw / 1023.0) * 15.0;
// Wind Speed Calculation (every 2 seconds)
if (millis() - lastWindCalc >= 2000) {
noInterrupts();
unsigned int ticks = windTicks;
windTicks = 0;
interrupts();
float rps = ticks / 2.0;
windSpeedKmh = rps * WIND_SPEED_FACTOR;
lastWindCalc = millis();
}
// Rain Calculation
noInterrupts();
unsigned int rainCount = rainTicks;
rainTicks = 0;
interrupts();
rainfallMm = rainCount * RAIN_MM_PER_TICK;
// Timestamp
char timestamp[20];
sprintf(timestamp, "%04d-%02d-%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(),
now.hour(), now.minute(), now.second());
//MQ135 calculations
int mq135_raw = analogRead(MQ135_PIN);
// Optional: convert to approximate CO2 PPM using calibration (very approximate)
float mq135_ppm = (mq135_raw / 1023.0) * 1000.0; // simple linear approximation
// Serial Output
Serial.print("Time: "); Serial.println(timestamp);
Serial.print("Temp DHT: "); Serial.println(tempDHT);
Serial.print("Humid: "); Serial.println(humid);
Serial.print("Temp BMP: "); Serial.println(tempBMP);
Serial.print("Pressure: "); Serial.println(pressure);
Serial.print("UV: "); Serial.println(uvIndex);
Serial.print("Light: "); Serial.println(lux);
Serial.print("Rain (mm): "); Serial.println(rainfallMm);
Serial.print("Wind (km/h): "); Serial.println(windSpeedKmh);
Serial.print("Air Quality: "); Serial.println(mq135_ppm);
Serial.println("-----------------------------");
// Write to SD Card
dataFile = SD.open("weather.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(timestamp); dataFile.print(",");
dataFile.print(tempDHT); dataFile.print(",");
dataFile.print(humid); dataFile.print(",");
dataFile.print(tempBMP); dataFile.print(",");
dataFile.print(pressure); dataFile.print(",");
dataFile.print(uvIndex); dataFile.print(",");
dataFile.print(lux); dataFile.print(",");
dataFile.print(rainfallMm); dataFile.print(",");
dataFile.println(windSpeedKmh);
dataFile.print(",");
dataFile.println(mq135_ppm);
dataFile.close();
} else {
Serial.println("SD write failed");
}
delay(10000); // Log every 10 seconds
}
An screenshot of the serial showing the data
this is the code with the RF module code already included.
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <RTClib.h>
#include <DHT.h>
#include <Adafruit_BMP085.h>
#include <BH1750.h>
#include <RH_ASK.h>
//#include <avr/wdt.h> // Optional: watchdog
//#include <EEPROM.h>
// Set custom RX pin (IO27)
#define RF_TRASMITTER_PIN 6
// Create the RF driver instance using custom RX pin
RH_ASK rf_driver(2000, -1, RF_TRASMITTER_PIN, -1);
// Parameters: speed, rxPin, txPin, pttPin
//RH_ASK rf_driver;
// Sensor Pins
#define DHTPIN 7
#define DHTTYPE DHT11
#define UV_PIN A0
#define RAIN_PIN 3
#define WIND_PIN 2
#define SD_CS_PIN 10
#define MQ135_PIN A1
// Rain and Wind Constants
#define RAIN_MM_PER_TICK 0.2
#define WIND_SPEED_FACTOR 2.4
// Sensor Objects
RTC_DS3231 rtc;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
BH1750 lightMeter;
// Rain & Wind Variables
volatile unsigned int rainTicks = 0;
volatile unsigned int windTicks = 0;
volatile unsigned long lastRainTime = 0;
volatile unsigned long lastWindTime = 0;
unsigned long lastWindCalc = 0;
float windSpeedKmh = 0.0;
float rainfallMm = 0.0;
File dataFile;
void countRain() {
if (millis() - lastRainTime > 10) {
rainTicks++;
lastRainTime = millis();
}
}
void countWind() {
if (millis() - lastWindTime > 10) {
windTicks++;
lastWindTime = millis();
}
}
void setup() {
Serial.begin(9600);
rf_driver.init();
dht.begin();
if (!bmp.begin()) Serial.println("BMP180 not found!");
lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
if (!rtc.begin()) Serial.println("Couldn't find RTC");
pinMode(RAIN_PIN, INPUT_PULLUP);
pinMode(WIND_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RAIN_PIN), countRain, FALLING);
attachInterrupt(digitalPinToInterrupt(WIND_PIN), countWind, FALLING);
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD init failed!");
//while (1);
}
if (!SD.exists("weather.csv")) {
dataFile = SD.open("weather.csv", FILE_WRITE);
dataFile.println("Timestamp,Temp_C_DHT,Humid_%,Temp_C_BMP,Pressure_hPa,UV,Light_lux,Rain_mm,Wind_kmh,MQ135_PPM");
dataFile.close();
}
lastWindCalc = millis();
}
void loop() {
DateTime now = rtc.now();
float tempDHT = dht.readTemperature();
float humid = dht.readHumidity();
float tempBMP = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0;
float lux = lightMeter.readLightLevel();
float uvRaw = analogRead(UV_PIN);
float uvIndex = (uvRaw / 1023.0) * 15.0;
if (millis() - lastWindCalc >= 2000) {
noInterrupts();
unsigned int ticks = windTicks;
windTicks = 0;
interrupts();
float rps = ticks / 2.0;
windSpeedKmh = rps * WIND_SPEED_FACTOR;
lastWindCalc = millis();
}
noInterrupts();
unsigned int rainCount = rainTicks;
rainTicks = 0;
interrupts();
rainfallMm = rainCount * RAIN_MM_PER_TICK;
char timestamp[20];
sprintf(timestamp, "%04d-%02d-%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(),
now.hour(), now.minute(), now.second());
int mq135_raw = analogRead(MQ135_PIN);
float mq135_ppm = (mq135_raw / 1023.0) * 1000.0;
// Serial Output
Serial.println("Timestamp: " + String(timestamp));
Serial.println("Temp DHT: " + String(tempDHT) + " °C");
Serial.println("Humidity: " + String(humid) + " %");
Serial.println("Temp BMP: " + String(tempBMP) + " °C");
Serial.println("Pressure: " + String(pressure) + " hPa");
Serial.println("UV Index: " + String(uvIndex));
Serial.println("Light: " + String(lux) + " lux");
Serial.println("Rainfall: " + String(rainfallMm) + " mm");
Serial.println("Wind: " + String(windSpeedKmh) + " km/h");
Serial.println("Air Quality (approx): " + String(mq135_ppm) + " ppm");
Serial.println("-----------------------------");
// Write to SD card
dataFile = SD.open("weather.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(timestamp); dataFile.print(",");
dataFile.print(tempDHT); dataFile.print(",");
dataFile.print(humid); dataFile.print(",");
dataFile.print(tempBMP); dataFile.print(",");
dataFile.print(pressure); dataFile.print(",");
dataFile.print(uvIndex); dataFile.print(",");
dataFile.print(lux); dataFile.print(",");
dataFile.print(rainfallMm); dataFile.print(",");
dataFile.print(windSpeedKmh);
dataFile.print(",");
dataFile.println(mq135_ppm);
dataFile.close();
} else {
Serial.println("SD write failed");
}
// Create CSV packet and send via RF
String packet = String(timestamp) + "," +
String(tempDHT, 1) + "," +
String(humid, 1) + "," +
String(tempBMP, 1) + "," +
String(pressure, 1) + "," +
String(uvIndex, 1) + "," +
String(lux, 1) + "," +
String(rainfallMm, 2) + "," +
String(windSpeedKmh, 2) + "," +
String(mq135_ppm, 1);
char msg[128];
packet.toCharArray(msg, sizeof(msg));
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(10000); // Send every 10 seconds
}
This the serial output for this code

