#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define CALDAIA_SWITCH 6 // pin switch on/off caldaia
#define DHTPIN 4 // pin DHT11
#define DS18PIN 3 // pin DS18B20
#define LEDPIN 5 // led on/off
#define BUTTON 12 // PIN button switch temp
#define DHTTYPE DHT22
#define OLED_RESET 4
const unsigned long periodo = 10000;
unsigned long starttime;
unsigned long currenttime;
OneWire oneWire(DS18PIN); //Istanza OneWire per utilizzare il canale di comunicazione
DallasTemperature sensors(&oneWire); //canale di comunicazione alla libreria della Dallas
Adafruit_SSD1306 display(OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);
// Enumerazione degli stati possibili (per avere una forma più leggibile)
enum States {INT_TEMP = 0, WAIT_10, EXT_TEMP, WAIT_5};
// Variabile per memorizzare lo stato corrente
int actualState = INT_TEMP;
// Variabile per memorizzare lo stato precedente
int oldState = -1;
const uint8_t PROGMEM goccia[] = {
B00000001, B10000000,
B00000011, B11000000,
B00000111, B11100000,
B00001111, B11110000,
B00011111, B11111000,
B00011011, B11111000,
B00011011, B11111000,
B00001101, B11110000,
B00000111, B11100000,
B00000000, B00000000,
B00000000, B00000000,
B00000000, B00000000,
B00000000, B00000000,
B00000000, B00000000,
B00000000, B00000000,
B00000000, B00000000,
};
void setup()
{
starttime = millis();
sensors.begin(); //inizializza sensore esterno
Wire.begin();
dht.begin();
pinMode(CALDAIA_SWITCH, INPUT); // switch dal relè
pinMode(BUTTON, INPUT); // visualizza temp. esterna
pinMode(LEDPIN, OUTPUT); // led on/off
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // imposta l'indirizzo i2c
display.cp437(true); // abilita uso di tutti i caratteri ascii del display
display.setTextColor(WHITE);
display.clearDisplay();
}
void loop() {
// Clear and write display only when needed
if (oldState != actualState) {
oldState == actualState;
switch (actualState) {
case INT_TEMP:
temp_int();
starttime = millis();
actualState = WAIT_10;
break;
case WAIT_10:
if (millis() - starttime > 10000)
actualState = EXT_TEMP;
break;
case EXT_TEMP:
temp_est();
starttime = millis();
actualState = WAIT_5;
break;
case WAIT_5:
if (millis() - starttime > 5000)
actualState = INT_TEMP;
break;
}
display.display();
}
}
void caldaia_switch()
{
display.setTextSize(1);
display.setCursor(23, 1);
if (digitalRead(CALDAIA_SWITCH) == HIGH) {
display.print("CALDAIA ACCESA");
digitalWrite(LEDPIN, HIGH);
}
else {
display.print("CALDAIA SPENTA");
digitalWrite(LEDPIN, LOW);
}
}
void temp_int()
{
int h = dht.readHumidity();
int t = dht.readTemperature();
display.clearDisplay();
caldaia_switch();
display.setCursor(0, 12);
display.setTextSize(3);
display.print(t);
display.setTextSize(2);
display.print((char)248); // Carattere gradi°
display.setTextSize(3);
display.setCursor(74, 12);
display.print(h);
display.print("%") ;
display.drawBitmap(56, 12, goccia, 16, 16, WHITE);
}
void temp_est ()
{
sensors.requestTemperatures();
int e (sensors.getTempCByIndex(0));
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print(" TEMPERATURA ESTERNA");
display.setTextSize(3);
display.setCursor(48, 12);
display.print(e);
display.setTextSize(2);
display.print((char)248); // Carattere gradi°
}