Accendere e spegnere led

Buongiorno a tutti! io ho realizzato questa parte di programma per accendere e spegnere un led con un telecomando, ma vorrei poterlo anche accendere e spegnere con un pulsante tipo che quando premo il pulsante se avevo acceso il led con il telcomando esso si spegne e viceversa…

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 11;
int Luce1 = 13;                 
        

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // inizia a ricevere
pinMode(Luce1, OUTPUT);      // settaggio come pin uscita
}

void loop() {
if (irrecv.decode(&results)) { 
 long int decCode = results.value;
 Serial.println(decCode);
 switch (results.value) {
  
   case 16738455:
     Serial.println("Luce1");
     digitalWrite(Luce1, HIGH);   // accendi luce uno
     break;
   case 16750695:
     Serial.println("Stop");
       digitalWrite(Luce1, LOW);   // spegni luce 1
       default: 
     Serial.println("Waiting ...");
 }

 irrecv.resume(); 
}
}

Mentre guardando su internet per far funzionare un led come una luce di casa devo usare questo programma (copio e incollo dal web)

#define LED 10               // LED collegato al pin digitale 13  
#define BUTTON 7              // pin di input dove è collegato il pulsante  
int val = 0;                  // si userà val per conservare lo stato del pin di input  
int vecchio_val = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  
  
void setup() {  
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output  
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
}  
  
void loop() {  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
  }   
  
  vecchio_val = val;            // ricordiamo il valore precedente di val  
  
  if (stato == 1) {  
    digitalWrite(LED, HIGH);   // accende il led  
  }  
  else {  
    digitalWrite(LED, LOW);    //spegne il led  
}  }

come faccio a raggiungere le funzioni che voglio senza che i due si contrastino a vicenda?
Perchè se uso il programma qui sopra lui leggerà che il pulsante non ha restituito uno a val e quindi anche se premo il tasto del telecomando per accenderlo lui non si accenderà…
Qualcuno sa aiutarmi?

Grazie mille in anticipo!!A

metti nel case 16738455: stato = TRUE; ... ...

e nel case 16750695: stato = FALSE; ... ...

poi

void loop() {

------------------------------------------

qui applichi il programma che controlla il button

------------------------------------------

if (irrecv.decode(&results)) { 
...
...

}

Scusami, non è che potresti spiegarmi un pò dettagliatamente se hai tempo e voglia perchè non ho afferato... scusa

Prendi il programma che hai copiato per l'IR come base e li dentro aggiungi il pezzo che hai copiato e che ti serve per controllare il pulsante.

la funzione loop() deve verificare sia l'arrivo di un segnale IR che la pressione del pulsante fin qui ci siamo? il pezzo lo metti prima di if (irrecv.decode(&results)) {

ora il loop legge entrambi gli eventi ma manca l'aggiornamento delle variabili "val" e "stato", dove andrai mai ad aggiornare questi valori? Li metti quando riceve on e off del telecomando.

poi ovviamente ti manca da aggiungere al setup() le parti del pulsante e le variabili all'inizio dello sketch. Ma scusa, se vuoi fare un sistema switch con un pulsante solo una volta ON e una volta OFF, perchè usi 2 tasti del telecomando? così ti complichi la vita

Ps: se volete accendere la luce sia dalla porta che con un telecomando perchè non avete voglia di alzarvi, bisogna anche comprendere il software che si copia e si incolla o no?

la luce è per un faro esterno, e non posso usare lo stesso pulsante perchè quando premo lui mi invia una serie di segnali quindi mi ritroverei ad avere la luce che si accende e si spenge... comunque il programma che ho copiato l'ho capito, mentre non capivo solo come metterli assieme, ma provo, come mi hai spiegato! grazie mille!!

#include <IRremote.h>
#include <IRremoteInt.h>
#define BUTTON 7             

int RECV_PIN = 11;
int Luce1 = 13;          
int val = 0;                  
int vecchio_val = 0;          
int stato = 0;           
        

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); 
pinMode(Luce1, OUTPUT);      
}

void loop() {
   val = digitalRead(BUTTON);  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
  }   
  
  vecchio_val = val;            
  if (stato == 1) {  
    digitalWrite(Luce1, HIGH);   
  }  
  else {  
    digitalWrite(Luce1, LOW);    
}  
if (irrecv.decode(&results)) { 
 long int decCode = results.value;
 Serial.println(decCode);
 switch (results.value) {
  
   case 16738455:
     Serial.println("Luce1");
     digitalWrite(Luce1, HIGH);   // accendi luce uno
     break;
   case 16750695:
     Serial.println("Stop");
       digitalWrite(Luce1, LOW);   // spegni luce 1
       default: 
     Serial.println("Waiting ...");
 }

 irrecv.resume(); 
}
}

