Aiuto, sono inesperto (IRremote control)

Ciao a tutti, premetto che pur essendo una domanda un po basilare e stupida, ancora autonomamente non so darmi risposta… Quindi speravo nel vostro aiuto !

Questo è uno sketch che ho preso su internet per potermi accendere semplicemente dei led tramite un telecomandino IR. Con questo sketch posso accenderlo, ma per poterlo spegnere usando lo stesso tasto di accensione come si fa ??

#include <IRremote.h>


int RECV_PIN = 8;
const int ledPin = 13;

IRrecv irrecv(RECV_PIN);

decode_results results;

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

void loop() {
 if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX);
   irrecv.resume(); // Receive the next value
 }
 delay(100);
 if(results.value == 0xFF30CF) {
   digitalWrite(ledPin,HIGH);
   }
 }

Grazie in anticipo per l’aiuto !! :slight_smile:

**@Masciu: ** ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

Ok ho aggiustato, grazie per l'avvertimento

Per rispondere alla tua domanda ... ... invece di accendere il LED, quando ricevi il codice devi commutare una variabile, da un valore ad un altro, esempio true/false, 1/0, poi, sempre nel loop() se la variabile è in una condizione accendi, nell'altro spegni ;)

Quindi ... ... ricevi codice ... ti chiedi variabile == true ...... si, variabile = false ...... no, variabile = true ... se variabile true, accendi LED, se false spegni LED

Guglielmo

Ti ringrazio moltissimo per la risposta ma ero riuscito a risolvere poco fa.
Solo che ora è sorto un’altro problema:
In pratica quando con il telecomando accendo il ledPinA, questo comincia a lampeggiare e non riesco più a fermarlo. Poi provo ad accenderne un’altro (e mi si spegne il ledPinA ) e anche l’altro fa lo stesso.
Non saprei davvero dove ho sbagliato, il mio dubbio potrebbe essere che il loro comportamento potrebbe esser dovuto al fatto che sono attaccati ai Pin A1, A2, A3 e A4.
Ecco il codice:

#include <IRremote.h>

int ReciverPin = 8;
const int ledPinA = 15; //numero del pin analogico del LED, 15 -> A1 
const int ledPinB = 16; //numero del pin analogico del LED, 16 -> A2
const int ledPinC = 17; //numero del pin analogico del LED, 17 -> A3
const int ledPinD = 18; //numero del pin analogico del LED, 18 -> A4

IRrecv irrecv(ReciverPin); 
decode_results results;
char stato;

void setup() {
  
  Serial.begin(9600); 
  irrecv.enableIRIn();
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT); 
  pinMode(ledPinD, OUTPUT); 
  
  stato==LOW;
  }
void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); 
    irrecv.resume();
    }
 if ( results.value == 0xFF30CF){ 
  stato=(stato==LOW ? HIGH : LOW);   
  digitalWrite(ledPinA, stato);
  delay(250); 
  } 
  //if ( results.value == 0xFF30CF){
  //stato=!stato;  
  //digitalWrite(ledPinA, stato);
  //delay(250);
  //}
else if ( results.value == 0xFF18E7){
  stato=!stato;  
  digitalWrite(ledPinB, stato);
  delay(250);
  }   
else if ( results.value == 0xFF7A85){
  stato=!stato;  
  digitalWrite(ledPinC, stato);
  delay(250);
  }  
else if ( results.value == 0xFF10EF){
  stato=!stato;  
  digitalWrite(ledPinD, stato);
  delay(250);
  }  
}

Guarda questo tuo pezzo ...

if ( results.value == 0xFF30CF){ 
  stato=(stato==LOW ? HIGH : LOW);   
  digitalWrite(ledPinA, stato);
  delay(250); 
  } 
  //if ( results.value == 0xFF30CF){
  //stato=!stato;  
  //digitalWrite(ledPinA, stato);
  //delay(250);
  //}

... se ricevi il codice metti il LED come stato ... 250 millisecondi dopo, se ricevi ancora il codice (ed alcuni telecomandi trasmetto lo stesso codice più volte e quindi superano i 250 ms) inverti stato e quindi commuti di nuovo il led :confused:

Guglielmo

P.S.: i pin Analogici di Arduno UNO posso essere usati tutti senza problema come digitali, quindi NO, il problema NON sono i pin, è il codice ;)

Guglielmo abbi pazienza :sweat_smile: :sweat_smile: purtroppo non ho capito bene cosa devo modificare, sfortunatamente sono davvero poco istruito sulla programmazione ed elettronica in general, quindi se ti va riusciresti a postarmi il pezzo corretto dello sketch ?? forse vedendolo lo capisco e così so come aggiustare il mio :sweat_smile:

[u]Perdona, mio errore[/u], ho letto male il codice e ... non mi sono accorto che la parte dopo era commentata ... ... è stata una giornata piena e ... gli occhi e la testa cominciano ad ingannarmi ... :confused:

No, deve essere qualche altra cosa ...

Guglielmo

Mi fai una prova … ti rallenterà tutto il funzionamento del programma, ma è per vedere se è quello il problema …
… mi porti i delay(250) a delay(2000) ?

Ho considera che così una volta comandato un LED resta sordo per 2 secondi (il tempo del delay) … dimmi però come si comporta …

Guglielmo

Non preoccuparti nessun problema, le sviste capitano a tutti :) :) Comunque lampeggia lo stesso con tempismi diversi, infatti passano 2 secondi acceso e poi 2 secondi spento e così via

