#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define DHTPIN 4 // Pin sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT22
#define MQ135PIN 34 // Pin sensor MQ135
#define BUZZER_PIN 3 // Pin Buzzer
// Definisi pin untuk TFT
#define TFT_CS 15
#define TFT_DC 4
#define TFT_RST 2 // Pin reset, jika tersedia
#define TFT_MOSI 23
#define TFT_SCLK 18
DHT dht(DHTPIN, DHTTYPE);
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK);
// Pengaturan WiFi dan MQTT
const char* ssid = "NamaSSIDAnda";
const char* password = "PasswordWiFiAnda";
const char* mqtt_server = "test.mosquitto.org"; // Verify that this MQTT server is accessible and correct
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
// Topik MQTT
const char* topic_temperature = "/sensor/data/temperature";
const char* topic_humidity = "/sensor/data/humidity";
const char* topic_air_quality = "/sensor/data/air_quality";
const char* topic_command = "/sic/command/mqtt";
unsigned long lastMsg = 0;
unsigned long lastBuzzer = 0;
void setup_wifi();
void callback(char* topic, byte* payload, unsigned int length);
void reconnect();
void publishData(const char* topic, float value, int precision);
void displayData(float temperature, float humidity, int air_quality);
// void controlBuzzer(int air_quality); // Uncomment if you want to use the buzzer
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
tft.begin();
tft.setRotation(1); // Sesuaikan rotasi layar jika perlu
tft.fillScreen(ILI9341_BLACK); // Bersihkan layar
// Simple test to verify the TFT display is working
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Hello, World!");
dht.begin();
// Give the DHT sensor some time to stabilize after startup
delay(2000);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - lastMsg >= 2000) {
lastMsg = currentMillis;
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int air_quality = analogRead(MQ135PIN); // Ganti dengan perhitungan AQI Anda
// Check for DHT errors
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT sensor error!");
return;
}
publishData(topic_temperature, temperature, 1);
publishData(topic_humidity, humidity, 1);
publishData(topic_air_quality, air_quality, 1);
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Air Quality: ");
Serial.println(air_quality);
displayData(temperature, humidity, air_quality);
// controlBuzzer(air_quality); // Uncomment if you want to use the buzzer
}
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1') {
digitalWrite(BUZZER_PIN, LOW);
} else {
digitalWrite(BUZZER_PIN, HIGH);
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.publish("/sic/mqtt", "Hello from ESP32");
client.subscribe(topic_command);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void publishData(const char* topic, float value, int precision) {
char message[10];
dtostrf(value, 4, precision, message);
client.publish(topic, message);
}
void displayData(float temperature, float humidity, int air_quality) {
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Sensor Data:");
tft.setTextSize(3);
tft.setCursor(10, 40);
tft.print("Temp: ");
tft.print(temperature);
tft.println(" C");
tft.setCursor(10, 80);
tft.print("Humidity: ");
tft.print(humidity);
tft.println(" %");
tft.setCursor(10, 120);
tft.print("Air Quality: ");
tft.println(air_quality);
}