Мигаем светодиодом. Мигание встроенным на плату Arduino светодиодом Blink проекты

В этой статье мы сделали попытку собрать в одном месте ссылки на все самые популярные библиотеки Ардуино, а также подготовили подборку наиболее популярных библиотек. Рано или поздно, любой ардуинщик сталкивается с необходимостью использования той или иной библиотеки. Ведь использование готового кода сильно сокращает время на программирование. Надеемся, что собранные в одном месте и снабженные ссылками для скачивания и короткими примерами использования, сведения о популярных библиотеках помогут вам в ваших проектах.

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

Сегодня создано огромное количество библиотек, которые можно легко найти и скачать в интернете. Подавляющее большинство библиотек распространяются по свободной лицензии, поэтому необходимости в поиске “пиратских” версий нет. Главное, это научиться .

Стандартные библиотеки Ардуино

Начать знакомство с библиотеками лучше с официального сайта, на котором можно найти внушительный список стандартных модулей и ссылки на официальные библиотеки партнеров.

Список встроенных библиотек (они поставляются вместе с дистрибутивом Arduino IDE):

  • EEPROM
  • Ethernet / Ethernet 2
  • Firmata
  • LiquidCrystal
  • Servo
  • SoftwareSerial
  • Stepper

Подборка библиотек в одном архиве

Если у вас нет времени на детальный анализ множества сайтов и вы хотите скачать все необходимое для работы с внешними устройствами Ардуино в одном архиве, мы подготовили список 40 самых популярных библиотек. Просто и распакуйте его содержимое (папку libraries) в папку Arduino.

Библиотеки для экранов, индикаторов и дисплеев

Библиотека I2C

Библиотека, предназначенная для работы периферийного устройства по протоколу I2C.

Пример использования:

#ifndef I2C_MASTER_H

#define I2C_MASTER_H

void I2C_init (void) – создание объекта, настройка на правильную частоту для шины.

uint8_t I2C_start () – установка соединения с новым устройством.

uint8_t I2C_write() – запись данных на текущее устройство.

uint8_t I2C_read_ack() – считывание байта с устройства, запрос следующего байта.

Библиотека LiquidCrystal

Стандартная библиотека, установленная в Arduino IDE. Предназначена для управления жидкокристаллическими дисплеями LCD.

Пример использования:

#include . Также, чтобы не ошибиться при написании, можно подключить через меню Sketch – Import Library – LiquidCrystal.

Конструктор класса – LiquidCristal(…). Аргументами являются rs, rw, en, do…d7. Первые 3 соответствую выводам сигналов RS, RW и Enable. Выводы d соответствуют номерам шин данных, к которым подключен дисплей.

void begin(cols, rows) – метод, который инициализирует интерфейс дисплея. Аргументами являются количество знаков в строке (cols) и число строк (rows). Этот метод должен задаваться первым.

void createChar(num, data) – метод, необходимый для создания пользовательских символов.

Библиотека UTFT

Стандартная библиотека, необходимая для работы Ардуино с TFT экранами разных типов. Все поддерживаемые дисплеи представлены в сопроводительном документе с библиотекой.

Пример использования:

#include

UTFT(); – создание экземпляра UTFT.

textRus(char*st, int x, int y); – метод, позволяющий выводить строку из указателя. Например, char *dht = “Температура,С”;

textRus(string st, int x, int y); – вывод строки с указанием в параметре. Например, g.textRus(“Температура, С”, 0, 20);

Библиотека LedControl

Позволяет управлять семисегментными дисплеями, объединять массив из светодиодов в одну матрицу.

Пример использования:

#include

LedControl lc1= LedControl();

– требуется для инициализации библиотеки. Должна состоять из четырех аргументов – номера пинов, к которым подключен дисплей (первые 3 аргумента) и количество подключенных чипов.

writeArduinoOn7Segment() – отображение на дисплее всех чисел от 0 до 15. Использует функции setChar() для символов a и d и setRow() для создания макета пропущенных символов.

LedControl.shutdown() – отключение изображения.

setIntensity() – контроль яркости.

Библиотеки для работы с датой и временем ардуино

Библиотека RTClib

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

Пример использования:

#include

RTC_DS1307 RTC; – выбор датчика (в данном случае DS1307).

rtc.adjust(DateTime(Date, Time)); – настройка времени и календаря.

dayOfTheWeek () – вывод дня недели. Аргумент от 0 до 6, 0 – воскресенье.

Библиотека Timelib

Позволяет Ардуино получать информацию о дате и времени в данный момент.

Пример использования:

#include

Time(); – создание экземпляра.

setTime (t); – установка времени. Аргумент t – час, минута, секунда, день, месяц и год.

timeStatus(); – показывает, установлено ли время.

adjustTime(adjustment); – настройка времени.

Библиотека Ds1307

Библиотека для удобного взаимодействия часов DS1307 с Ардуино c использованием библиотеки Wire.

Пример использования:

#include

class DS1307RTC – создание объекта DS1307.

SetTime() – установка времени.

get() – считывает RTC, возвращает полученную дату в формате POSIX.

Set(time_t t) – запись даты в RTC

Библиотека DS 3231

Предназначена для управления датой и временем в модуле ds3231.

#include “ds3231.h”

DS3231 Clock(SDA, SCL); – создание объекта DS3231, подключение к линии тактирования и линии данных.

getTime(); – считывание даты и времени с часов.

setDate(date, mon, year); – установка даты.

Системные библиотеки ардуино

Библиотека EEPROM

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

Пример использования:

#include

EEPROM.read(); – создание объекта, считывание байта по адресу из энергонезависимой памяти.

EEPROM.write(address, value)– запись байта в энергонезависимую память.

EEPROM.put() – запись строк чисел с плавающей запятой.

EEPROM.get() – чтение строк и чисел с плавающей запятой.

Библиотека SoftwareSerial

Библиотека, которая позволяет реализовывать последовательные интерфейсы с любых цифровых пинов. Также позволяет создавать несколько последовательных портов, которые работают на скорости до 115200 бод.

#include

SoftwareSerial mySerial(RX, TX) – создание объекта, аргументы – выводы, к которым подключены RX и TX.

Serial.begin(); – устанавливает скорость порта для связи ардуино и компьютера.

mySerial.overflow() – проверка входного буфера на переполнение.

Библиотека Math

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

Пример использования:

#include

Math(); – создание экземпляра Math.

Serial.print(“cos num = “); – возвращает косинус числа.

Serial.println (fmod (double__x, double__y)); – возвращает числа по модулю.

Библиотека Scheduler

Предназначена для работы с Arduino Due, позволяет работать в режиме многозадачности. Пока является экспериментальной библиотекой.

Пример использования:

#include

Scheduler; – создание экземпляра.

Scheduler.startLoop() – позволяет добавить функцию, которая будет выполняться вместе с loop().

yield() – позволяет передать управление другим задачам.

Библиотеки серво моторов и шаговых двигателей

