// Libraries
#include <DHT.h>
#include <Adafruit_SH110X.h>
#include <Wire.h>
// Devices
#define PIN_GREEN_LED 23
#define PIN_RELAY 14
#define PIN_DHT22 33
#define PIN_POTENCIOMETRO 32
// Constants
#define MIN_RANDOM_TEMPERATURE 20
#define MAX_RANDOM_TEMPERATURE 25
#define POTENCIOMETER_RESOLUTION 8
#define MAX_TEMPERATURE 50
// Objects
DHT dht(PIN_DHT22, DHT22);
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1);
// Variables
int criticalMinTemperature;
float criticalMaxTemperature = 25.0;
float newCriticalMaxTemperature;
float dht22Temperature;
float newDht22Temperature;
volatile bool relayActivated = false;
volatile int potenciometerValue;
// Menu
bool readPotenciometer = true;
bool isSettingTemperature = false;
bool switchRelayBasedOnTemperature = true;
// Functions
void setOLEDText(String txt);
void setup() {
Serial.begin(9600);
pinMode(PIN_GREEN_LED, OUTPUT);
pinMode(PIN_POTENCIOMETRO, INPUT);
pinMode(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, relayActivated);
// Define potenciometer resolution (0 to 2 ^ POTENCIOMETER_RESOLUTION - 1)
analogReadResolution(POTENCIOMETER_RESOLUTION);
// Initialize dht
dht.begin();
// Initializar display
display.begin(0x3c, true);
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
// Get criticalMinTemperature
criticalMinTemperature = random(MIN_RANDOM_TEMPERATURE, MAX_RANDOM_TEMPERATURE + 1);
String minTemperatureMessage = "Min Temperature: " + String(criticalMinTemperature);
Serial.println(minTemperatureMessage);
}
void loop() {
// Read potenciometer value
if (readPotenciometer) {
potenciometerValue = analogRead(PIN_POTENCIOMETRO);
newCriticalMaxTemperature = (((float)potenciometerValue / (pow(2, POTENCIOMETER_RESOLUTION) - 1)) * (MAX_TEMPERATURE - criticalMinTemperature)) + criticalMinTemperature;
if (criticalMaxTemperature != newCriticalMaxTemperature) {
criticalMaxTemperature = newCriticalMaxTemperature;
Serial.println("Max Temperature: " + String(criticalMaxTemperature));
oledPrintState();
}
}
// Read dht22Temperature from sensor DHT22
newDht22Temperature = dht.readTemperature();
if (dht22Temperature != newDht22Temperature) {
dht22Temperature = newDht22Temperature;
Serial.println("DHT22 Temperature: " + String(dht22Temperature));
oledPrintState();
}
// Validate lecture
if (isnan(dht22Temperature)) {
Serial.println("Error al leer el sensor DHT22");
return;
}
// Active or deactivate relay based on temperature
if (switchRelayBasedOnTemperature) {
if (relayActivated) {
if (dht22Temperature < criticalMinTemperature) {
switchRelay (false);
}
} else {
if (dht22Temperature > criticalMaxTemperature) {
switchRelay (true);
}
}
}
// Show menu
if (Serial.available() && !isSettingTemperature) {
char car = (char) Serial.read();
// Ignora retorno de carro y nueva línea
if (car == '\r' || car == '\n') {
return;
}
switch(car) {
case '1':
Serial.println();
Serial.println("System state:");
Serial.println("Min Temperature: " + String(criticalMinTemperature));
Serial.println("DHT22 Temperature: " + String(dht22Temperature));
Serial.println("Max Temperature: " + String(criticalMaxTemperature));
Serial.println("Relay activated: " + String(relayActivated ? "true" : "false"));
Serial.println();
break;
case '2':
readPotenciometer = false;
isSettingTemperature = true;
switchRelayBasedOnTemperature = true;
// Limpiar el buffer serial para descartar el \n que viene con la opción 2
while (Serial.available()) {
// Leer y descartar cualquier carácter pendiente
Serial.read();
}
Serial.println("Enter max temperature: ");
break;
case '3':
switchRelayBasedOnTemperature = false;
switchRelay(true);
break;
case '4':
switchRelayBasedOnTemperature = false;
switchRelay(false);
break;
default:
Serial.println("Opcion incorrecta!");
}
}
// Option 2
if (Serial.available() && isSettingTemperature) {
String cmd = Serial.readStringUntil('\n');
float newTemperature = cmd.toFloat();
if (newTemperature < criticalMinTemperature) {
Serial.println("The temperature you entered is lower than the min temperature!");
Serial.println("It'll be set to the min temperature");
newTemperature = criticalMinTemperature;
}
if (newTemperature > MAX_TEMPERATURE) {
Serial.println("The temperature you entered is greater than the max temperature!");
Serial.println("It'll be set to the max temperature");
newTemperature = MAX_TEMPERATURE;
}
criticalMaxTemperature = newTemperature;
Serial.println("Max Temperature: " + String(criticalMaxTemperature));
oledPrintState();
isSettingTemperature = false;
}
delay(500);
}
void oledPrintState() {
String stateText = "Min Temp: " + String(criticalMinTemperature) + "\nDHT22 Temp: " + String(dht22Temperature) + "\nMax Temp: " + String(criticalMaxTemperature);
stateText += "\n\n1) State\n2) Set Temperature\n3) Cooler on\n4) Cooler off";
setOLEDText(stateText);
}
void switchRelay (bool activate) {
digitalWrite(PIN_RELAY, activate);
digitalWrite(PIN_GREEN_LED, activate);
relayActivated = activate;
if (activate) {
Serial.println("Cooler on");
} else {
Serial.println("Cooler off");
}
oledPrintState();
}
void setOLEDText(String txt) {
display.clearDisplay();
display.setCursor(0, 0);
display.println(txt);
display.display();
}