//Configuração do BLynk
#define BLYNK_TEMPLATE_ID "TMPL2GfsofSaS"
#define BLYNK_TEMPLATE_NAME "testeiot"
#define BLYNK_AUTH_TOKEN "dSxsiu7zsSCoqw2iANicr-ncn9syZAt4"
//Bibliotecas para acessar display, wifi e blynk
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
//Redireciona os prints da serial com informações do Blynk
#define BLYNK_PRINT Serial
//Autentica a conexão direcionando para o login do Blynk
char auth[] = BLYNK_AUTH_TOKEN;
//Credenciais de conexão para rede WiFi. SSID = nome da rede, Pass = senha da rede
//Senha nomeada como "" para redes abertas.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//LCD
const int LCD_ADDRESS = 0x27;
const int LCD_COLUMNS = 16;
const int LCD_ROWS = 2;
//BOTOES DE ESTADO
const int RED_BUTTON_PIN = 4;
const int YELLOW_BUTTON_PIN = 16;
const int GREEN_BUTTON_PIN = 0;
//LEDS DE ESTADO
const int RED_LED_PIN = 18;
const int YELLOW_LED_PIN = 5;
const int GREEN_LED_PIN = 19;
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
String staticMessage = "";
unsigned long startTime = 0;
bool isTimerStarted = false; //Controle para start do timer
int lastPressedButton = -1; // -1 nenhum botao pressionado
//CONTROLES DO TIMER
unsigned long elapsedSeconds = 0;
unsigned long hours = 0;
unsigned long minutes = 0;
unsigned long seconds = 0;
void scrollText(int row, String message, int delayTime, int lcdColumns) {
message = String(message.length() + lcdColumns, ' ') + message + String(lcdColumns, ' ');
for (int pos = 0; pos < message.length() - lcdColumns + 1; pos++) {
lcd.setCursor(0, row);
lcd.print(message.substring(pos, pos + lcdColumns));
delay(delayTime);
}
}
void displayMessage(String message) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(message);
}
void processTimerAndBlynk(int row) {
elapsedSeconds = (millis() - startTime) / 1000;
hours = elapsedSeconds / 3600;
minutes = (elapsedSeconds % 3600) / 60;
seconds = elapsedSeconds % 60;
lcd.setCursor(0, row);
String param = String();
lcd.print("Tempo: ");
param.concat(hours < 10 ? "0" : "");
param.concat(hours);
param.concat(":");
param.concat(minutes < 10 ? "0" : "");
param.concat(minutes);
param.concat(":");
param.concat(seconds < 10 ? "0" : "");
param.concat(seconds);
lcd.print(param);
switch(lastPressedButton) {
case RED_BUTTON_PIN : //parada
Blynk.virtualWrite(V4, 3);
Blynk.virtualWrite(V0, param); break;
case YELLOW_BUTTON_PIN : //falha
Blynk.virtualWrite(V4, 2);
Blynk.virtualWrite(V1, param); break;
default : //run
Blynk.virtualWrite(V4, 1);
Blynk.virtualWrite(V2, param); break;
}
}
void setup() {
pinMode(RED_BUTTON_PIN, INPUT_PULLUP);
pinMode(YELLOW_BUTTON_PIN, INPUT_PULLUP);
pinMode(GREEN_BUTTON_PIN, INPUT_PULLUP);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
displayMessage("BEM VINDO AO OEE");
lcd.setCursor(0, 1);
lcd.print("MONITOR MQ");
delay(2000);
displayMessage("PRESS. BOTAO P/");
lcd.setCursor(0, 1);
lcd.print("START DA SIMULAC.");
//Inicializa e loga no blynk
Blynk.begin(auth, ssid, pass);
}
void loop() {
if (digitalRead(RED_BUTTON_PIN) == LOW && lastPressedButton != RED_BUTTON_PIN) {
staticMessage = "MQ EM PARADA";
startTime = millis();
isTimerStarted = true;
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
displayMessage(staticMessage);
lastPressedButton = RED_BUTTON_PIN;
} else if (digitalRead(YELLOW_BUTTON_PIN) == LOW && lastPressedButton != YELLOW_BUTTON_PIN) {
staticMessage = "MQ EM FALHA";
startTime = millis();
isTimerStarted = true;
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
displayMessage(staticMessage);
lastPressedButton = YELLOW_BUTTON_PIN;
} else if (digitalRead(GREEN_BUTTON_PIN) == LOW && lastPressedButton != GREEN_BUTTON_PIN) {
staticMessage = "MQ EM PRODUCAO";
startTime = millis();
isTimerStarted = true;
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
displayMessage(staticMessage);
lastPressedButton = GREEN_BUTTON_PIN;
}
if (isTimerStarted) {
processTimerAndBlynk(1);
}
delay(1000);
}