problema termostato wifi

codice trasmittente

#include <VirtualWire.h>;
const short sensore=0;
int temp=0;

void setup()
{
    Serial.begin(9600);	// inizializa monitor seriale
   

    // Inizializza trasmettitore
    
    vw_setup(2000);	 // Bits per sec
    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
temp=(analogRead(sensore)*5/1023.0*100);
delay(10);
Serial.print("temperatura ");
Serial.print(temp);
Serial.print(" ");
    
     char msg[10] = "";                     //variabile di char
    itoa (temp,msg,10);
  
    Serial.println(msg);
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    digitalWrite(13, true); // Flash led 13 quando trasmetti
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    Serial.println("Sent");
    digitalWrite(13, false);

    // Wait at most 200ms for a reply
    if (vw_wait_rx_max(200))
    {
	if (vw_get_message(buf, &buflen)) // Non-blocking
	{
	    int i;
	    
	    // Message with a good checksum received, dump it.
	    Serial.print("Got: ");
	    
	    for (i = 0; i < buflen; i++)
	    {
		Serial.print(buf[i], HEX);
		Serial.print(" ");
	    }
	    Serial.println("");
	}
    }
    else
	Serial.println("Timout");
delay(5000);
	
}

codice ricevente

#include <LiquidCrystal.h>
#include <VirtualWire.h>
int temperaturaimpostata=62;
int temperaturaeffetiva=0;
#define rele1 9
#define rele2 8
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int timeout = 5100;              // 5 sec.              fuori dal looop()
unsigned long millisTime=0;            //                        fuori dal looop()

void setup() {
  Serial.begin(9600);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  vw_setup(2000);	 // Bits per sec
  vw_rx_start();       // Start the receiver PLL running
  pinMode(12, INPUT);//pulsante aumento temp.impostata
  pinMode(10, INPUT);//pulsante diminuzione temp. impostata
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Temp. Impo:");
  lcd.setCursor(0,1);
  lcd.print("Temp. Effe:");
  digitalWrite(rele1, LOW);
  digitalWrite(rele2, HIGH);
}

void loop() {
   if(digitalRead(12)==HIGH)
   {
     temperaturaimpostata=temperaturaimpostata+1;
   }
   if(digitalRead(10)==HIGH)
   {
     temperaturaimpostata=temperaturaimpostata-1;
   }
   lcd.setCursor(12, 0);
  lcd.print(temperaturaimpostata);
   uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    // Wait for a message
    

    
    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
       millisTime = millis();
       digitalWrite(rele2, HIGH);
	int i;
	const char *msg = "prova";

        digitalWrite(13, true); // Flash a light to show received good message
	// Message with a good checksum received, dump it.
	Serial.print("temperatura ");

	
char buffer[10] = "";
   	for (i = 0; i < buflen; i++) {
     
            buffer[i]=(buf[i]);
   	}
  temperaturaeffetiva = atoi(buffer);
  lcd.setCursor(12,1);
           lcd.print("    ");
           lcd.setCursor(12,1);
           lcd.print(buffer);
          Serial.print(buffer);
          
         
          Serial.println(" ");
          

	// Send a reply
	vw_send((uint8_t *)msg, strlen(msg));
        digitalWrite(13, false);
    }
    else{
     if( millis() > millisTime + timeout ) {
       digitalWrite(rele2, LOW);//qui fai la segnalazione allarme
       Serial.println("MANCA SEGNALE");                 
     }}
     if (temperaturaeffetiva >= temperaturaimpostata)
     {
       digitalWrite(rele1, HIGH);
     }
     else if(temperaturaeffetiva <=(temperaturaimpostata-2))
     {
       digitalWrite(rele1, LOW);
     }     
       
  
  delay(200);  
}

Allora attualmente ogni 11 ricezioni mi accende il rele2 per una frazione di secondo..
cmq io avevo bisogno che se non riceve il segnale per un qualsiasi motivo ( ma non una cosa immediata anche magari dopo un tempo di alcuni minuti) mi poerta il rele 2 in LOW e quando riceve il segnale il rele2 sia in posizione HIGH...
Spero di essermi spiegato...

Nessuno ha consigli?
Non so come fare...

Allora attualmente ogni 11 ricezioni mi accende il rele2 per una frazione di secondo..
cmq io avevo bisogno che se non riceve il segnale per un qualsiasi motivo ( ma non una cosa immediata anche magari dopo un tempo di alcuni minuti) mi poerta il rele 2 in LOW e quando riceve il segnale il rele2 sia in posizione HIGH...
Spero di essermi spiegato...

in teoria è quello che dovrebbe fare.
non capisco da dove escano le 11 ricezioni :relaxed:

mi pare che la sonda trasmette più o meno ogni 5 sec, per cui il tempo di timeout nel ricevitore devi portarlo almeno a 15-20 sec. altrimenti è molto probabile che gli allarmi di mancata ricezione arrivino più o meno ad ogni trasmissione

Le undici ricezioni sono circa 55 secondi non capisco perche ma ciclicamente mi accende il rele2 per una frazione di secondo...
lo avevo messo a 20 secondi ma mi faceva aggiornamento temperatura ogni 20 seondi...
praticamente sembrava avere dato un delay 20000...
Il timeout fa fermare il resto delle funzioni di arduino?