Datenübertragung zwischen 2 Arduinos (433MHz)

Hallo zusammen,

ich möchte über Funk (433Mhz-Sender & Empfänger) drei Daten senden. Zum einen Temperatur- und Luftfeuchtigkeitswerte (DHT11) und die Bodenfeuchtigkeit (soil moisture sensor).
Den Bodenfeuchtigkeitssensor habe ich beim Sender über den Analog 0 Pin angeschlossen. Dieser liefert Werte zwischen 0-1023.
Jedoch habe ich im Sketch eine Vorgabe darüber, wie viele Zeichen übertragen werden sollen. Und der Empfänger empfängt diese auch nur, wenn die exakte Anzahl an Zeichen auch gesendet worden ist.
Nun, da die Werte des Bodenfeuchtigkeits-Sensors variieren (1-4-stellig) funktioniert das Sketch nur teilweise.
Meine Frage nun: Wie schaffe ich es Werte zu übertragen, die nicht abhängig von der exakten Zeichenanzahl ist ?

Sketch Sender:

// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library 
#include <SPI.h> 
 
// Include DHT Libraries from Adafruit
// Dependant upon Adafruit_Sensors Library
#include "DHT.h";
 
// Define Constants
 
#define DHTPIN 7       // DHT-22 Output Pin connection
#define DHTTYPE DHT11   // DHT Type is DHT 22 (AM2302)
 
// Define Variables
 
float hum;    // Stores humidity value in percent
float temp;   // Stores temperature value in Celcius
float feucht;
 
// Define output strings
 
String str_humid;
String str_temp;
String str_feucht;
String str_out;
 
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
 
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  
  Serial.begin(9600);
  
  
  // Initialize ASK Object
  rf_driver.init();
  // Start DHT Sensor
  dht.begin();
 
}
 
void loop()
{
 
  delay(2000);  // Delay so DHT-22 sensor can stabalize

  int feucht_edgy;
  feucht_edgy = analogRead(0);
  //Serial.println(feucht_edgy);
  
   
    hum = dht.readHumidity();  // Get Humidity value
    temp= dht.readTemperature();  // Get Temperature value
    
    // Convert Humidity to string
    str_humid = String(hum);
    
    // Convert Temperature to string
    str_temp = String(temp);

    str_feucht = String(feucht_edgy);
 
    // Combine Humidity and Temperature
    str_out = str_humid + "," + str_temp + "," + str_feucht;
    
    // Compose output character
    static char *msg = str_out.c_str();
    
    rf_driver.send((uint8_t *)msg, strlen(msg));
    rf_driver.waitPacketSent();
    Serial.println(str_out);
    delay(2000);
  
}

Sketch Empfänger:

// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library 
#include <SPI.h> 
 
// Define output strings
 
String str_humid;
String str_temp;
String str_feucht;
String str_out;
 
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
 
void setup()
{
    // Initialize ASK Object
    rf_driver.init();
    // Setup Serial Monitor
    Serial.begin(9600);
}
 
void loop()
{
    // Set buffer to size of expected message
    uint8_t buf[15];
    uint8_t buflen = sizeof(buf);
    // Check if received packet is correct size
    if (rf_driver.recv(buf, &buflen))
    {
      
      // Message received with valid checksum
      // Get values from string
      
      // Convert received data into string
      str_out = String((char*)buf);
      
      // Split string into two values
      /*for (int i = 0; i < str_out.length(); i++) {
      if (str_out.substring(i, i+1) == ",") {
      str_humid = str_out.substring(0, i);
      str_temp = str_out.substring(i+1);
      */
      for (int i = 0; i < str_out.length(); i++) {
      if (str_out.substring(i, i+1) == ",") {
      str_humid = str_out.substring(0,i);
      str_temp = str_out.substring(i+1,i+6);
      str_feucht = str_out.substring(i+7, i+10); //i+9
      break;
      }
    }
      
      // Print values to Serial Monitor
      Serial.print("Humidity: ");
      Serial.print(str_humid);
      Serial.print("  - Temperature: ");
      Serial.print(str_temp);
      Serial.print("   - Boden: ");
      Serial.print(str_feucht);    
      Serial.println("");   
      //Serial.println(str_out);         
    }
}

Danke für Eure Hilfe :slight_smile:

Danke, daran habe ich gar nicht gedacht.
Also einfach bspw. eine 10.000 zum Wert addieren und die 1 dann "wegkomman".

Top, das sollte ich hinkriegen. :slight_smile:

Ich würde den Vorschlag aus #1 aufgreifen und mit strtok die empfangene Zeichenkette zerlegen:

char input[] = "44.64,20.78,22";

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");

  char * str_humid, * str_temp, * str_feucht;
  str_humid = strtok (input, ",");
  str_temp = strtok (NULL, ",");
  str_feucht = strtok (NULL, ",");
  Serial.print(str_humid);
  Serial.print(' ');
  Serial.print(str_temp);
  Serial.print(' ');
  Serial.print(str_feucht);
  Serial.println();
}

void loop() {}