IRremote segnale continuo

Salve a tutti,
sono nuovo del forum. Mi chiamo Andrea, ho 16 anni e da poco mi sono avvicinato al Mondo di Arduino.
Sto realizzando un braccio robotico e vorrei controllarlo con un telecomando infrarossi con IRremote. Ho già fatto delle prove, però sono riuscito, per esempio, a fare accendete un led con un tasto e a spegnerlo con un altro.
Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???
Se qualcuno di buona volontà potrebbe farmi un esempio di sketch gli sono molto grato :slight_smile:
Per esempio il codice in HEX trasmesso dal mio telecomando(telesystem) con il tasto OK é 25AE7EE0

Grazie mille

Ciao e benvenuto.
Ti suggerisco la lettura del regolamento per imparare l'uso del forum e dei suoi strumenti :wink:

Sul tuo problema, resta da capire se il tuo telecomando con il pulsante premuto fa un invio continuo oppure no, per capire poi come poter gestire il comando ricevuto. Se lo fa continuativo, basta leggere e tenere acceso finché c'è quel dato, altrimenti o prevedi un sistema di accensione/spengimento oppure con timeout.

Molti dei miei telecomandi quando tieni premuto un tasto non sparano più quel valore ma un fisso 0xFFFFFFFF
perciò devi prima memorizzarti il valore del tasto.

Si, leggeró accuratamente il regolamento :slight_smile: grazie...
Comunque ho due telecomandi:

  • con uno, mantenendo premuto un pulsante il primo valore é quello che corrisponde al tasto stesso, mentre i successivi sono FFFFFFFF...
  • con l'altro telecomando, invece, mantenendo premuto un pulsante viene ripetuto costantemente il valore del pulsante stesso... ho fatto alcune prove peró, essendo ancora alle basi, non sono riuscito a trovare una soluzione e vi chiedo gentilmente uno sketch con un minimo di spiegazione :slight_smile:
    Ancora grazie :slight_smile:

Al max possiamo correggere un tuo sketch.
Posta quello che non ti funziona, spiega cosa fa e cosa invece dovrebbe fare e vediamo di trovare una soluzione. Sketch ex-novo non si scrivono perché non si può indovinare la logica che vuoi dare tu al programma e poi perché senza il tuo hardware in mano sarebbe come sparare nel vuoto. Senza considerare che se ti scriviamo noi il programma poi tu non impari nulla. :wink: Se questo programma non è di facile realizzazione per te, ti consiglierei di iniziare con progetti più semplici e di seguire la strada che andrebbe fatta normalmente, ossia quella dei piccoli passi, partendo dalle basi e poi salendo pian piano.

AndreaGeekTrufini:
Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???

Al massimo pseudocodice, che ti indica la logica. Comunque per semplificare, usa il telecomando che ripete sempre lo stesso codice, lascia stare l'altro, per ora.

if (tasto == XXX)
accendi led
else // ovvero qualsiasi altro tasto)
spegni led

EDIT: si, vero ho scritto una cavolata. Così non può funzionare.

nid69ita:

AndreaGeekTrufini:
Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???

Al massimo pseudocodice, che ti indica la logica. Comunque per semplificare, usa il telecomando che ripete sempre lo stesso codice, lascia stare l'altro, per ora.

if (tasto == XXX)
accendi led
else // ovvero qualsiasi altro tasto)
spegni led

Giá ho utilizzato questo sketch, in questo modo il led si accende quando premo il tasto indicato e resta acceso fino a quando non premo un altro tasto... io invece vorrei fare in modo che il led deve restare acceso per il tempo che mantengo premuto il pulsante e poi al rilascio del pulsante si dovrebbe spegnere

leo72:
Al max possiamo correggere un tuo sketch.
Posta quello che non ti funziona, spiega cosa fa e cosa invece dovrebbe fare e vediamo di trovare una soluzione. Sketch ex-novo non si scrivono perché non si può indovinare la logica che vuoi dare tu al programma e poi perché senza il tuo hardware in mano sarebbe come sparare nel vuoto. Senza considerare che se ti scriviamo noi il programma poi tu non impari nulla. :wink: Se questo programma non è di facile realizzazione per te, ti consiglierei di iniziare con progetti più semplici e di seguire la strada che andrebbe fatta normalmente, ossia quella dei piccoli passi, partendo dalle basi e poi salendo pian piano.

