#include <OneWire.h>
#include <DallasTemperature.h> //https://github.com/milesburton/Arduino-Temperature-Control-Library/tree/master
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pin konfigurasi
#define ONE_WIRE_BUS 11
#define BUTTON_NORMAL 3
#define BUTTON_PANAS 4
#define BUTTON_DINGIN 5
#define RELAY_HEATER 6
#define RELAY_COOLER 7
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device address
DeviceAddress sensor;
// Variabel kontrol suhu
float suhu;
String jenis_suhu;
int setpoint = 25;
void setup() {
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// locate devices on the bus
Serial.print("Mencari sensor DS18B20...");
sensors.begin();
Serial.print("Ditemukan ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" perangkat.");
// report parasite power requirements
Serial.print("Parasite power : ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
if (!sensors.getAddress(sensor, 0)) Serial.println("Tidak dapat menemukan sensor DS18B20");
//atur resolusi suhu DS18B20 dengan resolusi 9-12 bit
sensors.setResolution(sensor, 12); //kita gunakan 12 bit untuk mendapatkan presisi yang paling baik
pinMode(BUTTON_NORMAL, INPUT_PULLUP);
pinMode(BUTTON_PANAS, INPUT_PULLUP);
pinMode(BUTTON_DINGIN, INPUT_PULLUP);
pinMode(RELAY_HEATER, OUTPUT);
pinMode(RELAY_COOLER, OUTPUT);
lcd.begin(20, 4);
lcd.backlight();
}
void loop() {
//Ambil data suhu
sensors.requestTemperatures(); // Send the command to get temperatures
float suhu = sensors.getTempC(sensor);
// Menentukan jenis suhu
if (suhu >= 0 && suhu <= 15) {
jenis_suhu = "Dingin";
} else if (suhu >= 15 && suhu <= 20) {
jenis_suhu = "Parsial";
} else if (suhu >= 20 && suhu <= 30) {
jenis_suhu = "Normal";
} else if (suhu >= 30 && suhu <= 50) {
jenis_suhu = "Parsial";
} else if (suhu >= 50 && suhu <= 90) {
jenis_suhu = "Panas";
}
// Menyesuaikan setpoint berdasarkan tombol yang ditekan
if (digitalRead(BUTTON_NORMAL) == LOW) {
setpoint = 25;
} else if (digitalRead(BUTTON_PANAS) == LOW) {
setpoint = 60;
} else if (digitalRead(BUTTON_DINGIN) == LOW) {
setpoint = 5;
}
// Tampilkan suhu dan jenis suhu pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("J.Suhu: ");
lcd.print(jenis_suhu);
lcd.setCursor(0, 2);
lcd.print("Setpoint: ");
lcd.print(setpoint);
lcd.print(" C");
// Implementasi kontrol Heater & Cooler
if (suhu < setpoint - 2) {
digitalWrite(RELAY_HEATER, HIGH);
digitalWrite(RELAY_COOLER, LOW);
} else if (suhu > setpoint + 2) {
digitalWrite(RELAY_COOLER, HIGH);
digitalWrite(RELAY_HEATER, LOW);
} else {
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_COOLER, LOW);
}
delay(1000);
}