Библиотека Servo

Стандартная библиотека. Необходима для управления серводвигателями и часто используется в робототехнических проектах с манипуляторами.

Пример использования:

#include

Servo myservo; – создание объекта для серводвигателя..

myservo.attach(); – номер выхода, к которому подключен серводвигатель.

myservo.write(180, 30, true); – движение на 180 градусов, скорость 30, ожидание окончания движения.

Библиотека Stepper

Небходима для управления шаговым униполярным и биполярным двигателем.

#include

const int stepsPerRevolution = ; – количество шагов, за которое двигатель проходит полный поворот.

Stepper myStepper = Stepper(steps, pin1, pin2) – создает экземпляр класса с указанным количеством шагов и выводами, к которым подключается двигатель.

Библиотеки датчиков ардуино

Библиотека DHT

#include < DHT.h>

DHT dht(DHTPIN, DHT11); – инициализирует датчик (в данном случае DHT11).

dht.begin(); – запуск датчика.

float t = dht.readTemperature(); – считывание текущего значения температуры в градусах Цельсия.

Библиотека DallasTemperature

Предназначается для работы с датчиками Dallas. Работает совместно с библиотекой OneWire.

#include

DallasTemperature dallasSensors(&oneWire); – передача объекта oneWire для работы с датчиком.

положить ее в регистр.

printTemperature(sensorAddress); – запрос получить измеренное значение температуры.

Библиотека Ultrasonic

Обеспечивает работу Ардуино с ультразвуковым датчиком измерения расстояния HC-SR04.

#include

Ultrasonic ultrasonic (tig , echo) – объявление объекта, аргументы – контакт Trig и контакт Echo.

dist = ultrasonic.distanceRead(); – определение расстояния до объекта. Агрумент – сантиметры(СМ) или дюймы (INC).

Timing() – считывание длительности импульса на выходе Echo, перевод в необходимую систему счисления.

Библиотека ADXL345

Предназначается для работы с акселерометром ADXL345.

Пример использования:

#include

ADXL345_ADDRESS – создание объекта, указание его адреса.

ADXL345_REG_DEVID – идентификация устройства.

ADXL345_REG_OFSX – смещение по оси Х.

ADXL345_REG_BW_RATE – управление скоростью передачи данных.

Библиотека BME280

Предназначается для работы с датчиком температуры, влажности и давления BME280.

Пример использования:

#include

BME280_ADDRESS – создание объекта BME280, указание его адреса.

begin(uint8_t addr = BME280_ADDRESS); – начало работы датчика.

getTemperature – получение измеренной температуры.

getPressure – получение измеренного давления.

Библиотека BMP280

Требуется для работы с датчиком атмосферного давления BMP280.

Пример использования:

#include

BMP280_CHIPID – создание экземпляра, указание его адреса.

getTemperature(float *temp); – получение измеренной температуры.

getPressure(float *pressure); – получение измеренного значения давления.

Библиотека BMP085

Требуется для работы с датчиком давления BMP085.

Пример использования:

#include

Adafruit_BMP085 bmp; – создание экземпляра BMP085.

dps.init(MODE_ULTRA_HIGHRES, 25000, true); – измерение давления, аргумент 25000 – высота над уровнем моря (в данном случае 250 м. над уровнем моря).

dps.getPressure(&Pressure); – определение давления.

Библиотека FingerPrint

Требуется для работы со сканером отпечатков пальцев.

Пример использования :

#include

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); – объявление объекта Finger. Параметр – ссылка на объектр для работы с UART, кокторому подключен модуль.

finger.begin(); – инициализация модуля отпечатков пальцев.

Func_sensor_communication(); – вызов модуля отпечатков пальцев.

Библиотеки коммуникации

Библиотека Wire

Требуется для работы с двухпроводным интерфейсом I2C.

Пример использования:

#include

Wire.begin() – инициализация библиотеки, подключение к шине I2C.

Wire.requestFrom() – запрос мастером байтов от ведомого устройства.

Wire.beginTransmission() – начало передачи на ведомое устройство.

Библиотека Irremote

Требуется для работы ардуино с ИК приемником.

Пример использования:

#include

IRrecv irrecv(RECV_PIN); – пин, к которому подключен ИК приемник.

SetPinAndButton(int ir1,int ir2,int pin) – позволяет настроить определенный выход на срабатывание при заданных значениях ir1, ir2.

Библиотека GSM

Требуется для соединения через GSM-плату с сетью GSM/GRPS. С ее помощью можно реализовать операции, свершаемые GSM-телефоном, работать с голосовыми вызовами и подключаться к сети интернет через GRPS.

Пример использования:

#include

GSM GSMAccess – инициализирует экземпляр класса.

gprs.powerOn() – включение питания.

GPRS – настройка подключения к интернету.

GSM – управление радио-модемом.

Библиотека RFID

Требуется для соединения Ардуино и RFID -модуля.

Пример использования:

#include

RFID rfid(SS_PIN, RST_PIN); – создание экземпляра rfid, аргументы – пины, к которым подключен модуль.

rfid.init(); – инициализация модуля RFID.

Библиотека MFRC 522

Требуется для соединения Ардуино и MFRC522 -модуля.

Пример использования:

#include

MFRC522 mfrc522(SS_PIN, RST_PIN); – создание экземпляра MFRC522, аргументами указаны выходы, к которым подключен модуль.

mfrc522.PCD_Init(); – инициализация MFRC522.

Библиотека Ethershield

Новая версия https://github.com/jcw/ethercard

Требуется для подключения Ардуино к локальной сети или сети интернет. Библиотека больше не поддерживается, более новая версия Ethercard. Также существует стандартная библиотека Ethernet.

Пример использования:

#include «EtherShield.h»

#include

EtherShield es = EtherShield (); – подготовка веб-страницы

ether.begin(sizeof Ethernet::buffer, mymac,); – начало работы, аргументы – адрес Mac и номер порта, к которому подключен выход CS.

Библиотека Nrf24l01

Требуется для работы с RF24-радиомодулем.

Пример использования:

#include “RF24.h”

RF24 – Конструктор создает новый экземпляр драйвера. Перед тем, как использовать, нужно создать экземпляр и указать пины, к которым подключен чип (_cepin: контакт модуля Enable, cspin: контакт модуля Select).

Begin – начало работы чипа.

setChannel – каналы для связи RF.

setPayloadSize – установка фиксированного размера передачи.

getPayloadSize – получение фиксированного размера.

Библиотека TinyGPS

Требуется для чтения сообщений GPGGA и GPRMC. Помогает считывать данные о положении, дате, времени, высоте и других параметрах.

Пример использования:

#include

TinyGPS gps; – создание экземпляра TinyGPS.

encode () – подача на объект последовательных данных по одному символу.

gps.stats() – метод статистики. Показывает, получены корректные данные или нет.

Библиотеки в Arduino IDE

