#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
// ---- WiFi (Wokwi) ----
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
// ---- URL a monitorar ----
String TARGET_URL = "https://www.icanadareparos.com.br/";
// ---- Pinos (seu diagrama) ----
const int PIN_LED = 5; // LED vermelho -> resistor -> GND
const int PIN_BUZZER = 3; // Buzzer -> GND
// ---- Parâmetros ----
const unsigned long CHECK_INTERVAL_MS = 10000; // 10 s
const unsigned long TIMEOUT_MS = 5000; // 5 s
const unsigned long LATENCY_SLOW_MS = 1500; // 1,5 s
// ---- Struct precisa vir antes da função ----
struct SiteResult {
bool ok;
int statusCode;
long latencyMs;
};
// ---- “Beep” sem PWM (liga/desliga) ----
void beep(unsigned long msOn=160, unsigned long msOff=120, int times=1) {
for (int i=0;i<times;i++){
digitalWrite(PIN_BUZZER, HIGH);
delay(msOn);
digitalWrite(PIN_BUZZER, LOW);
if (i<times-1) delay(msOff);
}
}
// ---- Checagem HTTP/HTTPS ----
SiteResult checkSite(const String& url) {
SiteResult r{false, -1, -1};
bool https = url.startsWith("https://");
WiFiClient *base = nullptr;
WiFiClientSecure *tls = nullptr;
if (https) {
tls = new WiFiClientSecure();
tls->setInsecure(); // ok para simulação
base = tls;
} else {
base = new WiFiClient();
}
HTTPClient http;
http.setTimeout(TIMEOUT_MS);
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
unsigned long t0 = millis();
if (!http.begin(*base, url)) {
if (tls) delete tls; else delete base;
return r;
}
int code = http.GET();
long elapsed = (long)(millis() - t0);
r.statusCode = code;
r.latencyMs = elapsed;
r.ok = (code > 0 && code < 500); // 2xx/3xx/4xx = respondeu; 5xx/erro = down
http.end();
if (tls) delete tls; else delete base;
return r;
}
void ensureWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
Serial.print("Conectando ao WiFi");
while (WiFi.status() != WL_CONNECTED) { delay(300); Serial.print("."); }
Serial.print("\nIP: "); Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_BUZZER, LOW);
ensureWiFi();
Serial.println("\n=== ESP32-C3 Monitor de Site ===");
Serial.print("Alvo: "); Serial.println(TARGET_URL);
}
unsigned long lastCheck = 0;
void loop() {
if (millis() - lastCheck >= CHECK_INTERVAL_MS) {
lastCheck = millis();
ensureWiFi();
SiteResult r = checkSite(TARGET_URL);
// log em JSON para o relatório
Serial.print("{\"status\":"); Serial.print(r.statusCode);
Serial.print(",\"latency_ms\":"); Serial.print(r.latencyMs);
Serial.print(",\"ok\":"); Serial.print(r.ok ? "true" : "false");
Serial.println("}");
if (r.ok) {
digitalWrite(PIN_LED, HIGH); // OK: LED aceso
digitalWrite(PIN_BUZZER, LOW); // buzzer off
if (r.latencyMs >= (long)LATENCY_SLOW_MS) {
// lento: 2 piscadas + 1 beep curto
for (int i=0;i<2;i++){ digitalWrite(PIN_LED, LOW); delay(70); digitalWrite(PIN_LED, HIGH); delay(70); }
beep(120, 0, 1);
}
} else {
// down: 3 piscadas + 3 beeps
for (int i=0;i<3;i++){ digitalWrite(PIN_LED, HIGH); delay(150); digitalWrite(PIN_LED, LOW); delay(150); }
beep(180, 120, 3);
}
}
}