433 MHz bei keinem Empfang Zähler zurücksetzen

Hallo Zusammen,

da bin ich wieder mit meinem Temperatursendern :slight_smile:

Folgendes ich hab diesen Code: (Code ist zu lang, versuche ihn als Antwort zu schreiben)

Nun hab ich folgendes "Problem"

Wenn ein Temperatursender aus irgend einem Grund sein Signal nicht Sendet bzw der Empfänger Arduino das Signal nicht Empfängt dann bleibt im Display immer der "alte" Wert stehen.
Das heißt man würde eine gewisse Zeit gar nicht merken das kein Signal Empfangen wurde.

Ich wollte jetzt das wenn nach ablauf einer gewissen Zeit kein Signal empfangen wird auf dem Display etwas ausgegeben wird zb. "Keine Daten empfangen"

Nun da komm ich momentan nicht so richtig weiter wie ich das anstellen soll.

Es müsste auch für jeden Sender solch ein Cod laufen.
Jeder Sender hat eine ID 1 bis 3.

Ich müsste doch eigentlich für jeden Sender ein millis() laufen lassen zb. 10min (der Sender schickt alle 4,37min, ein Signal mal zu verpassen wäre nicht so schlimm) und wenn dann kein Signal gekommen ist muss der Text im LCD ausgegeben werden. Empfängt er ein Signal dann müsste praktisch millis() wieder von vorne los gehen.

Nur wie genau mach ich das?

Vielen dank für eure Hilfe!

Gruß Dominik

//-------------------------------------------------------------------------------------------------// Libs implantieren \\---------------------------------------------------------------------------------------------------------------------------------------------------------
#include <VirtualWire.h>
#include <SPI.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>


//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

LiquidCrystal_I2C lcd(0x27,20,4);   // set the LCD address to 0x27 for a 16 chars and 2 line display
const int RECEIVERID  = 1;         // ID des Empfängers
const int RX_Pin      = 8;        // PIN, an den der 433 Mhz Empfänger angeschlossen ist
const int TX_Pin      = 9;       // Einen leeren PIN angeben, da die VirtualWire-Lib sonst einen Pin belegt, der für den Ethernet-Chip genutzt wird
const int PTT_Pin     = 7;      // Einen leeren PIN angeben, da die VirtualWire-Lib sonst einen Pin belegt, der für den Ethernet-Chip genutzt wird

//---------------------------------------------------------------------------------------------// DS18B20 \\------------------------------------------------------------------------------------------------------------------------------------------------------------------

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
long letzteMillis = 300000;
long intervall = 300000;
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
char SensorDataTemp[] = "s=1,t=1580,h=4470,v=4980"; // Wird zum String auftrennen benutzt
int s;
int h;
int v;
float t;

//---------------------------------------------------------------------------------------------------// Eigene Zeichen im LCD ausgeben für Batterie Status \\-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

