problema termostato wifi

salve a tutti nella mia ignoranza dopo prove ho cercato di creare un termostato wireless con due arduino micro, due moduli rf , un dispay 16*2, un sesore lm 35, due pulsanti e una schedina rele per la potenza....
su un arduino ho messo sensore lm 35 e rf tx.
e questo legge e trasmette la temperatura...
nel altro dispay, i due pulsanti per incremento e diminuzione temperatura impostata, modulino rf rx, e la schedina rele...
in maniera oscena ma ho fatto gli sketch...
dopo vari tentativi funzionava provando con i due arduino su due pc e i serial monitor..
fino a quando non ho provato a fare scrivere sul display ma la temperatura effetiva mi perde la prima cifra esempuio 26 scrive solo 6 ..
allego sketch ricevente

#include <LiquidCrystal.h>
#include <VirtualWire.h>
int temperaturaimpostata=62;
int temperaturaeffetiva=0;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  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:");
}

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
    {
	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 ");
	
	for (i = 0; i < buflen; i++)
	{temperaturaeffetiva=(buf[i]-48);
lcd.setCursor(12,1);
  lcd.print(temperaturaeffetiva);
	    Serial.print(temperaturaeffetiva);
	    
	}
	Serial.println(" ");
	// Send a reply
	vw_send((uint8_t *)msg, strlen(msg));
        digitalWrite(13, false);
    }
     
  
  
  delay(200);  
}

trasmitente

#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);
Serial.print("temperatura ");
Serial.print(temp);
Serial.print(" ");
    const char *msg = "0";//variabile di char
    switch (temp)
    {
      case 1:
      msg="1";
      break;
      case 2:
      msg="2";
      break;
      case 3:
      msg="3";
      break;
      case 4:
      msg="4";
      break;
      case 5:
      msg="5";
      break;
      case 6:
      msg="6";
      break;
      case 7:
      msg="7";
      break;
      case 8:
      msg="8";
      break;
      case 9:
      msg="9";
      break;
      case 10:
      msg="10";
      break;
       case 11:
      msg="11";
      break;
      case 12:
      msg="12";
      break;
      case 13:
      msg="13";
      break;
      case 14:
      msg="14";
      break;
      case 15:
      msg="15";
      break;
      case 16:
      msg="16";
      break;
      case 17:
      msg="17";
      break;
      case 18:
      msg="18";
      break;
      case 19:
      msg="19";
      break;
      case 20:
      msg="20";
      break;
       case 21:
      msg="21";
      break;
      case 22:
      msg="22";
      break;
      case 23:
      msg="23";
      break;
      case 24:
      msg="24";
      break;
      case 25:
      msg="25";
      break;
      case 26:
      msg="26";
      break;
      case 27:
      msg="27";
      break;
      case 28:
      msg="28";
      break;
      case 29:
      msg="29";
      break;
      case 30:
      msg="30";
      break;
      case 31:
      msg="31";
      break;
      case 32:
      msg="32";
      break;
      case 33:
      msg="33";
      break;
      case 34:
      msg="34";
      break;
      case 35:
      msg="35";
      break;
      case 36:
      msg="36";
      break;
      case 37:
      msg="37";
      break;
      case 38:
      msg="38";
      break;
      case 39:
      msg="39";
      break;
      case 40:
      msg="40";
      break;
       case 41:
      msg="41";
      break;
      case 42:
      msg="42";
      break;
      case 43:
      msg="43";
      break;
      case 44:
      msg="44";
      break;
      case 45:
      msg="45";
      break;
      case 46:
      msg="46";
      break;
      case 47:
      msg="47";
      break;
      case 48:
      msg="48";
      break;
      case 49:
      msg="49";
      break;
      case 50:
      msg="50";
      break;
       case 51:
      msg="51";
      break;
      case 52:
      msg="52";
      break;
      case 53:
      msg="53";
      break;
      case 54:
      msg="54";
      break;
      case 55:
      msg="55";
      break;
      case 56:
      msg="56";
      break;
      case 57:
      msg="57";
      break;
      case 58:
      msg="58";
      break;
      case 59:
      msg="59";
      break;
      case 60:
      msg="60";
      break;
       case 61:
      msg="61";
      break;
      case 62:
      msg="62";
      break;
      case 63:
      msg="63";
      break;
      case 64:
      msg="64";
      break;
      case 65:
      msg="65";
      break;
      case 66:
      msg="66";
      break;
      case 67:
      msg="67";
      break;
      case 68:
      msg="68";
      break;
      case 69:
      msg="69";
      break;
      case 70:
      msg="70";
      break;
       case 71:
      msg="71";
      break;
      case 72:
      msg="72";
      break;
      case 73:
      msg="73";
      break;
      case 74:
      msg="74";
      break;
      case 75:
      msg="75";
      break;
      case 76:
      msg="76";
      break;
      case 77:
      msg="77";
      break;
      case 78:
      msg="78";
      break;
      case 79:
      msg="79";
      break;
      case 80:
      msg="80";
      break;
       case 81:
      msg="81";
      break;
      case 82:
      msg="82";
      break;
      case 83:
      msg="83";
      break;
      case 84:
      msg="84";
      break;
      case 85:
      msg="85";
      break;
      case 86:
      msg="86";
      break;
      case 87:
      msg="87";
      break;
      case 88:
      msg="88";
      break;
      case 89:
      msg="89";
      break;
      case 90:
      msg="90";
      break;
       case 91:
      msg="91";
      break;
      case 92:
      msg="2";
      break;
      case 93:
      msg="93";
      break;
      case 94:
      msg="94";
      break;
      case 95:
      msg="95";
      break;
      case 96:
      msg="96";
      break;
      case 97:
      msg="97";
      break;
      case 98:
      msg="98";
      break;
      case 99:
      msg="99";
      break;
     
    }
  
    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(2000);
	
}

