#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <WiFi.h>
//-- SIMULADOR YL-83
#define RAIN_ANALOG 34
#define RAIN_DIGITAL 35
//-- BMP280
#define BMP_SCK (26)
#define BMP_MISO (25)
#define BMP_MOSI (32)
#define BMP_CS (33)
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
//-- HC-R04
#define ECHO_PIN 16
#define TRIG_PIN 17
float distanciaAnterior = 0;
const int intervalo = 1000;
String getIdentificador() {
uint64_t chipid = ESP.getEfuseMac(); // Pega o MAC (64 bits)
char id[20];
snprintf(id, sizeof(id), "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
return String(id);
}
String identificador;
void setup() {
Serial.begin(9600);
identificador = getIdentificador();
pinMode(RAIN_ANALOG, INPUT);
pinMode(RAIN_DIGITAL, INPUT);
analogReadResolution(10);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
distanciaAnterior = lerDistanciaCM();
unsigned status;
status = bmp.begin();
if (!status) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(), 16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
}
Serial.begin(9600);
Serial.print("Conectando-se ao Wi-Fi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Conectado!");
}
float lerDistanciaCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracao = pulseIn(ECHO_PIN, HIGH, 30000); // timeout de 30ms
if (duracao == 0) return -1; // sem leitura válida
return duracao * 0.034 / 2;
}
void loop() {
/* SIMULADOR YL-83
> 800 = Seco
600–800 = Garoa
300–600 = Chuva
< 300 = Tempestade
*/
int rainAnalog = analogRead(RAIN_ANALOG);
Serial.print("analogRead Rain amount: ");
Serial.println(rainAnalog);
// Classificação
char classificacaoChuva;
if (rainAnalog > 800) {
classificacaoChuva = 'S'; // Seco
} else if (rainAnalog > 600) {
classificacaoChuva = 'G'; // Garoa
} else if (rainAnalog > 300) {
classificacaoChuva = 'C'; // Chuva
} else {
classificacaoChuva = 'T'; // Temporal
}
Serial.print("Classificação da chuva (Baseado no analogico): ");
Serial.println(classificacaoChuva);
Serial.println();
/* SIMULADOR BMP280 */
// Lê a pressão do sensor em Pascais (Pa)
float pressurePa = bmp.readPressure();
// Converte a pressão de Pascais para hectopascais (hPa)
// 1 hPa = 100 Pa, então dividimos por 100
float pressurehPa = pressurePa / 100.0;
// Lê a temperatura do sensor em graus Celsius
float temperature = bmp.readTemperature();
// Calcula a altitude aproximada em metros usando a pressão padrão do nível do mar (1013.25 hPa)
float altitude = bmp.readAltitude(1013.25);
// Imprime a temperatura
Serial.print("Temperatura = ");
Serial.print(temperature);
Serial.println(" *C");
// Imprime a pressão convertida para hPa
Serial.print("Pressao = ");
Serial.print(pressurehPa);
Serial.println(" hPa");
// Imprime a altitude aproximada
Serial.print("Altitude = ");
Serial.print(altitude);
Serial.println(" m");
Serial.println();
/* SIMULADOR BMP280 */
float distanciaAtual = lerDistanciaCM();
if (distanciaAtual < 0) {
Serial.println("Falha na leitura");
delay(intervalo);
return;
}
Serial.print("Distância atual: ");
Serial.print(distanciaAtual);
Serial.print(" cm | Anterior: ");
Serial.print(distanciaAnterior);
Serial.print(" cm");
if (distanciaAtual < distanciaAnterior - 1) { // margem de 1cm
Serial.println(" -> Nível SUBIU!");
} else {
Serial.println(" -> Nível estável ou baixou.");
}
Serial.println("---------------------------------------");
// LOG PARA O BANCO DE DADOS
Serial.print(rainAnalog);
Serial.print(";");
Serial.print(temperature);
Serial.print(";");
Serial.print(pressurehPa);
Serial.print(";");
Serial.print(altitude);
Serial.print(";");
Serial.print(distanciaAtual);
Serial.print(";");
Serial.print(distanciaAnterior);
Serial.print(";");
Serial.println("00");
Serial.println("---------------------------------------");
Serial.println("");
distanciaAnterior = distanciaAtual;
delay(intervalo);
}