:-[ Aiutatemi ragazzi... Problema con Arduino.

Salve a tutti, sono nuovo del forum.
ps.(se c'è la sezione presentazioni ditemeloc osì mi presento :-)).

Ho acquistato da poco l'ultimo uscito di Arduino nano.. Ci ho già messo mano ed ho notato che la programmazione con questo piccolo hardware non è molto difficile...

Io ho un problema a far leggere ad arduino tramite ricevitore infrarossi l'istruzione giusta.
Mi spiego meglio... Ho fatto tutto un procedimento per poter visualizzare tramite la seriale il codice che mando attraverso il telecomando in modo tale da poter ordinare ad arduino di eseguire diverse funzioni.. Il problema è che mandando un codice(quindi premendo un tasto) faccio accendere un led... Se premo un altro tasto che non centra niente questo benedetto led si spegne...

Scrivo ciò che ho flashato in arduino

#include <IRremote.h> // Includo la libreria.

int RECV_PIN = 1; // OUT ricevitore Ir.

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600); // porta seriale
irrecv.enableIRIn(); // Ini
}

void loop() {
digitalWrite(13, LOW);
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX); //Eestituisce il codice in esadecimale.
irrecv.resume();
}
if (results.value == 0x53F) { // accensione led premendo il tasto (cd) del telecomando.
digitalWrite(13, HIGH);
delay(200);
}

}

[/list]

Nella seriale mi esce scritto un codice strano.. ci sono diversi quadratini (come quando word dà un errore di codifica) e poi il numero 53F : io ho scritto 0x53F.

Grazie a tutti :slight_smile: anche solo per la pazienza che avete per leggere questo post xD

Uhmmm.... Il monitor seriale e' settato agli stessi baud di arduino ?
Controlla nell'angolo in basso a destra che la velocita' sia la stessa.....

sisi a 9600... Non capisco cosa possa essere... Pensavo che fare una cosa di queste sarebbe stato semplicissimo...

lol il digital pin 1, insieme allo 0, è usato per la comunicazione seriale col pc.
Quindi l'out del ricevitore va a cozzare con TX di arduino (TX è output). Se avessi messo l'ir sul pin 0 invece arduino (e non il pc) avrebbe ricevuto segnali "strani" (credo che comunque in entrambi i casi la seriale si disallinei, quindi in realtà sia input che output risultarebbero sfasato, non conosco il protocollo nel particolare)
consiglio: digitalpin 0 e 1 evitali come la peste ;D

wow! Grazie infinite :smiley: hai trovato proprio la soluzione al problema del codice scritto sulla seriale! Però ho ancora un problema >_< cioè.. io dò il codice per accendere il led... se premo un altro pulsante che non centra niente si spegne... uff.. Come mai?

Aggiungo una piccola domanda... Per dire al microcontrollore "se leggi codici diversi da questi ... mantieni lo stato precedente" come devo fare?

es: if (results.value != 0xC4C, 0x44C, 0x4BF, 0xCBF, 0x57F, 0xD7F, 0xC7F, 0x47F, 0xD3F, 0x53F)
digital.....

che dovrei mettere?

cambi il loop in questo modo; inserisci nel secondo if il codice tasto con il quale vuoi spegnere il LED

Ciao Uwe

void loop() {
 //digitalWrite(13, LOW);  // non serve piu
 if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX); //Eestituisce il codice in esadecimale.
   irrecv.resume();
   }
   if (results.value == 0x53F) { // accensione led premendo il tasto (cd) del telecomando.
  digitalWrite(13, HIGH);
  delay(200);
  } 
   if (results.value == 0xcodice) { // spegnimento led premendo il tasto (xx) del telecomando.
  digitalWrite(13, LOW);
  delay(200);
  } 

}