Среди всего разнообразия библиотек можно выделить 3 основных группы:

  • Встроенные – это библиотеки, изначально установленные в среде Arduino IDE. Их не нужно скачивать и устанавливать дополнительно, они доступны для использования в программе сразу после запуска среды разработки.
  • Дополнительные – это библиотеки, которые нужно самостоятельно скачивать устанавливать. Обычно такой вид библиотек разрабатывает производитель датчиков, сенсоров и других компонентов для облегчения работы с ардуино.
  • Зависимые библиотеки – устанавливаются как помощник дополнительной библиотеки, отдельно от нее не работает.

Самым простым способом работы с библиотеками в ардуино является использование встроенных возможностей среды разработки Arduino IDE. Об этом мы поговорим в отдельной статье.

На этом уроке Вы научитесь программировать свою плату Arduino на примере мигания встроенным светодиодом.

Необходимые элементы

Для данного примера Вам понадобится плата Arduino (в данном случае – Arduino Uno R3 , но Вы сможете проработать данный пример, имея в наличии и другую плату) и кабель USB (типа A (4х12 мм) – B (7х8 мм) – более подробно можно почитать на Вики).

Что такое ” L” светодиод


На Arduino Uno присутствуют ряды коннекторов типа мама по бокам платы, которые используются для подключения периферийных электронных устройств или “шилдов” .

Кроме того, на плате присутствует встроенный светодиод (англ. – LED), которым Вы можете управлять с помощью скетчей. Этот встроенный светодиод условно назовем “L” светодиод, как это принято на многих англоязычных ресурсах.

Расположение данного светодиода на плате отмечено на фото снизу.


Загрузка примера “Blink” (мигание) в Arduino IDE

При подключении новой платы к персональному компьютеру, обратите внимание, что светодиод начинает мигать, так как все платы от производителей поступают с уже “залитым” скетчем “Blink ”.

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

Пришло время проверить Ваше подключение и запрограммировать плату.

В оболочке Arduino IDE существует большая коллекция скетчей, которые уже готовы к использованию. Среди них находится и пример, который заставляет мигать “L” светодиод.

Откройте пример “Blink”, который находится в пункте меню File – Examples – 01.Basics

После открытия, расширьте окно оболочки Arduino IDE, чтобы Вы могли весь скетч в одно окне.

Скетчи из примеров, включенные в Arduino IDE предусматривают режим “только чтение” (“read only”). То есть, загрузить их на плату Вы сможете, но после изменения кода, Вы не сможете их сохранить в том же файле.

Мы будем изменять скетч, так что в первую очередь Вам необходимо сохранить собственную копию, которую Вы сможете изменять.

Вы сохранили копию скетча “Blink” в Вашей библиотеке. Теперь открыть этот файл Вы можете в любой момент, перейдя по вкладке File – Scetchbook.

Загрузка примера “Blink” (мигание) на плату

Подключите свою плату Arduino к компьютеру с помощью USB и проверьте тип платы (“Board type”) и серийный порт (“Serial Port”), по которому она подключена.

Текущие настройки отображаются внизу окна оболочки Arduino IDE

Кликните на кнопку “Загрузить” (“Upload”)

Во время загрузки в нижней части окна IDE появятся ползунок загрузки и сообщения. Вначале появляется фраза “Компилирование” (“Compiling scetch..”), что означает процесс конвертирования Вашего скетча в формат, подходящий для загрузки на плату Arduino.

В конце статус сменится на ”Загрузка завершена” (“Done uploading”). В сообщении, которое появится в текстовой строке отобразится информация о том, что загруженный скетч занимает 1,084 байта из 32,256 доступных.

Иногда при компиляции у Вас может возникнуть подобная ошибка:

Причин может быть несколько: Вы не подключили плату к компьютеру; Вы не установили необходимые драйвера; Вы выбрали некорректный серийный порт.

Пояснения к скетчу “Blink”

Ниже представлен код скетча “Blink”.

Turns on an LED on for one second, then off for one second, repeatedly.

This example code is in the public domain.

// Pin 13 has an LED connected on most Arduino boards.

// give it a name:

pinMode(led, OUTPUT);

delay(1000); // wait for a second

Первое, на что стоит обратить внимание: в данном скетче множество “комментариев”. Обратите внимание, что комментарии не являются инструкцией по работе программы. Это исключительно пояснения отдельных функций и задач, которые выполняются на определенном этапе кода. Это не обязательная часть кода. Все между символами /* и */ в верхней части скетча – это комментарии, в которых описаны задачи программы. Так же есть комментарии, которые ограничиваются одной строкой. Они начинаются с символов // и заканчиваются по умолчанию в конце строки. Первая важная, по сути, часть данного кода это строка:

В комментариях над строкой указано, что мы присваиваем имя пину, к которому подключен светодиод. На большинстве плат Arduino это будет 13 пин. Дальше используется функция “Setup”. Опять-таки, в комментариях указано, что функция срабатывает после нажатия кнопки “reset”. Также эта функция срабатывает, когда плата перезагрузится по каким-либо другим причинам. Например, подача питания или после загрузки скетча.

// the setup routine runs once when you press reset:

// initialize the digital pin as an output.

pinMode(led, OUTPUT);

Каждый скетч Arduino обязан включать в себя функцию “setup” и часть, в которую вы можете добавлять собственные инструкции, заключенные между { }. В нашем примере в функции присутствует только одна команда, в которой указано, что пин, который мы используем, настраивается на “вывод” (“Output”). Также обязательным для любого скетча является функция цикла “Loop”. В отличие от функции “Setup ”, которая отрабатывает один раз после перезагрузки, функция “Loop” после окончания работы команд, вновь запустится.

// the loop routine runs over and over again forever:

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

В теле функции “Loop” светодиод включается (HIGH), данное значение задерживается на 1000 миллисекунд (1 секунда), светодиод отключается (LOW) и остается выключенным на 1 секунду, после чего цикл повторится.

Изменение частоты мигания светодиода

Для того, чтобы обеспечить более частое мигание светодиода, необходимо изменить параметр, указываемый в скобках () в команде “delay ”.

Как уже было указано, период задержки указывается в миллисекундах. То есть, для того, чтобы заставить светодиод мигать в два раза чаще, необходимо изменить значение с 1000 на 500. В результате, пауза между включением/выключением светодиода составит половину секунды и светодиод будет мигать быстрее.

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

Любой домашний разработчик микроэлектроники, рано или поздно сталкивается с необходимостью управления своим, созданным своими руками, устройством посредством некоего пульта, которым будет удобно переключать режимы работы или же просто просматривать текущее состояние. Вообще, словосочетание «домашний разработчик микроэлектроники» еще лет 15 тому назад, вызывало бы жуткий хохот, ведь в то время и помыслить никто не мог, что дома кто-то будет возиться с миниатюрными платами, заниматься прошивками, да и вообще. А оказалось, что единичные энтузиасты превратились в сонмы увлеченных людей, а само дело получило массовый оборот.