Ok, era quello che volevo sentire …
… se prendi il tuo programma e lo formatti “come Dio comanda:smiley: … usando l’apposita funzione dell’IDE, “Tools → Auto Format” e dopo guardi con attenzione cosa fai nel loop() … ti dovrebbe saltare agli occhi l’errore di logica … :wink:

Guglielmo

Ho eseguito l'auto format, ancora però non ho ben capito dove può essere l'errore, mi verrebbe da azzardare dicendo; devo togliere tutti gli 'else' ?

NO
… ti metto sulla buona strada :

if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume();
}

… pensa, per come hai strutturato quello che segue, cosa succede DOPO la prima volta che hai ricevuto un codice valido … esegui proprio tu, passo passo il loop() e alla fine torna all’inizio e rieseguilo, come realmente avviene … :wink:

Guglielmo

Non saprei proprio >.<
Adesso se sparo un’altra >.< :
Dovrei mettere sotto ogni

if ( results.value == 0xFF30CF) {
    stato = (stato == LOW ? HIGH : LOW);
    digitalWrite(ledPinA, stato);
    delay(500);
  }

l’attesa di un’altro comando ?

irrecv.resume();

NO ... ... allora tu hai il loop() che gira sempre, la prima volta che dai un codice valido esso va a finire dentro a "result" che, DA QUEL MOMENTO contiene un codice valido ...

... il programma prosegue, effettua la prima, diciamo accensione del LED ... arriva alla fine e ricomincia dall'inizio ...

... NON ricevi nulla, (irrecv.decode() ritorna false) ma ... cosa contiene "result" ? ? ? sempre il codice valido che avevi ricevuto prima !!! quindi proseguendo ... fa il contrario di prima e spegne il LED ... e il ciclo si ripete all'infinito ...

Capito ?

Guglielmo

Questo non è il funzionamento che dovrebbe fare ? nel senso che ancora non ho capito qual'è la riga che mi manda in "tilt" e fa lampeggiare. Se la prima volta che premo il pulsante, il suo valore viene "memorizzato" in result, allora io dovrei farglielo "smemorizzare" ogni volta alla fine del loop ?

Salvo che tu non voglia creare un ... lampeggiatore ... :D :D :D

Però se non lo capisci ... allora [u]devi eseguire TU il programma[/u] ... a mente ... passo passo scrivendo su un foglio ciò che succede e vedrai .. che hai un lampeggio per forza !

Ah .. non "smemorizzare" ... "azzerare"... è una variabile ;)

O, più elegantemente, mettere tutto quello che segue comunque nel primo IF così che , se non si è ricevuto nulla, NON viene eseguito nulla di ciò che segue.

Guglielmo

Niente mi dispiace davvero di averle fatto perdere così tanto tempo però io continuo a non saltarci fuori, cerco di tradurmi lo sketch di continuo ma non capisco dov'è l'intoppo. Il modo in cui uso io Arduino e molto "strano", più che altro copio incollo altri sketch e gli adatto ai miei obbiettivi poi provo a capirli anche . ma stavolta non riesco davvero :sweat_smile: Quindi le chiedo un'ultimo favore, se solo può farmi vedere come sistemare perché devo abbandonare il pc e non so quando riprenderò a lavorarci su. Le chiedo scusa ancora, ma attribuirei la colpa alle mie scarse competenze in questo campo (credevo fosse più semplice all'inizio) che non mi permettono di ragionare sui problemi per risolverli (anche per questo motivo mi affido molto ad internet e questo forum).

Dovrebbe bastare spostare UNA parentesi graffa …

#include <IRremote.h>

int ReciverPin = 8;
const int ledPinA = 15; //numero del pin analogico del LED, 15 -> A1
const int ledPinB = 16; //numero del pin analogico del LED, 16 -> A2
const int ledPinC = 17; //numero del pin analogico del LED, 17 -> A3
const int ledPinD = 18; //numero del pin analogico del LED, 18 -> A4

IRrecv irrecv(ReciverPin);
decode_results results;
char stato;

void setup() {

  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);

  stato == LOW;
}
void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume();

    if ( results.value == 0xFF30CF) {
      stato = (stato == LOW ? HIGH : LOW);
      digitalWrite(ledPinA, stato);
      delay(250);
    }
    else if ( results.value == 0xFF18E7) {
      stato = !stato;
      digitalWrite(ledPinB, stato);
      delay(250);
    }
    else if ( results.value == 0xFF7A85) {
      stato = !stato;
      digitalWrite(ledPinC, stato);
      delay(250);
    }
    else if ( results.value == 0xFF10EF) {
      stato = !stato;
      digitalWrite(ledPinD, stato);
      delay(250);
    }
  }
}

In questo modo gli IF vengono eseguiti SOLO se riceve qualche cosa :slight_smile:

Prova e fammi sapere …

Guglielmo

Ok con quella parentesi al posto giusto, il funzionamento è correttissimo!
La ringrazio infinitamente della pazienza, disponibilità e dell’aiuto che mi ha dato :slight_smile:
E mi scuso ancora una volta per la mia ignoranza >.<

Comunque ora (forse per lo stress che ho scaricato) riguardando e rileggendo i suoi suggerimenti, penso di aver capito qual’era il problema e penso di essermi dato una spiegazione logica al mio “strano e particolare” modo di ragionare :slight_smile:

Grazie ancora per l’aiuto! e a presto !