Si, hai pienamente ragione... sto studiando il C dalle basi, peró da sempre ho voluto realizzare una cosa del genere e lo faccio anche per mettere in pratica quello che imparo... conosco giá cicli e cose varie perché a scuola abbiamo effettuato lo studio del linguaggio di programmazione Pascal... Comunque ora sono dal mio smartphone e non ho lo sketch a portata di mano, lo posto oggi pomeriggio e vediamo di correggerlo insieme :slight_smile:
Grazie per la disponibilitá

Controlla se viene ricevuto il codice per accendere il led.
Accendi il led e memorizzi la variabile che Ti da millis().
Se entro x ms (per esempio 100ms) non ti arriva un altro codice accensione led lo spegni
Se arriva un altro codice accensione led aggiorni la variabile che memorizza i millis() cosí parte il tempo di nuovo.

Ciao Uwe

Ragazzi ecco una delle prove che ho fatto:

#include <IRremote.h>

#define OK    0x25AE7EE0         // pulsante OK

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
pinMode(13,OUTPUT);

irrecv.enableIRIn();
Serial.begin (9600);
}

void loop(){
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);       //Risultato in esadecimale
    irrecv.resume();
    }
         if(results.value==OK) {
         digitalWrite(13,HIGH);
         }
            else{
                digitalWrite(13,LOW);
                }
}

però come già vi ho detto con questo sketch il led mi resta acceso fino a quando premo un tasto(diverso da OK) che provoca lo spegnimento del led stesso. Io vorrei farlo rimanere acceso solo per la durata che mantengo premuto il tasto :slight_smile: Come faccio???

edit by mod: per favore includi il codice usando gli appositi tag

#include <IRremote.h>

int led1 = 5;
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
byte flag=0;

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

void loop() {
   if (irrecv.decode(&results)) {
     Serial.println(results.value, DEC);
      irrecv.resume();
       if (results.value == 33480735) {
         digitalWrite(led1, flag);
         flag^=1;
       }
    }
}

by Leo72, tempo fa !

Grazie mille a AnerDev!!!
Però non é ancora quello che vorrei realizzare. Con lo sketch postato riesco a fare lampeggiare il led mantenendo premuto il pulsante. Però io avrei bisogno di mantenere il LED acceso per il tempo che mantengo premuto il pulsante e spegnere il LED lasciando semplicemente il pulsante stesso, tipo come i circuiti realizzanti con i pulsantini SMD. :slight_smile:

La logica l'hai detta esattamente tu, devi solo tramutarla in codice :wink:

AndreaGeekTrufini:
io avrei bisogno di mantenere il LED acceso per il tempo che mantengo premuto il pulsante spesso e spegnere il LED lasciando semplicemente il pulsante, tipo come i circuiti realizzanti con i pulsantini SMD. :slight_smile:

Quindi:

if (digitalRead(pulsante) == statoLogicoCheTiPare) {
  digitalWrite(led, HIGH);
  while (digitalRead(pulsante) == statoLogicoCheTiPare); //questo blocca finché premi il pulsante
  digitalWrite(led, LOW);
}

Così ovviamente sei bloccato finché non rilasci il pulsante. Se invece nel contempo vuoi fare altro, dovresti fare una cosa più complessa, usando una variabile di stato:

boolean pulsantePremuto = false;
void loop() {
  if (digitalRead(pulsante) == statoLogicoCheTiPare) {
    if (pulsantePremuto == false) {
      digitalWrite(led, HIGH);
      pulsantePremuto = true;
    }
  } else {
    if (pulsantePremuto == true) {
      pulsantePremuto = false;
      digitalWrite(led, LOW);
    }
  }
  ....il resto del tuo codice
}
  1. Non l'ho provato.
  2. Occhio ai rimbalzi, il codice non li controlla.

