AnalogWrite e ricevitore ir

Ciao a tutti.
Sto facendo funzionare un paio di led con un telecomando ir usando la libreria IR di Ken Shirriff's.

Funzionano egregiamente quando uso il digitalWrite.
Volendo aggiungere l'effetto fade questo funziona, ma ho degli "effetti collaterali" che non mi spiego, praticamente è come se l'analogwrite funzionasse sempre, indipendentemente da che comando gli do, scavalcando sistematicamente il digitalwrite

Il problema è che funziona indistintamente con quasiasi tasto del telecomando premo... anche quelli che non ci sono nel codice, e il digitalwrite viene escluso.
Come se fosse collegato a quasiasi cosa arrivi alla seriale... Forse mi sto perdendo qualche passaggio nel funzionamento del pwm e dell' analogwrite

Mi potete spiegare cosa, e perchè??

premesso che di arduino ne capisco ben poco, prova a vedere questo straccio di codice che feci!!!
l'array tasto racchiude tutti i codici, nel mio caso erano 7X3 = 21.
il 22esimo equivale alla pressione del tasto premuto.
con "T_Init();" inizializzi l'IR e con "Telecomando();" lo lanci.
la variabile Temp, dopo aver lanciato "rilevamento tasto" assume il codice del pulsante che hai premuto una volta terminato il primo processo c'è una sezione Switch case dove dovrai scrivere il codice per ogni tasto premuto.
spero sia soddisfacente, per qualsiasi cosa (nel mio piccolo) basta chiamare.

Marco

#include <IRremote.h>

//Collegamenti
int RECV_PIN = 11; //Ricevitore Segnale PIN
int UltimoTasto; //Ultimo Tasto Premuto

