valori di piu sensori su monitor seriale

salve a tutti..... ho notato che collegando 1 sensore di gas uno di temperatura e valori di un telecomando il tutto va un pò in conflitto... siccome sto facendo un progetto di un modellino di casa domotica come posso collegare tutti questi sensori non avendo problemi tra loro?? haimè la stampa seriale la devo comunque fare perchè poi in base a questi valori arduino deve decidere se deve attaccare o meno la ventola.. oppure accendere o meno un led!! c'è qualke metodo per farli fnzionare bene??? qualcuno che ha fatto questo progetto può indirizzarmi in merito? grazie!!

Innanzitutto dovresti essere più preciso:

che sensori sono? che protocollo di comunicazione usano? come li hai collegati? cosa succede? cosa vorresti fare?

I sensori non dovrebbero andare in conflitto tra loro, è fatto apposta per leggere svariati sensori l'arduino. Usi le resistenze di pull-up/down?

ecco un problema… ho il monitor seriale aperto e mi sta stampando la temperatura dell’ lm35… mentre i valori scendono ed io voglio utilizzare un telecomando con ricevitore tsop per far fare altre funzioni tipo accendere una luce da remoto è come se non mi stampa il valore perchè va in conflitto con i valori della temperatura… per l’ lm3 non ho usato resistenza pull-up down…

poi ho creato una situazione ovvero che quando la temperatura è superiore ai 20 gradi la ventola si accende automatica oppure è spenta con if ed else e qui tutti bene… poi ho programmato con il telecomando che posso attivare e disattivare la ventola anche da remoto ma non mi va mi va solo in automatico :astonished: sarà la programmazione???

Puoi postare lo sketch?

#include <IRremote.h> // use the library
int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

int lm35=A0;
float temperatura;
int ventola=8;

void setup (){
Serial.begin (9600);
pinMode (lm35,INPUT);
pinMode (ventola,OUTPUT);
irrecv.enableIRIn(); // Start the receiver
}

void loop (){
temperatura=analogRead (A0);
temperatura=(5 * temperatura * 100/1024);
Serial.print ("Gradi centigradi");
delay (2000);
Serial.println (temperatura);



if (temperatura>25.00){
  
digitalWrite (ventola,HIGH);
}

else {

  digitalWrite (ventola,LOW);
  }
  
  
  
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  
  
  
  if ( results.value == 0xFF52AD){ //TASTO9
    digitalWrite(ventola, HIGH);   
  } 
 if ( results.value == 0xFF6897){ //TASTO0
    digitalWrite(ventola, LOW);   
}
  
  
  }

Hai messo un delay da 2 secondi, è normale che in quel periodo di tempo il ricevitore a infrarossi non funzioni. Guarda l'esempio dell'IDE "blink without delay"; devi temporizzare la stampa della temperatura me non bloccare il flusso del programma.

Ciao deagon

Provo i miei 2cents...

Per evitare il confronto con un valore letto ad ogni loop (e quindi eliminare il delay "pesante"), potresti rendere "non bloccante" la gestione delle letture della LM35: - aggiungendo un controllo sul tempo: "leggo ogni x secondi/millisecondi" (sulla falsa riga dell'antirimbalzo via software) - e magari seguendo anche lo schema di questo link per costruire una lettura media di n letture: http://www.adrirobot.it/menu_new/index/index_sensori_in-out.htm

altrimenti a ridosso del valore di set (25.00) potresti avere un continuo on/off perchè la condizione ">25.00" diventerebbe vera/falsa molto velocemente (per ora il delay(2000) ti ha evitato questo comportamento, ma ha reso bloccante la lettura della temperatura)

trattandosi di un termostato per climatizzazione, i tempi di "rinnovo" del valore della temperatura possono essere relativamente lunghi (per me anche nell'ordine del minuto o più), però è anche vero che in fase di test si necessita di tempi più rapidi: mettendo questo tempo in una variabile, puoi cambiarlo a piacimento

sono principiante con arduino… mi potete fare un esempio di questa temporizzazione a codice???
devo immettere questa teporizzazione nel loop??

potete farmi un esempio ve ne sarei grato così da poter prendere spunto :drooling_face:

ho visto il codice d’ esmpio quello del blikwithoutdelay ma non ci capisco molto =(

Ti hanno già risposto gli altri su come risolvere il problema per questi test, il punto è che, a mio avviso, dovresti temporizzare solo la scrittura, mentre le letture dovrebbero andare sempre in continua. (più o meno quello che ti hanno detto).

Per farlo avrei due metodi,

Il più semplice è creare una funzione che si attiva ogni x cicli (con un codice ridotto l'intervallo risulta stabile, se cominci ad avere centinaia di funzioni rischi che ogni ciclo abbia un intervallo apprezzabilmente differente dagli altri). Dentro questa funzione stampi a video. Per evitare di fumare la ventola puoi fare la media (metodo a mio avviso migliore) oppure temporizzare anche questa all'interno della funzione di prima o su una uguale.

Il metodo più complesso è quello di usare i timer interrupts, ma visto che sei alle prime armi è meglio che questo metodo magari te lo guardi tra qualche giorno.

nel codice

int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

hai 3 variabili per il tempo: - currentMillis: il "tempo" corrente dall'accensione ("Millis() returns the number of milliseconds since the Arduino board began running the current program."), in millisecondi - previousMillis è il tempo dell'ultima "operazione" eseguita (un blocco di istruzioni, una funzione richiamata, ecc.) - interval: è il tempo minimo in millisecondi che deve passare prima di eseguire nuovamente l' "operazione"

Inizialmente, all'accensione, previousMillis vale zero, currentMillis vale esattamente il millis() al momento dell'assegnazione unsigned long currentMillis = millis();. Quindi, al primo ciclo, sicuramente non è passato il tempo interval. Ma dopo un certo numero di cicli, accadrà che millis() e di conseguenza currentMillis() avranno un valore tale che:

currentMillis - previousMillis > interval

e così il blocco di codice dell' IF sarà eseguito. Da notare che è fondamentale aggiornare la variabile previous:

previousMillis = currentMillis

infatti il tempo dell'ultima operazione è "adesso" (millis()) e la prossima sarà fra almeno "interval" millisecondi.

Impostando interval, imposterai il tempo che intercorre tra un'operazione e l'altra: 1000 per un secondo, 60000 per un minuto e così via.

Che stupido, questo era un altro metodo semplice...Sarà stata l'ora, me lo auguro :grin: