Anzeigen von Dezimalzahlen im 2.8'' TFT LCD Shield mittels 433MHz Modulen

Hallo zusammen,

ich stehe vor dem Problem, dass ich mit den 433MHz Modulen von meinem Nano etwas an den Uno schicken möchte und dies auf dem 2.8'' TFT LCD Shiel darstellen möchte. Die Übertragung funktioniert reibungslos, jedoch möchte ich statt Buchstaben eine Dezimalzahl, also den Datentyp float, versenden. Jedoch bekomme ich die Umwandlung, bzw. die Anzeige des Zahlenwertes nicht hin. Es wird immer diese Form von der Funktion gefordert: vw_send(uint8_t*, uint8_t). Die Einzige Ausgabemöglichkeit, die bisher funktioniert hat ist die Folgende:

Sender

#include <VirtualWire.h>
#include <VirtualWire_Config.h>

uint8_t text[VW_MAX_MESSAGE_LEN];               //Speicherort der empfangenen Nachricht
uint8_t textlaenge = VW_MAX_MESSAGE_LEN;    //Größe des Speicherortes

char *eins = "1.15";
char *zwei = "2.25";

void setup() {
  vw_set_ptt_inverted(true);      
  vw_set_tx_pin(2);               
  vw_setup(5000);                 
}

void loop() {
  vw_send((uint8_t *)eins, strlen(eins));
  vw_wait_tx();
  delay(3000);
  

  vw_send((uint8_t *)zwei, strlen(zwei));
  vw_wait_tx();
  delay(3000);

}

Empfänger

#include <VirtualWire.h>
#include <VirtualWire_Config.h>

uint8_t text[VW_MAX_MESSAGE_LEN];           //Speicherort der empfangenen Nachricht
uint8_t textlaenge = VW_MAX_MESSAGE_LEN;    //Größe des Speicherortes

void setup(void)
{ 
  Serial.begin(9600);

  vw_set_ptt_inverted(true);      //damit der Sender richtig funktioniert
  vw_set_rx_pin(11);               //Verbundener Datenpin
  vw_setup(5000);                 //Datenrate festlegen
  vw_rx_start();                  //Starten des Empfängers                 
}

void loop()
{  
  if (vw_get_message(text, &textlaenge)){
    
    tft.setTextColor(BLACK);
    tft.setTextSize(6);
    tft.setCursor(80, 101);
    tft.fillScreen(WHITE);
    tft.drawRect(4,4,312,232,BLACK);

    tft.println(text[0]);

    }
        
  }

Deinen Sketch habe ich mir noch nicht genau angesehen, konnte aber erkennen, das dieser so nicht funktioniert.
Du musst die Datenrate auf 2000 setzen, da die verwendete Library nur auf max. 2000 lt. Datenblatt festgelegt ist.

Edit:
Einen float-Wert kannst du mittels dieser Library nicht übertragen. Du musst den Wert als Ganzzahl übertragen und anschließend wieder teilen.

Alles klar, wie kann ich das denn genau umsetzten? Habe schon einiges probiert aber nichts klappt..
Wenn ich den Empfänger folgendermaßen ändere bekomme ich die Dezimalzahl, welche als char gespeichert ist ausgegeben.

 for (i=0; i< textlaenge; i++){
    tft.setCursor(x, 100);
    x = x+28;
    tft.println((char)text[i]); 
    Serial.print((char)text[i]);
    }

Jedoch möchte ich einen Messwert, welcher vom Typ float ist, versenden. Dazu würde ich den float am liebsten einfach in einen string umwandeln und wie gehabt versenden. Alle Möglichkeiten (schon den Überblick verloren) haben jedoch nicht funktioniert, vielleicht kann mir jemand die Richtung weisen :confused:

Diese Wandlung kann man relativ einfach mit Union machen. Diese Definition gehört vor die Loop/Setup

union floatTObyte{
  float f;
  byte b[4]; // 32bit float/int angenommen
} FTB;
Jetzt kannst du im Programm z.B. FTB.f=23.455 belegen und in FTB.b[0] bis FTB[3] 
deine 4 Bytes raus kramen und übertragen. Am Empfänger genau anders herum. 
Du schreibst mit die FTB.b[0..3] deine Empfangenen bytes und liest mit FTB.f 
die zusammengesetzte float aus.

Gruß
DerDani

Habe offensichtlich falsch gesucht.. Habe es nun folgendermaßen beim Sender:

#include <VirtualWire.h>
#include <VirtualWire_Config.h>

uint8_t text[VW_MAX_MESSAGE_LEN];           //Speicherort der empfangenen Nachricht
uint8_t textlaenge = VW_MAX_MESSAGE_LEN;    //Größe des Speicherortes

