Отправка данных датчика с передатчика Dragino Lora на приемник Dragino Lora с помощью Arduino - PullRequest
0 голосов
/ 03 мая 2019

Я соединяю две платы Arduino UNO с передатчиком lora и приемником lora и проверяю соединение, отправляя «Hello World», который легко передается на последовательный монитор приемника.

Но когда я подключаю свой датчик к Arduino UNO и связываю его с lora-device, он передает значение датчика как int тип данных. Поэтому я попытался преобразовать int в string и сохранил значение в типе unit_8, но он не может преобразовать тип данных unit_8 в string.

Мой код клиента:

#include <SPI.h>
#include <RH_RF95.h>
const int watermeterPin = 2;
volatile int  pulse_frequency;
unsigned int  literperhour;
unsigned long currentTime, loopTime;
byte sensorInterrupt = 0;
RH_RF95 rf95; 
void setup() 
{
  Serial.begin(9600);
  delay(500);
   pinMode(watermeterPin, INPUT); 
   attachInterrupt(sensorInterrupt, getFlow, FALLING);
   currentTime = millis();
   loopTime = currentTime;
  while (!Serial) ; 
  if (!rf95.init())
    Serial.println("init failed");
}
void loop()
{
  Serial.println("Sending to rf95_server");
  currentTime = millis();
   if(currentTime >= (loopTime + 1000))
   {
      loopTime = currentTime;
      literperhour = (pulse_frequency * 60 / 7.5);
      pulse_frequency = 0;
       Serial.print(literperhour, DEC);
   Serial.println(" Liter/hour");  
   }
   String str= String(literperhour);
  uint8_t data[] = str;
  rf95.send(data, sizeof(data));
  rf95.waitPacketSent();
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  if (rf95.waitAvailableTimeout(3000))
  {   
    if (rf95.recv(buf, &len))
   {
      Serial.print("got reply: ");
      Serial.println((char*)buf);   
   }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is rf95_server running?");
  }
  delay(400);
}
void getFlow ()
{ 
   pulse_frequency++;
} 

И мой код сервера:

#include <SPI.h>
#include <RH_RF95.h>
RH_RF95 rf95;
int led = 10;
void setup() 
{
  pinMode(led, OUTPUT);     
  Serial.begin(9600);
  while (!Serial) ;
  if (!rf95.init())
    Serial.println("init failed");  
}
void loop()
{
  if (rf95.available())
  {  
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (rf95.recv(buf, &len))
    {
      digitalWrite(led, HIGH);
      Serial.print("got request: ");
      Serial.println((char*)buf);
      uint8_t data[] = "And hello back to you";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Sent a reply");
       digitalWrite(led, LOW);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 21 июня 2019

String не конвертируется в uint8_t[].Потому что:

ошибка: инициализатор массива должен быть списком инициализатора или строковым литералом

И поэтому вместо этого:

String str= String(literperhour);
uint8_t data[] = str; // <-- illegal assignment. String is not implicitly convertible to uint8_t
rf95.send(data, sizeof(data));

Bestбыло бы сделать это

String str= String(literperhour);
uint8_t data[] = str;
rf95.send(str.c_str(), str.length());

Функция c_str() возвращает const unsigned char* (или аналогичный тип), а length() возвращает суммусимволы внутри String.

...