Road Bike DIY Cadence Speed Sensor、Arduinoでケイデンススピードセンサー作ってみた

YouTubeで紹介したオリジナルのソースコードです。
参考にしてください

YouTubeはこちらです: https://www.youtube.com/watch?v=-ffh0vC2JRs

ソースコード(Source Code)
#include 

BLEPeripheral blePeripheral;
BLEService cscService("1816");

BLECharacteristic cscChar("2A5B", BLENotify, 11);
BLEUnsignedShortCharacteristic cscFtr("2A5C", BLERead);
BLEUnsignedCharCharacteristic cscSL("2A5D", BLERead);
//BLECharacteristic cscCP("2A55", BLEIndicate | BLEWrite, 20);

volatile unsigned long previousMillis = 0;
volatile unsigned long lastMillis = 0;
volatile unsigned long currentMillis = 0;

volatile unsigned long time_prev_wheel = 0, time_now_wheel;
volatile unsigned long time_prev_crank = 0, time_now_crank;
volatile unsigned long time_chat = 100;

volatile unsigned int wheelRev = 0;
volatile unsigned int oldWheelRev = 0;
volatile unsigned long oldWheelMillis = 0;
volatile unsigned long lastWheeltime = 0;
volatile unsigned int crankRev = 0;
volatile unsigned int oldCrankRev = 0;
volatile unsigned long lastCranktime = 0;
volatile unsigned long oldCrankMillis = 0;
char packet[20];

boolean centralConnected = false;

void setup() {
  Serial.begin(9600);       // initialize serial communication
/*
  while (!Serial) {
    ; // Wait for ready
  }
*/
  Serial.println("App Start");
  pinMode(13, OUTPUT);      // initialize the LED on pin 13 to indicate when a central is connected
  blePeripheral.setLocalName("CSCSketch");
  blePeripheral.setAdvertisedServiceUuid(cscService.uuid());  // add the service UUID
  blePeripheral.addAttribute(cscService);   // Add the BLE service
  blePeripheral.addAttribute(cscChar); // add characteristic
  blePeripheral.addAttribute(cscFtr);
  blePeripheral.addAttribute(cscSL);
//  blePeripheral.addAttribute(cscCP);
  
  lastWheeltime = millis();
  lastCranktime = millis();

  const unsigned char charArray[11] = {
    3,                
    (unsigned char)wheelRev, (unsigned char)(wheelRev >> 8), (unsigned char)(wheelRev >> 16), (unsigned char)(wheelRev >> 24), 
    (unsigned char)lastWheeltime, (unsigned char)(lastWheeltime >> 8), 
    (unsigned char)crankRev, (unsigned char)(crankRev >> 8), 
    (unsigned char)lastCranktime, (unsigned char)(lastCranktime >> 8) };
  cscChar.setValue(charArray, 11);   // initial value for this characteristic
  cscFtr.setValue(3);
  cscSL.setValue(11);

  blePeripheral.begin();
  Serial.println("Bluetooth device active, waiting for connections...");

  attachInterrupt(digitalPinToInterrupt(11), wheelAdd, FALLING); // RISING FALLING CHANGE LOW 
  attachInterrupt(digitalPinToInterrupt(10), crankAdd, FALLING);
}

void wheelAdd() {
  time_now_wheel = millis();
  if( time_now_wheel > time_prev_wheel + time_chat){
    wheelRev = wheelRev + 1;
    time_prev_wheel = time_now_wheel;
    lastWheeltime = millis();
  }
}

void crankAdd() {
  time_now_crank = millis();
  if( time_now_crank > time_prev_crank + time_chat){
    crankRev = crankRev + 1;
    time_prev_crank = time_now_crank;
    lastCranktime = millis();
  }
}

void loop() {
  // listen for BLE peripherals to connect:
  BLECentral central = blePeripheral.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());
    // turn on the LED to indicate the connection:
    digitalWrite(13, HIGH);

    // check the csc mesurement every 200ms
    while (central.connected()) {
      centralConnected = true;
      currentMillis = millis();
      // if 200ms have passed, check the blood pressure mesurement:
      if (oldWheelRev < wheelRev && currentMillis - oldWheelMillis >= 500) {
        updateCSC("wheel");
      }
      else if (oldCrankRev < crankRev && currentMillis - oldCrankMillis >= 500) {
        updateCSC("crank");
      }
      else if (currentMillis - previousMillis >= 1000) {
        updateCSC("timer");
      }
    }
    // when the central disconnects, turn off the LED:
    digitalWrite(13, LOW);
    centralConnected = false;
    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

void updateCSC(String sType) {
  oldWheelRev = wheelRev;
  oldCrankRev = crankRev;
  oldWheelMillis = currentMillis;
  previousMillis = currentMillis;

  const unsigned char cscCharArray[11] = {
    3,                
    (unsigned char)wheelRev, (unsigned char)(wheelRev >> 8), (unsigned char)(wheelRev >> 16), (unsigned char)(wheelRev >> 24), 
    (unsigned char)lastWheeltime, (unsigned char)(lastWheeltime >> 8), 
    (unsigned char)crankRev, (unsigned char)(crankRev >> 8), 
    (unsigned char)lastCranktime, (unsigned char)(lastCranktime >> 8) };
  cscChar.setValue(cscCharArray, 11);
  
  Serial.print("Wheel Rev.: ");
  Serial.print(wheelRev);
  Serial.print(" WheelTime : ");
  Serial.print(lastWheeltime);
  Serial.print(" Crank Rev.: ");
  Serial.print(crankRev);
  Serial.print(" CrankTime : ");
  Serial.print(lastCranktime);
  Serial.print("  ");
  Serial.println(sType);
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です