Blink программа

Blink программа

Котаны, читайте на здоровье!

×

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

Закрыть

01.Basics: Blink
Добавляем свой светодиод (+светодиод)

Будем постепенно знакомиться с основами программирования, платой и другими полезными вещами. Это позволит избежать стресса от потока новой информации.

Хотя я немного разбираюсь в программировании, сегодня притворюсь, что никогда не слышал о языках программирования и постараюсь максимально доходчиво показать, как новичок осваивает новую для себя деятельность.

Во-первых, нам придётся писать примеры на C++-подобном языке. Поэтому можете похвастаться перед знакомыми, что пишите программы на C++. Во-вторых, он очень упрощённый, и вам не нужно бояться его.

01.Basics: Blink

Второй пример будет немного сложнее, ведь придётся подключать плату к компьютеру. Но есть и хорошая новость — нам не понадобятся дополнительные прибамбасы в виде проводов, датчиков, светодиодов, кнопок. Дело в том, что на плате уже есть один маленький встроенный светодиод, вот мы его и включим.

Выбираем нашу плату — в меню Tools | Board (Сервис | Плата) должна быть отмечена Arduino Uno (как правило по умолчанию она уже отмечена). У вас может быть другая плата. Естественно, вы должны уже подключить плату к компьютеру через USB-порт для загрузки скетча в микроконтроллер.

Теперь нужно выбрать последовательный порт. Опять идём в меню Tools | Serial Port (Сервис | Последовательный порт) и выбираем нужный порт (обычно это COM3 или COM4).

Теперь нам необходимо загрузить открытый пример Blink на микроконтроллер. Просто щёлкните на кнопкуUpload (Загрузить) и внимательно смотрите на плату. Вы увидите, что светодиоды, помеченные как RX и TX будут мигать. После успешной загрузки примера в контроллер, в строке состояния среды разработки появится надпись Done uploading (Загрузка выполнена).

Ещё ниже в области консоли будет выведено сообщение:
Sketch uses 930 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.

В сообщение выводится информацию об используемой памяти. Программа настолько проста, что почти ничего не потребляет (0% оперативной памяти и 2% постоянной памяти).

Через несколько секунд после загрузки, вы можете увидеть, что светодиод, помеченный на плате как 13 (L), будет мигать оранжевым цветом. Поздравляю, вы успешно установили среду разработки и запустили свою первую программу!

Обращу внимание, что в комментариях к коду написано, что листинг менялся несколько раз. Так выглядел код в предыдущий раз.

// Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13; // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

Сравните с текущей версией.

// the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

Теперь вместо создания отдельной переменной led используется встроенная константа LED_BUILTIN. Это удобно, так как в разных платах используются разные значения для встроенного светодиода и таким образом программа получилась универсальной.

Возвращаемся к первой программе BareMinimum. Откройте скетч и сделайте сначала первую вещь — нажмите на кнопку Verify (первый значок с галочкой). Среда разработки переводит ваш код в машинный код, т.е. компилирует. Если в вашем коде есть ошибка, то компилятор выведет сообщение. Это полезно, чтобы не тратить зря время на загрузку заведомо неработающей программы. Давайте сознательно сделаем ошибку — напишем код в функции setup().

