This is an old revision of the document!
Student: Eduard Popa-Costin
Grupa: 332CC
#include <dht11.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BUTTON_INCREMENT 2
#define BUTTON_DECREMENT 3
#define BUTTON_MODE 4
#define DHT11PIN_OUTSIDE 7
#define DHT11PIN_INSIDE 6
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
dht11 DHT11;
int INA_OUTSIDE = 9;
int INB_OUTSIDE = 10;
int incrementButtonState = HIGH;
int decrementButtonState = HIGH;
int lastIncrementButtonState = HIGH;
int lastDecrementButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long previousTemperatureTime = 0;
long referenceTemperature = 25.00;
const unsigned long temperatureInterval = 2000;
bool buttonModeState = false;
bool buttonModePressed = false;
bool fanOn = false;
bool mode = false;
void setup() {
pinMode(BUTTON_INCREMENT, INPUT);
pinMode(BUTTON_DECREMENT, INPUT);
pinMode(BUTTON_MODE, INPUT_PULLUP);
pinMode(INA_OUTSIDE, OUTPUT);
pinMode(INB_OUTSIDE, OUTPUT);
digitalWrite(INA_OUTSIDE, LOW);
digitalWrite(INB_OUTSIDE, LOW);
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
}
void loop() {
unsigned long currentMillis = millis();
if (digitalRead(BUTTON_MODE) == LOW) {
if (!buttonModePressed) {
buttonModePressed = true;
buttonModeState = !buttonModeState;
}
} else {
buttonModePressed = false;
}
if (!buttonModeState) {
display.clearDisplay();
display.setCursor(0, 10);
display.println("Mode: Manual");
display.setCursor(0, 25);
display.print("Temp (C): ");
display.println((float)DHT11.temperature, 2);
display.setCursor(0, 40);
display.print("Temp limit (C): ");
display.println(referenceTemperature);
display.setCursor(0, 52);
display.print("Fan: ");
if (fanOn) {
display.println("ON");
}
else {
display.println("OFF");
}
display.display();
int reading_increment = digitalRead(BUTTON_INCREMENT);
int reading_decrement = digitalRead(BUTTON_DECREMENT);
if (reading_increment != lastIncrementButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading_increment != incrementButtonState) {
incrementButtonState = reading_increment;
if (incrementButtonState == LOW) {
referenceTemperature++;
}
}
}
lastIncrementButtonState = reading_increment;
if (reading_decrement != lastDecrementButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading_decrement != decrementButtonState) {
decrementButtonState = reading_decrement;
if (decrementButtonState == LOW) {
referenceTemperature--;
}
}
}
lastDecrementButtonState = reading_decrement;
if (currentMillis - previousTemperatureTime >= temperatureInterval) {
previousTemperatureTime = currentMillis;
DHT11.read(DHT11PIN_OUTSIDE);
if ((float)DHT11.temperature > referenceTemperature) {
if (!fanOn) {
digitalWrite(INA_OUTSIDE, LOW);
digitalWrite(INB_OUTSIDE, HIGH);
fanOn = true;
}
}
else {
if (fanOn) {
digitalWrite(INA_OUTSIDE, LOW);
digitalWrite(INB_OUTSIDE, LOW);
fanOn = false;
}
}
}
display.display();
}
else {
display.clearDisplay();
display.setCursor(0, 10);
display.println("Mode: Auto");
if (currentMillis - previousTemperatureTime >= temperatureInterval) {
previousTemperatureTime = currentMillis;
DHT11.read(DHT11PIN_OUTSIDE);
float temperature_outside = DHT11.temperature;
DHT11.read(DHT11PIN_INSIDE);
float temperature_inside = DHT11.temperature;
display.setCursor(0, 25);
display.print("Temp outside(C) ");
display.println(temperature_outside, 2);
display.setCursor(0, 40);
display.print("Temp inside(C) ");
display.println(temperature_inside, 2);
if (temperature_inside <= temperature_outside) {
if (!fanOn) {
digitalWrite(INA_OUTSIDE, LOW);
digitalWrite(INB_OUTSIDE, HIGH);
fanOn = true;
display.setCursor(0, 52);
display.println("Fan: ON");
display.display();
}
}
else {
if (fanOn) {
digitalWrite(INA_OUTSIDE, LOW);
digitalWrite(INB_OUTSIDE, LOW);
fanOn = false;
display.setCursor(0, 52);
display.println("Fan: OFF");
display.display();
}
}
}
}
}