char b66 = 0;
char b56 = 1;
char b46 = 2;
char b36 = 3;
char b26 = 4;
char b16 = 5;
byte Batterie6zu6[8] = // Sensor 1 Batterie 3/3 voll
{
B01110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte Batterie5zu6[8] = // Sensor 1 Batterie 2/3 voll
{
B01110,
B11111,
B10001,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte Batterie4zu6[8] = // Sensor 1 Batterie 1/3 voll
{
B01110,
B11111,
B10001,
B10001,
B11111,
B11111,
B11111,
B11111

};
byte Batterie3zu6[8] = // Sensor 1 Batterie leer
{
B01110,
B11111,
B10001,
B10001,
B10001,
B11111,
B11111,
B11111
};
byte Batterie2zu6[8] = // Sensor 1 Batterie 1/3 voll
{
B01110,
B11111,
B10001,
B10001,
B10001,
B10001,
B11111,
B11111

};
byte Batterie1zu6[8] = // Sensor 1 Batterie leer
{
B01110,
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111
};

//---------------------------------------------------------------------------------------------------// Eigene Zeichen im LCD ausgeben für ° Zeichen \\-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

char grad = 6;
byte GradZeichen[8] = // ° Zeichen
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};

//---------------------------------------------------------------------------------------------------// Eigene Zeichen im LCD ausgeben für Funk Zeichen \\-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

char funk = 7;
byte FunkZeichen[8] = // Funk Zeichen
{
B00000,
B11111,
B10001,
B00000,
B01110,
B01010,
B00000,
B00100
};

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 void setup() {
  
 //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
 
  lcd.init();                      // initialize the lcd 
  lcd.backlight();                // LCD Hintergrundbeleuchtung an
  Serial.begin(9600);   // Serial starten
  Serial.print("Auf Daten warten....");
  Serial.println();
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 lcd.setCursor(0, 0);
 lcd.print("Auf Daten warten....");
 lcd.setCursor(0, 1);
 lcd.print("Auf Daten warten...."); 
 lcd.setCursor(0, 2);
 lcd.print("Auf Daten warten...."); 
 
 
lcd.createChar(b66, Batterie6zu6);    // Batterie Status
lcd.createChar(b56, Batterie5zu6); 
lcd.createChar(b46, Batterie4zu6); 
lcd.createChar(b36, Batterie3zu6); 
lcd.createChar(b26, Batterie2zu6); 
lcd.createChar(b16, Batterie1zu6); 
    lcd.createChar(grad, GradZeichen); // ° Zeichen
        lcd.createChar(funk, FunkZeichen); // Funk Zeichen
//------------------------------------------------------------------------------------------------- //VirtualWire initialisieren\\----------------------------------------------------------------------------------------------------------------------------------------------
    
  vw_set_rx_pin(RX_Pin);                  // Empfangs-Pin für den 433-Empfänger setzen
  vw_rx_start();                         // Empfänger starten
  vw_setup(2000);                       // Bits/Sec
  
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  // Start up the library DS18B20
  sensors.begin();
  
}
void loop(){
  
  
  
  
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
  // Daten-Variable, die die empfangenen Daten hält
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];
 
  // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
  String SensorData;
  
  // Empfang von Daten prüfen
  if (vw_get_message(buf, &buflen)) {
    int i;
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit 0en füllen
 
    // Datagramm zusammensetzen
    for (i = 0; i < buflen; i++) {
      SensorDataTemp[i] = (char)buf[i];
      
    }

  


    // Char-Variable terminieren
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';
 
    // Char to String-Konvertierung zur Übergabe an die connect()-Funktion
    SensorData = SensorDataTemp;
    
   s = atoi(strtok(SensorDataTemp, ",") + 2);  // Wird zum trennen des Strings benutzt
   t = atoi(strtok(NULL, ",") + 2);
   h = atoi(strtok(NULL, ",") + 2);
   v = atoi(strtok(NULL, ",") + 2);
    
   
   
  //---------------------------------------------------------------------------------------Start Ausgabe Sensor 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------
   
   if(s == 1){
  
   
    // Serial-Output zum Debuggen
    Serial.println();
    Serial.print("Daten empfangen: ");
    Serial.println(SensorData);
    Serial.println();
    Serial.print("SensorID: ");
    Serial.println(s);
    Serial.print("Temperatur: ");
    Serial.print(t/100);
    Serial.println("C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(h);
    Serial.println("%");
    Serial.print("Batteriespannung: ");
    Serial.print(v);
    Serial.println("mV");
    Serial.println();
    


 
lcd.setCursor(0, 0);
lcd.print(F("                    "));
lcd.setCursor(0, 0);
lcd.print(s);
lcd.setCursor(1, 0);
lcd.print(".");
lcd.setCursor(2, 0);
lcd.print(funk);
lcd.setCursor(5, 0);
lcd.print(t/100);
lcd.setCursor(10, 0);
lcd.print(grad);
lcd.setCursor(11, 0);
lcd.print("C");
lcd.setCursor(14, 0);
lcd.print(h);
lcd.setCursor(16, 0);
lcd.print("% ");


  
 
 if(v > 4000){
   lcd.setCursor(19, 0);
   lcd.write(b66);}
 else if(v > 3800){
   lcd.setCursor(19, 0);
   lcd.write(b56);}  
 else if(v > 3600){
   lcd.setCursor(19, 0);
   lcd.write(b46);}  
 else if(v > 3400){
   lcd.setCursor(19, 0);
   lcd.write(b36);}
 else if(v > 3200){
   lcd.setCursor(19, 0);
   lcd.write(b26);}  
 else if(v < 3000){
   lcd.setCursor(19, 0);
   lcd.write(b16);}    
 }
 
 

//--------------------------------------------------------------------- Ende Ausgabe Sensor 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
    
    
    
//---------------------------------------------------------------------------------------Start Ausgabe Sensor 2 --------------------------------------------------------------------------------------------------------------------------------------------------------------
   
   if(s == 2){
  
   
    // Serial-Output zum Debuggen
    Serial.println();
    Serial.print("Daten empfangen: ");
    Serial.println(SensorData);
    Serial.println();
    Serial.print("SensorID: ");
    Serial.println(s);
    Serial.print("Temperatur: ");
    Serial.print(t/100);
    Serial.println("C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(h);
    Serial.println("%");
    Serial.print("Batteriespannung: ");
    Serial.print(v);
    Serial.println("mV");
    Serial.println();
    




lcd.setCursor(0, 1);
lcd.print(F("                    "));
lcd.setCursor(0, 1);
lcd.print(s);
lcd.setCursor(1, 1);
lcd.print(".");
lcd.setCursor(2, 1);
lcd.print(funk);
lcd.setCursor(5, 1);
lcd.print(t/100);
lcd.setCursor(10, 1);
lcd.print(grad);
lcd.setCursor(11, 1);
lcd.print("C");
lcd.setCursor(14, 1);
lcd.print(h);
lcd.setCursor(16, 1);
lcd.print("% ");



if(v > 4000){
   lcd.setCursor(19, 0);
   lcd.write(b66);}
 else if(v > 3800){
   lcd.setCursor(19, 0);
   lcd.write(b56);}  
 else if(v > 3600){
   lcd.setCursor(19, 0);
   lcd.write(b46);}  
 else if(v > 3400){
   lcd.setCursor(19, 0);
   lcd.write(b36);}
 else if(v > 3200){
   lcd.setCursor(19, 0);
   lcd.write(b26);}  
 else if(v < 3000){
   lcd.setCursor(19, 0);
   lcd.write(b16);}    
 }
 

//--------------------------------------------------------------------- Ende Ausgabe Sensor 2 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
    
    
    
//---------------------------------------------------------------------------------------Start Ausgabe Sensor 3 --------------------------------------------------------------------------------------------------------------------------------------------------------------
   
   if(s == 3){
  
   
    // Serial-Output zum Debuggen
    Serial.println();
    Serial.print("Daten empfangen: ");
    Serial.println(SensorData);
    Serial.println();
    Serial.print("SensorID: ");
    Serial.println(s);
    Serial.print("Temperatur: ");
    Serial.print(t/100);
    Serial.println("C");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(h);
    Serial.println("%");
    Serial.print("Batteriespannung: ");
    Serial.print(v);
    Serial.println("mV");
    Serial.println();
    



lcd.setCursor(0, 2);
lcd.print(F("                    "));
lcd.setCursor(0, 2);
lcd.print(s);
lcd.setCursor(1, 2);
lcd.print(".");
lcd.setCursor(2, 2);
lcd.print(funk);
lcd.setCursor(5, 2);
lcd.print(t/100);
lcd.setCursor(10, 2);
lcd.print(grad);
lcd.setCursor(11, 2);
lcd.print("C");
lcd.setCursor(14, 2);
lcd.print(h);
lcd.setCursor(16, 2);
lcd.print("% ");



if(v > 4000){
   lcd.setCursor(19, 0);
   lcd.write(b66);}
 else if(v > 3800){
   lcd.setCursor(19, 0);
   lcd.write(b56);}  
 else if(v > 3600){
   lcd.setCursor(19, 0);
   lcd.write(b46);}  
 else if(v > 3400){
   lcd.setCursor(19, 0);
   lcd.write(b36);}
 else if(v > 3200){
   lcd.setCursor(19, 0);
   lcd.write(b26);}  
 else if(v < 3000){
   lcd.setCursor(19, 0);
   lcd.write(b16);}    
 }
 

//--------------------------------------------------------------------- Ende Ausgabe Sensor 3 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
    
      }
  
  //--------------------------------------------------------// Für Temperatur Innen \\---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
      
      
      
      unsigned long jetzigeMillis = millis();
 if(jetzigeMillis - letzteMillis > intervall){ //Sensoren werden nur alle 30 sec gelesen
 letzteMillis = jetzigeMillis;
      
      
      sensors.requestTemperatures(); // Send the command to get temperatures
 
  lcd.setCursor(0, 3);
  lcd.print ("Innen:");
  lcd.setCursor(7, 3);
  lcd.print(sensors.getTempCByIndex(0));  
  lcd.setCursor(12, 3);
  lcd.print(grad);
  lcd.setCursor(13, 3);
  lcd.print("C");
Serial.print(sensors.getTempCByIndex(0)); 
 
 }
 
      
      
      
      
}

millis() läuft automatisch immer weiter. Was du speichern musst ist wann zuletzt was empfangen wurde

Du legst ein Array an:

unsigned long previousMillis[3];

Jedesmal wenn du Daten empfängst, setzt du das auf den aktuellen Wert von millis(). Das kannst du über ID - 1 ansprechen

Dann kannst du sowas machen:

for(int i = 0; i < 3; i++)
{
   if(millis() - previousMillis[i] > interval)
   {
   }
}

Hallo Serenifly,

danke für deine Antwort.
Leider weiß ich nicht wie ich dem Array die millis zuweiße seit dem letzten Empfang.

previousMillis[ID - 1] = millis();

Vielleicht habe es auch falsch verstanden und du hast an der Stelle nur ein Gegenstück von dem du was empfängst. Oder du hast 3 Gegenstücke, aber die Zeit für alle gemeinsam haben. Dann muss man natürlich nur eine Zeit verwalten. Dann lass das Array weg und nimm einfach "unsigned long previousMillis". Und mach nur das:

   if(millis() - previousMillis > interval)
   {
   }

Übrigens:

char SensorDataTemp[] = "s=1,t=1580,h=4470,v=4980";

Das war Test Code! Wieso ist das da drin?

Außerdem, wenn du für t auch Nachkommastellen übertragen willst, kannst du da atoi() durch atof() ersetzten. Mit atoi() werden die Nochkommastellen abgeschnitten.

Aber irgendwie sind da sowieso 2-3 Konvertierungen zu viel drin. String Objekte solltest du nirgends brauchen.

Wenn du einen Puffer namens uint8_t buf[...] hast, dann sollte theoretisch einfach sowas gehen:

char* str = (char*)buf;

Also buf auf char* casten. Und schon kann man über str den Puffer als C String ansprechen (d.h. Array aus char)

Aber da müssen nirgends Daten umkopiert werden wenn man es richtig macht. Schon gar nicht über String Objekte. str ist in dem Fall einfach eine Variable die auf den Anfang des Puffers zeigt. Es wird nur Speicher für die Variable benötigt. Kein weiteres Array.

Selbst wenn du das umkopieren willst, wieso erst in ein char Array kopieren und dann das Array in ein String Objekt wandeln (wo die Daten nochmal kopiert werden!)?

Hallo Serenifly,

sei nicht so streng mit mir :slight_smile:
Ich bin noch nicht sehr gut in der ganzen Sache und ja ich weiß man sollte sich normalerweiße erst ein gewisses Grundwissen erarbeiten.

Ich hab es jetzt so gemacht:

previousMillisSender1 = millis();

hab ich in meine if abfrage für Sensor 1 geschrieben und dann kommt später am ende vom loob

if (millis() - previousMillisSender1 > intervalSender1) {
  
  lcd.setCursor(0, 0);
  lcd.print("!Kein Daten empfang!");}

Das ganze scheint zu klappen :slight_smile:

Ich danke dir das du dir immer wieder Zeit für mich nimmst!