Но годы прошли и упертые компании создали настоящую нишу, целый рынок, в котором варятся миллионы увлеченных непрофессионалов, с упоением собирающих очередной «девайс на ардуинке». Вот именно у таких энтузиастов, платящих длинные баксы производителям шилдов да датчиков, и возникает потребность в управлении своими умными устройствами при помощи пульта. И как ни странно их потребность была удовлетворена наиболее изящным из возможных способов. На свет появился Blynk.

Приложение Blynk

Что дает Blynk любителю домашней автоматизации? Ответ на поставленный вопрос - двоякий. С одной стороны - совсем не много, а вот с другой, немного превращается чуть ли не в половину «стоимости» всего реализованного проекта. Blynk позволяет превратить обычный смартфон или планшет, под управлением Android или iOS, в настоящий пульт управления самостоятельно разрабатываемой электроники. Blynk очень удачно вписался в экоструктуру Arduino и появился в самый подходящий момент.

По сути, Blynk есть ни что иное, как приложение под мобильное устройство, позволяющее в форме графического конструирования создавать полнофункциональные приложения для связи их с устройствами на платформе Arduino и совместимыми (по правде сказать, скоро совместимых платформ станет куда больше). Основной фишкой Blynk я смело могу назвать простоту, с которой создается как само приложение, так и то, как реализуется связь с программным кодом в устройстве.

Для начала работы, впрочем, и для ее продолжения, достаточно только установить приложение Blynk на ваш мобильный или планшет. Далее, просто водите пальцем по экрану, размещаете такие элементы, как кнопки, слайдеры, переключатели, лампочки, графопостроители и прочее, прочее, прочее. У каждого элемента есть возможность по настройке немногочисленных параметров, но основа кроется в привязке элементов управления или отображения к пинам физического устройства. А сами пины, могут быть как всамделишными, физическими, а могут быть и виртуальными. Но я бы рекомендовал работать именно с виртуальными, поскольку логику их обработки можно настраивать куда гибче, нежели у физических.

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

Вот так вот просто, вы получаете удобный пульт управления своим устройством, способный не только отправлять команды на него, но и отображать все, что потребуется на своем экранчике. Разработчики даже не стали заморачиваться на продвинутую и подробную документацию. Все собрано в виде единого документа на одной странице сайта Blynk . Ну, что же, за простоту реализации разработчикам я посылаю полноценный «респект»!

Откуда взялся Blynk?

Появление Blynk произошло не по чистой случайности. Я бы даже отметил, что появление Blynk на свет - есть ни что иное, как образцовый, счастливый случай удачного краудфандинга. Некий Паша Байдурин, надеюсь, что фамилию не исковеркал, завел кампанию на Kikstarter со скромной суммой сбора всего в 10.000$. В итоге, кампания набрала сумму в пятеро большую, что позволило развернуться на полную катушку. Сбор средств стартовал в середине января 2015 и уже к концу месяца набрал требуемый объем средств. Вот именно таким способом мозги и побеждают бабло, мотайте на ус.

За чуть меньше, чем год, а я пишу обзор в декабре 2016, Blynk успел подрасти, обзавестись всеми необходимыми атрибутами и, я надеюсь, смог побороть проблему роста и превратился в полноценную корпорацию. По крайней мере, теперь Blynk предлагается не только для физических, но и для юридических лиц. Модели монетизации для разных типов пользователей различаются, но об этом ниже.

Уникальность бизнес модели

Так чем же еще уникален Blynk, кроме как возможностью создать приложение для телефона за пять минут и связать его с Arduino за дополнительные пять? А уникален он примененной бизнес моделью. В мире программного обеспечения приняты стандартные условия использования продуктов: Freeware (бесплатно), Shareware (условно бесплатно, с тестовым периодом), Donationware (заплати, если понравилось), платные продукты. Допускаются различные комбинации, например, для частного использования продукт может быть бесплатен, а корпоративный сектор обязан заплатить за каждую копию. Впрочем, существуют и другие типы лицензий, например, множество OpenSource, когда продукт рассматривается как некий кирпичик исходного кода доступного всем. Но не будем углубляться в дебри и посмотрим пристально на Blynk.

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

По умолчанию обычному частному пользователю, скачавшему Blynk из маркета, выдается лимитированный набор, нет, не элементов, а заряда батареи. Оный заряд тратится на использование элементов интерфейса для создания своего приложения. Допустим, изначально вам доступна величина в 1000 единиц заряда. Каждая кнопка, установленная в проекте, обойдется вам в 200 единиц, а что-то посложнее, к примеру, построитель графика, выйдет уже в 400. Таким образом, строя свое приложение из элементов вы тратите энергию, выделенную вам изначально. Как только энергия истощится, добавить новые элементы в приложение будет уже нельзя. Придется либо докупать энергию за настоящие деньги, а операция происходит чрезвычайно просто, как и все остальное в Blynk, либо удалять элементы из приложения. При удалении, энергия, затраченная на установку, возвращается обратно в полном объеме.

Тем самым разработчики позволяют новому пользователю оценить возможности Blynk и создать как минимум одно более-менее функциональное приложение. А дальше – хочешь плати, не хочешь, разбирай то, что наваял и используй повторно. Уникальность ситуации заключается в том, что пользователю предлагается покупать не приложение, не подписку на него, не ограничение по трафику, а элементы интерфейса его приложения! Пополнение заряда батареи Blynk стоит не дорого, и его можно отнести к микроплатежам. Поэтому расставание с кровно заработанным происходит незаметно и безболезненно.

Но все же оцените идею. Представьте, что вы используете MS Word и вам предлагается писать тексты не более десяти страниц. А чтобы написать одиннадцатую, потребуется либо прикупить еще виртуальной бумаги, либо возвести краткость в благодетель и сократить свой текст до минимума. А после печати и вовсе его весь стереть. Несмотря на абсурдность реализации примера, с Blynk все работает. И работает отлично.

Для корпоративных же пользователей, чья работа непосредственно связана с выпуском приложений в коммерческих или около коммерческих целях, предлагается немного другая схема оплаты за труд разработчиков в Blynk. Корпораты получают stand alone приложение, работающее не в «песочнице» Blynk, а отдельно. Blynk там все равно будет, скрытый за фасадом. А платить придется за подписку, в течение которой приложение останется работоспособным.

Представьте, что вы производите ультразвуковые увлажнители воздуха. Вы уже вдоволь украсили каждую из своих моделей синими светодиодами и всерьез подумываете, как бы прикрутить туда еще и IoT. Blynk предоставляет вам почти готовое решение. Прикручиваете к увлажнителю, нечто на подобие ESP8266, а пользователям предлагаете скачать приложение. Voilà! Все работает, все довольны. Ровно до тех пор, пока вы не решите выпустить новую, усовершенствованную линейку увлажнителей, щеголяющую не только синими, но и фиолетовыми светодиодами. И вполне разумно полагаете, что за старое приложение можно уже не платить. Денег оно потребляет, а потребителю пора прийти за новым увлажнителем, ибо у вас дети, им надо поступать в колледж.

