Let's play 般若心経

研究日記です。

なつやすみ

8/19 コロナとかで時間を半分以上消し飛ばした

2つのキャラクタリスティックを同時に読む

クリックでコードを表示
#include <ArduinoBLE.h>
#include "DFRobot_VEML7700.h"
#include <BH1745NUC.h>

DFRobot_VEML7700 als;
BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);

BLEService sensorService("1221");
BLEStringCharacteristic luxCharacteristic("2A37", BLERead | BLENotify, 20);
BLEStringCharacteristic colorCharacteristic("2A38", BLERead | BLENotify, 20);

void setup() {
  Serial.begin(9600);
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }

  als.begin();
  bh1745nuc.init();

  BLE.setLocalName("SensorBLE");
  BLE.setAdvertisedService(sensorService);

  sensorService.addCharacteristic(luxCharacteristic);
  sensorService.addCharacteristic(colorCharacteristic);

  BLE.addService(sensorService);

  luxCharacteristic.writeValue("Initializing...");
  colorCharacteristic.writeValue("Initializing...");

  BLE.advertise();
  Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
  BLEDevice central = BLE.central();

  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());

    while (central.connected()) {
      float lux;
      als.getALSLux(lux);
      String luxStr = "VEML7700:" + String(lux) + " lx";
      luxCharacteristic.writeValue(luxStr.c_str());

      unsigned short rgbc[4];
      if (bh1745nuc.get_val(rgbc) == 0) {
        String colorStr = String(rgbc[0]) + "," + String(rgbc[1]) + "," + String(rgbc[2]);
        colorCharacteristic.writeValue(colorStr.c_str());
      }

      delay(500);
    }

    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

2つsubscribeしたら読めるみたいです。

16進数になっちゃってるので変換します。二文字ずつ区切って10進数に変換してASCIIに当てはめるプログラムを組みます。BPでやったのでASCII変換ノード載せときます。

ASCII Select posted by HoriKogasa | blueprintUE | PasteBin For Unreal Engine

スペースがSPCになっていますがいい感じ。上はカラーセンサのRGBです。

カラーセンサの値から色を表示してみる

RGB値をこんな感じにして送ってみます。

unsigned short rgbc[4];
      if (bh1745nuc.get_val(rgbc) == 0) {
          float maxVal = max(max(rgbc[0], rgbc[1]), rgbc[2]);
          float scale = 1.0 / maxVal;

          // RGB値を0~1の範囲にスケーリング
          float R = rgbc[0] * scale;
          float G = rgbc[1] * scale;
          float B = rgbc[2] * scale;

          // 小数点以下3桁にフォーマット
          char colorStr[50];
          snprintf(colorStr, sizeof(colorStr), "%.3f,%.3f,%.3f", R, G, B);
          Serial.println(colorStr);

          colorCharacteristic.writeValue(colorStr);

グラデーションするLEDをカラーセンサに近づけて

Set Color and Opacityでimageに色を入れてあげます。すると右の画像のように色が反映されます。

UEのバグでずーっと色反映されなくて悩んでいたのですが再起動したら直りました。よくある

理論的に詰まないことが分かったのでこれからコントローラのガワを作っていきたいと思います。

ほんとは自作基盤とか発注してやりたかったけど時間が無いので全部採寸していい感じに作りたいと思います。