void setup() { // put your setup code here, to run once: int cat = «Я люблю котиков»; }

С точки зрения кошатника, здесь всё написано правильно. Предложение написано без ошибок, есть даже точка с запятой в конце строки — всё как положено.

Проверим. Нажимаем кнопку Verify и видим сообщения с красным текстом. Его текст приводить не буду, сами убедитесь. Если программа с ошибкой, то нет смысла её загружать на плату. Даже если вы очень упрямый и всё-равно нажмёте кнопку Upload, то получите ту же ошибку. Иными словами, Upload сначала самостоятельно выполняет операцию Verify и при отсутствии ошибки загружает скетч.

Разбор примера

Мы запустили программу, чтобы помигать светодиодом. Но делали это неосознанно, повторяя шаг за шагом описываемые действия. В дальнейшем вам придётся самому писать код, а значит пора ознакомится с основами программирования.

Изучим код шаг за шагом.

В функции setup() мы видим три строчки:

// the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); }

Приблизительный перевод комментариев, которые используется в функции setup() можно перевести как:

// инициализируем цифровой порт как вывод

Дальше следует сам код, который делает операцию, описанную в комментариях. Обратите внимание, что команда завершается точкой с запятой:

pinMode(LED_BUILTIN, OUTPUT);

В старых версиях код был немного другим:

// очень старый вариант pinMode(13, OUTPUT); // обновлённый вариант pinMode(led, OUTPUT);

Разработчики позже написали более грамотный код, вынеся число 13 в отдельную переменную led.

// Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13;

Комментарий можно перевести как:

// Порт 13 в большинстве плат Arduino соединён со светодиодом

Сейчас код обновили, и вместо переменной led используют константу LED_BUILTIN. Такой подход удобен, так как не все платы Arduino имеют встроенный светодиод на порту 13. Если у вас две разные платы и одна из них имеет нестандартный номер, то вам не придётся переписывать пример под каждую плату. Например, у плат MKR1000 встроенный светодиод находится на порту 6.

Нам встретилась новая функция pinMode(), которая устанавливает режим для портов. Функция состоит из двух параметров. В первом параметре указывается порт, с которым мы собираемся работать. Во втором параметре мы сообщаем, как должен работать указанный порт: работать на выход (OUTPUT) или вход (INPUT). В нашем примере, вывод под номером 13 (или другой порт, используемый встроенным светодиодом) должен выводить информацию (посылать сигнал), то есть давать указание мигать светодиоду.

Мы определили в функции setup() необходимые данные для начала работы и теперь можем приступить к непосредственной реализации задачи в функции loop().

// Старый вариант // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } // Современный вариант // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

Здесь мы видим уже четыре строчки кода. Первая строчка включает светодиод при помощи функции digitalWrite(). В первом параметре мы указываем номер порта, с которым собираемся работать, а во второй указываем константу HIGH. Забегая вперёд, могу сказать что константа HIGH равна 1, и можно было написать digitalWrite(13, 1). Но такая запись не очень удобна, так мельтешение цифр в большом проекте затрудняет чтение кода. А здесь вы сразу видите, что на порту под номером 13 включается светодиод.

Далее идёт команда, отвечающая за паузу — delay(), которая имеет один параметр — количество времени в миллисекундах. В нашем примере мы сделали паузу в одну секунду (1000 миллисекунд = 1 секунда).

Следом идёт уже знакомая нам функция digitalWrite(), но уже с параметром LOW, который выключает светодиод (значение константы LOW равно 0).

И последняя строчка снова делает паузу в одну секунду.

Посмотрим, как работает программа. Когда мы загружаем программу в микроконтроллер, то Arduino активирует порт 13 в режиме выхода (функция setup()), а затем начинает последовательно выполнять четыре строчки из функции loop(): включает диод-пауза-выключает диод-пауза. Когда эти четыре строчки будут выполнены, то они снова будут вызваны и будут повторяться до тех пор, пока мы не выдернем кабель.

Немного о паузе. Теоретически можно убрать вызов функции delay() и программа будет работать. Проблема в другом — контроллер работает с частотой 16 миллионов герц (герц — одно колебание в секунду; если команда длится один такт, вывод переключается 16 миллионов раз в секунду, соответственно, состояние вывода меняется каждые 0,0000000625 секунды), человеческий глаз не способен увидеть реакцию светодиода. Необходимо немного увеличить интервал между двумя командами включения и выключения светодиода.

Что мы можем изменить в данной программе? По большому счету ничего — мы можем установить только собственные значения пауз. Поэкспериментируйте с этим. Другие изменения результата не принесут — нет смысла, например, сейчас использовать другой порт или использовать режим INPUT.

Добавляем свой светодиод (+светодиод)

Мы научились мигать встроенным светодиодом. Но на самом деле у вас не будет возможность пользоваться встроенными компонентами, а придётся самостоятельно собирать нужную конструкцию и взаимодействовать с ней. Поэтому нам понадобится отдельный светодиод, который и будет у нас и мигать, и затухать, и кашу варить (насчёт последнего я, пожалуй, погорячился). Можно использовать любой светодиод — красный, зелёный, синий.

Напомню, что диод проводит ток в одном направлении. Следовательно, необходимо всегда правильно устанавливать светодиод в своих схемах. Встроенный светодиод уже правильно припаян к плате Arduino (скажем спасибо разработчикам).

В светодиодах короткую ножку («минус») светодиода нужно соединять с землёй (GND). Светодиод не рассчитан на большой ток. Чтобы не повредить светодиод, используйте с ним резистор. Он позволяет уменьшить силу тока. В противном случае светодиод прослужит недолго или просто сгорит. Полярность резисторов не важна. Сам резистор можно подключать как до светодиода, так и после него. Я привык сначала ставить резистор, а потом светодиод по направлению от источника питания к земле.

Из первого примера с встроенным светодиодом мы помним, что он использует вывод под номером 13 (на большинстве плат). На плате есть свободный вывод с этим номером, который находится рядом с выводом GND. Берём светодиод и вставляем в эти выводы. Не забываем, что короткую ножку вставляем в GND, а длинную в вывод 13. У вывода 13 уже установлен резистор, поэтому светодиод не сгорит.

Запускаем снова программу Blink. Теперь будут мигать два светодиода: встроенный и наш. Красота!

Вернёмся к светодиодам. Как правило, в цепи идёт слишком большой ток для светодиодов. Чтобы уменьшить силу тока, используют токопонижающие резисторы (сопротивления). У светодиодов есть важные характеристики: ток питания и напряжение падения (Forward voltage). Невероятно, но факт — светодиоды разных цветов используют разные значения напряжения падения. Максимальный ток для светодиодов колеблется в районе 20 миллиампер. Для вычисления значения сопротивления используют формулу: из напряжения питания вычитаем напряжение падения и результат делим на силу тока в светодиоде в амперах. В документации обычно рекомендуют использовать резистор от 220 ohm до 1K ohm. На практике, можно использовать и 100 ом. Если поставите меньше, то будет риск спалить светодиод. При выполнении опытов с несколькими светодиодами вы можете установить разные резисторы, чтобы увидеть разницу.

На следующем уроке мы поближе познакомимся с цифровыми выводами и попробуем изменять программы под свои нужды.

Реклама

Еэспэшники — вливайтесь в ряды блинкеров!
Сегодня мы за 5 минут настроим управление ESP8266 с вашего смартфона (iOS или Android) с помощью нового облачного сервиса Blink. Видео и подробности под катом.

Установите приложение Blynk на смартфон

Зарегистрируйтесь в приложении и создайте новый проект.

Создание нового проекта в Blynk

Введите название проекта, например ESP8266. В поле Hardware Model выберите ESP8266. (надеюсь, что вы заметите впечатляющий список поддерживаемого оборудования) Автоматически сгенерированный Auth Token отправьте на свой почтовый ящик.

Проект Blynk

После нажатия на кнопку Create вам станет доступно пустое поле для проектирования UI вашей панели управления ESP8266.

Пустой проект Blynk

Жмете на плюсик вверху справа — появится панель инструментов Widget Box для добавления виджетов на вашу панель управления. Стоит заметить, что список виджетов еще будет пополняться.

Виджеты Blynk

Для пробы выберем тип виджета Button — этот виджет сразу добавится на вашу панель. Отредактируйте его одним прикосновением. Название можно не заполнять, чуть правее можно выбрать цвет индикатора, в поле OUTPUT PIN выберите справа Digital, а слева любой свободный пин GPIO. Ниже переключите тип кнопки на Switch.

Blynk button

На моей отладочной плате к светодиодам разведено 10 GPIO — я все их подключу к панели Blynk.

Все, интерфейс готов, пока отложите смартфон в сторонку.

Если вы еще не знакомы с Arduino IDE для ESP8266 — почитайте и . Установите Arduino IDE, как описано .

Далее установите библиотеку Blynk в Arduino IDE. В этом вам поможет официальная инструкция. Также можете взять библиотеку самую последнюю версию прямо из репозитария и установить вручную. Далее выбираем пример ESP8266_Standalone и прописываем в нем Auth Token, который мы получили по почте, SSID и пароль вашей WiFi сети. Компилируем и заливаем скетч в ESP8266.

ESP8266 Blynk

Вот, собственно, и все.

Возвращаемся к нашему приложению на смартфоне, жмем маленький треугольничек, похожий на кнопку Play, в верхнем правом углу и переходим из режима редактирования проекта в режим управления ESP8266 и жмем созданные нами кнопочки и мигаем светодиодами, как на видео в начале статьи.

Замечания

1. Стоит отметить, что еще есть возможность использовать ESP8266 в качестве WiFi шилда для ардуино.

2. Облачный сервер Blynk — open source и может быть развернут в вашей локальной сети

P.S. Blynk на Kickstarter неплохо отработал — собрал почти 50k

Команда Blynk:

Не могу не сообщить, что создал этот суперклассный дизайн интерфейса Vitalii Kramar

Большое еспэшное СПАСИБО вам!

Обсуждение Blynk на нашем форуме

Все статьи →

Начитавшись чужих статей по умному дому я тоже захотел сделать свою дачу немного умней. Начал с того, что собрал на iboard и ds18b20 температурный датчик и всегда мог узнать какая температура на даче и даже получить СМС, если она опустилась ниже 5 градусов (могут замерзнуть трубы) или поднялась выше 30 (либо посреди зимы настало лето, либо у меня сейчас будет пожар). Но от того, что я знал какой дубарь сейчас на даче теплее мне не становилось. И следующим шагом я решил сделать возможность удаленно включать насос теплых полов, чтобы, утром нажав кнопку на телефоне обеспечивать по приезду на дачу комфортную температуру в доме. Можно было бы добавить к iboard реле, но, во-первых, эзернета у меня в котельной нет, во-вторых хотелось попробовать чего-то проще и желательно дешевле (с iboard я потратил несколько вечеров на программирование, да и бюджет вышел не самый низкий).

Полазив по интернетам выбрал самое простое, на мой взгляд, решение — Sonoff. В общем-то эта штука умеет все что мне надо и осталось только подключить к ее входу вилку, а к выходу – розетку. Установив на телефон приложение EWeLink из Play маркета я подружил его со своим Sonoff и имел возможность нажимая на кнопку включать-выключать нагрузку.

На этом рассказ можно было бы закончить — одно недорогое устройство полностью решило мою задачу и можно было бы приниматься за следующие шаги по автоматизации, если бы не одно НО: приложение управляет устройством не напрямую и даже не через локальную сеть, а через облачный сервис производителя и если у них какие-то проблемы с серверами, то управлять устройством уже не получится. Сначала я решил закрыть на это глаза, но однажды, собираясь уезжать с дачи, я обнаружил в приложении надпись Network unavailable. Попытки выключить теплый пол ни к чему не привели. Можно было бы конечно поехать домой и попробовать выключить мой Sonoff позже, когда они починят свое облако, но что будет если у них серьезные проблемы и сервис не поднимется в течение нескольких дней? За неделю газу нагорит на несколько таких Sooff-ов, не ехать же специально на дачу среди недели, чтобы выключить то, что должно было выключаться удаленно? Пришлось отключить устройство и забрать его домой на переделку. Попробуем отказаться от сторонних сервисов, а заодно попробуем немного улучшить функционал добавив к нему датчик влажности и температуры, чтобы знать какая температура в котельной.

Начал я с разбора модуля и подпайки разъемов для прошивки. Поскольку это проект с открытым исходным кодом (по крайней мере аппаратная часть, на счет программной не уверен), то есть и принципиальная схема, по которой можно разобраться какие выводы куда выведены. Пять отверстий поперек платы это интерфейс для перепрошивки модуля (обведен на фото красным овалом) и свободный GPIO14, который можно использовать под свои нужды (обведен фиолетовым). К последнему я подключу датчик температуры и влажности DHT22. Так же, можно откусить светодиод и кнопку, тогда появится еще два свободных GPIO, например для подключения еще двух реле.

Само-собой перед разборкой надо отключить устройство от сети 220В.

Вот распиновка разъема для программирования.

Я использую USB-UART преобразователь Foca, во-первых его делает та же компания, которая выпускает Sonoff и его распиновка полностью подходит, во-вторых потому, что на нем есть переключатель 3.3 – 5В, что очень удобно, т.к. к примеру, тот же ESP8266 сгорит от подачи 5В, а какая-нибудь Ардуина не заведется от 3.3В). Теперь настало время стереть стоковую прошивку и влить что-то свое.