Программируемый срок службы потребительских товаров - заветная мечта любого производителя. Решить которую, при помощи Blynk, очень легко. Как, впрочем, и все, что касается Blynk.

Что взамен?

Но не все индивидуумы готовы платить деньги, особенно за то, что можно сделать бесплатно. И народная мысль моментально ориентируется, энтузиасты приступают к раскопкам альтернативных вариантов бесплатного использования аналога функций Blynk. И как бы странно оно не звучало, я из их числа.

Веб-сервер

Самым простым способом реализовать удаленное управление я бы назвал использование Web-сервера на вашем устройстве. Такие современные чипы как EPS8266 и многие другие позволяют подключаться к IP-сетям, в том числе локальным сетям в квартире и даже с выходом в Internet. А свободного места в памяти контроллера достаточно для размещения полноценного сервера.

Соответственно на подобном устройстве можно развернуть несложный web-сервер, оптимизированный под экраны мобильных устройств. Вызывать же его можно через ярлык на рабочем столе вашего смартфона. Да, в большинстве случаев, и устройство и мобильный должны находиться в пределах одной сети, но часто-ли вам приходит в голову включить ваш увлажнитель дома, когда вы сами находитесь в Гималаях, карабкаясь с веревками на очередную вершину?

При использовании варианта с веб-сервером потребуется обрабатывать ответы от клиента, да выводить элементы управления в виде HTML. Получится может быть не так красиво и быстро, как при помощи Blynk, но зато совершенно бесплатно.

Cayenne

Добавление элементов на панель управления в Caynne (браузер)

Что было сделано? При помощи специалистов Cayenne был перегружен метод CayenneWiFiClient, в который добавился конструктор для создания объекта Cayenne с передачей в него только идентификатора аутентификации на сервисе Cayenne. Соединение с интернет в таком случае требуется создать самостоятельно.

Необходимо модернизировать штатную библиотеку Cayenne и положить измененный файл в каталог с вашим скетчем:

#ifndef _CAYENNEESP8266WIFICLIENT_h #define _CAYENNEESP8266WIFICLIENT_h #include "CayenneClient.h" class CayenneWiFiClient: public CayenneClient { public: /** * Begins Cayenne session * @param token Authentication token from Cayenne site * @param ssid WiFi network id * @param pass WiFi network password */ void begin(const char* token, const char* ssid, const char* pass) { Blynk.begin(token, ssid, pass, CAYENNE_DOMAIN, CAYENNE_PORT); } /* void config(const char* auth, const char* domain = CAYENNE_DOMAIN, uint16_t port = CAYENNE_PORT) { Base::begin(auth); this->conn.begin(domain, port); }*/ void config(const char* auth) { Blynk.config(auth, CAYENNE_DOMAIN, CAYENNE_PORT); } }; CayenneWiFiClient Cayenne; #endif

И собственно сам скетч:

#include #define CAYENNE_PRINT Serial // Comment this out to disable prints and save space #include "CayenneDefines.h" #include "BlynkSimpleEsp8266.h" #include "CayenneESP8266WiFiClient.h" #define VIRTUAL_PIN V0 #define ledPin D4 // the onboard LED char token = "YourCayenneSecurityToke"; const char* ssid = "YourWiFiNetwork"; const char* password = "YourWiFiNetworkKeyPhrase"; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println("YaHoo..."); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } Cayenne.config(token); pinMode(ledPin, OUTPUT); } CAYENNE_IN(VIRTUAL_PIN){ int value = getValue.asInt(); // Get value as integer Serial.print("Value received V1P: "); Serial.print(value); Serial.println(""); if (value==1){ digitalWrite(ledPin, LOW); }else{ digitalWrite(ledPin, HIGH); } } void loop() { // put your main code here, to run repeatedly: Cayenne.run(); delay(100); //Serial.print("."); }

Если из вышеописанного ничего не понятно, то попробую объяснить. Во-первых, Cayenne опирается на Blynk… Да, Cayenne использует Blynk, только не то приложение, что я описал несколькими абзацами выше, а фреймворк Blynk, выпущенный под лицензией MIT. Таким образом получается, что и приложение Blynk, и Cayenne, так или иначе, выполняют одну и туже функцию. В действительности же оно так и есть.

Готовая панель управления в Cayenne при просмотре через браузер

Разница между проектами в следующем: Blynk делает упор на мобильное приложение и простоту разработки приложения, Blynk уже сейчас активно монетизируется. Cayenne же помимо мобильного приложения предлагает еще и полнофункциональную панель управления на своем Web-сайте. И пока не собирает деньги со своих пользователей. Концепция работы в Cayenne идентична концепции Blynk. В приложении или через веб-браузер, пользователь создает проект, добавляет кнопки, лампочки и прочие показометры, которые можно связать с виртуальным или реальным пином вашего, конкретного, устройства. Дополнительно у Cayenne имеется механизм триггеров и событий. Триггеры обрабатывают события, получаемые от устройств. А событийная модель опирается на календарное расписание.

Связь устройства и приложения осуществляется так же, как и у Blynk, посредством добавления небольших кусочков программного кода для обработки бизнес-логики зашитой в ваше устройство. Но первоначально проект затачивался на применение минимального количества программирования на стороне устройства клиента. Все так или иначе должно быть подхвачено библиотеками Cayenne. Именно по этой причине в Cayenne можно найти множество плат и вариантов подключения к сети, представлены, в том числе, и различные сенсоры конкретных производителей. С одной стороны, разнообразие снижает необходимость в программировании скетчей, с другой, понижает возможности использования универсальных устройств.

Интерфейс рабочей панели Cayenne на планшете

Именно по этой причине у меня и возникло затруднение в том, как можно подключить Cayenne к уже подключенному Wi-Fi соединению. И мне пришлось объяснять разработчикам, для чего мне это потребовалось. Возможно, что система была задумана для самого начального уровня подготовки оконечных разработчиков, о чем косвенно говорит количество примеров скетчей, вылезающих при каждом действии.

Немного удивил построитель на веб-сайте. К его логике нужно привыкать. Сначала добавляем устройство, получаем код идентификации, затем подключаем его на устройстве и пробуем подключиться к серверам Cayenne. Если подключение нам удалось, к подключенному устройству можно будет подключать виджиты, кнопки, табло и прочие средства визуализации.

Подводя итог после тестирования Cayenne, могу отметить я так и не смог определиться, понравилась ли мне система или нет. С одной стороны, да, все, что от нее требуется, все на месте. С другой стороны, меня постоянно не покидало ощущение, что тут что-то недоделано. Оно и понятно, система новая и план работ по реализации всех функций еще наверняка не завершен. Еще больше беспокойства вызывает «завлекалочка» Try it for Free, без какой-либо публикации, а что будет, когда «тестовый» период завершится? По крайней мере в настоящий момент (декабрь 2016), Cayenne можно пользоваться в своих целях без какой-либо платы, тренироваться, создавать свои приложения. И самое главное - никаких ограничений в плане запаса энергии в батарейке.

