有没有,如果有的话,可以在特定命令如 if 语句中使用从 LoRa 发射器接收到的数据包?

问题描述

我正在为学校完成一个项目,现在我已经到了让设备 100% 正常工作的最后一步。有关该项目的一些信息。我正在开发一个无线速度计,它可以跟踪 rpm 并通过霍尔效应传感器将其转换为 MPH。除了通过 Arduino 使用的 LoRa 库之外,我还使用 Heltec LoRa esp32 的模块。我遇到的问题是我正在尝试使用收到的数据包并使用发出的传感器值在 if 语句中使用来激活振动电机以指示它们是否达到某个最高速度。我的代码如下,关于如何正确使用数据包的任何输入都将不胜感激。谢谢你。 接收方:

//lora stuff
#include <SPI.h>
#include <LoRa.h>
#include "SSD1306.h"

SSD1306 display(0x3c,4,15);

#define SS      18
#define RST     14
#define DI0     26
#define BAND    433E6

//neopixel
#include <Adafruit_NeoPixel.h>
#define LED_PIN 32
#define LED_COUNT 1

Adafruit_NeoPixel strip = Adafruit_NeoPixel(1,32,NEO_GRB + NEO_KHZ800);
const int buttonPin = 17;// button
const int neo = 32; //
const int neoCount = 1; //number of pixels
int counter = 0; //button state counter
int buttonState = 0;

//Vibration motor
int motorPin = 25;

//level of speed in mph to trigger motor
int beginner = 10;
int intermediate = 15;
int expert = 25;
int mphVal = 0;

String data;
unsigned int totalMPH;
void setup() {
  //lora
  pinMode(16,OUTPUT);
  digitalWrite(16,LOW);    // set GPIO16 low to reset OLED
  delay(50);
  digitalWrite(16,HIGH);
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_LEFT);

  // button
  pinMode(buttonPin,INPUT);

  //motor
  pinMode(motorPin,OUTPUT);

  //neopixel
  strip.begin();
  strip.show();
  strip.setBrightness(50);
  Serial.begin(115200);

  //lora initial
  while (!Serial); //if just the the basic function,must connect to a computer
  delay(100);
  Serial.println("Speed Receiver");
  display.drawString(5,5,"Speed Receiver");
  display.display();
  SPI.begin(5,19,27,18);
  LoRa.setPins(SS,RST,DI0);

  if (!LoRa.begin(BAND)) {
    display.drawString(5,25,"Starting LoRa Failed!");
    while (1);
  }
  Serial.println("LoRa Initial OK!");
  display.drawString(5,"LoRa Initializing OK!");
  display.display();

}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packets
    //Serial.print("Received packet. ");
    display.clear();
    display.setFont(ArialMT_Plain_16);
    display.drawString(3,"Received Speed ");
    display.display();
    // read packet
    while (LoRa.available()) {
      String data = LoRa.readString();
      Serial.print(data);
      display.drawString(20,22,data);
      display.display();
      // if speed reaches x then motor will buzz
      if (data.equals("MPH: 12.5")) {
        digitalWrite(motorPin,HIGH);
        delay(10);
        digitalWrite(motorPin,LOW);
        delay(10);
      }

    }
    // print RSSI of packet
    //Serial.print(" with RSSI ");
    //Serial.println(LoRa.packetRSSi());
    //    display.drawString(20,45,"RSSI:  ");
    //    display.drawString(70,(String)LoRa.packetRSSi());
    //    display.display();


  }

  //taking the packet and turning it into an int from string
  //String data = data.toInt();
  //int data = totalMPH;
  //float totalMPH = data.toFloat();
  //   char data;
  //   float totalMPH;

  //totalMPH = atof(data);
  //Serial.println(totalMPH);

  //button
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {
    counter++;

    delay(150);
  }

  //button states with three colors
  //beginner
  else if (counter == 0) {
    //Serial.println("pushed");
    strip.setPixelColor(0,255,0);
    strip.show();
    //Serial.println(0);
    display.drawString(10,"REC: 10 MPH");
    display.display();
    //vibration motor will trigger if the speed recieved is less then or equal to 12mph
//    digitalWrite(motorPin,HIGH);
//    delay(4000);
//    digitalWrite(motorPin,LOW);
//    delay(120000);

  }
  //intermediate
  else if (counter == 1) {
    strip.setPixelColor(0,0);
    strip.show();
    Serial.println(1);
    display.drawString(10,"REC: 15 MPH");
    display.display();
    //vibration motor will trigger if the speed recieved is less then or equal to 17mph
    //      digitalWrite(motorPin,HIGH);
    //      delay(4000);
    //      digitalWrite(motorPin,LOW);
    //      delay(240000);
    //digitalWrite(motorPin,LOW);

  }
  //expert
  else if (counter == 2) {
    strip.setPixelColor(0,255);
    strip.show();
    Serial.print(2);
    display.drawString(10,"REC: 20 MPH");
    display.display();
    //digitalWrite(motorPin,LOW);
    
  }
  //reset settings
  else {
    counter = 0;
  }
}

