Introduction: Smart Thermostat

Kelompok Tugas Rancang IoT and Application SENTIRE

  • Devin Hartanto - 2501995010
  • Kevin Juan - 2540118183
  • Leonard Edmund Kent - 2540128695

Sampe hari ini, perubahan cuaca telah menjadi bagian dari hidup kita. Perubahan cuaca dapat menyembabkan perubahan kondisi pada suatu ruangun.

  • Suhu ruangan dan kelembaban yang tinggi.
  • Tidak ada alat yang bisa membantu mengatur keseimbangan suhu dan kelembaban ruangan.
  • Tidak ada cara yang efisien untuk memulihkan suhu ruangan dan kelembaban saat kita tidak ada di ruangan tersebut.

Sekarang kita sudah memasuki era digital, dengan banyaknya solusi dari masalah tersebut. Salah satunya adalah benda yang dibuat kelompok kita yaitu "Smart Thermostat", benda ini adalah termostat pintar yang terhubung ke jaringan internet dan dapat dikendalikan secara jarak jauh melalui aplikasi smartphone. Smart thermostat ini juga dilengkapi dengan sensor suhu dan kelembapan yang dapat mendeteksi kondisi lingkungan dalam ruangan dan memperbarui pengaturan suhu secara otomatis agar sesuai dengan preferensi pengguna.

Supplies

Berikut adalah Komponen yang kami gunakan:

Bahan

  • DHT22
  • ESP-32 DOiT
  • Layar OLed 0.96 inch
  • Relay

Alat

  • Case
  • PCB
  • Wiring Kit
  • Solder & Timah
  • Bor
  • Grinda

Perangkat Lunak

  • Visual Studio Code
  • C++
  • Dart Flutter
  • Flutter

Step 1: Fitur

ESP32: ESP32 adalah mikrokontroler tangguh yang banyak digunakan dalam aplikasi IoT. Ini fitur prosesor dual-core, kemampuan Wi-Fi dan Bluetooth bawaan, dan serangkaian antarmuka periferal yang kaya. ESP32 akan berfungsi sebagai unit kontrol pusat untuk sistem pemantauan suhu, menangani akuisisi data, pemrosesan, dan tugas komunikasi.

Sensor DHT22: Sensor DHT22 adalah perangkat presisi tinggi yang dirancang untuk mengukur suhu dan kelembapan. Ini memberikan pembacaan yang akurat dan andal dalam rentang operasi yang luas. Keluaran digital dari sensor DHT22 menyederhanakan proses integrasi dengan mikrokontroler ESP32, memungkinkan akuisisi data yang lancar.

Relai: Relai adalah sakelar yang dioperasikan secara elektrik yang memungkinkan kontrol tegangan yang lebih tinggi atau beban arus menggunakan sinyal tegangan yang lebih rendah. Pada sistem pemantauan suhu, relai akan digunakan untuk mengontrol perangkat atau peralatan eksternal berdasarkan ambang batas suhu. Misalnya, dapat mengaktifkan atau menonaktifkan sistem pendingin atau memicu alarm saat suhu melebihi batas tertentu.

Layar OLED 0,96": Layar OLED (Organic Light-Emitting Diode) 0,96" berfungsi sebagai tampilan visual untuk menunjukkan pembacaan suhu. Layar OLED menawarkan kontras tinggi, sudut pandang lebar, dan konsumsi daya rendah. Layar berukuran 0,96" akan diintegrasikan ke dalam sistem untuk memberikan informasi suhu real-time dalam format yang jelas dan mudah dibaca.

Esp-32 berfungsi sebagai microcontroller dari sensor DHT22, dimana sensor akan mendeteksi suhu dan kelembaban suatu ruangan. Jika suhu/kelembaban dari suatu ruangan melebihi threshold yang di tentukan, maka perangkat (AC/Humidifer) yang di perintahkan akan menyala dengan menggunakan relay. Layar O-LED tersebut digunakan sebagai display fisik yang menampilakan kondisi ruangan tersebut pada perangkat yang buat.


Step 2: Block Diagram

Selanjutnya, kami membuat blok diagram komponen-komponen yang digunakan untuk membuat Smart Thermostat

Step 3: Schematic

Selanjutnya, kami membuat skematik untuk membuat jalur penyambung antara komponen-komponen.

Step 4: PCB Design

Design PCB

Step 5: Code

Setelah hardware tersusun, program code dibuat di main.cpp. Program tersebut dibuat untuk menjalankan display untuk suhu dan humidity pada layar OLED. Setelah itu, ubah SSID dan password pada baris kode sesuai SSID dan password Wifi Anda, lalu tes koneksi antara ESP32 dengan Wifi apakah sudah bisa tersambung.


Code:

//This code is for the ESP32 board, it is used to read the temperature and humidity from the DHT22 sensor and send it to the Firebase database and control 4 relay.

#include <Arduino.h>

#include "DHTesp.h"

#include <Wire.h>

#include "SSD1306Ascii.h"

#include "SSD1306AsciiWire.h"

#include <WiFi.h>

//Firebase stuff

#include <FirebaseESP32.h>

#include <addons/TokenHelper.h>

#include <addons/TokenHelper.h>