Virtuino

В отличие от Blynk или Cayenne, разработкой Virtuino занимается один единственный человек. И несмотря на сильно ограниченные ресурсы, результат получился не хуже, а может быть даже и лучше, нежели описано выше. Итак, Virtuino - плод усердий греческого разработчика, ознакомиться с которым можно как на отдельной страничке (на греческом языке), так и прямиком на странице загрузки приложения Virtuino из маркета. Для спешащих в бой, даю прямую ссылку на tutorial по подключению Virtuino, поскольку поначалу процедура может быть не тривиальной.

Как и Blynk, Virtuino подразумевает использование только мобильного приложения для создания пользовательского интерфейса. Как и Cayenne с Blynk, Virtuino использует технологию приложения в приложении. Это означает, что ваши наработки остаются в «песочнице» Virtuino и не могут существовать отдельно от Virtuino. Но у Virtuino присутствует и отличие от двух конкурентов. Virtuino не использует промежуточный сервер.

Интерфейс приложения Virtuino на планшете

Остановлюсь немного подробнее именно на этом факте, поскольку для меня он является ключевым. Blynk и Cayenne используют серверную часть и работают только через нее. Нельзя обратиться к устройству без подключения к Интернет, по крайней мере для подключений, не касающихся Bluetooth и USB подключения. А если соединение нестабильное, то ваш скетч будет затормаживаться на сетевых соединениях. Для каких-то применений, замедление исполнения инструкций может быть весьма критично. Причем, и Blynk и Cayenne могут работать из-под сурового NAT, то это означает, что ваше устройство будет периодически опрашивать, буквально в каждом цикле, сервер в Интернет. При плохой связи исполнение скетча может пойти вообще не так, как задумано изначально.

В Virtuino разработчик может пойти двумя путями. Во-первых, он может воспользоваться сервисом ThingSpeak , в качестве того самого, промежуточного сервера. А во-вторых, коммуникация между приложением и устройством осуществляется при помощи веб-сервера, поднятого на самом устройстве! Да, в этом случае, доступ извне вашей локальной сети к устройству, скорее всего, будет невозможен. С другой стороны, он мало кому и нужен. Но зато никаких задержек и проблем с внешним соединением. Все реализовано прозрачно до невозможности, вот чего не хватает грандам IoT. При работе с Cayenne тебя постоянно не покидает ощущение, что в любой момент может быть введена плата за использование сервиса, а у Blynk будут подняты расценки и ваш, уже оплаченный, набор окажется неработоспособным. С Virtuino вы продолжите пользоваться приложением и будите управлять им устройством. Во всяком случае приложение можно и не обновлять.

Как и у Cayenne в Virtuino реализована жесткая возможность по подключению к сети Wi-Fi средствами Virtuino без возможности использовать уже установленное соединение. Наличие двух одинаковых подходов к реализации наводит на невеселые мысли. По какой-то невероятной причине, разработчики значительно ограничивают возможность пользователей их продуктов. Если с Cayenne мне удалось решить вопрос про использование моего собственного подключения к сети, то в Virtuino я потерпел фиаско. Даже при помощи разработчика мне не удалось подключить мой ESP8266 к сети и использовать Virtuino. Дело в том числе и в том, что Virtuino поддерживает ESP8266 только как внешний модуль Wi-Fi для Arduino, а не как самостоятельную плату. А я полностью перешел в своих устройствах на ESP8266 в виду их выдающихся характеристик.

Да, в погоне за облегчением жизни потребителя, некоторые разработчики загоняет его, потребителя, в очень узкие рамки и не позволяют за них выходить. На примере 1С, мы помним, чем гибче и открытие платформа, тем больший успех ждет ее на рынке. Где все те «парусы», «галактики» и «абакусы»? Тем не менее, я связался с разработчиком и выяснил его ближайшие планы. Первым делом будут реализованы настраиваемые кнопки и индикаторы. Эта работа должна быть завершена к моменту публикации статьи, а затем настанет черед добавления новых плат к штатной библиотеке. Надеюсь, что в библиотеке появится нативная поддержка ESP8266 для Arduino.

В целом же Virtuino произвел на меня очень благоприятное впечатление, в первую очередь тем, что присутствует возможность не использовать промежуточный сервер. Но ограниченные ресурсы одного человека не позволяют реализовать сразу все задумки, например, добавить англоязычную версию сайта или же слепить универсальный вариант своей библиотеки, а заодно положить ее на GitHub. С нетерпением ждем дальнейшей разработки и новостей от Illias-а .

Выводы

Меня очень радует тот факт, что начали появляться реализации реальной конвергенции мобильных устройств и устройств из мира IoT. Пока у нас не будет возможности с легкостью общаться с нашими устройствами, по возможности через единый или универсальный интерфейс, тотального марша IoT по планете наблюдаться не будет. Человек уж такая скотина, которая ленится привыкать к чему-то новому и наличие с десятка различных интерфейсов по управлению IoT-устройствами будет вызывать нескончаемую экзистенциальную боль в суставах конечного потребителя.

Конечно, рассчитывать на тотальную унификацию не стоит. Помните историю с умными домами? Когда весь бум сошел на нет? А все из-за несовместимости систем между собой и отсутствию четкого, единого стандарта. Подобный риск существует и с IoT. В принципе, как-то мы обходились без умных розеток, холодильников и стиральных машин, а добавление новых «умных» функций не добавляет много ценности к устройствам. Поэтому будем внимательно следить за назревающей битвой, возможно, что на наших глазах победит один из рассматриваемых выше способов коммуникации между человеком и устройством. Поглядим, посмотрим.

Всем привет. Это еще одна статья из разряда ESP8266 + Blynk = . Прошу не воспринимать как рекламу, а только как дань уважения разработчикам платформы Blynk и личный опыт, который может быть полезен кому то еще, кроме меня.

Начало

Идея проекта родилась несколько лет назад, когда в порыве DYI-энтузиазма на Ali был куплен датчик качества воздуха MQ-135 . По спецификации этот датчик реагирует на наличие в воздухе таких веществ как: NH3, NOx, спирт, бензин, дым и CO2 и выдает свою абстрактную оценку качества воздуха на аналоговом выходе [да я знаю, что существуют подстроечные резисторы и способы калибровки, но как то это слишком сложно].

Испытания показали, что на всякие вредные и «вонючие» соединения датчик реагирует отлично, показывая достаточно резкое изменение выходного уровня. Хуже дело обстояло с определением невидимого врага, а именно углекислого газа СО2. Про вред и очевидную повсеместность этого диоксида сказано немало, повторяться не будем.


