#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
#define ENCODER_CLK 3
#define ENCODER_DT 5
#define ENCODER_SW 6
int menu = 1;
int flag = 0; //flag para saber se entrou no menu ou não
float temp_agua = 70; //valor deve ser pego do sensor do boiler
float temp_cabine = 30; //valor deve ser pego do sensor
float new_temp_cabine = 30;
float vent_velocidade = 40;
float new_vent_velocidade = 10;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.display();
display.clearDisplay();
// Initialize encoder pins
pinMode(ENCODER_CLK, INPUT); //pulso do botão
pinMode(ENCODER_DT, INPUT); // giro do botão
pinMode(ENCODER_SW, INPUT_PULLUP); //click do botão
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
}
void readEncoder() { // faz a leitura da rotação do botão
int dtValue = digitalRead(ENCODER_DT);
if(flag != 0){ // se estiver dentro de algum dos menus
switch(dtValue){
case HIGH: // sobe
switch(flag){
case 1: // ventilador
new_vent_velocidade++;
break;
case 2: // temperatura
new_temp_cabine++;
break;
}
break;
case LOW: //desce
switch(flag){
case 1: // ventilador
new_vent_velocidade--;
break;
case 2: // temperatura
new_temp_cabine--;
break;
}
break;
}
}
if(menu < 2){ //não deixar selecionar mais do que 2
if (dtValue == LOW) {
menu++; // Clockwise
}
}
if(menu > 1){ //não deixar selecionar menos do que 1
if (dtValue == HIGH) {
menu--; // Counterclockwise
}
}
}
int getMenu() {
int result;
noInterrupts();
result = menu;
interrupts();
return result;
}
void resetMenu() {
noInterrupts();
menu = 1;
interrupts();
}
void loop() {
valida_temperatura();
if(flag == 0){
staticMenu();
}else{
switch(flag){
case 1: // ventilador
ventiladorMenu();
break;
case 2: // temperatura
temperaturaMenu();
break;
}
}
display.clearDisplay();
delay(50);
if (digitalRead(ENCODER_SW) == LOW) { //se o botão foi apertado
printTela();
}
}
void printTela(){
if(flag > 0){ // volta para o menu inicial
flag = 0;
staticMenu();
resetMenu();
}else{
switch(menu){ // entra no menu ->
case 1: // ventilador
ventiladorMenu();
flag = 1;
break;
case 2: // temperatura
temperaturaMenu();
flag = 2;
break;
}
}
}
void ventiladorMenu(){ // menu ventilador
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" VENTILADOR");
//---------------------------------
display.setTextSize(1);
display.setCursor(10, 16);
display.print("Vel ");
display.print(vent_velocidade); //apresenta a velocidade real do ventilador
display.setCursor(10, 32);
display.print("New ");
display.print(new_vent_velocidade);
display.display();
}
void temperaturaMenu(){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" TEMPERATURA");
//---------------------------------
display.setTextSize(1);
display.setCursor(10, 16);
display.print("Temp ");
display.print(temp_cabine);
display.setCursor(10, 32);
display.print("New ");
display.print(new_temp_cabine);
display.display();
}
void staticMenu() {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" AQUECEDOR");
//---------------------------------
display.setTextSize(1);
display.setCursor(10, 10);
display.println("Ventilador");
display.setCursor(10, 20);
display.print("Temperatura");
display.setCursor(0, getMenu()*10);
display.print(">");
display.display();
}
void valida_temperatura(){
if(new_temp_cabine >= temp_cabine){
Bomba_agua(0);
}else{
Bomba_agua(1);
}
}
void Bomba_agua(int status){
switch(status){
case 1: // ligar a bomba
break;
case 0: //desligar a bomba
break;
}
}