#define FIREBASE_HOST "your firebase link"

#define FIREBASE_AUTH "your firebase key

#define WIFI_SSID "your wifi username"

#define WIFI_PASSWORD "your wifi password "

//Pinout stuff

#define PIN_DHT  15

#define SDA_1 32

#define SCL_1 33

#define I2C_ADDRESS 0x3C

#define AC_RELAY 23

#define HEAT_RELAY 22

#define DEHUMIDIFIER_RELAY 19

#define HUMIDIFIER_RELAY 21

//function and variable declaration

DHTesp dht;

int AC_STATUS = 0;

int HEAT_STATUS = 0;

int DHUM_STATUS = 0;

int HUMD_STATUS = 0;

float temperature, humidity; 

TwoWire I2C_1 = TwoWire(0);

SSD1306AsciiWire OLED1(I2C_1);

FirebaseData fbdo, stream;

//reconnect to DHT sensor

void reconnectDHT() {

 Serial.println("Attempting to reconnect to DHT sensor...");

 dht.setup(PIN_DHT, DHTesp::DHT22); // Setup DHT sensor

 delay(2000); // Wait for 2 seconds

 if (dht.getStatus() != DHTesp::ERROR_NONE) {

  Serial.println("Failed to reconnect to DHT sensor!");

 } else {

  Serial.println("Successfully reconnected to DHT sensor.");

 }

}

//reconnect to Firebase

void streamTimeoutCallback(bool timeout)

{

 if(timeout)

 {

  Serial.println("Stream timeout, resume streaming...");

 }

}

//stream callback function

void streamCallback(StreamData data)

{

 if (data.dataType() == "int") // Check if the data type is int

 {

  if (data.dataPath() == "/AC_STATUS")

  {

   AC_STATUS = data.intData();

   digitalWrite(AC_RELAY, AC_STATUS);

  }

  else if (data.dataPath() == "/HEAT_STATUS")

  {

   HEAT_STATUS = data.intData();

   digitalWrite(HEAT_RELAY, HEAT_STATUS);

  }

  else if (data.dataPath() == "/DHUM_STATUS")

  {

   DHUM_STATUS = data.intData();

   digitalWrite(DEHUMIDIFIER_RELAY, DHUM_STATUS);

  }

  else if (data.dataPath() == "/HUMD_STATUS")

  {

   HUMD_STATUS = data.intData();

   digitalWrite(HUMIDIFIER_RELAY, HUMD_STATUS);

  }

 }

}

//OLED 0.96 display function

void displayControl(float temperature, float humidity)

{

 OLED1.set1X();  // set font size to 1X

 OLED1.setCursor(0, 0);  // First text location

 OLED1.println("Temperature: ");

 OLED1.set2X();  // set font size to 2X

 OLED1.setCursor(0, 10);   

 OLED1.println(String(temperature) + " C");


 OLED1.set1X();  // set font size to 1X

 OLED1.setCursor(0, 35);

 OLED1.println("Humidity: ");

 OLED1.set2X();  // set font size to 2X

 OLED1.setCursor(0, 45);

 OLED1.println(String(humidity) + " %");

}


void setup()

{

 Serial.begin(115200);

 dht.setup(PIN_DHT, DHTesp::DHT22); 

 pinMode(AC_RELAY, OUTPUT);

 pinMode(HEAT_RELAY, OUTPUT);

 pinMode(DEHUMIDIFIER_RELAY, OUTPUT);

 pinMode(HUMIDIFIER_RELAY, OUTPUT);

 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

 Serial.print("Connecting to WiFi");

 while (WiFi.status() != WL_CONNECTED)

 {

  Serial.print(".");

  delay(300);

 }

 Serial.print("Connected with IP: ");

 Serial.println(WiFi.localIP());


 I2C_1.begin(SDA_1, SCL_1, 400000L);

 OLED1.begin(&Adafruit128x64, I2C_ADDRESS);

 OLED1.setFont(Adafruit5x7);

 OLED1.clear();


 Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

 Firebase.reconnectWiFi(true);

 Firebase.setwriteSizeLimit(fbdo, "tiny");


 // Begin streams

  if (!Firebase.beginStream(stream, "/relay"))

  Serial.println("Could not begin stream!");

 else

 {

  Serial.println("Stream began successfully.");

  Firebase.setStreamCallback(stream, streamCallback, streamTimeoutCallback);

 }

}

//send data to Firebase

void loop()

{

 if (Firebase.ready()){

 if (dht.getStatus()==DHTesp::ERROR_NONE)

 {

  float humidity = dht.getHumidity();

  float temperature = dht.getTemperature();

  displayControl(temperature, humidity);

  if (Firebase.ready()){

   Firebase.RTDB.setFloat(&fbdo, "/temperature", temperature);

   Firebase.RTDB.setFloat(&fbdo, "/humidity", humidity);

  }

 }

 else{ Serial.println("DHT22 not found.");

 reconnectDHT();}

}

 delay(1000);


}

Step 6: Kesimpulan

Kesimpulan

  • Layar OLed menunjukan suhu dan kelembaban yang sesuai.
  • Relay dapat mengontrol perangkat.
  • Menggunakan 2 port daya yang berbeda.

Saran

  • Menambah parameter.