// Library: MQ2_LPG
// By: Devan Cakra M.W
#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ButtonControl.h>
#define MQ2_ANALOG_PIN A0
#define BUZZER_PIN A3
#define RED_PIN 10
#define GREEN_PIN 11
#define BLUE_PIN 12
int sensorValue = 0;
// Defina aqui os limites de segurança
int limitYellow = 300; // Começa a ficar alerta
int limitRed = 600; // Perigo real
const int PINO_DT = A1;
const int PINO_SCK = A2;
ButtonControl btn(A4); //Button connected to pin 4 and GND. Default library configuration: pin in INPUT_PULLUP mode and the button connecting LOW to the pin. Can be changed with parameters
HX711 balanca;
LiquidCrystal_I2C lcd(0x27, 16, 2);
float fator_calibracao = 420.00;
void setup() {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
Serial.println("Sistema de Monitoramento Iniciado...");
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
balanca.begin(PINO_DT, PINO_SCK);
//Verifica se o módulo está pronto
while(!balanca.is_ready()) {
lcd.setCursor(0, 1);
lcd.print("Erro Modulo HX");
delay(500);
}
// --- O SEGREDO ESTÁ AQUI ---
delay(1000); // Aguarda o sensor "acordar"
balanca.set_scale();
lcd.clear();
lcd.print("Zerar prato...");
Serial.println("Limpando escala... mantenha a balança vazia.");
delay(500); // Pequena pausa para evitar vibração
balanca.tare(10); // Tira a média de 20 leituras para um zero perfeito
// ---------------------------
Serial.println("--- MENU DE CALIBRACAO ---");
Serial.println("Comandos: + / - (ajuste fino), s / x (ajuste grosso), t (tara)");
lcd.clear();
}
void loop() {
balanca.set_scale(fator_calibracao);
// Aumentei para 10 amostras para o peso não ficar "pulando" no visor
float leitura = balanca.get_units(10);
// Exibe no Serial
Serial.print("Peso: ");
Serial.print(leitura, 2);
Serial.print(" g | Fator: ");
Serial.println(fator_calibracao);
// Exibe no LCD
lcd.setCursor(0, 0);
lcd.print("Peso: ");
// Filtro de "ruído" para não mostrar -0.0 ou 0.03 quando vazia
if (leitura > -0.5 && leitura < 0.5) leitura = 0;
lcd.print(leitura, 1);
lcd.print("g "); // Espaços para limpar resíduos de números anteriores
if (Serial.available()) {
char temp = Serial.read();
if (temp == '+' || temp == 'a') fator_calibracao += 1.0;
else if (temp == '-' || temp == 'z') fator_calibracao -= 1.0;
else if (temp == 's') fator_calibracao += 50.0;
else if (temp == 'x') fator_calibracao -= 50.0;
else if (temp == 't') {
lcd.setCursor(0,1);
lcd.print("Zerando... ");
balanca.tare(10);
}
}
if (btn.click()) {balanca.tare(10);}
sensorValue = analogRead(MQ2_ANALOG_PIN);
Serial.print("Nível: ");
Serial.println(sensorValue);
lcd.setCursor(0, 1);
lcd.print("Nivel: ");
lcd.print(sensorValue, 1);
lcd.print(" ");
if (sensorValue < limitYellow && leitura >= 5) {
// TUDO SEGURO - Verde
setColor(0, 255, 0);
noTone(BUZZER_PIN);
}
else if (leitura < 5 || sensorValue >= limitYellow && sensorValue < limitRed ) {
// ATENÇÃO - Amarelo
setColor(175, 255, 0);
tone(BUZZER_PIN, 500); // Som constante mas grave
delay(100);
tone(BUZZER_PIN, 300);
setColor(0, 0, 0);
}
else {
// PERIGO - Vermelho
setColor(255, 0, 0);
// Alarme desesperador: agudo e rápido
tone(BUZZER_PIN, 2000);
delay(100);
tone(BUZZER_PIN, 1000);
setColor(0, 0, 0);
delay(50);
}
delay(200);
}
// Função auxiliar para facilitar a troca de cores
void setColor(int red, int green, int blue) {
analogWrite(RED_PIN, red);
analogWrite(GREEN_PIN, green);
analogWrite(BLUE_PIN, blue);
}