Telegram-бот с кнопками на ESP8266: управление реле и таймером
Telegram-бот с кнопками делает управление устройствами удобным и интуитивным. Вместо ссылок или команд используем InlineKeyboard — кнопки с русским текстом всегда под сообщением. В проекте на ESP8266 управляем реле (вкл/выкл лампы), открываем веб-страницу и реализуем таймер на 1–10 минут. Проект идеален для умного дома: свет, розетки, полив или вентиляция через Telegram.
Возможности бота
Кнопки всегда на экране, текст на русском. Быстрое управление реле без задержек. Кнопка URL для перехода на сайт. Таймер включения на заданное время (1, 2, 10 мин или любое). Легко добавить больше кнопок и функций. Работает с любого устройства в интернете.
Необходимые компоненты
- ESP8266 (NodeMCU или Wemos D1 mini)
- Реле-модуль (низкий уровень)
- Нагрузка (лампа 12В или 220В через реле)
- Провода
Подключение реле
- VCC реле → 3.3V или 5V
- GND → GND
- IN → D5 (GPIO14)
Библиотеки
- ESP8266WiFi
- UniversalTelegramBot
- ArduinoJson
Полный скетч ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#define BOTtoken "YOUR_BOT_TOKEN"
#define CHAT_ID "YOUR_CHAT_ID"
#define RELAY_PIN D5
const char* ssid = "SSID";
const char* password = "PASS";
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
unsigned long relayOffTime = 0;
bool relayTimerActive = false;
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // реле выкл (LOW-активное)
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setInsecure(); // Telegram на ESP8266 без проверки сертификата
bot.sendMessage(CHAT_ID, "Бот запущен. Нажмите /start", "");
}
void handleNewMessages(int numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
String chat_id = bot.messages[i].chat_id;
// обычные сообщения
if (bot.messages[i].type == "message") {
String text = bot.messages[i].text;
if (text == "/start") {
String keyboardJson =
"["
"[{\"text\":\"Перейти на канал\",\"url\":\"https://youtube.com/channel\"}],"
"[{\"text\":\"ВКЛ\",\"callback_data\":\"ON\"},{\"text\":\"ВЫКЛ\",\"callback_data\":\"OFF\"}],"
"[{\"text\":\"1 мин\",\"callback_data\":\"TIME1\"},{\"text\":\"2 мин\",\"callback_data\":\"TIME2\"},{\"text\":\"10 мин\",\"callback_data\":\"TIME10\"}]"
"]";
bot.sendMessageWithInlineKeyboard(chat_id, "Выберите действие:", "", keyboardJson);
}
}
// inline-кнопки
if (bot.messages[i].type == "callback_query") {
String data = bot.messages[i].callback_data;
if (data == "ON") {
digitalWrite(RELAY_PIN, LOW);
relayTimerActive = false;
}
if (data == "OFF") {
digitalWrite(RELAY_PIN, HIGH);
relayTimerActive = false;
}
if (data.startsWith("TIME")) {
data.replace("TIME", "");
unsigned long minutes = data.toInt();
digitalWrite(RELAY_PIN, LOW);
relayOffTime = millis() + minutes * 60000UL;
relayTimerActive = true;
}
bot.answerCallbackQuery(bot.messages[i].query_id);
}
}
}
void loop() {
int numNewMessages = bot.getUpdates();
if (numNewMessages > 0) handleNewMessages(numNewMessages);
// неблокирующий таймер реле
if (relayTimerActive && millis() > relayOffTime) {
digitalWrite(RELAY_PIN, HIGH);
relayTimerActive = false;
}
delay(500);
}
Управляет реле через Telegram-бота:
/start — показывает клавиатуру
ВКЛ/ВЫКЛ — мгновенное управление
1/2/10 мин — включается на заданное время
Отправляет пользователю клавиатуру с кнопками включения/выключения реле и таймеров.
Управляет реле по командам Telegram и автоматически отключает его по таймеру.
Обрабатывает callback-запросы корректно и неблокирующе.
Как работает
Команда /start выводит клавиатуру. InlineKeyboardMarkup в JSON. Callback_data передаёт команды без нового сообщения. URL-кнопка открывает ссылку. Таймер: callback_data «TIME1» → включение на 1 минуту.
Заключение
Кнопки делают Telegram-бот профессиональным и удобным. Легко добавить управление несколькими реле, датчиками или меню. Идеальная основа для умного дома через Telegram.
FAQ — Telegram-бот с кнопками
Как создать Inline-кнопки в Telegram-боте?
Используйте sendMessageWithInlineKeyboard с JSON-клавиатурой. В callback_data передавайте команды для обработки.
Чем InlineKeyboard лучше ReplyKeyboard?
Inline не засоряет чат, работает через callback_query, поддерживает URL-кнопки.
Почему таймер неточный?
delay() блокирует loop. Лучше использовать millis() для неблокирующего таймера.
Можно несколько строк кнопок?
Да, в JSON массивы массивов: [[кнопка1, кнопка2],[кнопка3]].
Как добавить больше реле?
Определите несколько пинов, в callback_data передавайте «RELE1_ON» и обрабатывайте в handleNewMessages.
Работает ли с несколькими пользователями?
Да, проверяйте chat_id в сообщениях и разрешайте только авторизованным.
Как убрать уведомление о нажатии?
Вызовите bot.answerCallbackQuery(query_id) после обработки.