В этом руководстве рассмотрим, как управлять GPIO ESP32 или ESP8266 NodeMCU удаленно с помощью Telegram (изменение сигналов на выходе будет осуществляться с помощью бота Telegram). Мы будем использовать светодиоды, но, внеся несколько изменений, вы сможете адаптировать данный код под любые задачи.
Обзор проекта
В этом руководстве мы создадим простой проект, управляющий GPIO ESP32 или ESP8266 NodeMCU с помощью Telegram.
Вот, что будет рассмотрено в ходе проекта:
- Создание бота Telegram для платы ESP32 / ESP8266;
- Отправка команд /led_on и /led_off боту, по которым плата ESP получает сообщение и включает/выключает GPIO 2;
- Отправка команды /state, чтобы запросить текущее состояние GPIO. Когда ESP получает это сообщение, бот выводит текущее состояние GPIO;
- Отправка сообщения /start, по которой выводится приветственное сообщение с командами для управления платой.
Если вы не знакомы с Telegram…
Telegram Messenger – это облачный сервис обмена мгновенными сообщениями и IP-телефонии. Вы можете установить его на свой смартфон (Android и iPhone) или компьютер (ПК, Mac и Linux). Telegram позволяет создавать ботов, которых можно использовать для наших проектов.
Боты – это сторонние приложения, которые работают в Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API.
Создание бота Telegram
Зайдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие действия, чтобы создать бота Telegram. Сначала найдите «botfather » и щелкните BotFather, как показано ниже. Или откройте эту ссылку в своем смартфоне.
В следующем окне вам будет предложено нажать на кнопку /start.
Введите /newbot и следуйте инструкциям по созданию бота. Дайте ему название и логин.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к нему и токеном бота. Сохраните токен бота, он вам понадобится, чтобы обеспечить взаимодействие ESP32 с ботом.
Ограничьте доступ к боту
Любой, кто знает ваш логин бота, может его использовать. Чтобы убедиться, что мы игнорируем сообщения, поступающие не из нашей учетной записи Telegram, вы можете указать свой ID Telegram. В итоге, ESP будет проверять ID перед тем, как обрабатывать сообщение, полученное ботом Telegram.
В своем аккаунте Telegram найдите «IDBot» или перейдите по этой ссылке.
Начните чат с этим ботом и введите /getid. Вы получите ответ с вашим идентификатором пользователя. Сохраните этот ID.
Подготовка Arduino IDE
Для создания этого проекта нам потребуется плата ESP32, поэтому убедитесь, что у вас установлены дополнения для платы в среде Arduino.
Универсальная библиотека ботов Telegram
Для взаимодействия с ботом Telegram мы будем использовать универсальную библиотеку ботов Telegram, которая предоставляет достаточно простой интерфейс для Telegram Bot API.
Выполните следующие шаги, чтобы установить библиотеку.
- Скачайте библиотеку
- Перейдите Скетч > Подключить библиотеку > Добавить .ZIP библиотеку
- Добавьте только что загруженную библиотеку.
Важно: не устанавливайте библиотеку через диспетчер библиотек Arduino, так как он может установить устаревшую версию.
Все подробности о библиотеке можно найти на этой странице.
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги, чтобы установить библиотеку.
- Перейдите в Скетч> Подключить библиотеку > Управлять библиотеками .
- Найдите «ArduinoJson».
- Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Требуемые детали
В этом примере мы будем управлять светодиодами ESP:
- Плата ESP32
- Альтернатива – плата ESP8266
Скетч для управления выходами с помощью Telegram
Следующий код позволяет управлять GPIO ESP32 или ESP8266 NodeMCU, отправляя сообщения боту Telegram. Чтобы он работал у вас, необходимо ввести свои SSID и пароль от сети WiFi, токен бота Telegram и свой идентификатор пользователя Telegram.
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 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/telegram-control-esp32-esp8266-nodemcu-outputs/ Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot Example based on the Universal Arduino Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/examples/ESP8266/FlashLED/FlashLED.ino */ #ifdef ESP32 #include <WiFi.h> #else #include <ESP8266WiFi.h> #endif #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> // Замените учетными данными вашей сети const char* ssid = "ЗАМЕНИТЕ СВОИМ SSID"; const char* password = "УКАЖИТЕ СВОЙ ПАРОЛЬ"; // Токен вашего бота (полученный от Botfather) #define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // Используйте @myidbot чтобы узнать ID чата или группы // Чтоьы бот начал отправлять сообщения, сначало необходимо нажать "start" #define CHAT_ID "XXXXXXXXXX" #ifdef ESP8266 X509List cert(TELEGRAM_CERTIFICATE_ROOT); #endif WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); // Проверяет наличие новых сообщений раз в секунду int botRequestDelay = 1000; unsigned long lastTimeBotRan; const int ledPin = 2; bool ledState = LOW; // Определяем действия при получении новых сообщений void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); Serial.println(String(numNewMessages)); for (int i=0; i<numNewMessages; i++) { // Проверяем ID чата, с котрого пришел запрос String chat_id = String(bot.messages[i].chat_id); if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Unauthorized user", ""); continue; } // Выводи полученное сообщение в Serial String text = bot.messages[i].text; Serial.println(text); String from_name = bot.messages[i].from_name; if (text == "/start") { String welcome = "Welcome, " + from_name + ".\n"; welcome += "Use the following commands to control your outputs.\n\n"; welcome += "/led_on to turn GPIO ON \n"; welcome += "/led_off to turn GPIO OFF \n"; welcome += "/state to request current GPIO state \n"; bot.sendMessage(chat_id, welcome, ""); } if (text == "/led_on") { bot.sendMessage(chat_id, "LED state set to ON", ""); ledState = HIGH; digitalWrite(ledPin, ledState); } if (text == "/led_off") { bot.sendMessage(chat_id, "LED state set to OFF", ""); ledState = LOW; digitalWrite(ledPin, ledState); } if (text == "/state") { if (digitalRead(ledPin)){ bot.sendMessage(chat_id, "LED is ON", ""); } else{ bot.sendMessage(chat_id, "LED is OFF", ""); } } } } void setup() { Serial.begin(115200); #ifdef ESP8266 configTime(0, 0, "pool.ntp.org"); // Запрашивае UTC время с помощью NTP client.setTrustAnchors(&cert); // Сертификат для api.telegram.org #endif pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); // Подключение к WiFi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); #ifdef ESP32 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Сертификат для api.telegram.org #endif while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } // IP адрес вашей ESP в локальной сети Serial.println(WiFi.localIP()); } void loop() { if (millis() > lastTimeBotRan + botRequestDelay) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } lastTimeBotRan = millis(); } } |
Код совместим с платами ESP32 и ESP8266 NodeMCU (основан на примере для библиотеки Universal Arduino Telegram Bot). Код подключит нужные библиотеки в соответствии с выбранной платой.
Как работает код?
Подключаем нужные библиотеки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ifdef ESP32 #include <WiFi.h> #else #include <ESP8266WiFi.h> #endif #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> |
Вставьте свои учетные данные в следующие переменные.
1 2 3 |
const char * ssid = "ЗАМЕНИТЕ СВОИМ SSID"; const char * пароль = "УКАЖИТЕ СВОЙ ПАРОЛЬ"; |
Установите GPIO, которым хотите управлять. В нашем случае – GPIO 2 (встроенный светодиод)
1 2 3 |
const int ledPin = 2; bool ledState = LOW; |
Состояние диода по умолчанию LOW.
Примечание: если вы используете ESP8266, светодиод работает с инвертированной логикой. То есть, вы должны отправить сигнал LOW, чтобы включить светодиод, и сигнал HIGH, чтобы выключить его.
Вставьте токен бота Telegram, полученный от Botfather, в переменную BOTtoken.
1 |
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
Вставьте свой идентификатор чата Telegram. Он должен начинаться со знака «-».
1 |
#define CHAT_ID "-XXXXXXXXXX" |
Создайте новое соединение WiFi с WiFiClientSecure.
1 |
WiFiClientSecure client; |
Создайте бот с токеном и клиентом, введенными ранее.
1 |
UniversalTelegramBot bot(BOTtoken, client); |
botRequestDelay и lastTimeBotRan используются для проверки наличия новых сообщений в Telegram с заданной частотой. В этом случае код будет проверять наличие новdх сообщений каждую секунду (1000 миллисекунд). Вы можете изменить время задержки в переменной botRequestDelay.
1 2 3 |
int botRequestDelay = 1000; unsigned long lastTimeBotRan; |
handleNewMessages ()
Эта функция определяет действия программы при появлении новых сообщений.
1 2 3 4 5 |
void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); Serial.println(String(numNewMessages)); |
Проверяем доступные сообщения:
1 |
for (int i=0; i<numNewMessages; i++) { |
Получите идентификатор чата для этого сообщения и сохраните его в переменной chat_id.
1 |
String chat_id = String(bot.messages[i].chat_id); |
Если chat_id отличается от вашего идентификатора чата (CHAT_ID), это означает, что кто-то (не вы) отправил сообщение вашему боту. В этом случае игнорируем сообщение.
1 2 3 4 5 6 7 |
if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Неавторизованный пользователь", ""); continue; } |
В противном случае это означает, что сообщение было отправлено зарегистрированным пользователем. Сохраним в строковую переменную text и выведем её.
1 2 3 |
String text = bot.messages[i].text; Serial.println(text); |
Переменная from_name сохраняет имя отправителя.
1 |
String from_name = bot.messages[i].from_name; |
Если бот получит сообщение /start , ESP32 отправит команды для управления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (text == "/start") { String welcome = "Welcome, " + from_name + ".\n"; welcome += "Use the following commands to control your outputs.\n\n"; welcome += "/led_on to turn GPIO ON \n"; welcome += "/led_off to turn GPIO OFF \n"; welcome += "/state to request current GPIO state \n"; bot.sendMessage(chat_id, welcome, ""); } |
Отправить сообщение боту очень просто. Вам просто нужно использовать метод sendMessage() и передать в качестве аргументов идентификатор чата получателя, сообщение и режим парсинга.
1 |
bool sendMessage(String chat_id, String text, String parse_mode = "") |
В нашем примере мы отправим сообщение по идентификатору, хранящемуся в переменной chat_id (который соответствует человеку, отправившему сообщение), и отправим сообщение, сохраненное в переменной приветствия.
1 |
bot.sendMessage (chat_id, Welcome, ""); |
Если бот получает сообщение / led_on , то он должен включить светодиод, отправить подтверждающее сообщение и обновить переменную ledState.
1 2 3 4 5 6 7 8 9 |
if (text == "/led_on") { bot.sendMessage(chat_id, "LED state set to ON", ""); ledState = HIGH; digitalWrite(ledPin, ledState); } |
Тоже самое делаем и для команды / led_off .
1 2 3 4 5 6 7 8 9 |
if (text == "/led_off") { bot.sendMessage(chat_id, "LED state set to OFF", ""); ledState = LOW; digitalWrite(ledPin, ledState); } |
Примечание: если вы используете ESP8266, светодиод работает с инвертированной логикой. То есть, вы должны отправить сигнал LOW, чтобы включить светодиод, и сигнал HIGH, чтобы выключить его.
Наконец, если получена команда / state, проверяем текущее состояние GPIO и отправляем сообщение с состоянием.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (text == "/state") { if (digitalRead(ledPin)){ bot.sendMessage(chat_id, "LED is ON", ""); } else{ bot.sendMessage(chat_id, "LED is OFF", ""); } } |
setup()
Инициализируйте монитор последовательного порта.
1 |
Serial.begin(115200); |
Если вы используете ESP8266, вам необходимо использовать следующую строку:
1 2 3 4 5 |
#ifdef ESP8266 client.setInsecure(); #endif |
Установите светодиод как выход и задайте сигнал LOW при запуске ESP:
1 2 3 |
pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); |
Инициализируйте Wi-Fi и подключите ESP к вашей сети, используя SSID и пароль.
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 |
WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } void loop() { if (millis() > lastTimeBotRan + botRequestDelay) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } lastTimeBotRan = millis(); } } |
Когда придет новое сообщение, вызываем функцию handleNewMessages ().
1 2 3 4 5 6 7 8 9 |
while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } |
Примерно так и работает код.
Демонстрация
Загрузите код в ESP, откройте меню Инструменты> Плата и выберите плату , которую вы используете. Перейдите в Инструменты > Порт и выберите COM-порт, к которому подключена ваша плата.
После загрузки кода нажмите кнопку ESP EN / RST, чтобы запустить код. Затем откройте монитор порта чтобы посмотреть, что происходит в фоновом режиме.
Зайдите в Telegram и откройте группу.
Отправьте следующие команды и посмотрите, что отвечает бот:
- / start показывает приветственное сообщение с допустимыми командами.
- / led_on включает светодиод.
- / led_off выключает светодиод.
- / state запрашивает текущее состояние светодиода.
Встроенный светодиод должен включаться и выключаться (встроенный светодиод ESP8266 работает наоборот, он не горит, когда вы отправляете команду /led_on, и горит по команде /led_off).
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
21 комментарий. Оставить новый
у меня почему-то не загружает скетч пишет Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
Здравствуйте! Напишите полный код ошибки, которая у вас отображается – постараемся помочь.
Подключил esp8266 библиотеку и настроил плату и com-порт
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.3-gcc10.3-9bcba0b/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: core\core.a(core_esp8266_main.cpp.o): in function
__loop_end':
setup’C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.1\cores\esp8266/core_esp8266_main.cpp:189: undefined reference to
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.3-gcc10.3-9bcba0b/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: core\core.a(core_esp8266_main.cpp.o):(.text._ZL12loop_wrapperv+0xc): undefined reference to
loop'
_ZL12loop_wrapperv’:c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.3-gcc10.3-9bcba0b/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: core\core.a(core_esp8266_main.cpp.o): in function
C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.1\cores\esp8266/core_esp8266_main.cpp:193: undefined reference to
setup'
loop’c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.3-gcc10.3-9bcba0b/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.1\cores\esp8266/core_esp8266_main.cpp:196: undefined reference to
collect2.exe: error: ld returned 1 exit status
Несколько библиотек найдено для “ESP8266WiFi.h”
Используется: C:\Users\User\Documents\Arduino\libraries\ESP8266WiFi
Не используется: C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.1\libraries\ESP8266WiFi
exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
Добрый вечер. Не загружает скетч пишет Ошибка компиляции для платы NodeMCU 1.0/0.9 (ESP-12E Module).
c:/users/���/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: core\core.a(core_esp8266_main.cpp.o): in function
__loop_end':
setup’C:\Users\���\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\cores\esp8266/core_esp8266_main.cpp:167: undefined reference to
c:/users/���/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\���\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\cores\esp8266/core_esp8266_main.cpp:167: undefined reference to
loop'
loop_wrapper()’:c:/users/���/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: core\core.a(core_esp8266_main.cpp.o): in function
C:\Users\���\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\cores\esp8266/core_esp8266_main.cpp:173: undefined reference to
setup'
loop’c:/users/���/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\���\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.0\cores\esp8266/core_esp8266_main.cpp:174: undefined reference to
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы…
Бот отправляет сообщения, но полностью отказывается их читать. В чём проблема?
Что мешало привести пример скетча целиком ?
c:/users/samve/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\samve\AppData\Local\Temp\arduino\cores\16636fd35038c95688f72b9653699219\core.a(main.cpp.o):(.literal._Z8loopTaskPv+0x8): undefined reference to
setup()'
loop()’c:/users/samve/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\samve\AppData\Local\Temp\arduino\cores\16636fd35038c95688f72b9653699219\core.a(main.cpp.o):(.literal._Z8loopTaskPv+0xc): undefined reference to
c:/users/samve/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\samve\AppData\Local\Temp\arduino\cores\16636fd35038c95688f72b9653699219\core.a(main.cpp.o): in function
loopTask(void*)':
setup()’C:\Users\samve\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\cores\esp32/main.cpp:42: undefined reference to
c:/users/samve/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\samve\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\cores\esp32/main.cpp:48: undefined reference to `loop()’
collect2.exe: error: ld returned 1 exit status
exit status 1
Compilation error: exit status 1
Esp8266.h No such file of directory
Что делать?
Добрый день!
Эта ошибка говорит о том, что компилятор не может найти файл Esp8266.h. Убедитесь, что вы правильно выбрали плату в настройках скетча.
На плате ESP8266 можно адекватно настроить отправку команд, чтобы ON – это включить, а OFF – выключить? А не наоборот
Здравствуйте! Для этого необходимо заменить строку 73 в коде на ledState = LOW;, а строку 79 на ledState = HIGH;, т.е. поменять их местами.
Это связано с тем, что на ESP8266 светодиод работает с инвертированной логикой, т.е. включается при подаче низкого уровня сигнала и выключается при высоком уровне.
Добрый день!
Сообщение ошибки:
Missing FQBN (Fully Qualified Board Name)
Compilation error: Missing FQBN (Fully Qualified Board Name)
Добрый день!
Эта ошибка возникает, если у вас не выбрана целевая плата. Если у вас в Arduno IDE отсутствует нужная вам версия платы, то вам необходимо дополнительно установить её поддержку в Arduino IDE.
C:\Users\User\Documents\Arduino\RemoteControlComp_WiFi\RemoteControlComp_WiFi.ino:101:12: error: ‘class WiFiClientSecure’ has no member named ‘setTrustAnchors’
client.setTrustAnchors(&cert); // Сертификат для api.telegram.org
^
C:\Users\User\Documents\Arduino\RemoteControlComp_WiFi\RemoteControlComp_WiFi.ino:101:29: error: ‘cert’ was not declared in this scope
Добрый день.
Извините за предыдущее сообщение -поторопился нажать кнопку.
Ваш скетч практически один-в-один (небольшие правки в обработчиках сообщений), плата Node MCU ESP8266… Всё делал по данной статье, при попытке загрузить скетч в плату вываливаются ошибки вот на эту строку:
client.setTrustAnchors(&cert);
Что не так у меня? Спасибо, с уважением
Здравствуйте!
Ошибка
class WiFiClientSecure’ has no member named ‘setTrustAnchors’
может указывать на то, что вы используете неправильную библиотеку для работы с WiFi. Убедитесь, что вы используете именноESP8266WiFi.h
, неWiFi.h
.Вторая ошибка
‘cert’ was not declared in this scope
говорит о том, что у вас не была объявлена переменнаяcert
. Убедитесь, что вы объявили эту переменную в начале скетча:X509List cert(TELEGRAM_CERTIFICATE_ROOT);
Также убедитесь, что в Arduino IDE выбрана правильная плата.
Спасибо! на объявление cert вот так ругается IDE: C:\Users\User\Documents\Arduino\FlashLED\FlashLED.ino:35:1: error: ‘X509List’ does not name a type
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
Compilation error: ‘X509List’ does not name a type
Эта ошибка говорит о том, что программа не может найти определение класса
X509List
. Этот класс определён внутри библиотеки ESP8266WiFi в файле WiFiClientSecureBearSSL.h. Попробуйте также включить этот файл в вашу программу:#include <WiFiClientSecureBearSSL.h>
.Если это не поможет, возможно, библиотека ESP8266WiFi была установлена неправильно. Переустановите её со всеми зависимостями либо попробуйте обновить до последней версии.
Перепробовал несколько вариантов. файла WiFiClientSecureBearSSL нигде не нахожу. Не подскажете ли где взять правильную библиотеку?
Спасибо
Библиотеку можно установить через менеджер библиотек в Arduino IDE либо скачать с github: https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi.
Огромное спасибо! Всё получилось!