#include <stdio.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#define TRUE 1
#define FALSE 0
#define NUM_CHAR 2
// Definição de pinos
const int potPin = A0; // Pino analógico para o potenciômetro
const int pwmPin = 9; // Pino PWM para o controle do ventilador
const int buttonPinOperacao = 2; // Pino do botão para alternar entre MANUAL e AUTOMATICO
const int botao_menu = 3; // Pino do botão para incrementar valor na EEPROM
const int displayAddress = 0x27; // Endereço I2C do display
const int numRows = 2;
const int numCols = 16;
int opcaoSelecionada;
char flag_clear;
char flag_MinMax = 0;
int loop_auto;
int valorNaEEPROM;
int valorPot;
int velocidade;
int minValue;
int maxValue;
// Enumeração para os modos de controle e menu
enum ModoControle {
MANUAL,
AUTOMATICO,
MENU
};
enum {
MIN,
MAX
};
// Inicialização do display
LiquidCrystal_I2C lcd(displayAddress, numCols, numRows);
// Variáveis para armazenar o modo atual e valor na EEPROM
ModoControle modoAtual = MANUAL;
unsigned char valorMinNaEEPROM = 0;
unsigned char valorMaxNaEEPROM = 1;
void incrementarValorMinNaEEPROM() {
EEPROM.put(0, valorMinNaEEPROM);
}
void incrementarValorMaxNaEEPROM() {
EEPROM.put(1, valorMaxNaEEPROM);
}
void setup() {
// Inicialização do display
Serial.begin(9600);
lcd.init();
lcd.backlight();
flag_clear = FALSE;
// Configuração dos pinos dos botões
pinMode(buttonPinOperacao, INPUT_PULLUP);
pinMode(botao_menu, INPUT_PULLUP);
pinMode(potPin, INPUT);
}
void loop() {
// Verificar se o botão de operação foi pressionado
if (digitalRead(buttonPinOperacao) == LOW)
{
//permite registrar os valores de minimo e maximo pelo potenciometro
if (modoAtual == MENU)
{
flag_MinMax++;
if (flag_MinMax > MAX)
{
minValue = EEPROM.read(0);
maxValue = EEPROM.read(1);
// Exibindo os valores no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Min: ");
lcd.print(minValue);
Serial.println(minValue);
lcd.setCursor(0, 1);
lcd.print("Max: ");
lcd.print(maxValue);
Serial.println(maxValue);
delay(5000);
modoAtual = MANUAL;
}
}
else
{
// Alternar entre AUTOMATICO e MANUAL
modoAtual = (modoAtual == MANUAL) ? AUTOMATICO : MANUAL;
}
delay(200);
}
// Entrar no modo de menu se o botão de incremento for pressionado
if (digitalRead(botao_menu) == LOW) {
modoAtual = MENU;
// Aguardar um curto período para evitar leituras múltiplas do botão
delay(200);
}
// Lógica principal do controle do ventilador
switch (modoAtual) {
case MANUAL:
valorPot = analogRead(potPin);
velocidade = map(valorPot, 0, 1023, 0, 255);
analogWrite(pwmPin, velocidade);
lcd.setCursor(0, 0);
lcd.print("Modo: MANUAL ");
lcd.setCursor(0, 1);
lcd.print("Velocidade: " + String(map(valorPot, 0, 1023, 0, 100)) + "% ");
flag_clear = TRUE;
break;
case AUTOMATICO:
for (int i = minValue; i <= maxValue; i++)
{
// Verificar se o botão foi pressionado para alternar o modo
if (digitalRead(buttonPinOperacao) == LOW) {
break;
}
analogWrite(pwmPin, i);
lcd.setCursor(0, 0);
lcd.print("Modo: AUTOMATICO");
lcd.setCursor(0, 1);
lcd.print("Velocidade: " + String(map(i, 0, 255, 0, 100)) + "% ");
delay(1000);
}
flag_clear = TRUE;
break;
case MENU:
if (flag_clear)
{
lcd.clear();
flag_clear = FALSE;
flag_MinMax = MIN;
}
//usa o potenciometro para ajustar
valorPot = analogRead(potPin);
velocidade = map(valorPot, 0, 1023, 0, 255);
//analogWrite(pwmPin, velocidade);
lcd.setCursor(0, 0);
lcd.print("Modo: AJUSTE ");
lcd.setCursor(0, 1);
if(flag_MinMax == MIN)
{
lcd.print("V. Min: " + String(map(valorPot, 0, 1023, 0, 100)) + "% ");
valorMinNaEEPROM = map(valorPot, 0, 1023, 0, 100);
}
else if (flag_MinMax == MAX)
{
lcd.print("V. Max: " + String(map(valorPot, 0, 1023, 0, 100)) + "% ");
valorMaxNaEEPROM = map(valorPot, 0, 1023, 0, 100);
}
if(flag_MinMax == MIN)
incrementarValorMinNaEEPROM();
else if (flag_MinMax == MAX)
incrementarValorMaxNaEEPROM();
delay(200);
break;
}
}