Поэтому для меня, датчик MQ-135 оказался бесполезным, поскольку не мог «заметить» существенную разницу в качестве воздуха в переполненном людьми помещении и на свежем воздухе. Но вызов был уже принят, поэтому несколько итераций спустя родилась последняя (текущая) версия платы OpenWindAir с ИК-датчиком MH-Z19 [да не идеальный, да китайский]. Подробнее про получившуюся железку и ее аппаратные возможности написано в статье Система сбора данных на ESP. Часть I .

Для задачи измерения уровня углекислого газа в жилом помещении датчик оказался идеальным и оптимальным по цене (1200 рублей на Ali с доставкой) решением.

Blynk - помогает соединить железо, облако и телефон

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

Запуск тестового скетча BlynkSimpleEsp8266 , не вызвал никаких проблем. Однако по мере усложнения и наращивания функционала - пришлось столкнуться с некоторыми трудностями, о которых и хочется рассказать подробнее.

Архитектура ПО

Главный плюс разработки ПО под ESP8266 в среде Arduino IDE – что можно совместить в одном скетче совершенно разные библиотеки и вам за это почти ничего не будет.

Перед началом разработки ТЗ было сформулировано тезисно и включало следующие пункты:

1. Необходимо с определенным интервалом считывать показания датчика CO2 (MH-Z19) и отображать результаты с помощью трех (зеленый, желтый, красный) светодиодов. Пределы были выбраны почти с учетом ГОСТ 30494-2011 (Здания жилые и общественные. Параметры микроклимата в помещениях.): до 900 PPM – зеленый , от 901 до 1400 PPM - желтый , выше 1401 PPM - красный . Также у нас есть бипер, порог бибикания которого задан на уровне 1100 PPM, но его можно настроить или вообще отключить через Blynk. Во время отладки выяснилось, что иногда MH-Z19 может глюкануть и выдать свое максимальное значение (в зависимости от установленного предела: 1000, 2000, 3000 или 5000 PPM), вместо фактически измеренного. Это немного осложнило обработку результатов и могло привести к ложным сообщениям пользователю, а нервы пользователя надо беречь. И поскольку нет абсолютно верного (кроме многократных измерений) способа отличить неверно измеренные 2000 PPM (дикое значение для жилого помещения) от ситуации, когда пользователь сидит и специально дышит в датчик. То было принято две меры по маскировке данной проблемы: установлен предел измерения в 2000 PPM (предполагается использование прибора в жилых помещениях и все что больше 1400 для нас уже красная зона) и добавлено усреднение результатов последних 10 измерений. Как итог - единичные ложные срабатывания (на 2000 PPM) не дают больших всплесков на усредненном графике. Но при желании через Blynk можно настроить предел измерения датчика и посмотреть фактическое (не усредненное значение CO2).

2. Для работы с датчиком температуры\влажности (AM2302 ) была использована библиотека DHT Sensor Library от Adafruit. Было сделано два небольших изменения: добавил повторное считывание AM2302 (иногда считывается не с первого раза) и введены поправочные коэффициенты для значений температуры и влажности. Если используется встроенный датчик, то опытным путем установлено, что воздух внутри прибора «суше» на 15% и теплее на 2 градуса C (1 градус F) чем снаружи, при использовании выносного датчика (выбирается джампером) - поправку в измеренные результаты вносить не надо и можно отключить.

3. Пользователь должен иметь возможность настроить устройство (подключиться к WiFi, указать auth token и тд) без дополнительного софта или перепрошивки. Наиболее оптимальным решением стало использование библиотеки WiFiManager , которая переводит ESP в режим точки доступа и позволяет через Captive портал сохранить во флешку настройки WiFi сети и другие параметры.


В дальнейшем при старте библиотека пытается подключится к сохраненной WiFi точке и в случае неудачи снова переходит в режим точки доступа и Captive портала. А если пользователь вдруг не захочет использовать Blynk или у него не окажется WiFi-роутера, то в этом случае OpenWindAir никогда на загрузится и будет только стартовать в AP-режиме и перезагружаться по таймауту.

Выход из этой безвыходной ситуации был найден следующий, если у нас сохранены ненулевые параметры подключения к Blynk или MQTT серверу, значит при старте будем пытаться подключиться и перезагружаться, в противном случае - можем и не подключаться к WiFi, а работать оффлайн.