(/* Variabile Tasto
N° Codici Telecomando: 22
Tastierino numerico :7 X 3

*/
long unsigned Tasto[22]={
16753245,
16736925,
16769565,
16720605,
16712445,
16761405,
16769055,
16754775,
16748655,
16738455,
16750695,
16756815,
16724175,
16718055,
16743045,
16716015,
16726215,
16734885,
16728765,
16730805,
16732845,
4294967295,
};

//Inizializzazione Ricevitore
IRrecv irrecv(RECV_PIN);
decode_results results;

void T_Init() {

Serial.println(" Inizializzazione Ricevitore IR");
irrecv.enableIRIn();

}

//Funzioni Telecomando//

//Funzione Base Telecomando

void Telecomando () {

if (irrecv.decode(&results)) {

int Temp = RilevamentoTasto();

String Cancella="";

switch (Temp) {
case 1: //OnOff
Cancella="OnOff";
break;
case 2: //Mode
Cancella="Mode";
break;
case 3: //Mute
Cancella="Mute";
break;
/* case 4: //Indietro

case 5: //Avanti
case 6: //Play/Pause
case 7: //+
case 8: //-
case 9: //EQ
case 10: //0
case 11: //100+
case 12: //Return /
case 13: //1
Luci_loop(0);
break;
case 14: //2
Luci_loop(1);
break;
case 15: //3
Luci_loop(2);
break;
case 16: //4
Luci_loop(3);
break;
/
case 17: //5
case 18: //6
case 19: //7
case 20: //8
case 21: //9
case 22: //Pressione Continua
default://Errore
*/
}

irrecv.resume();

}

}

/*Rilevamento Tasto

Restituisce il tasto premuto

*/
int RilevamentoTasto () {

int N = 0;

while (results.value != Tasto[N]) {

N++;

}

return N + 1 ;

}

si scusa... ma non capisco come lo posso usare per capire i miei problemi.

Io i codici del telecomando riesco a vederli tutti.. e ad usarli.. Volevo spiegazioni sul perchè l'analogwrite fa quello che fa.. e il perchè... :grin:

fammi capire tu vuoi sapere perchè scrivendo analogWrite arriva l'impulso al pin desiderato?

io voglio sapere perchè quando uso analogwrite , il fade del led , funziona indistamente quando premo qualsiasi pulsante del telecomando e non quando premo solo quello che gli assegno io. Si comporta come se ogni scrittura sulla seriale attivasse il comando..

Sia la libreria che i PWM usano i timer del ATmega. L'ATmega328 ne ha 3 e ciascuno pilota 2 canali PWM. Se poi un timer viene usato anche per altri usi (come nel Tuo caso la IR remote library) si disturbano uno l' altro.
Non so dirti quale timer usa la libreria.
La corrensondenza PWM - timer trovi nel datasheet del ATmega.
Soluzione: forse una altro pin PWM funziona.
Ciao Uwe

Se parli di questo codice sotto riportato

if(results.value == 2149362520);
      {
         analogWrite(led2, brightness);
         brightness = brightness + fade;
         Serial.println("Luminosita':");
         Serial.println(brightness);
         if (brightness >= 255) {
           fade = 0;
          irrecv.resume(); 
          }
  }

non so dirti, a parte che, a parer mio, prima incrementerei la luminosità e poi avvierei il comando analogWrite, ma sono modi di programmare.
poi scusami tanto, perchè non metti un solo irrecv.resume() alla fine di tutte le istruzioni?

if (Codice==VarCod1) {
comando1;
comando2;
}
if (Codice==VarCod2){
comando3;
comando4;
}
irrecv.resume;

prova ad ascoltare il consiglio di uwe, che di sicuro, ne sa più di noi :slight_smile:

HO risolto!
Era questione di codice ... Non gli piaceva come lo scrivevo.. :grin: :grin: :grin:
Ho sistemato un po la cosa e ora va perfettamente tutto...

Ve lo posto, se qualcuno ne avesse bisogno.. (premesso che il mio telcomando ha doppi valori , quindi premo una volta e mi da xxx, premo lo stesso tasto la seconda volta e mi da yyy, così via, alternando i valori xxx e yyy)

ECCO IL CODICE CORRETTO..
Grazie a MARBI per i suggerimenti

#include <IRremote.h>

int led = 5; // pin del led
int RECV_PIN = 11; // pin del ricevitore a infrarossi
int brightness = 0; // inizializzo la luminosita' a 0
int fade = 15; // valori consigliati 5 o 15
IRrecv irrecv(RECV_PIN);
decode_results results;
// Valori del telecomando da personalizzare con i vostri
long on = 2149362448;
long off = 2149329680;
long fadeplus = 2149362638;
long fadeplus1 = 2149329870;
long fademinus = 2149329871;
long fademinus1 = 2149362639;

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

void loop() {
   if (irrecv.decode(&results)) {
   //Serial.println(results.value, DEC);

   if(results.value == on){
     digitalWrite(led, HIGH);
    brightness=255; 
}
   if (results.value == off) {   
     digitalWrite(led, LOW);
     brightness=0;
}
    if (((results.value == fadeplus) || (results.value == fadeplus1)) && (brightness < 255)) {
      brightness = brightness + fade; 
      Serial.print("Luminosita' incrementata a:  ");
      Serial.println(brightness); 
      analogWrite(led, brightness); 
    }  
    if (((results.value == fademinus) || (results.value == fademinus1)) && (brightness > 0)) { 
      brightness = brightness - fade;
      Serial.print("Luminosita' decrementata a: ");
      Serial.println(brightness);
      analogWrite(led, brightness);
    }
    
   irrecv.resume();  
  }

 }

hai provato a scriverlo così?
if((results.value == fadeplus) && (brightness < 255)) {

non mi devo essere spiegato...

Questo funziona bene.. if(results.value == fadeplus && brightness < 255) {

E' quando cerco di comprimerlo in questo modo che non va :

if(results.value == fadeplus || fadeplus1 && brightness < 255) {

Ho provato anche così:

if((results.value == fadeplus) || (results.value == fadeplus1) && (brightness < 255)) {

Ma niente... funziona l' OR, ma non AND, quindi non si ferma a 255, ma prosegue oltre.

if((results.value == fadeplus) || (results.value == fadeplus1) && (brightness < 255)) {

quell'istruzione if quando deve verificarsi?

quando il valore result è uguale a fadeplus, oppure a fade 1 ma contemporaneamente brightness deve essere inferiore a 255?
puoi provare (non è detto che vada bene) a scriverlo così?

if (((results.value == fadeplus) || (results.value == fadeplus1)) && (brightness < 255)) {

se non va.... che devo dirti... c'ho provato, ma per logica mi viene di dirti così :smiley:
fammi sapere.
ciao
Marbi

Grande funziona!!
Erano quelle parentesi in meno che non lo facevano andare :sweat_smile:

Grazie :grin:

Ho messo su il codice ridotto e corretto... AnalogWrite e ricevitore ir - #8 by dr4gone - Generale - Arduino Forum