Ok ho fatto una parte di quello che mi hai detto ora dovrei praticamente al posto di far accendere direttamente la luce con il telecomando farlo agire sulla variabile val o sbaglio ?

qualcuno mi saprebbe aiutare?

Allora ho provato e riprovato più volte ma niente non ci riesco... Vi spiego più dettagliatamente cos'è che mi ferma: Programma bottone: quando io vado a leggere il valore del pulsante cambio gli stati delle variabili val & vecchio_val da 0 a 1 o viceversa e a seconda dello stato 0 o 1 aliemnto o no il pin 13... Programma IR: quando mi arriva il codice X1 io alimento il pin 13 quando mi arriva il codice X2 tolgo l'alimentazione.

Problema mio: io vorrei che se mi è arrivato il codice X1 o ho premuto il pulsante in modo che val = 1 quindi led acceso mi venga acceso il led ma se mi arriva il codice X1 e val=0 il programma non mi lascia accendere il led perchè va in contrasto stessa cosa quando mi arriva X2, io vorrei una variabile che mi permetta di usare una funzione di tipo OR quindi mi è arrivato il codice X1 oppure ho premuto il pulsante e la luce era spenta: mi si accende il led e cosi via... quindi una variabile che cambi sia quando premo il pulsante che quando mi arriva un codice in modo che a seconda dello stato in cui si trova aliementi oppure no il pin 13 ... Qualcuno ha delle idee? Grazie mille in anticipo!!

così al volo, senza provarlo…

#include <IRremote.h>
#include <IRremoteInt.h>
#define BUTTON 7             

int RECV_PIN = 11;
int Luce1 = 13;         
int val = 0;                 
int vecchio_val = 0;         
int stato = 0;           
       

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(Luce1, OUTPUT);     
pinMode(BUTTON, INPUT);     // questo mancava
}

void loop() {
  // controlli il pulsante
  val = digitalRead(BUTTON); 
  if ((val == HIGH) && (vecchio_val == LOW)){ 
    stato = 1 - stato; 
  }   
  vecchio_val = val;           

  //controlli il telecomando
  if (irrecv.decode(&results)) {
    long int decCode = results.value;
    Serial.println(decCode);
    switch (results.value) {
 
      case 16738455:
        //Serial.println("Luce1");
        //digitalWrite(Luce1, HIGH);   // accendi luce uno
        stato = 1;
        break;
      case 16750695:
        //Serial.println("Stop");
        //digitalWrite(Luce1, LOW);   // spegni luce 1
        stato = 0;
        break;
      default:
       Serial.println("Waiting ...");
    }
  }

  // in base al valore di stato accendi o spegni la luce
  if (stato == 1) { 
    digitalWrite(Luce1, HIGH);   
  } 
  else { 
    digitalWrite(Luce1, LOW);   
  } 

  irrecv.resume();
}

Niente stesso problema, provo con il telecomando non funziona, premo il pulsante si accende il led e non si spegne più... Comunque grazie che hai provato! e se sai aiutarmi su come ragionarlo saresti molto gentile!!

se commenti la parte riguardante il bottone, il telecomando funziona? posta l'ultimo sketch che hai usato.

l'ultimo è il tuo... e il telecomando si l'ho sempre utilizzato e funziona il programma che usavo solo per il telecomando se non erro è il primo su in alto!

io dicevo di prendere l’esempio che ho postato io, di commentare la parte del pulsante (da val = … a vecchio_val) e vedere se il resto funziona. se il codice è corretto dovresti accendere e spegnere la luce col telecomando.

Ma non trovo problemi in quelle righe mi sembra giusto il programma ( scuso la mia ignoranza in questo campo, ma non ho mai operato con problemi del genere )

onestamente non trovo problemi neanche nel resto... per questo dicevo di isolare pezzi di codice e vedere se funzionano. non ho un telecomando, quindi non posso provare io... al limite ripristina le righe serial.print che ho commentato e vedi premendo il telecomando cosa ti stampa sulla seriale.

ho provato il codice postato sopra e limitatamente al bottone funziona.
la parte telecomando non so.

la luce è per un faro esterno, e non posso usare lo stesso pulsante perchè quando premo lui mi invia una serie di segnali quindi mi ritroverei ad avere la luce che si accende e si spenge... comunque il programma che ho copiato l'ho capito, mentre non capivo solo come metterli assieme, ma provo, come mi hai spiegato! grazie mille!!

Il problema è tipico e si risolve pensando a come funziona il grilletto di un'arma non automatica, cioè premi è spara una sola volta, per sparare una seconda volta devi rilasciare il grilletto, tirare il cane (cioè armare il grilletto) e allora esercitando la pressione sul grilletto spari una seconda volta.

