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...