spero di avere fatto giusto a inserire gli sketch

grazie in anticipo
Luigi

ciao, credo che questo sia sbagliato:

	for (i = 0; i < buflen; i++)
	{temperaturaeffetiva=(buf[i]-48);
lcd.setCursor(12,1);
  lcd.print(temperaturaeffetiva);
	    Serial.print(temperaturaeffetiva);
	    
	}

per ogni ciclo di for leggi un carattere e lo stampi in 12,1
ovvio che al secondo ciclo sovrascrive il nuovo carattere al precedente.... per cui alla fine leggi solo l'ultimo numero.
devi bufferizzare i caratteri in un array o stringa e stampi fuori dal ciclo for.
oppure devi incrementare anche le coordinate del cursore ad ogni ciclo.

nel trasmettittore a cosa serve quello switch?
in pratica gli fai fare: se il carattere è 10 allora scrivi 10.
non mi pare abbia senso, è un controllo inutile.

grazie per la risposta...
nel trasmetittore lo switch l'ho usato perche non sono riuscito a fargli scrivere il valire della variabile temp se non in questo modo...
ma accetto suggerimenti....
il 12, 1 io l'ho messo per settare il cursore non per scrivere un carattere solo...
che devo mettere?
grazie

ok, ma il cursore non avanza automaticamente quando ha scritto un carattere, e poi in ogni caso ad ogni ciclo for reimposti il cursore sulla stessa posizione.....

ricdata:
devi bufferizzare i caratteri in un array o stringa e stampi fuori dal ciclo for.
oppure devi incrementare anche le coordinate del cursore ad ogni ciclo.

come faccio a bufferizzare i caratteri per usarli fuori dal ciclo for?
perdona la mia ignoranza
grazie per l'aiuto
luigi

char buffer[buflen] = "";

   	for (i = 0; i < buflen; i++) {
            buffer[i]=(buf[i]-48);
   	}
           lcd.setCursor(12,1);
           lcd.print(buffer);
          Serial.print(buffer);

mi da questo errore:
voss_ricevente_dispay_gigi_2.ino: In function ‘void loop()’:
voss_ricevente_dispay_gigi_2.ino:46:24: error: variable-sized object ‘buffer’ may not be initialized

non accetta l'array variabile...strano
togli buflen e metti un numero di quanti caratteri hai bisogno

char buffer[10] = '';

grazie ..
funziona...
ora pero devo convertire la char buffer nella variaile temperaturaeffettiva per far funzionare come termostato e azionare i rele...

temperaturaeffettiva = atoi(buffer);

per fare l'inverso, nel trasmettitore al posto dello swicth

    char msg[10] = "";                     //variabile di char
    itoa (temp,msg,10);

eccomi ancora qua..
nel trasmetitore dove ho collegato lm 35 finche arduino micro alimentato d usb dl pc va tutto benissimo quando lo collego a batteria a 9 volt nei pin vin e gnd la rilevaione della temperatura oscilla di molto ad ogni lettura...
perche ?
con arduino uno non mi crea questo problema neanche alimentato a batteria...
inoltre arduino micro facendo
void setup()
{
Serial.begin(9600);
Serial.println("CIAO")
}
non funziona scrive solo nel loop( questo l'ho notato da molto ma non e fondamentale)...
se qualcuno puo aiutarmi grazieeeeeeeeeee
Luigi

la batteria è carica a sufficienza?
fai una prova con un altra batteria o un alimentatore esterno.
il sensore come è collegato?

gia provato con altra batteria e anche con alimentatore esterno...
e cmq lo stesso collegamento e lo stesso sketch su arduino uno funziona bene...

non so che dire. non mi viene in mente nulla e la board micro non la conosco.
ti conviene aprire una nuova discussione sull'argomento.

leggevo in internet che alcuni mettono in paralelo all'alimetazione della sonda un condensatore da 100 uf...
cmq la nuova discussione che sia meglio la apro su hardware???

quel problema e risolto bisogna solo quando si toglie alimemntazione aspettare almeno 3 minuti prima di riaviare...

Ho un altro quesito...
praticamente io alimento arduino che fa da trasmettitore a batteria e auduino che fa da ricevitore con alimentatore...
Avrei bisogno che quando quello trasmettitore resta senza batteria e che ovviamente non trasmette più niente quello ricevente non ricevendo più niente dopo un po di tempo( diciamo un minuto o due) mi avvertisse tipo accendedomi un led...
E possibile farlo?
allego sketch...
trasmettirore

#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);
	
}

ricevitore

#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);

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
    {
	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);
    }
     if (temperaturaeffetiva >= temperaturaimpostata)
     {
       digitalWrite(rele1, HIGH);
     }
     else if(temperaturaeffetiva <=(temperaturaimpostata-2))
     {
       digitalWrite(rele1, LOW);
     }     
       
  
  delay(200);  
}

Grazie dei consigli...
Luigi

const int timeout = 2000;              // 2 sec.              fuori dal looop()
unsigned long millisTime=0;            //                        fuori dal looop()
.....
........
...........    
if (vw_get_message(buf, &buflen)) // Non-blocking
{
      millisTime = millis();
        ......
        ........
}
else{
     if( millis() > millisTime + timeout ) {
                 //qui fai la segnalazione allarme
     }
}

......
.....
....

ciao con questo sistema mettendo timeout =2000 si accende e spegne in continuazione,
ho messo 2100 e funziona meglio ma ogni tot tempo si accende e spegne anche se ce il segnale...
come risolvo?
grazie luigi

posta il codice e spiega cosa vuoi ottenere