Вариантов альтернативных прошивок для модуля ESP8266 на котором построен Sonoff достаточно много, но мне хотелось иметь возможность управлять не только через браузер, а и через приложение на телефоне. Писать программы под Android я не умею, поэтому решил воспользоваться сервисом Blynk.cc, который предоставлял и прошивку (кстати, не только к ESP8266, а и к куче разновидностей Arduino и других плат, о которых я даже не слыхал) и позволял в несколько кликов сделать свое приложение для Android или iOS.

Вообще простота работы с blynk просто поражает – ставим приложение, создаем в нем новый проект, выбираем какую плату мы используем (в случае с Sonoff это ESP8266), получаем ключ устройства (Auth token). Теперь открываем Arduino IDE, подключаем к нему библиотеку Blynk и прошиваем в наше устройство самый простой пример, чтобы подтвердить, что он действительно простой я приведу его код здесь:

char auth = «1234567890abcdef1234567890abcdef «; //токен, сгенерированный приложением

char ssid = «MyWifi»;//имя моей точки доступа

char pass = «MyWifiPassword»; //пароль от нее

void setup()

{

Serial.begin(9600);//инициируем последовательный интерфейс для дебага. Сюда будут выводиться служебные сообщения

Blynk.begin(auth, ssid, pass);//подключаемся к серверу blynk

}

