TJ9 BLE CrossKey対応本体ESP32へ書き込むソースファイル
(2020年5月29日)

コピーしてArduino IDEに貼り付けて下さい。
/*I referred BLE notify from the sketch example of ESP32 BLE Arduino.*/
#include "BLEDevice.h"

int F_LedState;
int B_LedState;
int L_LedState;
int R_LedState;
int LedState = 0;
int F_LedPin = 4;
int B_LedPin = 2;
int L_LedPin = 5;
int R_LedPin = 18;
int M_IN1 = 23;
int M_IN2 = 22;
int M_IN3 = 21;
int M_IN4 = 19;
unsigned long previousMillis = 0;
unsigned long interval = 200;

//Get your UUID from Online UUID Generator.
//https://www.uuidgenerator.net/version4
#define SERVICE_UUID        "********-****-****-*****-************"
#define CHARACTERISTIC_UUID "********-****-****-*****-************"
#define DEVICE_NAME         "esp32_BLE"

static BLEUUID  serviceUUID(SERVICE_UUID);
static BLEUUID  charUUID(CHARACTERISTIC_UUID);
static BLEAddress *pServerAddress;
static boolean doConnect = false;
static boolean connected = false;
static BLERemoteCharacteristic* pRemoteCharacteristic;

static void notifyCallback(
  BLERemoteCharacteristic* pBLERemoteCharacteristic,
  uint8_t* pData,
  size_t length,
  bool isNotify) {
}

void Forward() {
  digitalWrite(M_IN1, HIGH);
  digitalWrite(M_IN2,  LOW);
  digitalWrite(M_IN3, HIGH);
  digitalWrite(M_IN4,  LOW);
  F_LedState = 1;
  B_LedState = 0;
  L_LedState = 0;
  R_LedState = 0;
}

void Backward() {
  digitalWrite(M_IN1,  LOW);
  digitalWrite(M_IN2, HIGH);
  digitalWrite(M_IN3,  LOW);
  digitalWrite(M_IN4, HIGH);
  F_LedState = 0;
  B_LedState = 1;
  L_LedState = 0;
  R_LedState = 0;
}

void Turnleft() {
  digitalWrite(M_IN1, HIGH);
  digitalWrite(M_IN2,  LOW);
  digitalWrite(M_IN3,  LOW);
  digitalWrite(M_IN4, HIGH);
  F_LedState = 0;
  B_LedState = 0;
  L_LedState = 1;
  R_LedState = 0;
}

void Turnright() {
  digitalWrite(M_IN1,  LOW);
  digitalWrite(M_IN2, HIGH);
  digitalWrite(M_IN3, HIGH);
  digitalWrite(M_IN4,  LOW);
  F_LedState = 0;
  B_LedState = 0;
  L_LedState = 0;
  R_LedState = 1;
}

void Stop() {
  digitalWrite(M_IN1, LOW);
  digitalWrite(M_IN2, LOW);
  digitalWrite(M_IN3, LOW);
  digitalWrite(M_IN4, LOW);
  F_LedState = 0;
  B_LedState = 0;
  L_LedState = 0;
  R_LedState = 0;
}

bool connectToServer(BLEAddress pAddress) {
  Serial.print("Forming a connection to ");
  Serial.println(pAddress.toString().c_str());
  BLEClient*  pClient  = BLEDevice::createClient();
  pClient->connect(pAddress);
  BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
  Serial.print(" - Connected to server :");
  Serial.println(serviceUUID.toString().c_str());
  if (pRemoteService == nullptr) {
    Serial.print("Failed to find our service UUID: ");
    Serial.println(serviceUUID.toString().c_str());
    return false;
  }
  pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
  Serial.print(" - Found our characteristic UUID: ");
  Serial.println(charUUID.toString().c_str());
  if (pRemoteCharacteristic == nullptr) {
    Serial.print("Failed to find our characteristic UUID: ");
    return false;
  }
  Serial.println(" - Found our characteristic");
  pRemoteCharacteristic->registerForNotify(notifyCallback);
}

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      Serial.print("BLE Advertised Device found: ");
      Serial.println(advertisedDevice.toString().c_str());
      Serial.println(advertisedDevice.getName().c_str());

      if (advertisedDevice.getName() == DEVICE_NAME) { //
        Serial.println(advertisedDevice.getAddress().toString().c_str());
        advertisedDevice.getScan()->stop();
        pServerAddress = new BLEAddress(advertisedDevice.getAddress());
        doConnect = true;
      }
    }
};

void setup() {
  Serial.begin(115200);
  pinMode(F_LedPin, OUTPUT); digitalWrite(F_LedPin, LOW);
  pinMode(B_LedPin, OUTPUT); digitalWrite(B_LedPin, LOW);
  pinMode(L_LedPin, OUTPUT); digitalWrite(L_LedPin, LOW);
  pinMode(R_LedPin, OUTPUT); digitalWrite(R_LedPin, LOW);
  pinMode(M_IN1, OUTPUT); digitalWrite(M_IN1, LOW);
  pinMode(M_IN2, OUTPUT); digitalWrite(M_IN2, LOW);
  pinMode(M_IN3, OUTPUT); digitalWrite(M_IN3, LOW);
  pinMode(M_IN4, OUTPUT); digitalWrite(M_IN4, LOW);

  BLEDevice::init(DEVICE_NAME);
  BLEScan* pBLEScan = BLEDevice::getScan();
  Serial.println("getScan");
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  Serial.println("setAdvertisedDeviceCallbacks");
  pBLEScan->setActiveScan(true);
  pBLEScan->start(10);
  Serial.println("");
  Serial.println("End of setup");
}

void loop() {
  if (doConnect == true) {
    if (connectToServer(*pServerAddress)) {
      connected = true;
    } else {
      connected = false;
    }
    doConnect = false;
  }
  if (connected) {
    std::string value = pRemoteCharacteristic->readValue();
    String strVal = value.c_str();
    char strNum = strVal.toInt();
    Serial.println(strNum);
    switch (strNum) {
      case 'F': //Forward
        Forward();
        break;
      case 'B': //Backward
        Backward();
        break;
      case 'L': //Turnleft
        Turnleft();
        break;
      case 'R': //Turnleft
        Turnright();
        break;
      case 'S': //Stop
        Stop();
        break;
      default:
        break;
    }
  }
  else {
    Serial.println("Not connected");
    doConnect = true;
  }

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    if (LedState == 0) {
      LedState = 1;
    }
    else {
      LedState = 0;
    }
    previousMillis = currentMillis;
  }

  if (F_LedState == 1) {
    if (LedState == 0) {
      digitalWrite(F_LedPin, HIGH);
    } else {
      digitalWrite(F_LedPin, LOW);
    }
  } else {
    digitalWrite(F_LedPin, LOW);
  }

  if (B_LedState == 1) {
    if (LedState == 0) {
      digitalWrite(B_LedPin, HIGH);
    } else {
      digitalWrite(B_LedPin, LOW);
    }
  } else {
    digitalWrite(B_LedPin, LOW);
  }

  if (L_LedState == 1) {
    if (LedState == 0) {
      digitalWrite(L_LedPin, HIGH);
    } else {
      digitalWrite(L_LedPin, LOW);
    }
  } else {
    digitalWrite(L_LedPin, LOW);
  }

  if (R_LedState == 1) {
    if (LedState == 0) {
      digitalWrite(R_LedPin, HIGH);
    } else {
      digitalWrite(R_LedPin, LOW);
    }
  } else {
    digitalWrite(R_LedPin, LOW);
  }
}

元のページヘ戻る