#include <WiFiS3.h>
#include <DHT.h>
#include <Wire.h>
#include <WiFi.h>
#include <PubSubClient.h>
// MQTT Broker Configuration
const char* ssid = "Tselhome-D3A6";
const char* password = "61198131";
const char* mqttServer = "broker.emqx.io";
const int mqttPort = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
#define DHTPIN 2
#define DHTTYPE DHT11
#define TRIGGER_PIN 3
#define ECHO_PIN 4
#define PHOTOCELL_PIN A0
#define RELAY_PIN 7
#define SOIL_PH_PIN A2
#define WATER_PH_PIN A3
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0;
const long interval = 5000; // Interval waktu untuk berganti tampilan (ms)
bool showTempHumid = true; // Flag untuk menentukan tampilan
void setup() {
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
dht.begin();
Serial.begin(9600);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Connect to MQTT broker
client.setServer(mqttServer, mqttPort);
client.setKeepAlive(60); // Atur keep alive menjadi 60 detik
reconnect();
}
void loop() {
checkWiFi();
if (!client.connected()) {
reconnect();
}
client.loop();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
float distance = getDistance();
int lightValue = analogRead(PHOTOCELL_PIN);
float soilPh = readSoilPH();
float waterPh = readWaterPH();
// Publish data to MQTT immediately
publishData(temperature, humidity, distance, lightValue, soilPh, waterPh);
// Control relay based on light intensity
if (lightValue > 500) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
// Print sensor values to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.print(" %, Distance: ");
Serial.print(distance);
Serial.print(" cm, Light: ");
Serial.print(lightValue);
Serial.print(" Soil pH: ");
Serial.print(soilPh);
Serial.print(" Water pH: ");
Serial.println(waterPh);
delay(200);
}
float getDistance() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
float distance = (duration * 0.034) / 2;
return distance;
}
float readSoilPH() {
int sensorValue = analogRead(SOIL_PH_PIN);
float outputValue = (-0.0139 * sensorValue) + 7.7851;
return outputValue;
}
float readWaterPH() {
int sensorValue = analogRead(WATER_PH_PIN);
float outputValue = (-0.0139 * sensorValue) + 7.7851;
return outputValue;
}
void publishData(float temperature, float humidity, float distance, int lightValue, float soilPh, float waterPh) {
if (client.connected()) {
Serial.println("Publishing data to MQTT...");
// sending data suhu to topic MQTT
String mqttTopicTemp = "temperature_data";
String payloadTemp = String(temperature);
if(client.publish(mqttTopicTemp.c_str(), payloadTemp.c_str())) {
Serial.println("Temperature data sent");
} else {
Serial.println("Failed to send temperature data");
}
// sending data humidity to topic MQTT
String mqttTopicHumid = "humidity_data";
String payloadHumid = String(humidity);
if(client.publish(mqttTopicHumid.c_str(), payloadHumid.c_str())) {
Serial.println("Humidity data sent");
} else {
Serial.println("Failed to send humidity data");
}
// sending data distance to topic MQTT
String mqttTopicDist = "distance_data";
String payloadDist = String(distance);
if(client.publish(mqttTopicDist.c_str(), payloadDist.c_str())) {
Serial.println("Distance data sent");
} else {
Serial.println("Failed to send distance data");
}
// sending data light intensity to topic MQTT
String mqttTopicLight = "light_intensity_data";
String payloadLight = String(lightValue);
if(client.publish(mqttTopicLight.c_str(), payloadLight.c_str())) {
Serial.println("Light intensity data sent");
} else {
Serial.println("Failed to send light intensity data");
}
// sending data soil pH to topic MQTT
String mqttTopicSoilPh = "soil_ph_data";
String payloadSoilPh = String(soilPh);
if(client.publish(mqttTopicSoilPh.c_str(), payloadSoilPh.c_str())) {
Serial.println("Soil pH data sent");
} else {
Serial.println("Failed to send soil pH data");
}
// sending data water pH to topic MQTT
String mqttTopicWaterPh = "water_ph_data";
String payloadWaterPh = String(waterPh);
if(client.publish(mqttTopicWaterPh.c_str(), payloadWaterPh.c_str())) {
Serial.println("Water pH data sent");
} else {
Serial.println("Failed to send water pH data");
}
} else {
Serial.println("Client not connected to MQTT broker");
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 1 second...");
// Wait 1 second before retrying
delay(1000);
checkWiFi();
}
}
}
void checkWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Reconnecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Reconnected to WiFi");
}
}Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1