si l'ho fatto ma il problema è che se premo un tasto che non centra niente il led si spegne... Mentre invece dovrebbe mantenere lo stato precedente... es.. premo il tasto uno x accendere il led, premo il 9 che non centra niente e che nemmeno si trova nel codice ed il led s spegne.. quando invece nn dovrebbe fare niente...

Hai tolto il "digitalWrite(13, LOW);" all' inizio della funzione loop?
Mandaci per favore il codice nuovo interamente.

Ciao Uwe

Ecco tutto il codice per intero:
ps. Che lo tolgo o no dà sempre lo stesso effetto.

#include <IRremote.h> // Includo la libreria.

int RECV_PIN = 5; // OUT ricevitore Ir.

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600); // porta seriale
  irrecv.enableIRIn(); // Ini
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); //Restituisce il codice in esadecimale.
    irrecv.resume();
    }

    if (results.value == 0x4BF){ // accensione led premendo il tasto (tape) del telecomando [Luminosità Media].
   digitalWrite(13, HIGH); 
   delay(5);
   digitalWrite(13, LOW);
   delay(6);
   }
   
     if (results.value == 0x53F){ // accensione led premento il tasto (cd) [Luminosità Max].
   digitalWrite(13, HIGH);   
   delay(20);
   digitalWrite(13, LOW);
   delay(1);
   }
        if (results.value == 0x47F){ // accensione led premento il tasto (tuner) [Luminosità Min].
   digitalWrite(13, HIGH);   
   delay(1);
   digitalWrite(13, LOW);
   delay(20);
   }
        if (results.value == 0xD7F){ // accensione led premento il tasto (aux) [effetto rimbalzo].
   digitalWrite(13, HIGH);   
   delay(50);
   digitalWrite(13, LOW);
   delay(1);
   
   digitalWrite(13, HIGH);   
   delay(20);
   digitalWrite(13, LOW);
   delay(1);
   
   digitalWrite(13, HIGH);   
   delay(19);
   digitalWrite(13, LOW);
   delay(2);
   
   digitalWrite(13, HIGH);   
   delay(18);
   digitalWrite(13, LOW);
   delay(3);
   
   digitalWrite(13, HIGH);   
   delay(17);
   digitalWrite(13, LOW);
   delay(4);
   
   digitalWrite(13, HIGH);   
   delay(16);
   digitalWrite(13, LOW);
   delay(5);
   
      digitalWrite(13, HIGH);   
   delay(15);
   digitalWrite(13, LOW);
   delay(6);
   
   digitalWrite(13, HIGH);   
   delay(14);
   digitalWrite(13, LOW);
   delay(7);
   
   digitalWrite(13, HIGH);   
   delay(13);
   digitalWrite(13, LOW);
   delay(8);
   
   digitalWrite(13, HIGH);   
   delay(12);
   digitalWrite(13, LOW);
   delay(9);
   
   digitalWrite(13, HIGH);   
   delay(11);
   digitalWrite(13, LOW);
   delay(10);
   
      digitalWrite(13, HIGH);   
   delay(10);
   digitalWrite(13, LOW);
   delay(11);
   
   digitalWrite(13, HIGH);   
   delay(9);
   digitalWrite(13, LOW);
   delay(12);
   
   digitalWrite(13, HIGH);   
   delay(8);
   digitalWrite(13, LOW);
   delay(13);
   
   digitalWrite(13, HIGH);   
   delay(7);
   digitalWrite(13, LOW);
   delay(14);
   
   digitalWrite(13, HIGH);   
   delay(6);
   digitalWrite(13, LOW);
   delay(15);
   
      digitalWrite(13, HIGH);   
   delay(5);
   digitalWrite(13, LOW);
   delay(16);
   
   digitalWrite(13, HIGH);   
   delay(4);
   digitalWrite(13, LOW);
   delay(17);
   
   digitalWrite(13, HIGH);   
   delay(3);
   digitalWrite(13, LOW);
   delay(18);
   
   digitalWrite(13, HIGH);   
   delay(2);
   digitalWrite(13, LOW);
   delay(19);
   
      digitalWrite(13, HIGH);   
   delay(1);
   digitalWrite(13, LOW);
   delay(50);
   
         digitalWrite(13, HIGH);   
   delay(1);
   digitalWrite(13, LOW);
   delay(20);
   
      digitalWrite(13, HIGH);   
   delay(2);
   digitalWrite(13, LOW);
   delay(19);
   
         digitalWrite(13, HIGH);   
   delay(2);
   digitalWrite(13, LOW);
   delay(19);
   
      digitalWrite(13, HIGH);   
   delay(3);
   digitalWrite(13, LOW);
   delay(18);
   
      digitalWrite(13, HIGH);   
   delay(4);
   digitalWrite(13, LOW);
   delay(17);
   
      digitalWrite(13, HIGH);   
   delay(5);
   digitalWrite(13, LOW);
   delay(16);
   
      digitalWrite(13, HIGH);   
   delay(6);
   digitalWrite(13, LOW);
   delay(15);
   
      digitalWrite(13, HIGH);   
   delay(7);
   digitalWrite(13, LOW);
   delay(14);
   
      digitalWrite(13, HIGH);   
   delay(8);
   digitalWrite(13, LOW);
   delay(13);
   
      digitalWrite(13, HIGH);   
   delay(9);
   digitalWrite(13, LOW);
   delay(12);
   
      digitalWrite(13, HIGH);   
   delay(10);
   digitalWrite(13, LOW);
   delay(11);
   
         digitalWrite(13, HIGH);   
   delay(11);
   digitalWrite(13, LOW);
   delay(10);
   
         digitalWrite(13, HIGH);   
   delay(12);
   digitalWrite(13, LOW);
   delay(9);
   
            digitalWrite(13, HIGH);   
   delay(13);
   digitalWrite(13, LOW);
   delay(8);
   
            digitalWrite(13, HIGH);   
   delay(14);
   digitalWrite(13, LOW);
   delay(7);
   
            digitalWrite(13, HIGH);   
   delay(15);
   digitalWrite(13, LOW);
   delay(6);
   
            digitalWrite(13, HIGH);   
   delay(16);
   digitalWrite(13, LOW);
   delay(5);
   
            digitalWrite(13, HIGH);   
   delay(17);
   digitalWrite(13, LOW);
   delay(4);
   
            digitalWrite(13, HIGH);   
   delay(18);
   digitalWrite(13, LOW);
   delay(3);
   
            digitalWrite(13, HIGH);   
   delay(19);
   digitalWrite(13, LOW);
   delay(2);
   }
 }