发射器:

//lora
#include <SPI.h>
#include <LoRa.h>
#include "SSD1306.h"
#include <Arduino.h>
#include <Bounce2.h>

Bounce hall = Bounce();
SSD1306  display(0x3c,15);

#define SS      18
#define RST     14
#define DI0     26
#define BAND    433E6  //915E6 

int counter = 0;
int rpmTimer = 0;
int rpmInterval = 1000;

void setup() {
  //board and lcd
  pinMode(25,OUTPUT); //Send success,LED will bright 1 second
  pinMode(16,HIGH);

  // sensor and led
  hall.attach(37,INPUT);
  hall.interval(1);
  //pinMode(led,OUTPUT);
  //pinMode(hallSens,INPUT);
  Serial.begin(115200);

  //lcd
  while (!Serial); //If just the the basic function,must connect to a computer
  // Initialising the UI will init the display too.
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(5,"LoRa Sender");
  display.display();
  //lora
  SPI.begin(5,DI0);
  Serial.println("LoRa Sender");
  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa Failed!");
    while (1);
  }
  Serial.println("LoRa Initial OK!");
  display.drawString(5,20,"LoRa Initializing OK!");
  display.display();
  delay(10);
}


void loop() {
 
  hall.update();

  if(hall.rose()){
    counter++;
  }
  if(millis() - rpmTimer > rpmInterval){
    float rpm = counter * 60;
    float rph = rpm * 60;
    float dia = 0.00004349;
    float cir = dia * 3.14;
    float totalMPH = rph * cir;

    Serial.println(totalMPH);

    rpmTimer = millis();
    counter = 0;

  //sending packet
  LoRa.beginPacket();
  LoRa.print("MPH: " + String(totalMPH));
  LoRa.endPacket();

  //LoRa.sleep(); //puts lora receiver to sleep probably dont need
  digitalWrite(25,HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(10);                       // wait for a second
  digitalWrite(25,LOW);    // turn the LED off by making the voltage LOW
  delay(100);                       // wait for a second
  //delay(300);

  
  
  }
  
}

解决方法

在基于有线的 API 设计方面:

// packet is the packet from the transmitter
String packet = "S12.5"
String measurement = packet.substring(0,1); // "S"
if (measurement == "S") {
  // at this point we know that the rest of the message is the MPH
  String data = packet.substring(1,strlen(packet)-1); // "12.5"
  float mph = data.toFloat();
  if (mph >= TOP_SPEED) {
    doSomething();
  }
  else {
    doSomethingElse();
  }
}

如果您知道网络上的传感器少于 25 个,您可以使用 charAt(0) 来获取 measurement 而不是 substring()

每个度量在消息的开头都有自己的 char,与该度量相关的数据将紧随其后。因此,发送方和接收方就像 API 交换中的客户端/服务器一样进行交互。它们之间有一个隐含的约定,当发射器说“S12.5”时,接收器知道这意味着 12.5MPH。这是您的系统,因此您可以按照自己喜欢的方式设计通信数据包。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...