I tried to turn on the LED connected to the M5Stack from the iOS application via BLE
- 2018/10/01
- 23:23
I tried to turn on the LED connected to the M5Stack from the iOS application via BLE
Hello everyone! I’m RoboTakao.
Previously, I checked if I can connect with BLE with M5Stack , but this time I will create an iOS application and send and receive data with BLE and light the LED.

I consulted O'Reilly Japan 's " Prototyping Lab 2nd edition " and a sample sketch of the M5Stack library put in Arduino IDE.
Samples of Prototyping Lab is in Github.
1) iOS App
Sample 32.6 of Prototyping Lab 2nd edition "Create a dedicated smartphone application (iOS)"
Basically it is a sample of Swift using CoreBluetooth.
However, because there was a part that did not go well, I am fixing it.
2) M5Stack Sketch
Prototyping Lab 2nd Edition
Sample sketch of "I want to connect with a smartphone wirelessly"
"ex_32 _ 1 _ UART"
Arduino IDE Sample Sketch BLE_uart
I have combined them.
iOS application fix points
1) Change service name
if peripheral.name == "UART Service" {
2) Peripheral scan
I specified withServices but changed it to nil.
Before
let serviceUUIDs = [CBUUID(string: uartServiceUUIDString)]
centralManager.scanForPeripherals(withServices: serviceUUIDs, options: nil)
After
centralManager.scanForPeripherals(withServices: nil, options: nil)
3) Changing the type of peripheral uartRXCharacteristic
It seems to fail with Write if the type is different.
Before
peripheral!.writeValue(
command, for: uartRXCharacteristic!,
type: CBCharacteristicWriteType.withoutResponse)
After
peripheral!.writeValue(
command, for: uartRXCharacteristic!,
type: CBCharacteristicWriteType.withResponse)
Check sketch of M5Stack source.
Basically I combine sample sketches together.
Operation check
i Launch iOS application and start M5Stack.
Press the "connect" button to find the peripheral and connect to the service called UART Service.
When the LED button is pressed, the LED connected to the M5Stack lights up.
Actually I'd like to send M5Stack button information to iOS, but I have not done it yet.
I hope to post again when it goes well.
Sample Sketch
/*
Video: https://www.youtube.com/watch?v=oCMOYS71NIU
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
Ported to Arduino ESP32 by Evandro Copercini
Create a BLE server that, once we receive a connection, will send periodic notifications.
The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"
The design of creating the BLE server is:
1. Create a BLE Server
2. Create a BLE Service
3. Create a BLE Characteristic on the Service
4. Create a BLE Descriptor on the characteristic
5. Start the service.
6. Start advertising.
In this example rxValue is the data received (only accessible inside that function).
And txValue is the data to be sent, in this example just a byte incremented every second.
*/
#include
#include
#include
#include
#include
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;
int LEDPinNo = 22;
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
M5.Lcd.println("Receive");
Serial.println("Receive");
int from = 0;
boolean noMoreEvent = false;
while (!noMoreEvent) {
int index = rxValue.find("*", from);
if (index < 0) {
noMoreEvent = true;
}
else {
std::string command = rxValue.substr(from, index);
if (command == "On") {
digitalWrite(LEDPinNo, HIGH);
M5.Lcd.println("LED On");
Serial.println("LED On");
} else if (command == "Off") {
digitalWrite(LEDPinNo, LOW);
M5.Lcd.println("LED Off");
Serial.println("LED Off");
}
from = index + 1;
}
}
}
};
void setup() {
M5.begin();
Serial.begin(115200);
pinMode(LEDPinNo, OUTPUT); //22pin OUTPUT mode
// Create the BLE Device
BLEDevice::init("UART Service");
// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);
pRxCharacteristic->setCallbacks(new MyCallbacks());
// Start the service
pService->start();
// Start advertising
pServer->getAdvertising()->start();
M5.Lcd.println("Waiting a client connection to notify...");
Serial.println("Waiting a client connection to notify...");
}
void loop() {
// if (deviceConnected) {
// pTxCharacteristic->setValue(&txValue, 1);
// pTxCharacteristic->notify();
// txValue++;
// delay(10); // bluetooth stack will go into congestion, if too many packets are sent
// }
// disconnecting
if (!deviceConnected && oldDeviceConnected) {
delay(500); // give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // restart advertising
M5.Lcd.println("start advertising");
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
oldDeviceConnected = deviceConnected;
}
M5.update();
}
Good Bye! Thank you.
M5Stack related posts
1) M5Stack Arduino IDE initial setting (macOS)
2) M5Stack I tried Arduino IDE sample sketches
3) M5Stack I treid Avatar(Arduino IDE)
4) M5Stack LED Blink
5) M5Stack Servo operating
6) M5Stack X 16ch Servo Driver PCA9685
7) M5Stack Bluetooth Low Energy (BLE) Test
8) M5Stack WiFi Test
スポンサードリンク