/*IOT Project Design and Development
by Phyo Wai Lwin and Hasan AL*/
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define heater 19
#define yellow_led 18
#define green_led 5
#define cooler 4
const int DHT_PIN = 15;
float setpoint = 0;
float porcent_1 = 10;
bool command = false;
const char* ssid = "Wokwi-GUEST"; // Given by Wokwi
const char* password = ""; // no password
const char* hostname = "broker.hivemq.com"; // MQTT broker address that we are connecting
// Initializes the espClient
WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "5335064G_Hasan Al";
int PORTNUM = 1883;
/* DHT Sensor */
// Create a DHTesp object
DHTesp dhtSensor;
/* LCD */
// Create a LiquidCrystal_I2C object
LiquidCrystal_I2C LCD(0x27, 16, 2);
/***********************************************************************************
FUNCTION DECLARATIONS
***********************************************************************************/
void setup_wifi();
void connectMQTT();
void MQTTSubscribe();
void setup_MQTT();
void setup()
{
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(heater, OUTPUT);
pinMode(yellow_led, OUTPUT);
pinMode(green_led, OUTPUT);
pinMode(cooler, OUTPUT);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Temperature");
LCD.setCursor(0, 1);
LCD.print("System Control");
delay(2000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Enter a value");
LCD.setCursor(0, 1);
LCD.print("Between 0 to 100");
setup_wifi();
setup_MQTT();
}
void loop()
{
if (!client.connected())
{
connectMQTT();
}
client.loop();
if (Serial.available() > 0)
{
float receivedValue = Serial.parseFloat(); // Read the incoming data as a float
if (receivedValue > 0 && receivedValue < 100)
{
setpoint = receivedValue;
receivedValue = 0;
command = true;
}
}
if (command == true)
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
bool greenState = false;
bool yellowState = false;
float lowerLimit = setpoint - (setpoint * (porcent_1 / 100));
float upperLimit = setpoint + (setpoint * (porcent_1 / 100));
if (data.temperature > lowerLimit && data.temperature < upperLimit)
{
greenState = true;
digitalWrite(green_led, HIGH);
digitalWrite(yellow_led, LOW);
digitalWrite(heater, LOW);
digitalWrite(cooler, LOW);
client.publish("Hasan Al/room/sensors/temperature", "OK");
}
else if (data.temperature < lowerLimit)
{
yellowState = true;
digitalWrite(yellow_led, HIGH);
digitalWrite(heater, HIGH);
digitalWrite(green_led, LOW);
digitalWrite(cooler, LOW);
client.publish("Hasan Al/room/sensors/temperature", "LOW");
}
else if (data.temperature > upperLimit)
{
yellowState = true;
digitalWrite(yellow_led, HIGH);
digitalWrite(cooler, HIGH);
digitalWrite(green_led, LOW);
digitalWrite(heater, LOW);
client.publish("Hasan Al/room/sensors/temperature", "HIGH");
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Setpoint: ");
LCD.setCursor(10, 0);
LCD.print(setpoint);
LCD.setCursor(0, 1);
LCD.print("Temp:");
LCD.setCursor(10, 1);
LCD.print(data.temperature);
delay(2000);
}
}
// Setup WiFi
void setup_wifi()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// Connect to MQTT
void connectMQTT()
{
while (!client.connected())
{
Serial.println("Connecting to MQTT...");
if (client.connect(espClientName))
{
Serial.println("Connected to MQTT broker");
MQTTSubscribe();
} else {
Serial.print("Failed with state ");
Serial.println(client.state());
delay(2000);
}
}
}
// Subscribe to MQTT topics
void MQTTSubscribe()
{
client.subscribe("Hasan Al/room/LED"); // Example topic
}
// Setup MQTT client
void setup_MQTT()
{
client.setServer(hostname, PORTNUM);
}