• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь в написании скетч

brizx

New member
Нужна помощь в написании скетч за вознаграждение. На даче интернет сделан на связке роутера кинетик+модем EP-06E....Нужно чтобы модем передавал СМС о впропадании питания 220V(роутер по питанию зарезервирую бесперебойником) .....ТЗ- при замыкании или размыкании пина ESP8266 nodemcu - железка должна во вайфай подключиться(ну я понимаю, что она при первом включении питания автоматом уже подключатся к роутеру) к роутеру кинетик экстра и по Telnet отправить команды
Пример: вход в роутер -логин telnet, потом пароль TelnetTelnet, далее команды - sms UsbQmi0 это для доступа к меню смс, и далее команда отправки смс на номер- send +7ХХХХХХХХХХ "no power 220V" . По крайней мере я так из дома удаленно подключился к роутеру по телнет с компьютера и все комады ушли...и получил СМС...
То есть нужна отправка смс , что пропало питание 220в. Очень выручите меня. Самому не одолеть...знаний нет и возраст уже под 60т.
 

dzanis

Member
brizx быстрее будет это спросить у чат-бота на основе нейросети . Вот что мне он ответил на ваш вопрос.

Здравствуйте! Я с удовольствием помогу вам написать этот код абсолютно бесплатно. Как искусственный интеллект, я не беру вознаграждений — мне достаточно того, что моя помощь будет вам полезна. Задача понятная и вполне решаемая.
Ниже я подготовил полный скетч (программу) для вашей платы ESP8266 NodeMCU, а также инструкцию, как это все подключить.

Что делает эта программа:

  1. Подключается к вашему Wi-Fi (Keenetic).
  2. Следит за ножкой (пином) D1 (GPIO 5).
  3. Если контакт на D1 размыкается (пропадает напряжение), плата заходит на роутер через Telnet и отправляет команду отправки SMS.
  4. Когда питание восстанавливается, она отправляет SMS "Power OK" (это можно отключить, если не нужно).

1. Схема подключения (Важно!)

Для того чтобы плата узнала, что 220В пропало, вам нужен датчик. Напрямую 220В к плате подключать нельзя — сгорит!
Самый простой и безопасный вариант:
  1. Возьмите любую старую зарядку от телефона (5 Вольт), воткните её в розетку без бесперебойника (ту, где пропадает свет).
  2. Возьмите маленькое реле на 5 Вольт или оптопару.
  3. Логика:
    • Пока свет есть -> зарядка дает 5В -> реле замкнуто -> Пин D1 на плате замкнут на GND (землю).
    • Свет пропал -> зарядка выключилась -> реле размкнулось -> Пин D1 "повис в воздухе" (размыкание).
  4. Изображение: ESP8266 NodeMCU pinout

    Shutterstock
Куда подключать провода от реле:
  • Один провод на пин GND (G)
  • Второй провод на пин D1

2. Скетч (Код)

Скопируйте этот код в Arduino IDE. Вам нужно только заменить данные в блоке "НАСТРОЙКИ" на свои.

C++:
#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);
}
}
Инструкция по настройке:

  1. Установка Arduino IDE: Если еще не установлена, скачайте её с официального сайта Arduino.cc.
  2. Добавление ESP8266:
    • В Arduino IDE зайдите в Файл -> Настройки.
    • В поле "Дополнительные ссылки для менеджера плат" вставьте: http://arduino.esp8266.com/stable/package_esp8266com_index.json
    • Зайдите в Инструменты -> Платформа -> Менеджер плат, найдите "esp8266" и нажмите "Установить".
  3. Загрузка:
    • Подключите NodeMCU к компьютеру по USB.
    • В меню Инструменты -> Платформа выберите NodeMCU 1.0 (ESP-12E Module).
    • Выберите правильный порт.
    • Нажмите кнопку "Загрузить" (стрелка вправо).

Важные нюансы

  • Логика работы: Скетч настроен так: если контакт между D1 и GND есть — значит все хорошо. Если контакт пропал — шлет тревогу. Это самый надежный способ (реле обесточено — контакт разомкнут).
  • Задержки (delay): В функции sendSmsViaTelnet я поставил задержки (delay(500) и т.д.). Telnet — штука не мгновенная, роутеру нужно время подумать после каждой команды. Если вдруг команды не проходят, можно попробовать увеличить эти значения (например, с 500 до 1000).
  • Безопасность: Вы указали пароль TelnetTelnet. Если это реальный пароль от вашего роутера, очень рекомендую после настройки сменить его на что-то более сложное и обновить в скетче.
Если у вас возникнут ошибки при компиляции (проверке) кода или вопросы, куда припаять проводок — пишите, я подскажу!
Хотите, я подробнее распишу, как сделать "датчик 220В" из старой зарядки и реле, чтобы не паять сложную схему?
 
Сверху Снизу