#include <ESP8266WiFi.h>
// ================= НАСТРОЙКИ (РЕДАКТИРОВАТЬ ЗДЕСЬ) =================
const char* ssid = "Keenetic-XXXX"; // Имя вашего Wi-Fi
const char* password = "wifi_password"; // Пароль от вашего Wi-Fi
const char* router_ip = "192.168.1.1"; // IP адрес роутера (обычно такой)
const int telnet_port = 23; // Порт Telnet (стандартный 23)
const char* router_login = "telnet"; // Логин от Telnet
const char* router_pass = "TelnetTelnet"; // Пароль от Telnet
// Номер телефона (формат зависит от модема, обычно +7...)
const char* phone_number = "+79000000000";
// Пин, к которому подключен датчик питания (реле)
const int sensorPin = D1;
// ===================================================================
WiFiClient client;
bool powerState = true; // true - есть питание, false - нет
void setup() {
Serial.begin(115200);
// Настраиваем пин с подтяжкой вверх (INPUT_PULLUP)
// Это значит: если контакт разомкнут = HIGH (3.3В), если замкнут на землю = LOW (0В)
pinMode(sensorPin, INPUT_PULLUP);
// Подключение к Wi-Fi
Serial.println();
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
// Считываем начальное состояние
// Если реле замкнуто (LOW) - свет есть. Если разомкнуто (HIGH) - света нет.
if (digitalRead(sensorPin) == LOW) {
powerState = true;
} else {
powerState = false;
}
}
void loop() {
// Читаем состояние пина
int currentReading = digitalRead(sensorPin);
// Если пин стал HIGH (разомкнулся) и раньше питание БЫЛО (powerState == true)
if (currentReading == HIGH && powerState == true) {
Serial.println("ALARM: Power Lost! Sending SMS...");
powerState = false; // Запоминаем, что света нет
// Ждем немного, чтобы исключить ложные срабатывания (дребезг контактов)
delay(2000);
if(digitalRead(sensorPin) == HIGH) { // Проверяем еще раз
sendSmsViaTelnet("NO POWER 220V");
}
}
// Если пин стал LOW (замкнулся) и раньше питания НЕ БЫЛО (powerState == false)
else if (currentReading == LOW && powerState == false) {
Serial.println("INFO: Power Restored. Sending SMS...");
powerState = true; // Запоминаем, что свет есть
delay(2000);
if(digitalRead(sensorPin) == LOW) {
sendSmsViaTelnet("POWER RESTORED");
}
}
delay(100); // Небольшая пауза
}
// Функция отправки команд по Telnet
void sendSmsViaTelnet(String messageText) {
if (!client.connect(router_ip, telnet_port)) {
Serial.println("Connection to router failed");
return;
}
Serial.println("Connected to router via Telnet");
// Читаем приветствие роутера (пропускаем его)
readTelnetResponse();
// 1. Вводим логин
client.println(router_login);
delay(500);
readTelnetResponse();
// 2. Вводим пароль
client.println(router_pass);
delay(1000); // Пауза побольше для входа
readTelnetResponse();
// 3. Входим в меню SMS (команда из вашего ТЗ)
client.println("sms UsbQmi0");
delay(500);
// 4. Формируем команду отправки
// Команда выглядит как: send +79990000000 "Text"
String command = "send " + String(phone_number) + " \"" + messageText + "\"";
client.println(command);
Serial.println("Command sent: " + command);
delay(2000); // Ждем пока смс уйдет
// 5. Выход
client.println("exit");
client.stop();
Serial.println("Disconnected");
}
// Вспомогательная функция для очистки буфера (чтобы видеть ответы в мониторе порта)
void readTelnetResponse() {
while (client.available()) {
String line = client.readStringUntil('\n');
Serial.print("Router: ");
Serial.println(line);
}
}