If (!wifiManager.autoConnect("OpenWind - tap to config")){ if (mqtt_server != "\0" || blynk_token != "\0"){ Serial.println("Failed to go online for Blynk and MQTT, restarting.."); ESP.restart(); } else{ Serial.println("Failed to go online, offline mode activated"); online = false; }

4. Blynk требует подключения к Интернету (если сервер не локальный) и поэтому необходимо контролировать наличие подключения к WiFi. Библиотека WiFiManager на данный момент не умеет восстанавливать соединение с WiFi и если в квартире «моргнет» свет и роутер перезагрузится, то восстановить подключение ESP8266 к WiFi поможет только перезагрузка. Поэтому пришлось добавить простой таймер, который через 60 непрерывных секунд отсутствия коннекта перезагрузит устройство.

If (WiFi.status() != WL_CONNECTED && online){ if (!wifilost_flag){ wifilost_timer_start = uptime; wifilost_flag = true; } if (((uptime - wifilost_timer_start) > wifilost_timer_max) && wifilost_flag){ Serial.print("\n\rWiFi connection lost, restarting.."); wifilost_flag = false; ESP.restart(); } }
5. В качестве альтернативы использования Blynk пользователь может выбрать отправку показаний по протоколу MQTT на сервер Народного мониторинга или любого другого подобного сервиса. Для этих целей была выбрана библиотека PubSubClient , которая написана на наиболее понятном мне языке Си и единственная (из представленных в каталоге Arduino IDE), которая имела понятные примеры.

6. Перепрошивка устройства дело хоть и не частое и не очень сложное (особенно при наличии встроенного CP2102 ), но все равно захотелось максимально упростить этот процесс. Библиотека ArduinoOTA позволяет легко загрузить новый бинарник и прошить его. Активировать ОТА можно как кнопкой на устройстве, так и удаленно через телефон. Однако без сюрпризов не обошлось, оказывается мной были куплены модули ESP8266-12E с разным размером файловой системы (SPIFFS).

Примерное распределение Flash

Внешне не отличимые модули ESP8266-12E могут иметь файловую систему размером 1 или 3 Мб и требовать разные прошивки (опции сборки в Arduino IDE). Поэтому, чтобы избежать возможных проблем, при загрузке надо проверять фактический размер памяти и при ОТА апгрейде запрашивать на сервере соответствующий бинарник (пока не сделано). Или можно пойти чуть более простым путем и собирать все прошивки под SPIFFS c меньшим номиналом 1 Мб, т. к. они вполне работают на ESP8266-12E c большим объемом памяти.

Для таких проверок в SDK есть удобные функции позволяющие определить размер фактической и выбранной в IDE памяти.

String realSize = String(ESP.getFlashChipRealSize()); String ideSize = String(ESP.getFlashChipSize()); bool flashCorrectlyConfigured = realSize.equals(ideSize); if(flashCorrectlyConfigured){ Serial.println("flash correctly configured, SPIFFS starts, IDE size: " + ideSize + ", match real size: " + realSize); } else{ Serial.println("flash incorrectly configured, SPIFFS cannot start, IDE size: " + ideSize + ", real size: " + realSize); }
7. Чтобы самому не путаться в разных версиях ПО и отличать их друг от друга, был немного переписан файл arduino-1.8.5\hardware\platform.txt от Arduino IDE так, чтобы во время компиляции запускался bat файл, который делает копию текущего скетча и полученного бинарника, а также автоматически инкрементирует номер версии.

Recipe.hooks.sketch.prebuild.0.pattern=D:\arduino-1.8.5\hardware\increment.bat {build.path} {build.source.path} {build.project_name}
Таким образом, после каждой сборки\прошивки имеем зашитый в бинарнике номер версии и копию скетча с таким же номером. А если папку со скетчем положить в Dropbox - то получится самодельная система контроля версий.

Инструкция по настройке автоинкремента версии для Arduino IDE и bat-файл выложены на гитхабе.

8. Ну а раз есть встроенный USB-UART переходник (с драйвером для CP2102 нет никаких проблем в Windows и Linux), то нельзя было не добавить вывод результатов измерений через Терминал (на скорости 9600). Раз в двадцать секунд выводятся результаты измерений и сообщения об ошибках.

Reading MHZ19 sensor: ok
Reading DHT22 sensor: ok

Humidity: 36.20%
Temperature: 27.20C \ 83.56F
C02: 1153 ppm
C02 average: 462 ppm
ADC: 99
UpTime: 0 days, 0 hours, 3 minutes, 45 seconds.
Time: 16:25:56 20/3/2018
===================================================

А по нажатию кнопки Enter можно получить сообщение с системной информацией.
======SYSTEM-STATUS================================
Device name: OpenWindAir
Software version: 0.1.235
FreeHeap: 33824
ChipId: 13704617
FlashChipId: 1405167
FlashChipSize: 4194304
FlashChipSpeed: 40000000
CycleCount: 2204474679
Time: 16:27:6 20/3/2018
UpTime: 295
======BLYNK-STATUS=================================
Blynk token:
Blynk connected: 1
Notify level: 1100
Beep: 1
CO2 limit: 2000
Temperature correction: 1
======NETWORK-STATUS===============================
WiFi network: adakta2
WiFi status: 3
RSSI: -70
MAC: 18FE34D11DA9
IP: 192.168.0.152
Online: 1
======MQTT-STATUS==================================
MQTT server:narodmon.ru
MQTT port:1883
MQTT login:login
MQTT key:key
MQTT topics:
/OpenWindAir/h
/OpenWindAir/t
/OpenWindAir/f
/OpenWindAir/ppm
/OpenWindAir/status
======END-of-STATUS================================

Самая неприятная проблема

Самое неприятное с чем пришлось столкнуться при разработке, это когда при одновременной отправке результатов измерений на сервер MQTT и в Blynk, часть данных может начать теряться и не доходить до сервера. Как оказалось, на то, чтобы подключиться к серверу MQTT и отправить данные - может понадобиться несколько секунд и за это время библиотека Blynk успевает потерять соединение со своим сервером и в результате если вручную не инициировать переподключение к серверу - может пройти достаточно много времени и часть результатов измерений потеряется. Пришлось добавить проверку состояния WiFi клиента _blynkWifiClient и случае отсутствия коннекта делать принудительный стоп _blynkWifiClient.stop(), а потом подключаться к серверу Blynk заново.

If (WiFi.status() == WL_CONNECTED){ wifilost_flag = false; if (blynk_token != "\0"){ if (Blynk.connected() && _blynkWifiClient.connected()){ Blynk.run(); } else{ Serial.print("\n\rReconnecting to blynk.. "); Serial.print(Blynk.connected()); if (!_blynkWifiClient.connected()){ _blynkWifiClient.stop(); Return _blynkWifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT); } Blynk.connect(4000); Serial.print(Blynk.connected()); } }

Заключение

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

Ознакомиться с проектом целиком можно в репозитории на гитхабе .

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

Далее будет QR код, просканировав который приложением Blynk (AppSore , Android) можно узнать, какой микроклимат был у меня дома последние 3 месяца.


Проект работает, прошу ничего не ломать.

  • 220 ohm resistor

Circuit

This example uses the built-in LED that most Arduino and Genuino boards have. This LED is connected to a digital pin and its number may vary from board type to board type. To make your life easier, we have a constant that is specified in every board descriptor file. This constant is LED_BUILTIN and allows you to control the built-in LED easily. Here is the correspondence between the constant and the digital pin.

  • D13 - 101
  • D13 - Due
  • D1 - Gemma
  • D13 - Intel Edison
  • D13 - Intel Galileo Gen2
  • D13 - Leonardo and Micro
  • D13 - LilyPad
  • D13 - LilyPad USB
  • D13 - MEGA2560
  • D13 - Mini
  • D6 - MKR1000
  • D13 - Nano
  • D13 - Pro
  • D13 - Pro Mini
  • D13 - UNO
  • D13 - Yún
  • D13 - Zero

If you want to lit an external LED with this sketch, you need to build this circuit, where you connect one end of the resistor to the digital pin correspondent to the LED_BUILTIN constant. Connect the long leg of the LED (the positive leg, called the anode) to the other end of the resistor. Connect the short leg of the LED (the negative leg, called the cathode) to the GND. In the diagram below we show an UNO board that has D13 as the LED_BUILTIN value.

The value of the resistor in series with the LED may be of a different value than 220 ohm; the LED will lit up also with values up to 1K ohm.

Schematic

Code

After you build the circuit plug your Arduino or Genuino board into your computer, start the Arduino Software (IDE) and enter the code below. You may also load it from the menu File/Examples/01.Basics/Blink . The first thing you do is to initialize LED_BUILTIN pin as an output pin with the line

pinMode(LED_BUILTIN, OUTPUT);

In the main loop, you turn the LED on with the line:

digitalWrite(LED_BUILTIN, HIGH);

This supplies 5 volts to the LED anode. That creates a voltage difference across the pins of the LED, and lights it up. Then you turn it off with the line:

digitalWrite(LED_BUILTIN, LOW);

That takes the LED_BUILTIN pin back to 0 volts, and turns the LED off. In between the on and the off, you want enough time for a person to see the change, so the delay() commands tell the board to do nothing for 1000 milliseconds, or one second. When you use the delay() command, nothing else happens for that amount of time. Once you"ve understood the basic examples, check out the example to learn how to create a delay while doing other things.

Once you"ve understood this example, check out the example to learn how read a switch connected to the board.