float Vm;
int *Vm2;

int i;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <HX711_ADC.h>
HX711_ADC LoadCell(9, 10);


/////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

Serial.begin(9600);

  LoadCell.begin();
  LoadCell.start(2000);
  LoadCell.setCalFactor(2090.0);
  
  vw_set_ptt_inverted(true);      
  vw_set_tx_pin(2);               
  vw_setup(2000);

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  LoadCell.update();              
  float Vm = LoadCell.getData(); 

//Vm = 1.2345;

int C1 = (int)Vm;
int Vm2 = (Vm - C1) *100;
int C2 = (int)Vm2; // For two decimal points
char msg[24];
sprintf(msg, "%i.%i", C1,C2);

Serial.println(Vm, 5);

for(i=0; i<strlen(msg); i++){
Serial.print((char *)msg[i]);
}
 
      vw_send((uint8_t *)msg, strlen(msg));
      vw_wait_tx();


}

Wenn ich der Variable einen Wert zuweise funktioniert es, jedoch nicht für den gemessenen Wert vom Sensor. Bekomme durchgehend 0.0 angezeigt.

Ich habe nun alles Mögliche getestet und herausgefunden, dass der HX711 nicht parallel mit dem Sender arbeiten kann. Gibt es eine Möglichkeit sie Zeitversetzt an und auszuschalten? Ein Interrupt würde nicht funktionieren, da er keine Variable übergeben kann. Andere Varianten habe ich bisher nicht gefunden

jorkan:
Ich habe nun alles Mögliche getestet und herausgefunden, dass der HX711 nicht parallel mit dem Sender arbeiten kann. Gibt es eine Möglichkeit sie Zeitversetzt an und auszuschalten? Ein Interrupt würde nicht funktionieren, da er keine Variable übergeben kann. Andere Varianten habe ich bisher nicht gefunden

Wie hast du das festgestellt ?

Gibt es da eine Fehlermeldung ?

Nein keine Fehlermeldung, aber sobald ich die Anweisung zum Start des Senders ausführen lasse gibt der Verstärker keinen Wert mehr aus, beziehungsweise 0.0000 :frowning:

Der Code des Senders funktioniert ohne den Verstärker tadellos

Hier nochmal der aktuelle Code:

#include <HX711_ADC.h>

#include <VirtualWire.h>
uint8_t text[VW_MAX_MESSAGE_LEN];           //Speicherort der empfangenen Nachricht
uint8_t textlaenge = VW_MAX_MESSAGE_LEN;    //Größe des Speicherortes

HX711_ADC LoadCell(9, 10);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <LCD5110_Graph.h>
LCD5110 myGLCD(7,6,5,4,3);

extern uint8_t SmallFont[];         //Größe der Schrift ->6x8Pixel
extern unsigned char TinyFont[];    //4x6Pixel
extern uint8_t MediumNumbers[];     //12x16Pixel
extern uint8_t BigNumbers[];       //14x24Pixel

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setupHX711(){
  LoadCell.begin();
  LoadCell.start(2000);
  LoadCell.setCalFactor(2090.0);  
}

void setupSender(){
  vw_set_ptt_inverted(true);      
  vw_set_tx_pin(2);               
  vw_setup(2000);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(9600);
  
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);    
  randomSeed(analogRead(7));   

setupHX711();
setupSender();

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop()
{  

    myGLCD.clrScr();              

    myGLCD.print("HELLO", CENTER, 3);
    myGLCD.drawLine(25,11,59,11);
    myGLCD.update();
    delay(1500);

  LoadCell.update();              
  float Vm = LoadCell.getData();  

  Serial.print(Vm, 10);
  Serial.print("\t");
      
      myGLCD.clrScr();
      myGLCD.print("Gewicht [g]:", CENTER, 15);
      myGLCD.printNumF(Vm, 5, CENTER, 30);
      myGLCD.update();


float Vmp = Vm * (-1);       //Sensorwert ist negativ

int C1 = (int)Vmp;
int Vm2 = ((Vmp - C1) *(1000));
int C2 = (int)Vm2;
char msg[24];
sprintf(msg, "%i.%i", C1,C2);

  setupSender();
      //vw_send((uint8_t *)msg, strlen(msg));
      //vw_wait_tx();

}

Wozu ist in der Loop der nochmalige Aufruf des "SenderSetup" ?
Hast du für den Sender mal einen anderen Pin getestet ?

Da könnte das Problem sein. Dann macht der Interrupt0 evtl. ein Problem.
Das müsste man in der Lib zum HX711 prüfen.