#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "Adafruit_MPU6050.h"
#include "Adafruit_Sensor.h"
#include "ThingSpeak.h"
#include <HTTPClient.h>
// Pin Definitions
#define DHT_PIN 15
#define LED_PIN 33
#define LDR_PIN 35
#define RELAY_PIN 18
#define TRIG_PIN 5
#define ECHO_PIN 18
// Constants
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
// WiFi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak Settings
const int myChannelNumber = 2316429;
const char* myApiKey = "5N2SPHOB5AEX1IKU";
// Sensor and Display Initializations
DHT dht(DHT_PIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MPU6050 mpu;
WiFiClient client;
// Function Prototypes
void connectToWiFi();
void sendDataToThingSpeak(float temperature, float humidity);
void sendDataToServer(float soilMoisture, float lux, float temperature, float humidity);
float readSoilMoisture();
float readLightIntensity();
float readDistance();
void setup() {
Serial.begin(9600);
connectToWiFi();
dht.begin();
lcd.init();
lcd.backlight();
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
ThingSpeak.begin(client);
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1);
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
float soilMoisture = readSoilMoisture();
float lightIntensity = readLightIntensity();
float distance = readDistance();
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Update ThingSpeak
sendDataToThingSpeak(temperature, humidity);
// Update custom server
sendDataToServer(soilMoisture, lightIntensity, temperature, humidity);
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Soil: ");
lcd.print(soilMoisture);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("Light: ");
lcd.print(lightIntensity);
lcd.print(" Lux");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(2000); // Delay for readability
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
}
float readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distanceCm = duration * SOUND_SPEED / 2;
return distanceCm;
}
void sendDataToThingSpeak(float temperature, float humidity) {
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
if (ThingSpeak.writeFields(myChannelNumber, myApiKey) != 200) {
Serial.println("Error sending data to ThingSpeak");
} else {
Serial.println("ThingSpeak update successful");
}
}
void sendDataToServer(float soilMoisture, float lux, float temperature, float humidity) {
HTTPClient http;
http.begin("http://172.111.138.132:8000/post"); // Replace with your server's URL
http.addHeader("Content-Type", "application/json");
String httpRequestData = "{\"soil_moisture\": " + String(soilMoisture)
+ ", \"lux\": " + String(lux)
+ ", \"temperature\": " + String(temperature)
+ ", \"humidity\": " + String(humidity) + "}";
int httpResponseCode = http.POST(httpRequestData);
if (httpResponseCode == HTTP_CODE_OK) {
Serial.println("Data sent successfully");
} else {
Serial.print("Error sending data: ");
Serial.println(httpResponseCode);
Serial.println(http.getString()); // Print server response
}
http.end();
}
float readSoilMoisture() {
int sensorValue = analogRead(34); // Assuming the soil moisture sensor is connected to pin 34
return map(sensorValue, 0, 4095, 100, 0); // Mapping the value to a percentage
}
float readLightIntensity() {
int sensorValue = analogRead(35); // Assuming the LDR is connected to pin 35
float voltage = sensorValue * (5.0 / 4095.0); // Converting to voltage
float resistance = (5.0 - voltage) * 10000 / voltage; // Calculating resistance
return 500 / resistance; // Converting resistance to Lux (example calculation)
}