I tempi sono troppo brevi; non vedi un led che si accende una volta per 1, 20 o 50 milisecondi.
Anche la file decrescente finirá troppo veloce in meno di 1 secondo ( non ho voluto fare la somma dei delay)
Descrivi bene cosa vuoi fare.
Ciao Uwe

i delay veloci li ho messo per fare l'effetto rimbalzo col led (si spegne lentamente e s accende velocemente passando x tt le intensità d luce) e funziona perfettamente... Ma comunque... eliminando anche quel codice se io premo un altro tasto del telecomando mentre il eld è acceso esso si spegne senza motivo... non capisco perchè...

if (results.value == 0x4BF){ // accensione led premendo il tasto (tape) del telecomando [Luminosità Media].
   digitalWrite(13, HIGH);
   delay(5);
   digitalWrite(13, LOW);
   delay(6);
   }

scusami, sei sorpreso? Accendi il LED per 5 milisecondi e poi lo spegni per 6. lo vedi finche premi il tasto del telecomando ma poi é sicuramente spento.
Ciao Uwe

no, il led lo vedo all'infinito finkè non faccio cambiere stato con la pressione di un tadto!!! Quel che ho fatto (facendo spegnere ed accendere il led per un ciclo infinito) serve per regolare l'intensità di luce dello stesso...