void loop()

{ Blynk.run(); //вся магия в одной строчке

}

Заливаем его в Sonoff и всё — для удовлетворения большинства моих запросов больше ничего программировать не надо, остальное будем делать в приложении. Но мы ведь не указали, какие выводы у нас будут использоваться, что из них будет выходом, а что входом, использовать ли подтяжки, куда слать данные и как реагировать на запросы из вне, скажете вы. А это все уместилось в одной строчке

Blynk.run();

Основной функционал может набиваться в приложении – какой пин дернуть по нажатии на кнопку, как изменить вывод сигнала PWM при изменении положения слайдера, и много другое. Конечно для реализации специфических фич, код прошивки надо будет модифицировать, но все равно по сравнению со скетчем для iboard, с blynk все гораздо проще.

Правда тут есть одно НО: я ушел от облачного сервиса Itead, что бы ни от кого не зависеть и перешел… на облачный сервис Blynk.cc. Это правда, но нюанс в том, что Blynk позволяет запустить свой собственный сервер — хоть у себя в локалке на Raspberry Pi. Не буду подробно на этом останавливаться, инструкция по развертыванию есть в документации и там все тоже не сложно.

Вернемся к приложению. Начал я с того, что добавил кнопку и задал ей управление выходом GPIO12 (это зеленый светодиод на Sonoff). Перешел в режим просмотра (кнопочка Play в верхнем правом углу) и смог ею включать/выключать светодиод! Если поменять GPIO с 12, на 13, то я буду управлять встроенным реле. Неплохо за полчаса работы? Пойдем дальше – добавим слайдер и привяжем его к тому же светодиоду – теперь двигая слайдер я могу изменять яркость свечения светодиода. Таким образом подсоединив этот выход к диммеру я смогу регулировать освещение с телефона. Вообще возможности интерфейса blynk можно описывать долго, остановлюсь только кратко на некоторых

  • Таймер, позволяет задать действия, привязанные к временным интервалам. Хранятся на сервере и запустят событие на устройстве, даже, если ваш телефон выключен
  • Уведомления о событиях в твитер, на e-mail, смартфон
  • GPS триггер – посылает событие на устройство, если телефон прибыл или вышел из указанной зоны
  • Привязка событий к другим датчикам телефона, например, к акселерометру
  • Удобный конструктор отображения информации — графики, менюшки, окошки, таблицы и даже консоль, для любителей командной строки

