#include <Wire.h>
#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#define BUTTON_UP_PIN 7
#define BUTTON_DOWN_PIN 8
#define BUTTON_SET_PIN 6
#define BUTTON_NEXT_PIN 9
#define RELAY_PELTIER_PIN 10
#define RELAY_HUMIDIFIER_PIN 11
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
unsigned long delayTime;
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
uint8_t DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
float Temp_Fahrenheit;
int setTemperature = 0;
int setHumidity = 0;
bool settingMode = false;
bool settingTemperature = false;
bool settingHumidity = false;
void setup() {
Serial.begin(115200);
pinMode(DHTPin, INPUT);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(1000);
display.clearDisplay();
display.display();
display.setTextSize(1.75);
display.setTextColor(WHITE);
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SET_PIN, INPUT_PULLUP);
pinMode(BUTTON_NEXT_PIN, INPUT_PULLUP);
pinMode(RELAY_PELTIER_PIN, OUTPUT);
pinMode(RELAY_HUMIDIFIER_PIN, OUTPUT);
// Display initial text
display.clearDisplay();
display.setTextSize(1,3); // Adjust the text size as needed
display.setCursor(15,8); // Adjust the position as needed
display.println("CLIMATIC CHAMBER");
display.setTextSize(1,2); // Adjust the text size as needed
display.setCursor(25,40); // Adjust the position as needed
display.println("PORTABLE 1.0");
display.display();
delay(3000); // Display the initial text for 2 seconds
// Read set values from EEPROM
setTemperature = 250; // 25.0 degrees
setHumidity = 400; //
// Masuk ke mode pengaturan setelah setup
settingMode = true;
settingTemperature = true;
settingHumidity = false;
// Check if EEPROM is empty
if (EEPROM.read(0) == 0xFF && EEPROM.read(1) == 0xFF) {
// Write default values to EEPROM
EEPROM.put(0, 250); // 25.0 degrees
EEPROM.put(sizeof(setTemperature), 400); // 40.0% humidity
}
// Read set values from EEPROM
setTemperature = EEPROM.get(0, setTemperature);
setHumidity = EEPROM.get(sizeof(setTemperature), setHumidity);
}
void loop() {
if (settingMode) {
if (settingTemperature) {
if (digitalRead(BUTTON_UP_PIN) == LOW) {
setTemperature = min(500, setTemperature + 10);
delay(200); // debounce
} else if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
setTemperature = max(0, setTemperature - 10);
delay(200); // debounce
} else if (digitalRead(BUTTON_NEXT_PIN) == LOW) {
EEPROM.put(0, setTemperature);
settingTemperature = false;
settingHumidity = true;
delay(500); // debounce
}
display.clearDisplay();
display.setTextSize(1,3);
display.setCursor(7,20);
display.print("Set Temperature: ");
display.print(setTemperature / 10);
display.display();
} else if (settingHumidity) {
if (digitalRead(BUTTON_UP_PIN) == LOW) {
setHumidity = min(1000, setHumidity + 10);
delay(200); // debounce
} else if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
setHumidity = max(0, setHumidity - 10);
delay(200); // debounce
} else if (digitalRead(BUTTON_NEXT_PIN) == LOW) {
EEPROM.put(sizeof(setTemperature), setHumidity);
settingHumidity = false;
settingMode = false;
delay(500); // debounce
}
display.clearDisplay();
display.setTextSize(1,3);
display.setCursor(15,20);
display.print("Set Humidity: ");
display.print(setHumidity / 10);
display.display();
}
} else {
// Read temperature and humidity from DHT sensor
Humidity = dht.readHumidity();
Temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(Humidity) || isnan(Temperature)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// If set button is pressed, enter setting mode
if (digitalRead(BUTTON_SET_PIN) == LOW) {
settingMode = true;
settingTemperature = true;
settingHumidity = false;
delay(100); // debounce
}
// Control peltier
if (Temperature * 10.0 < setTemperature) {
digitalWrite(RELAY_PELTIER_PIN, HIGH); // Turn on peltier
} else if (Temperature * 10.0 > setTemperature) {
digitalWrite(RELAY_PELTIER_PIN, LOW); // Turn off peltier
}
// Control humidifier
if (Humidity * 10.0 < setHumidity) {
digitalWrite(RELAY_HUMIDIFIER_PIN, HIGH); // Turn on humidifier
} else if (Humidity * 10.0 > setHumidity) {
digitalWrite(RELAY_HUMIDIFIER_PIN, LOW); // Turn off humidifier
}
// Your existing code to read and display temperature and humidity
Humidity = dht.readHumidity();
Temperature = dht.readTemperature();
Temp_Fahrenheit= dht.readTemperature(true);
if (isnan(Humidity) || isnan(Temperature) || isnan(Temp_Fahrenheit)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("Humidity: "));
Serial.print(Humidity);
Serial.print(F("% Temperature: "));
Serial.print(Temperature);
Serial.print(F("°C "));
Serial.print(Temp_Fahrenheit);
Serial.println(F("°F "));
display.setCursor(0,0);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(Temperature);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display humidity
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(Humidity);
display.print(" %");
display.display();
delay(1000);
}
}