Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Genuino101CurieBLEBatteryMonitor

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Отслеживание уровня заряда батареи[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 вольт.

  1. /*
  2.    Правообладатель – Intel Corporation (2015).  Все права защищены.
  3.  
  4.    Эта библиотека является бесплатной; ее можно распространять
  5.    и/или модифицировать согласно условиям Стандартной общественной
  6.    лицензии ограниченного применения GNU (т.к. она выпущена Фондом
  7.    свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
  8.    версии (на ваш выбор).
  9.  
  10.    Эта библиотека распространяется в надежде на то, что будет
  11.    полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на
  12.    коммерческое качество и пригодность применения для конкретных
  13.    целей. Более подробно читайте в Стандартной общественной лицензии
  14.    ограниченного применения GNU.
  15.  
  16.    Вы должны получить копию Стандартной общественной лицензии
  17.    ограниченного применения вместе с этой библиотекой. Если не
  18.    получили, напишите в Фонд бесплатного ПО на адрес: Free Software
  19.    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,    
  20.    MA  02110-1301  USA
  21. */
  22. #include <CurieBLE.h>
  23.  
  24. /*
  25.    Этот скетч частично использует стандартный BLE-сервис «Battery Service».
  26.    Подробнее читайте на:
  27. https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
  28. */
  29.  
  30. /*  */
  31. BLEPeripheral blePeripheral;        // периферийное BLE-устройство (программируемая вами плата)
  32. BLEService batteryService("180F"); // BLE-сервис для батареи
  33.  
  34.  
  35. // BLE-характеристика для заряда батареи:
  36. BLEUnsignedCharCharacteristic batteryLevelChar("2A19",  // стандартный 16-битный UUID характеристики;
  37.     BLERead | BLENotify);     // клиенты будут получать уведомления, если эта характеристика изменится;
  38.  
  39. int oldBatteryLevel = 0;   // значение, последний раз считанное с аналогового датчика
  40. long previousMillis = 0;   // время, когда заряд батареи проверялся в последний раз (в миллисекундах)
  41.  
  42. void setup() {
  43.   Serial.begin(9600);     // инициализируем последовательную коммуникацию
  44.   pinMode(13, OUTPUT);    // инициализируем светодиод на 13-ом контакте, чтобы он сигнализировал о подключении центрального устройства
  45.  
  46.   /* Задаем локальное название для BLE-устройства. Это название будет
  47.      в пакетах-объявлениях и может быть использовано удаленными
  48.      устройствами для идентификации этого BLE-устройства. Кроме того,
  49.      это название можно поменять, но оно может быть обрезано из-за
  50.      нехватки места в пакете-объявлении. */
  51.   blePeripheral.setLocalName("BatteryMonitorSketch");
  52.   blePeripheral.setAdvertisedServiceUuid(batteryService.uuid());  // добавляем UUID сервиса
  53.   blePeripheral.addAttribute(batteryService);    // добавляем BLE-сервис для батареи
  54.   blePeripheral.addAttribute(batteryLevelChar);  // добавляем характеристику для заряда батареи
  55.   batteryLevelChar.setValue(oldBatteryLevel);   // начальное значение для этой характеристики
  56.  
  57.   /* Теперь включаем периферийное BLE-устройство. Оно начнет в
  58.      постоянном режиме рассылать пакеты-объявления и станет видимым
  59.      для находящихся рядом центральных BLE-устройств, пока не получит
  60.      новое подключение. */
  61.   blePeripheral.begin();
  62.   Serial.println("Bluetooth device active, waiting for connections...");  //  "Bluetooth-устройство активно, ждем подключений..."
  63. }
  64.  
  65. void loop() {
  66.   // начинаем прослушку периферийных BLE-устройств, к которым можно подключиться:
  67.   BLECentral central = blePeripheral.central();
  68.  
  69.   // если центральное устройство подключилось к периферийному:
  70.   if (central) {
  71.     Serial.print("Connected to central: ");  //  "Подключились к центральному устройству: "
  72.     // показываем MAC-адрес центрального устройства:
  73.     Serial.println(central.address());
  74.     // включаем светодиод, сигнализируя о факте подключения:
  75.     digitalWrite(13, HIGH);
  76.  
  77.     // проверяем уровень батареи каждые 200 миллисекунд,
  78.     // пока подключено центральное устройство:
  79.     while (central.connected()) {
  80.       long currentMillis = millis();
  81.       // если 200 миллисекунд прошли, снова проверяем заряд батареи:
  82.       if (currentMillis - previousMillis >= 200) {
  83.         previousMillis = currentMillis;
  84.         updateBatteryLevel();
  85.       }
  86.     }
  87.     // если центральное устройство отключилось, выключаем светодиод:
  88.     digitalWrite(13, LOW);
  89.     Serial.print("Disconnected from central: ");  //  "Отключились от центрального устройства: "
  90.     Serial.println(central.address());
  91.   }
  92. }
  93.  
  94. void updateBatteryLevel() {
  95.   /* Считываем уровень напряжения на 0-ом входном аналоговом контакте.
  96.      Это используется для симуляции заряда батареи.
  97.   */
  98.   int battery = analogRead(A0);
  99.   int batteryLevel = map(battery, 0, 1023, 0, 100);
  100.  
  101.   if (batteryLevel != oldBatteryLevel) {      // если уровень заряда поменялся
  102.     Serial.print("Battery Level % is now: "); //  "Заряд батареи сейчас: " сообщаем об этом
  103.     Serial.println(batteryLevel);
  104.     batteryLevelChar.setValue(batteryLevel);   // и обновляем характеристику для заряда батареи
  105.     oldBatteryLevel = batteryLevel;            // сохраняем считанное значение для сравнения при следующем проходе через цикл
  106.   }
  107. }

См.также

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

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

  1. Arduino.cc - Genuino101CurieBLEBatteryMonitor