С реле разобрались, можно ковырять дальше. Но для начала хотелось бы избавиться от необходимости регулярного подключения устройства к компьютеру для обновления прошивки. Для этого уже есть написанные примеры, которые позволяют прошивать устройство прямо из Arduino IDE по воздуху. Реализуется библиотекой ArduinoOTA (ну куда ж без ардуины). Правда, в документации сказано, что для этого устройство должно быть в той же локальной сети, но я думаю, что пробросив порт через роутер (по умолчанию порт 8266) это ограничение можно обойти.

Теперь можно начать экспериментировать с датчиком температуры и влажности. Я выбрал DHT22, он хоть дороже, но зато точнее – плюс-минус 0.1 градус, в отличии от DHT11 у которого плюс-минус 1 градус. На плате есть дублирующие выводы питания, чтобы не трогать гребенку для программирования подпаялся к ним, а вывод данных подпаял к GPIO14. Датчик вынес на несколько сантиметров в бок, т.к. сам Sonoff немного греется и это может повлиять на показания. Немного модифицировал скетч, установив отправку данных на сервер раз в секунду (кстати, если нужно, то можно указать отдавать данные с датчика только по запросу с сервера, а не бомбить его раз в секунду). Для работы с данными датчиков в Blynk есть т.н. виртуальные пины. Я определяю в скетче, что влажность будет отправляться на виртуальный пин5, а температура на виртуальный пин 6, потом в приложении привязываю эти виртуальные пины к необходимому виджету — я сделал Label для отображения текущих данных и History для графика изменения. В общем-то все, миссия выполнена. Вот видео работы и код итогового скетча (включение/віключение чайника):

