Pagina 1 di 2

Accendere relè da telecomando

Inviato: mar 15 feb 2022, 18:49
da Marcodb
Ciao a tutti
Approfitto di questo spazio messo a disposizione da Pier per chiedervi aiuto, in un piccolo progetto di arduino, che mi crea un piccolo problema.
Premetto che ne capisco poco quanto nulla, nelle mie intenzioni vorrei realizzare uno sketch che, tramite un tasto del telecomando della TV accenda e spenga un relè.
In effetti qualcosa ho fatto ma c'è un piccolo problema:
Quando premo il tasto del telecomando, questi emette per più volte il codice facendo, di fatto, accendere e subito spegnere il relè.
Dovrei limitare l'istruzione a recepire un solo comando.
Spero di essere stato chiaro.
Se può servire posso postare lo sketch che sto utilizzando.
Grazie a chiunque voglia aiutarmi

Re: Accendere relè da telecomando

Inviato: mar 15 feb 2022, 18:51
da pgv
Sarebbe bene leggere lo sketch e sapere che telecomando e', magari si potrebbero scegliere due codici diversi per accensione e spengimento.

Re: Accendere relè da telecomando

Inviato: mar 15 feb 2022, 19:42
da Marcodb
Certo
Posto il codice.
Il discorso del doppio tasto l'ho scartato poiché nelle mie intenzioni c'è la volontà di utilizzare il solo telecomando della TV per accendere e spegne il decoder Sky, in quanto lo skyQ consuma in standby ben 18W.
Visto che lo uso sporadicamente volevo usare un solo tasto del telecomando che apparentemente non offre funzioni attive sulla Tv per evitare che si accenda, o si spenga, quando si cerca qualche funzione nella tv.
Il codice usato è questo

Codice: Seleziona tutto

include <IRremote.h>

int RECV_PIN = 4;
int stato = LOW;
IRrecv irrecv(RECV_PIN);

decode_results results;

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

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value

    if (results.value == 0xFF6897) {
     stato = !stato;
     delay(200);
    }

    if ( stato == HIGH) {
      digitalWrite(7, HIGH);
    } else {
      digitalWrite(7, LOW);
    }
    
  }
  delay(100);
}
Grazie

Re: Accendere relè da telecomando

Inviato: mer 16 feb 2022, 16:59
da pgv
Il problema e' che soprattutto con i telecomandi e' difficile mandare un impulso solo. Inoltre, riabiliti la ricezione immediatamente dopo aver ricevuto un risultato:

Codice: Seleziona tutto

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
quindi indipendentemente dal delay() che metti dopo aver cambiato lo stato del rele' trovreai subito il primo rimbalzo dell'interruttore. Potresti provare a spostare l'istruzione

Codice: Seleziona tutto

    irrecv.resume(); // Receive the next value
alla fine del loop. Ancora meglio avere un loop infinito dentro il quale verifichi se c'e' un risultato, nel qual caso prendi azione, dopo di che, e solo dopo aver atteso un tempo specifico, riabiliti la ricezione di segnali. Potrebbe funzionare.
Magari meglio se aggiungiamo l'include della libreria correttamente... Il compilatore si lamenta che il metodo secode() e' deprecato, by the way.

Codice: Seleziona tutto

// Al prete (bof), al medico (meglio) ed al compilatore (assolutamente) non si deve mai mentire...
#include <IRremote.h>	// con il carattere #
// include <IRremote.h>	// e non senza che non funziona

int RECV_PIN = 4;
int stato = LOW;
IRrecv irrecv(RECV_PIN);

decode_results results;

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

void loop() {
  while (1) { // Continua per sempre
  // a questo punto copio e incollo dal tuo codice
    if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX);
//      irrecv.resume(); // Receive the next value si e' spostato

      if (results.value == 0xFF6897) {
       stato = !stato;
//       delay(200); // Questo delay non serve
      }
      if ( stato == HIGH) {
        digitalWrite(7, HIGH);
      } else {
        digitalWrite(7, LOW);
      }
      delay(500);	// Questo viene eseguito ogni volta
    }
//    delay(100);	// Questo delay() si e' spostato un po' sopra
    irrecv.resume(); // Receive the next value e' arrivato da sopra
  }
}
WARNING: io non ho un ricevitore, e non ho testato il codice. Possono esserci sciocchezze. Garantisco solo che compila.

Re: Accendere relè da telecomando

