LoRaチュートリアル(完)距離を取得して送信する

今回やること

前回でプログラムによる送受信ができたので、今回は超音波距離センサで距離を取得しその距離に応じて受信側のLEDのON・OFFの制御を行います。

距離を取得して送信

使用する超音波距離センサはHC-SR04です。

このサイト参考に距離を取得するプログラムを前回のプログラムに組み込みます。

deviceplus.jp

組み込んだプログラムはこんな感じです。

getDistance 関数で距離を取得して、それを00010001と結合しています。

#include <SoftwareSerial.h>

#define LORA_RECV_RecvData 100
#define ES920LR_RST_PIN 13
#define LORA_RX 2
#define LORA_TX 3
#define ECHO_PIN 8
#define TRIG_PIN 9

String dstId = "00010001";  /*送信相手の番号*/
const int maxSendTimes = 10; /*最大送信回数*/
const int setCmdDelay = 100; /*待機時間*/

SoftwareSerial LoRa_Serial(LORA_RX, LORA_TX);

void setup() {
  pinMode(ES920LR_RST_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
  // LoRaを再起動させる
  digitalWrite(ES920LR_RST_PIN, LOW);
  delay(100);
  digitalWrite(ES920LR_RST_PIN, HIGH);
  delay(1500);

  Serial.begin(9600);
  LoRa_Serial.begin(9600);
  delay(3500);
  loraInit();

  String sendData = "";
  for (int i = 1; i <= maxSendTimes; i++) {
    sendData = dstId + getDistance();
    delay(2000);
    Serial.println(sendData);
    LoRa_Serial.println(sendData);
    while (LoRa_Serial.available() > 0) LoRa_Serial.read();
    delay(4000);
  }
  Serial.println("Start Recv");
}

void loop() {
}

void loraInit() {
  Serial.print("Start...");
  // コマンドモード開始
  LoRa_Serial.println("2"); clearBuffer();
  // bw(帯域幅の設定)
  LoRa_Serial.println("bw 4"); clearBuffer();
  // sf(拡散率の設定)
  LoRa_Serial.println("sf 12"); clearBuffer();
  LoRa_Serial.println("channel 1"); clearBuffer();
  // 自分が参加するPANネットワークアドレスの設定
  LoRa_Serial.println("panid 0001"); clearBuffer();
  // 自分のノードIDを設定
  LoRa_Serial.println("ownid 0002"); clearBuffer();
  // ack受信の設定
  LoRa_Serial.println("ack 2"); clearBuffer();
  //送信元のID付与設定
  LoRa_Serial.println("o 1"); clearBuffer();
  // RRSIの付与設定
  LoRa_Serial.println("p 2"); clearBuffer();
  // 送信モードを設定
  LoRa_Serial.println("n 2"); clearBuffer();
  // 設定を保存する
  LoRa_Serial.println("w"); clearBuffer();
  // 通信の開始
  LoRa_Serial.println("z"); clearBuffer();
  Serial.println("Set up OK!");
}

void clearBuffer() {
  delay(setCmdDelay);
  while (LoRa_Serial.available() > 0) LoRa_Serial.read();
}

int getDistance() {
  double duration;
  double distance;
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH); //超音波を出力
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  duration = pulseIn(ECHO_PIN, HIGH); //センサからの入力
  if (duration > 0) {
    duration = duration / 2; //往復距離を半分にする
    distance = duration * 340 * 100 / 1000000; // 音速を340m/sに設定
    return (int)distance;
  } else {
    return 0;
  }
}

距離に応じてLEDを制御する(受信側)

送信側のプログラムがうまくできていれば、こんな感じのデータが受信できます。

このデータは文字なのでatoiを使って数値に型変換してLEDの制御に用います。

距離が30cm以上だったときにLEDがONになり、それ以下だったらOFFになります。

プログラムはこんな感じです。

#include <SoftwareSerial.h>
#include <stdlib.h>

#define RECV_SIZE 30
#define ES920LR_RST_PIN 10
#define LORA_RX 2
#define LORA_TX 3
#define LED_PIN 12

String dstId = "00010001";  /*送信相手の番号*/
const int maxSendTimes = 10; /*最大送信回数*/
const int setCmdDelay = 100; /*待機時間*/

SoftwareSerial LoRa_Serial(LORA_RX, LORA_TX);

void setup() {
  pinMode(ES920LR_RST_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(ES920LR_RST_PIN, LOW);
  delay(100);
  digitalWrite(ES920LR_RST_PIN, HIGH);  // LoRaを再起動させる
  Serial.begin(9600);
  LoRa_Serial.begin(9600);
  delay(3500);
  loraInit();
  Serial.println("Start Recv");
}


void loop() {
  char RecvData[RECV_SIZE] = "";
  unsigned char n = 0;
  int distance;
  while (LoRa_Serial.available() > 0) {
    RecvData[n] = LoRa_Serial.read();

    // 改行文字が来たらNULL文字にする
    if (RecvData[n] == '\r' || RecvData[n] == '\n') {
      RecvData[n] = '\0';
      clearBuffer();
      Serial.println(RecvData);
      distance = atoi(RecvData);
      if(distance >= 30) {
        digitalWrite(LED_PIN, HIGH);
      } else {
        digitalWrite(LED_PIN, LOW);
      }
      break;
    }
    
    if (n < RECV_SIZE) {
      n++;
    } else {
      n = 0;
    }
  }
  delay(300);
}


void loraInit() {
  Serial.print("Start...");
  // コマンドモード開始
  LoRa_Serial.println("2"); clearBuffer();
  // bw(帯域幅の設定)
  LoRa_Serial.println("bw 4"); clearBuffer();
  // sf(拡散率の設定)
  LoRa_Serial.println("sf 12"); clearBuffer();
  LoRa_Serial.println("channel 1"); clearBuffer();
  // 自分が参加するPANネットワークアドレスの設定
  LoRa_Serial.println("panid 0001"); clearBuffer();
  // 自分のノードIDを設定
  LoRa_Serial.println("ownid 0001"); clearBuffer();
  // ack受信の設定
  LoRa_Serial.println("ack 2"); clearBuffer();
  //送信元のID付与設定
  LoRa_Serial.println("o 2"); clearBuffer();
  // RRSIの付与設定
  LoRa_Serial.println("p 2"); clearBuffer();
  // 送信モードを設定
  LoRa_Serial.println("n 2"); clearBuffer();
  // 設定を保存する
  LoRa_Serial.println("w"); clearBuffer();
  // 通信の開始
  LoRa_Serial.println("z"); clearBuffer();
  Serial.println("Set up OK!");
}

void clearBuffer() {
  delay(setCmdDelay);
  while (LoRa_Serial.available() > 0) LoRa_Serial.read();
}

動作確認

30cm以下の時はLEDがOFFになる

30cm以上の時はLEDがONになる

わかりにくいですが光ってます