#define BLYNK_PRINT Serial // Comment this out to disable prints and save space

#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>

#include <ArduinoOTA.h>

#include <SimpleTimer.h>

#include <DHT.h>

#define DHTPIN 14

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

SimpleTimer timer;

// You should get Auth Token in the Blynk App.

// Go to the Project Settings (nut icon).

char auth = «yourToken»;

// Your WiFi credentials.

// Set password to «» for open networks.

char ssid = «mySSID»;

char pass = «myPass»;

IPAddress device_ip (192, 168, 1, 203);//я предпочитаю указывать IP статически без DHCP

IPAddress gw (192, 168, 1, 1);

void sendSensor(){

float h = dht.readHumidity();

float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

if (isnan(h) || isnan(t)) {

Serial.println(«Failed to read from DHT sensor!»);

}

// You can send any value at any time.

// Please don’t send more that 10 values per second.

Blynk.virtualWrite(V5, h);

Blynk.virtualWrite(V6, t);

}

void setup(){

Serial.begin(9600);

WiFi.config(device_ip,gw,gw);

WiFi.begin(ssid, pass);

Blynk.config(auth);

while (Blynk.connect() == false) {

}

ArduinoOTA.onStart(() {

Serial.println(«Start»);

});

ArduinoOTA.onEnd(() {

Serial.println(«\nEnd»);

});

ArduinoOTA.onProgress((unsigned int progress, unsigned int total) {

Serial.printf(«Progress: %u%%\r», (progress / (total / 100)));

});

ArduinoOTA.onError((ota_error_t error) {

Serial.printf(«Error: «, error);

if (error == OTA_AUTH_ERROR) Serial.println(«Auth Failed»);

else if (error == OTA_BEGIN_ERROR) Serial.println(«Begin Failed»);


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *