Arduino:Примеры/Genuino101CurieBLEBatteryMonitor

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Отслеживание уровня заряда батареи[1]

Этот пример демонстрирует одну из простейших вещей, которые можно сделать при помощи встроенных BLE-возможностей платы Arduino/Genuino 101, и в нем используется стандартный BLE-сервис «Battery Monitor» (т.е. «слежение за уровнем заряда батареи»). Этот сервис через BLE считывает уровень заряда батареи на вашем смартфоне или планшете, а затем показывает эту информацию на мониторе порта IDE Arduino. Это достигается при помощи библиотеки CurieBLE и специального приложения, установленного на смартфон или планшет.

Необходимое оборудование

  • Плата Arduino/Genuino 101
  • Потенциометр на 10 кОм
  • Смартфон или планшет на Android или iOS

Необходимое ПО

  • Приложение nRF Master Control Panel (BLE) для Android или iOS

Цепь

Arduino101 PotentiometerA0.png

Плата 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».

BatteryMonitorBLE.png

Код

Этот пример частично использует стандартный 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;            // сохраняем считанное значение для сравнения при следующем проходе через цикл
  }
}

См.также

  1. Heart Rate Monitor
  2. Button LED
  3. Callback LED
  4. LED

Внешние ссылки