記事一覧

Data is transmitted from M5Stack to iOS application by BLE to drive switch

Data is transmitted from M5Stack to iOS application by BLE to drive switch



Hello everyone! I’m RoboTakao.

Last time I tried to send data from iOS application to M5Stack with BLE and light the LED .

This time I will send data from M5Stack to iOS application with BLE and try driving the switch on iOS application.

M5Stack_BLE_LED_Button01.jpg

Only the sketch on the M5Stack side was changed for the last code.

Description of the sketch

Send a String with setValue.
"*" Is added to "Pressed", and the end of the data is judged on the iOS application side.

pTxCharacteristic->setValue((std::string)"Pressed*");
pTxCharacteristic->notify();

Press the A and B buttons to move the iOS slide switch.




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() {

// Button A B
if (deviceConnected) {
if(M5.BtnA.wasPressed()) {
M5.Lcd.printf("wasPressed A \r\n");
Serial.println("wasPressed A \r\n");
pTxCharacteristic->setValue((std::string)"Pressed*");
pTxCharacteristic->notify();
}

if(M5.BtnB.wasPressed())
{
M5.Lcd.printf("wasPressed B \r\n");
Serial.println("wasPressed B \r\n");
pTxCharacteristic->setValue((std::string)"Released*");
pTxCharacteristic->notify();
}
}

// 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
9) I tried to turn on the LED connected to the M5Stack from the iOS application via BLE

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/