Grazie leo72 :slight_smile:
Io avrei intenzione di comandare diversi led con diversi tasti del telecomando e da come l'ho "compilato" non so se é possibile... sono all'inizio ed ho alcuni problemi

#include <IRremote.h>

#define OK 0x632192736

#define led 13

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results(results);
boolean pulsantePremuto = false;

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

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
       irrecv.resume();
       
if (digitalRead(RECV_PIN) == HIGH) {
    if (pulsantePremuto == false) {
      digitalWrite(led, HIGH);
      pulsantePremuto = true;
    }
  } else {
    if (pulsantePremuto == true) {
      pulsantePremuto = false;
      digitalWrite(led, LOW);
    }
  }
 }
}

però comunque in questo modo non mi funziona... probabile mio errore :stuck_out_tongue: :smiley:

Veramente non funziona nulla.
Che è questo tra le variabili globali?
decode_results(results);

Deve essere:
decode_results results;

nid69ita:
Veramente non funziona nulla.
Che è questo tra le variabili globali?
decode_results(results);

Deve essere:
decode_results results;

Si scusa quello lo avevo corretto prima però qui ho messo il file non corretto... :stuck_out_tongue: così non mi funziona, quando premo il pulsante OK sul telecomando mi resta acceso e non si spegne più

Al massimo io sono arrivato a questo, ma funziona molto male, in quanto il telecomando funziona con degli interrupt e quando tieni premuto il testo spesso la libreria legge comunque un tasto 0 (ovvero nulla)
Ho provato a fare come suggerito da @uwe con la millis().
Io ho un telecomando che se tieni premuto da un codice fisso, perciò per semplificare tasto ok o tasto ripetuto per me è uguale.

#include <IRremote.h>

#define TASTO_RIPETI 0xFFFFFFFF
#define TASTO_OK 0x632192736

const byte LED_PIN=13;
const byte RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean pulsantePremuto = false;
unsigned long prevmillis=0;

void setup() {
  delay(1000);
  Serial.begin(9600);
  Serial.println("go");
  pinMode(LED_PIN, OUTPUT);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) 
  { if(results.value==TASTO_OK || results.value==TASTO_RIPETI) 
    { //Serial.println("Okay"); 
      pulsantePremuto=true;
      prevmillis=millis();
    } 
    else
    { //Serial.println("altro tasto"); 
      pulsantePremuto=false;
    }

  }
  irrecv.resume();
  if(millis()-prevmillis>200)
  { //Serial.println(millis());
    if(results.value==0) pulsantePremuto=false;
    prevmillis=millis();
  }
  Serial.print("results.value:"); Serial.print(results.value); 
  Serial.print("  pulsantePremuto:"); Serial.print(pulsantePremuto);
  Serial.println("");
  results.value=0;
  if(pulsantePremuto)
    digitalWrite(LED_PIN, HIGH);
  else
    digitalWrite(LED_PIN, LOW);
}

Mi da un errore nella compilazione dello sketch nel punto indicato con le frecce:

void loop() {
  if (irrecv.decode(&results)) {
 [u][b]  if(results.value == TASTO_OK || TASTO_RIPETI ) [/b][/u] <--- <--- <-- qui mi dice: "integer constant is too large for 'long' type"
    { //Serial.println("Okay"); 
      pulsantePremuto=true;
      prevmillis=millis();
    } 
    else
    { //Serial.println("altro tasto"); 
      pulsantePremuto=false;
    }

Appare diversa da quella che ho postato io.
Comunque a te il telecomando quanto tieni premuto ripete lo stesso codice, non il FFFFFF giusto?
Elimina quella parte e lascia solo il tuo tasto

if(results.value==TASTO_OK)

nid69ita:
Appare diversa da quella che ho postato io.
Comunque a te il telecomando quanto tieni premuto ripete lo stesso codice, non il FFFFFF giusto?
Elimina quella parte e lascia solo il tuo tasto

if(results.value==TASTO_OK)

Si, lo so... infatti ho eliminato giá il tasto ripeti, ma mi da lo stesso errore :frowning: