Arduino:Примеры/Genuino101CurieBLEBatteryMonitor
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Отслеживание уровня заряда батареи[1]
Этот пример демонстрирует одну из простейших вещей, которые можно сделать при помощи встроенных BLE-возможностей платы Arduino/Genuino 101, и в нем используется стандартный BLE-сервис «Battery Monitor» (т.е. «слежение за уровнем заряда батареи»). Этот сервис через BLE считывает уровень заряда батареи на вашем смартфоне или планшете, а затем показывает эту информацию на мониторе порта IDE Arduino. Это достигается при помощи библиотеки CurieBLE и специального приложения, установленного на смартфон или планшет.
Необходимое оборудование
- Плата Arduino/Genuino 101
- Потенциометр на 10 кОм
- Смартфон или планшет на Android или iOS
Необходимое ПО
Цепь
Плата Arduino/Genuino 101 оснащена BLE-модулем. Следовательно, для того, чтобы считывать сообщения, отправляемые скетчем, достаточно лишь подключить плату к компьютеру и запустить монитор порта. Симуляция заряда батареи осуществляется при помощи потенциометра, подключенного к 3.3V, GND и 0-ому аналоговому контакту.
Наиболее важные части скетча
CurieBLE.h – библиотека, дающая доступ ко всем параметрам, возможностям и функциям BLE-модуля платы Arduino/Genuino 101. При помощи BLE вы можете подключаться и коммуницировать со смартфонами, планшетами и прочими устройствами, поддерживающими этот стандарт. В данном руководстве BLE используется для считывания информации о заряде батареи на устройстве, к которому мы подключены в качестве периферийного устройства.
updateBatteryLevel() – функция, вызываемая каждые 200 миллисекунд в блоке loop(). Она симулирует считывание заряда батареи от потенциометра, подключенного к 0-ому аналоговому контакту. Новое значение всегда сверяется с тем, что было получено в прошлый раз. Если значение поменялось, код показывает новое значение через монитор порта, а затем обновляет характеристику для заряда батареи при помощи функции batteryLevelChar.setValue(batteryLevel). Это значение также будет показано в приложении nRF Master Control Panel (BLE) в графе «Battery Service».
Код
Этот пример частично использует стандартный BLE-сервис «Battery Service».
В блоке setup() мы инициализируем 13-ый контакт в режим OUTPUT, чтобы с его помощью управлять светодиодом. Это делается при помощи строчки pinMode(13, OUTPUT).
Объект blePeripheral используется, чтобы инициализировать плату в качестве периферийного BLE-устройства. Это делается строчкой BLEPeripheral blePeripheral.
Если этот скетч будут использовать сразу несколько плат, находящихся неподалеку друг от друга, вам нужно будет изменить локальные названия в этих платах, чтобы все они назывались по-разному. К примеру, blePeripheral.setLocalName("BatteryMonitorSketch") можно изменить на blePeripheral.setLocalName("BatteryMonitorSketch1").
Далее в цикле loop() при подключении к центральному устройству включаем светодиод на 13-ом контакте. Делаем это строчкой digitalWrite(13, HIGH).
Теперь каждые 200 миллисекунд проверяем, активно ли соединение, и если активно, вызываем функцию updateBatteryLevel(). Если соединение обрывается, выключаем светодиод строчкой digitalWrite(13, LOW) – это меняет напряжение на 13-ом контакте с 3,3 на 0 вольт.
/*
Правообладатель – Intel Corporation (2015). Все права защищены.
Эта библиотека является бесплатной; ее можно распространять
и/или модифицировать согласно условиям Стандартной общественной
лицензии ограниченного применения GNU (т.к. она выпущена Фондом
свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
версии (на ваш выбор).
Эта библиотека распространяется в надежде на то, что будет
полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на
коммерческое качество и пригодность применения для конкретных
целей. Более подробно читайте в Стандартной общественной лицензии
ограниченного применения GNU.
Вы должны получить копию Стандартной общественной лицензии
ограниченного применения вместе с этой библиотекой. Если не
получили, напишите в Фонд бесплатного ПО на адрес: Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA
*/
#include <CurieBLE.h>
/*
Этот скетч частично использует стандартный BLE-сервис «Battery Service».
Подробнее читайте на:
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
*/
/* */
BLEPeripheral blePeripheral; // периферийное BLE-устройство (программируемая вами плата)
BLEService batteryService("180F"); // BLE-сервис для батареи
// BLE-характеристика для заряда батареи:
BLEUnsignedCharCharacteristic batteryLevelChar("2A19", // стандартный 16-битный UUID характеристики;
BLERead | BLENotify); // клиенты будут получать уведомления, если эта характеристика изменится;
int oldBatteryLevel = 0; // значение, последний раз считанное с аналогового датчика
long previousMillis = 0; // время, когда заряд батареи проверялся в последний раз (в миллисекундах)
void setup() {
Serial.begin(9600); // инициализируем последовательную коммуникацию
pinMode(13, OUTPUT); // инициализируем светодиод на 13-ом контакте, чтобы он сигнализировал о подключении центрального устройства
/* Задаем локальное название для BLE-устройства. Это название будет
в пакетах-объявлениях и может быть использовано удаленными
устройствами для идентификации этого BLE-устройства. Кроме того,
это название можно поменять, но оно может быть обрезано из-за
нехватки места в пакете-объявлении. */
blePeripheral.setLocalName("BatteryMonitorSketch");
blePeripheral.setAdvertisedServiceUuid(batteryService.uuid()); // добавляем UUID сервиса
blePeripheral.addAttribute(batteryService); // добавляем BLE-сервис для батареи
blePeripheral.addAttribute(batteryLevelChar); // добавляем характеристику для заряда батареи
batteryLevelChar.setValue(oldBatteryLevel); // начальное значение для этой характеристики
/* Теперь включаем периферийное BLE-устройство. Оно начнет в
постоянном режиме рассылать пакеты-объявления и станет видимым
для находящихся рядом центральных BLE-устройств, пока не получит
новое подключение. */
blePeripheral.begin();
Serial.println("Bluetooth device active, waiting for connections..."); // "Bluetooth-устройство активно, ждем подключений..."
}
void loop() {
// начинаем прослушку периферийных BLE-устройств, к которым можно подключиться:
BLECentral central = blePeripheral.central();
// если центральное устройство подключилось к периферийному:
if (central) {
Serial.print("Connected to central: "); // "Подключились к центральному устройству: "
// показываем MAC-адрес центрального устройства:
Serial.println(central.address());
// включаем светодиод, сигнализируя о факте подключения:
digitalWrite(13, HIGH);
// проверяем уровень батареи каждые 200 миллисекунд,
// пока подключено центральное устройство:
while (central.connected()) {
long currentMillis = millis();
// если 200 миллисекунд прошли, снова проверяем заряд батареи:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateBatteryLevel();
}
}
// если центральное устройство отключилось, выключаем светодиод:
digitalWrite(13, LOW);
Serial.print("Disconnected from central: "); // "Отключились от центрального устройства: "
Serial.println(central.address());
}
}
void updateBatteryLevel() {
/* Считываем уровень напряжения на 0-ом входном аналоговом контакте.
Это используется для симуляции заряда батареи.
*/
int battery = analogRead(A0);
int batteryLevel = map(battery, 0, 1023, 0, 100);
if (batteryLevel != oldBatteryLevel) { // если уровень заряда поменялся
Serial.print("Battery Level % is now: "); // "Заряд батареи сейчас: " сообщаем об этом
Serial.println(batteryLevel);
batteryLevelChar.setValue(batteryLevel); // и обновляем характеристику для заряда батареи
oldBatteryLevel = batteryLevel; // сохраняем считанное значение для сравнения при следующем проходе через цикл
}
}
См.также
- Heart Rate Monitor
- Button LED
- Callback LED
- LED