초음파 센서 HC-SR04로 측거한 값을 ESP32의 BLE로 송신

5160 단어 ESP-WROOM-32BLEESP32

장비



장비는 다음을 사용합니다.
ESP32-DevKitC ESP-WROOM-32 개발 보드 (아키즈키 전자) 1,480엔(부가세 포함)
초음파 센서 HC-SR04 (AliExpress로 95엔 정도.무료우송)
・브레드보드
· 점프 와이어 케이블

회로는 간단하며 Vcc, GND, Trig, Echo의 4선만 연결됩니다.



초음파 센서 HC-SR04의 거리 측정



샘플 코드가 웹에 많이 있기 때문에 참고하겠습니다 구현합니다.
이번에는 궁극적으로 소수점 이하의 값까지의 정밀도를 구하지 않습니다. 1cm 단위의 정밀도로 충분합니다. 평균·평활화 등은 별도 생각합니다.

BLE로 HC-SR04로 측거한 값을 송신



ESP32 BLE 라이브러리를 Arduino IDE로 가져왔으므로 스케치 예제에 "ESP32 BLE Arduino"라는 그룹이 있습니다. 이번에는 BLE_notify를 사용합니다.
소스 코드를 보면 거의 무수정으로 사용할 수 있음을 알 수 있습니다.
void loop() {
    // notify changed value
    if (deviceConnected) {
        pCharacteristic->setValue(&value, 1);
        pCharacteristic->notify();
        value++;
        delay(10); // bluetooth stack will go into congestion, if too many packets are sent
    }

HC-SR04로 측거한 값을 value에 대입해, setValue()로 value의 주소와 사이즈를 설정하는 것 같습니다. value의 타입은 unit8_t이므로, 측거한 값이 255cm를 넘는 경우도 있으므로 2바이트 사용하기로 합니다.
후술하는 GATT의 Characteristics ID의 height의 포맷이 unit16이므로 이것에도 맞춥니다.

HC-SR04로 측거하는 함수 measureDistance()로 얻은 값 dist를 buff에 저장하고 setValue()로 설정합니다.
void loop() {

    delay(1000);
    double dist;
    uint8_t buff[2];
    // notify changed value
    if (deviceConnected) {

        dist = measureDistance();
        Serial.print("dist= ");
        Serial.println(dist);

        buff[0] = (int16_t)dist & 0xff;
        buff[1] = (int16_t)dist >> 8;

        pCharacteristic->setValue(buff, sizeof(buff));
        pCharacteristic->notify();

        delay(10); // bluetooth stack will go into congestion, if too many packets are sent
    }

BLE의 서비스 ID 및 characteristics ID



스케치 예제의 BLE_notify에서 service ID와 characteristics ID는 다음과 같이 정의됩니다.
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

이것은 Unknown service와 Unknow Characteristics가 되어 버립니다. HC-SR04로 측거하므로, 이에 적합한 Service와 Characteristics ID를 설정합니다.
블루투스의 사양은 공식 페이지의 Specification 페이지에서 확인할 수 있습니다.

서비스 ID



조금 무리가 있습니다만 서비스 ID0x181A의 Environmental Sensing 로 합니다.

Characteristics ID



Characteristics ID 은 Distance가 없었기 때문에 ElevationHeight 가 가까워서 Height(0x2A8E)를 사용하기로 합니다. 소스를 다음과 같이 수정합니다.
 #define SERVICE_UUID        "0000181a-0000-1000-8000-00805f9b34fb" // org.bluetooth.service.environmental_sensing 
 #define CHARACTERISTIC_UUID "00002a8e-0000-1000-8000-00805f9b34fb" // org.bluetooth.characteristic.height

이 설정으로 컴파일 빌드, ESP32에 씁니다.

Android 앱에서 확인



센트럴측의 앱이 아직 되어 있지 않으므로 Android 앱으로 확인합니다.
이번에는 NORDIC의 nRF Connect를 사용합니다.



방금 설정한 Service ID의 Environmental Sensing, Characteristics ID의 Height에서 Value(여기에서는 130cm)가 잡혀 있는 것을 알 수 있습니다.

소스 코드



샘플 코드에 조금 손을 더한 것이지만, github 에 둡니다.
(2019/3/18 추가)

좋은 웹페이지 즐겨찾기