#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// pin Sensor DHT
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// pin Encoder KY-040
#define pin_clk 4
#define pin_dt 3
#define pin_sw 2
#define pin_PWM 6
int hitung, hitung_1;
char menu;
int waktu_update_dht=1000, waktu_1;
float nilai_suhu, nilai_lembap, norm_suhu, norm_setpoint;
// parameter nilai set point tiap jenis filament
float sp_pla=30, sp_nylon=40, sp_petg=50, sp_nilai_suhu;
String jenis_filamen="";
// parameter kontrol PID
float kP, kI, kD, out_P, out_I, out_D, out_PID;
float error, error_1, error_total;
int nilai_PWM=0;
enum {
menu_awal, menu_1, menu_2, menu_pid
};
LiquidCrystal_I2C lcd(0x27, 20, 4);
void baca_dht(){
nilai_suhu = dht.readTemperature();
nilai_lembap = dht.readHumidity();
}
void encoder_gerak(){
if(digitalRead(pin_clk)){
hitung--;
}
else{
hitung++;
}
}
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(pin_clk, INPUT);
pinMode(pin_dt, INPUT);
pinMode(pin_sw, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pin_dt), encoder_gerak, RISING);
pinMode(pin_PWM, OUTPUT);
menu = menu_awal;
hitung=0;
baca_dht();
waktu_1 = millis();
}
void loop() {
if(millis() - waktu_1 > waktu_update_dht){
baca_dht();
// Serial.println(nilai_suhu);
waktu_1 = millis();
}
switch(menu){
case menu_awal:
lcd.setCursor(0, 0);
lcd.print("Pilih Filament");
lcd.setCursor(0, 1);
lcd.print("Suhu & Lembap");
lcd.setCursor(15, hitung);
lcd.print("<");
if(hitung != hitung_1){
lcd.clear();
hitung_1 = hitung;
}
if(hitung > 1){
hitung=0;
}
else if(hitung < 0){
hitung=1;
}
if(digitalRead(pin_sw)==0){
if(hitung == 0){
menu=menu_1;
}
else if(hitung == 1){
menu=menu_2;
}
hitung=0;
lcd.clear();
delay(2);
}
break;
case menu_1:
lcd.setCursor(0, 0);
lcd.print("PLA");
lcd.setCursor(7, 0);
lcd.print(sp_pla);
lcd.setCursor(0, 1);
lcd.print("Nylon");
lcd.setCursor(7, 1);
lcd.print(sp_nylon);
lcd.setCursor(0, 2);
lcd.print("PETG");
lcd.setCursor(7, 2);
lcd.print(sp_petg);
lcd.setCursor(0, 3);
lcd.print("Kembali");
lcd.setCursor(13, hitung);
lcd.print("<");
if(hitung != hitung_1){
lcd.clear();
hitung_1 = hitung;
}
if(hitung > 3){
hitung=0;
}
else if(hitung < 0){
hitung=3;
}
if(digitalRead(pin_sw)==0){
if(hitung == 3){
menu=menu_awal;
}
else {
if(hitung == 0){
sp_nilai_suhu = sp_pla;
jenis_filamen = "PLA";
}
else if(hitung == 1){
sp_nilai_suhu = sp_nylon;
jenis_filamen = "Nylon";
}
else if(hitung == 2){
sp_nilai_suhu = sp_petg;
jenis_filamen = "PETG";
}
menu=menu_pid;
}
hitung=0;
lcd.clear();
delay(2);
}
break;
case menu_2:
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.setCursor(10, 0);
lcd.print(nilai_suhu);
lcd.setCursor(0, 1);
lcd.print("Lembap: ");
lcd.setCursor(10, 1);
lcd.print(nilai_lembap);
lcd.setCursor(0, 2);
lcd.print("Kembali");
if(hitung == 2){
lcd.setCursor(18, hitung);
lcd.print("<");
}
if(hitung != hitung_1){
lcd.clear();
hitung_1 = hitung;
}
if(hitung > 0 || hitung < 0){
hitung=2;
}
if(digitalRead(pin_sw)==0){
if(hitung == 2){
menu=menu_awal;
}
hitung=0;
lcd.clear();
delay(2);
}
break;
case menu_pid:
lcd.setCursor(0, 0);
lcd.print("Suhu Untuk Filamen");
lcd.setCursor(0, 1);
lcd.print(jenis_filamen);
lcd.setCursor(6, 1);
lcd.print(sp_nilai_suhu);
lcd.setCursor(12, 1);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Suhu: ");
lcd.setCursor(6, 2);
lcd.print(nilai_suhu);
lcd.setCursor(12, 2);
lcd.print("C");
// range suhu dht22 -40 sd 80
error = sp_nilai_suhu - nilai_suhu;
out_P = kP*error;
out_I = kI*(error+error_1);
error_total += error;
out_D = kD*(error-error_1);
error_1 = error;
out_PID = out_P + out_I + out_D;
nilai_PWM = int(out_PID);
if(nilai_PWM < 0){nilai_PWM = 0;}
else if(nilai_PWM > 255){nilai_PWM = 255;}
analogWrite(pin_PWM, nilai_PWM);
break;
}
}