//This is cloth dry assistant
//Gives details about temperature, Humidity, Estimated cloth drying time based the humidity level.
//send notification to our mobile when its about to rain based on humidity level.(if its above 95%)
//In built function to switch on dryer when the humidity level is above the ideal level.
//Including the required libraries
#include <WiFi.h>
#include <DHT.h>
#include <Servo.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
//Uploading the Adafruit credentials
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "Subi_7" //your username
#define AIO_KEY "aio_dcLZ42uPJScT29nIqWYqEZ72xQ3m" //your AIO key
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
//setting up MQTT publish to send data to required feed in adafruit
Adafruit_MQTT_Publish send = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/rainfall_alert");//feed name
//Setting up DHT
#define DHTPIN 22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//Servo setup
int servoPin = 20;
Servo myServo;
//constant values
const float evaporationRate = 0.1; // Evaporation rate in percent per minute
const float idealHumidity = 50.0; // Ideal humidity for drying clothes in percentage
const float idealdrytime = 60.0;
float dryingTime;
void setup() {
Serial1.begin(115200);
dht.begin();
myServo.attach(servoPin);
myServo.write(0);
Serial1.print("Connecting to WiFi\n");//code to connect to wifi
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial1.print(".");
}
Serial1.print("Connected to WiFi\n");
}
// To connect to adafruit to upload the values.
void connect() {
Serial1.print(F("Connecting to Adafruit IO... "));
int8_t ret;
while ((ret = mqtt.connect()) != 0) {
switch (ret) {
case 1: Serial1.println(F("Wrong protocol")); break;
case 2: Serial1.println(F("ID rejected")); break;
case 3: Serial1.println(F("Server unavail")); break;
case 4: Serial1.println(F("Bad user/pass")); break;
case 5: Serial1.println(F("Not authed")); break;
case 6: Serial1.println(F("Failed to subscribe")); break;
default: Serial1.println(F("Connection failed")); break;
}
if(ret >= 0)
mqtt.disconnect();
Serial1.println(F("Retrying connection..."));
delay(10000);
}
Serial1.println(F("Adafruit IO Connected!"));
}
void loop() {
if(! mqtt.ping(3)) {
// reconnect to adafruit io
if(! mqtt.connected())
connect();
}
//Reading the DHT values
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// Displaying values to the console
Serial1.print("Temperature: ");
Serial1.print(temp);
Serial1.println("°C");
Serial1.print("Humidity: ");
Serial1.print(hum);
Serial1.println("%");
// Calculate drying time based on temperature and humidity readings
float humidityDifference = hum - idealHumidity;
if(hum>idealHumidity){
dryingTime = (humidityDifference * evaporationRate)+idealdrytime; //calculating the dry time.
}
if(hum<=idealHumidity){
dryingTime = idealdrytime;
}
//Printing the Estimated dry time in console
Serial1.print("Estimated Drying Time: ");
Serial1.print(dryingTime);
Serial1.println(" mins.");
if (!send.publish(static_cast<int32_t>(hum))) { //function to send data to adafruit //Publish to Adafruit
Serial1.println(F("Failed"));
}else {
Serial1.println(F("Sent!"));
}
if(hum>idealHumidity){
for(int i=0;i<=10;i++){
myServo.write(0);
delay(100);
myServo.write(180);
delay(100);
}
}
delay(1000);
}