/*
NEVEDIT 15 Dec 2023, 23:47
1. Added max and min as requested
2. added header to csv file
3. writing max and min to:
a. csv
b. serial
c. lcd
4. wokwi simulation link:
https://wokwi.com/projects/384217239675179009
*/
#include <Wire.h>
#include <TimeLib.h>
#include <RTClib.h> // for the RTC
#include <SimpleDHT.h>
#include <SD.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#include <SoftwareSerial.h>
SoftwareSerial sim800l(9, 10); // RX,TX for Arduino and for the module it's TXD RXD, they should be inverted
// RTC
//RTC_DS3231 rtc;
RTC_DS1307 rtc; //for wokwi simulation
//sdcard
File myFile;
int pinCS = 8; // Pin 10 on Arduino Uno
unsigned long msecLst;
int count;
//int timeValue = (1000*60*60*24);
#define myTime 300000// sending text message time delay 240000
int pinDHT11 = 2;
SimpleDHT11 dht11(pinDHT11);
byte temperature = 0;
byte maxTemperature, minTemperature;
byte humidity = 0;
byte maxHumidity, minHumidity;
//Photodiode
int radiationPin = A1;
float radiationValue = 0.0;
float maximumRadiation = 0.0;
float minRadiation = 0.0;
float radiation = 0.0;
#define echoPin 3 // attach pin1 D3 Arduino to pin Echo of HC-SR04
#define trigPin 4 //attach pin D4 Arduino to pin Trig of HC-SR04
// defines variables
long duration; // variable for the duration of sound wave travel
int distance; // variable for the distance measurement
int newDistance;
int distanceprim;
float maxDepth = 150;
float volume;
float rainfall;
float maxRainfall;
float minRainfall;
float Height;
//float m = 0.1726;
float m = 0.17;
float c = -12;
float radiation_percentage;
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
pinMode(radiationPin, INPUT);
lcd.init();// initialize the lcd
lcd.backlight();
lcd.print("Initializing...");
delay(2000);
lcd.clear();
// setup for the RTC
//while (!Serial); // for Leonardo/Micro/Zero
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
// //lcd.print("no RTC found"); // <-- not enough memory.
// //while (1);
}
else {
// // following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime now = rtc.now();
Serial.println(now.minute());
// char buf[20];
// sprintf(buf, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());
// Serial.println(buf);
// // }
// // if (! rtc.isrunning()) {
// //Serial.println("RTC is NOT running!");
}
// SD Card Initialization
if (SD.begin())
{
Serial.println("SD card is ready to use.");
//Create file
myFile = SD.open("file.csv", FILE_WRITE);
// print the header for the csv file:
//"Y/M/D H:mm:ss,rainfall, maxRainfall, minRainfall, humidity, maxHumidity, minHumidity, temperature, MaxTemperature, minTemperature, radiation, maxRadiation, minRadiation"
if (myFile){
myFile.println("Datetime,rainfall, maxRainfall, minRainfall, humidity, maxHumidity, minHumidity, temperature, MaxTemperature, minTemperature, radiation, maxRadiation, minRadiation");
myFile.close();
Serial.println("File Successfully Created");
}
}
else
{
Serial.println("SD card initialization failed");
return;
}
}
//void(*resetFunc)(void) = 0;
void loop() {
DateTime now = rtc.now();
DisplayDateAndTime();
getDHT11();
getWaterLevel();
solarRadiation();
WritingToFile();
lcdDisplay();
unsigned long msec = millis();
if ((msec - msecLst) > myTime) {
Serial.print("COUNT VALUE: ");
Serial.println(msecLst);
SendSMS();
msecLst = msec;
}
//
// delay(500);
}
/////////////////////////////////////////////////DHT CODE//////////////////////////////////////////////////////////////////
void getDHT11() {
// read without samples.
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
// Serial.print("Read DHT failed, err="); Serial.print(SimpleDHTErrCode(err));
// Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000);
return;
}
else {
//also get max and min values
if (humidity > maxHumidity) maxHumidity = humidity;
if (minHumidity > humidity) minHumidity = humidity;
if (temperature > maxTemperature) maxTemperature = temperature;
if (minTemperature > temperature) minTemperature = temperature;
}
}
/////////////////////////////////////////////////DHT CODE//////////////////////////////////////////////////////////////////
void getWaterLevel() {
// Clears the trigPin condition
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin HIGH (ACTIVE) for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back)
// Displays the distance on the Serial Monitor
distance = distance * 10;
//Serial.print("Distance"); //from sensor to boundary
//Serial.println(distance);
//Serial.print(distance);
if (distance > maxDepth) {
maxDepth = distance ;
}
newDistance = maxDepth - distance ;//height of water
Height = (newDistance * m) + c; // where y = mx + c
// volume = 26000.2 * Height;
rainfall = distance;
rainfall = map(rainfall, 0 , maxDepth , maxDepth , 0);
if (rainfall < 0.0) {
rainfall = 0;
}
if (rainfall > 130) {
rainfall = 130;
// resetFunc();
}
//get maximum and minimum rainfall
if (rainfall > maxRainfall) maxRainfall = rainfall;
if (minRainfall > rainfall) minRainfall = rainfall;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////268.802521423
void solarRadiation() {
radiationValue = analogRead(radiationPin);
radiationValue = (radiationValue / 1024.0) * 5.0;
radiation = ((radiationValue * 85.07 )+ 79.54);
//get max and min radiation
if (radiation > maximumRadiation) maximumRadiation = radiation;
if (minRadiation > radiation) minRadiation = radiation;
// Serial.println("Radiation: ");
// Serial.println(radiation);
// Serial.print("w/msq");
delay(1000);
Serial.println();
}
void DisplayDateAndTime() {
DateTime now = rtc.now();
}
void WritingToFile() {
getDHT11();
// getWaterLevel();
DateTime now = rtc.now();
// Create/Open file
myFile = SD.open("file.csv", FILE_WRITE);
//need to print the header for the csv file:
//"Y/M/D H:mm:ss,rainfall, maxRainfall, minRainfall, humidity, maxHumidity, minHumidity, temperature, MaxTemperature, minTemperature, radiation, maxRadiation, minRadiation"
// if the file opened okay, write to it:
if (myFile) {
getWaterLevel();
// Write to file
DateTime now = rtc.now();
myFile.print(now.year(), DEC);
myFile.print('/');
myFile.print(now.month(), DEC);
myFile.print('/');
myFile.print(now.day(), DEC);
myFile.print(" ");
myFile.print(now.hour(), DEC);
myFile.print(':');
myFile.print(now.minute(), DEC);
myFile.print(':');
myFile.print(now.second(), DEC);
myFile.print(",");
myFile.print(rainfall);
myFile.print(",");
myFile.print(maxRainfall);
myFile.print(",");
myFile.print(minRainfall);
myFile.print(",");
myFile.print(humidity);
myFile.print(",");
myFile.print(maxHumidity);
myFile.print(",");
myFile.print(minHumidity);
myFile.print(",");
myFile.print(temperature);
myFile.print(",");
myFile.print(maxTemperature);
myFile.print(",");
myFile.print(minTemperature);
myFile.print(",");
myFile.print(radiation);
myFile.print(",");
myFile.print(maximumRadiation);
myFile.print(",");
myFile.print(minRadiation);
myFile.println();
myFile.close(); // close the file
// DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
//Serial.print(" Distance: ");
// Serial.print(distance);
Serial.print(" Rainfall: ");
Serial.print(rainfall);
Serial.print(" mm");
Serial.print(" Max Rainfall: ");
Serial.print(maxRainfall);
Serial.print(" mm");
Serial.print(" Min Rainfall: ");
Serial.print(minRainfall);
Serial.print(" mm");
Serial.println();
Serial.print(" Humidity: ");
Serial.print(humidity);
Serial.print(" %");
Serial.print(" Max Humidity: ");
Serial.print(maxHumidity);
Serial.print(" %");
Serial.print(" Min Humidity: ");
Serial.print(minHumidity);
Serial.print(" %");
Serial.println();
Serial.print(" Temperature: ");
Serial.print(temperature);
Serial.print(" Degrees C");
Serial.print(" Max Temperature: ");
Serial.print(maxTemperature);
Serial.print(" Degrees C");
Serial.print(" Min Temperature: ");
Serial.print(minTemperature);
Serial.print(" Degrees C");
Serial.println();
Serial.print(" Radiation: ");
Serial.print(radiation);
Serial.print(" Watt/msq");
Serial.println();
Serial.print(" Max Radiation: ");
Serial.print(maximumRadiation);
Serial.print(" Watt/msq");
Serial.println();
Serial.print(" Min Radiation: ");
Serial.print(minRadiation);
Serial.print(" Watt/msq");
Serial.println();
delay(1000);
}
// if the file didn't open, print an error:
else {
Serial.println("error opening file.csv");
}
}
void SendSMS()
{
getDHT11();
sim800l.begin(9600); //Module baude rate, this is on max, it depends on the version
Serial.println("Sending SMS..."); //Show this message on serial monitor
sim800l.print("AT+CMGF=1\r"); //Set the module to SMS mode
delay(100);
sim800l.print("AT+CMGS=\"+263776384952\"\r"); //Your phone number don't forget to include your country code, example +263784430024
delay(500);
sim800l.println("Weather Conditions:");//This is the text to send to the phone number, don't make it too long or you have to modify the SoftwareSerial buffer
DateTime now = rtc.now();
sim800l.print(now.year(), DEC);
sim800l.print('/');
sim800l.print(now.month(), DEC);
sim800l.print('/');
sim800l.print(now.day(), DEC);
sim800l.print(" ");
sim800l.print(now.hour(), DEC);
sim800l.print(':');
sim800l.print(now.minute(), DEC);
sim800l.print(':');
//sim800l.print(now.second(), DEC);
sim800l.println(" ");
sim800l.print("Temperature: ");
sim800l.print(temperature);
sim800l.println(" Degrees C");
sim800l.print("Humidity: ");
sim800l.print(humidity);
sim800l.println(" %");
sim800l.print("");
sim800l.print("Rainfall: ");
sim800l.print(rainfall);
sim800l.println(" mm");
sim800l.print(" ");
sim800l.print("Radiation: ");
sim800l.print(radiation);
sim800l.println(" Watt/msq");
sim800l.print(" ");
sim800l.print((char)26);// (required according to the datasheet)
delay(500);
sim800l.println();
Serial.println("Text Sent.");
delay(500);
}
void lcdDisplay() {
getDHT11();
getWaterLevel();
solarRadiation();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(10, 0);
lcd.print(temperature);
lcd.print((char)223); //degree symbol
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Max Temp:");
lcd.setCursor(10, 1);
lcd.print(maxTemperature);
lcd.print((char)223); //degree symbol
lcd.print("C");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity:");
lcd.setCursor(10, 0);
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("Max:");
lcd.setCursor(10, 1);
lcd.print(maxHumidity);
lcd.print(" %");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Rainfall:");
lcd.setCursor(10, 0);
lcd.print(rainfall);
lcd.print("mm");
lcd.setCursor(0, 1);
lcd.print("Max:");
lcd.setCursor(10, 1);
lcd.print(maxRainfall);
lcd.print("mm");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Radiation:");
lcd.setCursor(10, 0);
lcd.print (radiation);
lcd.print(" W/m2");
lcd.setCursor(0, 1);
lcd.print("Max:");
lcd.setCursor(10, 1);
lcd.print (maximumRadiation);
lcd.print(" W/m2");
delay(2000);
}