Scrittura analogica per intensità luminosa di un led.

Salve ragazzi, il mio problema è il seguente... Avvio tutto il led lampeggia una sola volta e non funziona niente... Sapete aiutarmi??? perchè non funziona?

#include <IRremote.h> // libreria ir

int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);

decode_results results;
byte c=128; // valore iniziale (luminosità media) da scrivere su pin analogico
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}

void loop() {

analogWrite(A5,c);

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

if((results.value==0x38C758A7) && (c<255)) {
c++;
}
if((results.value=0x38C77887) && (c>0)) {
c--;
}

}

Ciao,
domanda da profano, ma che c'entra con un ricevitore infrarosso ?
Forse non ho capito la domanda

Saluti

Scusa, in effetti mi sono dimenticato di specificarlo.. Quei due codici esadecimali cossispondono ai codici che mando con un telecomando (tasto + e -) praticamente premendo il tasto + aumenta l'intensità luminosa del led e viceversa col tasto meno .

inanzitutto, sicuro che quei codici esadecimali siano corretti?
prova a far partire il led da spento (valore 0) e poi aumenta a ogni ciclo (quando schiacci) di 10 invece che 1.
poi mi lascia perplesso quel irrecv.resume() non sono pratico di questa libreria ma li c'è scritto che prendi il prossimo valore ma.. almeno ti scrive su seriale? dove si ferma il codice?

sisis funziona tutto perfettamente.. avevo fatto anche un modellino di auto radiocomandato con questo telecomando e questo sistema.. Solo non mi funziona il discorso della scrittura analogica....

ps. certo che scrive su seriale.. funziona tutto perfettamente...

La scrittura analogica non funziona perché A5 non é un uscita PWM. Devi usare i pin digitali 3, 5, 6, 9, 10 o 11.

Ciao Uwe

ah, ok... Ho appena provato a scrivere solo 6 e collegarlo ad un pin digital 6 e niente.. Ho provato a scrivere anche digitalWrite(6,c); e niente.. neppure dichiarando nel void che il 6 è un output... Come mai?

devi usare analogWrite
hai messo una resistenza sul led? e polarizzato giusto?
Ciao Uwe

Ho fatto analogWrite... Si è tutto messo bene, queste cose sono cretinate anche se ho ricontrollato per scripolo.. Non riesco proprio a capacitarmi del perchè non funzioni.. Eppure il codice non mi sembra errato.. Ma almeno anche senza mandare nessun segnale dovrebbe stare acceso con una luminosità intermedia.....

Ma sulla seriale cambiano i valori in funzione dei tasti + e - premuti?

La libreria IRremote potrebbe usare i timer e disturnbare il PWM di alcuni o tutti pin PWM. controlla o prova tutti i 6 pin PWM uno dopo l' altro.

Ciao Uwe

Provato e niente..... Non sò proprio che fare... Io in questo momento ho un potenziometro sul pin della 5v.. Potrebbe interferire? L'alimentazione usb m dà 5-5.25v con una i di 500 ma... Magari non ce la fà arduino.. Anche se mi sembra strano...

Non sapete aiutarmi ragazzi? T_T

Non mi fai facile aiutarti. :wink: 8)
Mi rispond per favore:
Ma sulla seriale cambiano i valori in funzione dei tasti + e - premuti?
Ciao Uwe

xD si scusami, i valori cambiano, come da codice mi appaiono quei valori esadecimali corrispondenti ai tasti + e -

#include <IRremote.h> // libreria ir


int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);

decode_results results;
 byte c=128; // valore iniziale (luminosità media) da scrivere su pin analogico
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 
    analogWrite(6,c);
 
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if((results.value==0x38C758A7) && (c<255)) {
  c++;
 }
  if((results.value=0x38C77887) && (c>0)) {
  c--;
}
    irrecv.resume(); // Receive the next value
  }


}

prova così scusa...
secondo me irrecv.resume() fa un flush...

ciao j84c3

fai un "serialprintln(c);" dopo il
analogWrite(6,c);

cosí Ti rendi conto che valore hai. dovrebbe cambiare in funzione dei tasti + e - premuti.

prova di mettere il valore di results.value in un altra variabile e fare tutti i controlli e il serialprint con quella variabile.
all inizio: valoreIR = results.value;
e poi il println e i if usi il valoreIR.
@superlol
nel if servono sempre una doppio segno di uguale ==

Ciao Uwe

uwefed:
...
@superlol
nel if servono sempre una doppio segno di uguale ==

Ciao Uwe

sisi lo so, ma io avevo solo fatto talgia e incolla dal primo post, tanto che avevo anche editato perchè lasciato A5, non è che è anche quello il problema? :grin:

Penso che lo sai; ma sai che se é scritto qualcuno che impara potrebbe leggere e avere dubbi e capire male. Meglio che negli esempi siano meno errori possibili.
Ciao Uwe

si hai ragione scusa allora riposto il codice vedendolo meglio :wink:

#include <IRremote.h> // libreria ir


int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);

decode_results results;
int c=128; // valore iniziale (luminosità media) da scrivere su pin analogico <- ho modificato in int, gestito meglio
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 
    analogWrite(6,c);
 
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if((results.value==0x38C758A7) && (c<255)) {
      c = c+10; //rendiamo più visibili gli effetti
    }
    if((results.value==0x38C77887) && (c>0)) {
      c = c-10; //vedi sopra
    }
    irrecv.resume(); // Receive the next value in cui credo faccia un flush
  }


}

scusa ancora :wink:

Perfetto! Funziona!!! Ma in parte... ovvero... (ho letto il valore di c sulla seriale) succede questo:
qualsiasi tasto io prema che non centra niente col codice di aumentare o abbassare il valoce da 128 scende fino a 0 e non sale più... non capisco perchè....

In oltre ho notato che se kiudo e riapro la seriale il valore riparte da 128 di colpo...