-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlarmaperimetral.cpp
147 lines (127 loc) · 3.96 KB
/
Alarmaperimetral.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <Ticker.h>
#include <BlynkSimpleEsp8266.h>
#define BLYNK_TEMPLATE_ID "TMPL2einD6e19"
#define BLYNK_TEMPLATE_NAME "Sistema Perimetral"
#define BLYNK_AUTH_TOKEN "OxOdz4K6aYFhAWFscgto1dGvR67gqAO3"
// Pines y variables
#define ALARM_PIN D7
#define SENSOR_PIN D2
#define ACTIVATION_PIN D1
#define LED_PIN D6
bool alarmActivated = false;
bool alarmTriggered = false;
unsigned long lastEventMillis = 0;
unsigned long eventInterval = 60000; // Intervalo para notificaciones (1 minuto)
// Servidor web
ESP8266WebServer server(80);
// Ticker para parpadear LEDs
Ticker ticker;
// Funciones auxiliares
void tick() {
int state = digitalRead(LED_PIN);
digitalWrite(LED_PIN, !state);
}
void configModeCallback(WiFiManager *myWiFiManager) {
Serial.println("Entrando en modo configuración");
Serial.println(WiFi.softAPIP());
ticker.attach(0.2, tick);
}
// Guardar eventos en SPIFFS
void saveEvent(const String &event) {
File logFile = SPIFFS.open("/events.txt", "a");
if (logFile) {
logFile.println(event);
logFile.close();
} else {
Serial.println("Error guardando el evento.");
}
}
// Mostrar historial de eventos
void handleShowLogs() {
if (!server.authenticate("admin", "admin")) {
return server.requestAuthentication();
}
String logs;
File logFile = SPIFFS.open("/events.txt", "r");
if (logFile) {
while (logFile.available()) {
logs += logFile.readStringUntil('\n') + "<br>";
}
logFile.close();
}
server.send(200, "text/html", "<h1>Historial de eventos</h1><p>" + logs + "</p>");
}
// Control de alarma desde la interfaz web
void handleControlAlarm() {
if (!server.authenticate("admin", "admin")) {
return server.requestAuthentication();
}
if (server.hasArg("state")) {
String state = server.arg("state");
if (state == "on") {
digitalWrite(ALARM_PIN, HIGH);
alarmActivated = true;
saveEvent("Alarma activada desde la web.");
} else {
digitalWrite(ALARM_PIN, LOW);
alarmActivated = false;
saveEvent("Alarma desactivada desde la web.");
}
}
server.send(200, "text/html", "<h1>Alarma actualizada</h1>");
}
void setup() {
Serial.begin(115200);
pinMode(ALARM_PIN, OUTPUT);
pinMode(SENSOR_PIN, INPUT_PULLUP);
pinMode(ACTIVATION_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
// Configuración inicial de LEDs
ticker.attach(0.6, tick);
// Iniciar SPIFFS
if (!SPIFFS.begin()) {
Serial.println("Error iniciando SPIFFS");
return;
}
// Configuración WiFi
WiFiManager wifiManager;
wifiManager.setAPCallback(configModeCallback);
if (!wifiManager.autoConnect("Alarma_Perimetral")) {
Serial.println("Error al conectar WiFi, reiniciando...");
ESP.restart();
}
ticker.detach();
digitalWrite(LED_PIN, LOW);
// Iniciar Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, WiFi.SSID().c_str(), WiFi.psk().c_str());
// Configuración del servidor web
server.on("/logs", handleShowLogs);
server.on("/control", handleControlAlarm);
server.begin();
Serial.println("Servidor web iniciado");
}
void loop() {
Blynk.run();
server.handleClient();
bool sensorState = digitalRead(SENSOR_PIN);
bool activationState = digitalRead(ACTIVATION_PIN);
if (sensorState && activationState) {
if (!alarmTriggered) {
alarmTriggered = true;
digitalWrite(ALARM_PIN, HIGH);
saveEvent("Alarma disparada por sensor.");
Blynk.notify("Intruso detectado. Alarma activada.");
}
} else {
alarmTriggered = false;
digitalWrite(ALARM_PIN, LOW);
}
if (millis() - lastEventMillis >= eventInterval && alarmTriggered) {
lastEventMillis = millis();
Blynk.notify("Recordatorio: Alarma activa.");
}
}