Inviato: gio 17 feb 2022, 17:47
da Marcodb
pgv ha scritto: mer 16 feb 2022, 16:59 Il problema e' che soprattutto con i telecomandi e' difficile mandare un impulso solo. Inoltre, riabiliti la ricezione immediatamente dopo aver ricevuto un risultato:

WARNING: io non ho un ricevitore, e non ho testato il codice. Possono esserci sciocchezze. Garantisco solo che compila.
Ciao pgv
Innanzitutto grazie per l'interessamento
Si, il problema è proprio quello del rimbalzo dell'impulso che accende ed immediatamente spegne il relè.
Ad ogni modo, sabato o domenica che avrò un po' più di tempo testerò la tua modifica e ti aggiornerò.
Intanto posso solo ringraziarti ancora.
P.S. l'avevo messo il # ma nella copia/incolla si era perso

Re: Accendere relè da telecomando

Inviato: dom 27 feb 2022, 11:35
da Marcodb
pgv ha scritto: mer 16 feb 2022, 16:59
WARNING: io non ho un ricevitore, e non ho testato il codice. Possono esserci sciocchezze. Garantisco solo che compila.
Buongiorno pgv e buona domenica
Ti aggiorno per dirti che purtroppo il codice non funziona
In questa configurazione l'IR non riceve nulla e non stampa nulla sulla seriale.
La conseguenza è che non compie nessuna azione.
Ripristinato il vecchio codice, stampa sulla seriale, quindi l'IR riceve il codice, ed accende e spegne il relè.
Ma rimane l'inconveniente del rimbalzo del segnale.
Grazie

Re: Accendere relè da telecomando

Inviato: dom 27 feb 2022, 13:15
da scossa
Marcodb ha scritto: dom 27 feb 2022, 11:35 Ripristinato il vecchio codice, stampa sulla seriale, quindi l'IR riceve il codice, ed accende e spegne il relè.
Ma rimane l'inconveniente del rimbalzo del segnale.
Grazie
Io ho modificato così il codice e funziona senza rimbalzi:

Codice: Seleziona tutto

#include <IRremote.h>

int RECV_PIN = 4;
int stato = LOW;
IRrecv irrecv(RECV_PIN);

decode_results results;

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

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    delay(200);
    if (results.value == 0xFF9867) {
     stato = !stato;
     digitalWrite(7, stato);
     //Serial.println(results.value, HEX);
     Serial.println(digitalRead(7));
    }
    irrecv.resume();
    delay(100);
  }
}
Ovviamente i vari Serial.println poi puoi toglierli/commentarli

Re: Accendere relè da telecomando

Inviato: lun 28 feb 2022, 8:28
da Marcodb
scossa ha scritto: dom 27 feb 2022, 13:15
Io ho modificato così il codice e funziona senza rimbalzi:
Grazie scossa
Nella giornata di oggi lo carico e ti aggiorno

Ovviamente si, stampare sulla seriale mi serve solo a capire che comando riceve l'ir

Grazie ancora

Re: Accendere relè da telecomando

Inviato: lun 28 feb 2022, 22:18
da Marcodb
scossa ha scritto: dom 27 feb 2022, 13:15 Io ho modificato così il codice e funziona senza rimbalzi:
Aggiornamento
il codice sembra funzionare anche se, alla pressione del tasto, invia i seguenti codici

8CCC9BB4
6F
1006F
0
6F
1006F
1


ovviamente, tenendo per sbaglio qualche decimo di secondo in più il tasto può succedere che il relay si spenga o riaccenda.
posso aumentare il ritardo ( delay ) o non risolvo nulla?
Si possono inserire anche altri codici? ( 6F e 1006F) che sono i più ricorrenti?
Grazie per l'interessamento

Re: Accendere relè da telecomando

Inviato: mar 1 mar 2022, 0:10
da scossa
Marcodb ha scritto: lun 28 feb 2022, 22:18 Aggiornamento
il codice sembra funzionare anche se, alla pressione del tasto, invia i seguenti codici
....
Acc... avevo notato anch'io questo problema col telecomando dell'amplificatore Lepy, mentre con quello nel kit della Elegoo e col telecomando del decoder dtt funziona perfettamente; ma visto che avevi scritto
Quando premo il tasto del telecomando, questi emette per più volte il codice facendo, di fatto, accendere e subito spegnere il relè.
pensavo fosse solo un problema di "rimbalzi".
Puoi provare a verficare con un altro telecomando?