Purtroppo il telecomando è paragonabile ad una arma automatica, dove la pressione continua sul pulsante genera una treno di codici tutti uguali, cioè spara di continuo.

Alcune abbreviazioni usate di seguito sono qui brevemente descritte: * PWRON = Power On - Sarebbe a dire dall'accensione in poi, o dal reset in poi. * Trigger - È Il grilletto, esso può essere Loaded (caricato) o unloaded (non caricato)

Al PWRON trigger deve essere caricato nel setup, triggerButton1 = LOADED; Per semplicità definiamo due costanti:

#define LOADED true
#define UNLOADED false

Chi è mancino di cervello potrebbe desiderare gli stati invertiti e allora si può modificare così le define:

#define LOADED true
#define UNLOADED (!LOADED)

In questo modo posso modificare soltanto LOADED

#define LOADED true
#define UNLOADED (!LOADED)

boolean irTriggerState = LOADED;  // il trigger è caricato

void setup() {

}



    if (irrecv.decode(&results)) { // il ricevitore IR ha qualcosa da comunicarmi
         switch (results.value) {

              case 16738455:
                    if ( irTriggerState == LOADED ) {
                        togglePin( Luce1 );  // togglePin è una funzione da scrivere che inverte lo stato del pin specificato.
                        irTriggerState = UNLOADED; // il grilletto ha sparato e quindi ora è scarico
                    }
            

              break;

              case 16750695:
                   if ( irTriggerState == LOADED ) {
                        togglePin( Luce2 );  // togglePin è una funzione da scrivere che inverte lo stato del pin specificato.
                        irTriggerState = UNLOADED; // il grilletto ha sparato e quindi ora è scarico
                    }    
              break;
         }   
        
   } else {
         // il ricevitore non ha nulla da comunicarmi, quindi tutti i pulsanti sono rilasciati
         irTriggerState = LOADED; // carico il grilletto  
   }

Il codice è solo un esempio per mostrare il concetto di trigger caricato o meno.

Ciao.

Grazie mille a tutti e due che mi state aiutando!! Mauro ho provato a creare un programmino sulle basi del tuo solo che mi da questi errori a riguardo della tua nuova funzione... cosa sbaglio? Ed in qualsiasi caso come posso ora con questa nuova funzione risolvere il problema del fatto che le variabili mi vadano in contrasto? :confused:

Errori:

D:\Arduino\Progetto luce camera\IR_Reciver uso solo un pulsante\Solo un pulsante\sketch_jul02a\sketch_jul02a.ino: In function 'void loop()':

sketch_jul02a:30: error: 'togglePin' was not declared in this scope

togglePin( Luce1 ); // togglePin è una funzione da scrivere che inverte lo stato del pin specificato.

^

sketch_jul02a:37: error: expected '}' before 'else'

} else {

^

sketch_jul02a:40: error: expected '}' at end of input

}

^

exit status 1 'togglePin' was not declared in this scope

Mauro ho provato a creare un programmino sulle basi del tuo solo che mi da questi errori a riguardo della tua nuova funzione... cosa sbaglio? Ed in qualsiasi caso come posso ora con questa nuova funzione risolvere il problema del fatto che le variabili mi vadano in contrasto? :confused:

Forse sbagli nel desiderare la pappa pronta per risolvere il problema. Il mio codice è da prendere come suggerimento per favorire l'apprendimento e il ragionamento, da questi deriva la capacità di scrivere codice di proprio pugno.

Se leggi bene il commento circa la funzione togglePin, ti accorgi che non esiste e che quindi bisogna crearla e questo lo devi fare tu (anche con l'aiuto del forum).

Intanto mancando la funzione togglePin() puoi testare il resto del codice sostituendo a questa una serial.println("comando luce 1 ricevuto");

Così facendo il codice dovrà comportarsi nel seguente modo: Pressione sul tasto 1 che rimane premuto per 5 secondi circa. Il serial monitor ti deve mostrare solo una print, cioè: comando luce 1 ricevuto.

Riguardo la funzione togglePin() Il nome della funzione che inverte lo stato di un pin va scelto in modo arbitrario dal programmatore, se la vuoi chiamare invertiStato() va bene uguale. Io ho usato questo nome perché rende bene l'idea ed è usato ampiamente da altri programmatori, inoltre l'atmega internamente è dotato di questa funzione via hardware e il manuale la descrive appunto "toggle pin".

Ora sta a te e alla tua volontà mettere a frutto questi suggerimenti. Ciao.

Io ho provato e riprovato ma non riesco a venire a capo di questo problema e non capisco come questa nuova funzione citata da te Mauro potrebbe aiutarmi a risolvere il problema delle variabili...