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
Per esempio il codice in HEX trasmesso dal mio telecomando(telesystem) con il tasto OK é 25AE7EE0
Ciao e benvenuto.
Ti suggerisco la lettura del regolamento per imparare l'uso del forum e dei suoi strumenti
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 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
Ancora grazie
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. 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.
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. 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
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.
#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 Come faccio???
edit by mod: per favore includi il codice usando gli appositi tag
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.
La logica l'hai detta esattamente tu, devi solo tramutarla in codice
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.
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
}
Grazie leo72
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
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... 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.
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
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