dubbio funzione map e blocco sketch infrarossi

Buonasera ragazzi,
Sto iniziando a studiare l’infrarossi con arduino e mi sono imbatutto in due problemi principali.
il primo utilizzando analogWrite(); e la funzione map(0, 255, 0, 100), ho un piccolo problema e capire se è possibile risolverlo.

Ad ogni tasto che premo con il mio telecomando IR modifico il duty cycle e fin qui tutto bene.

  1. Il problema sta nel fatto che quando map arriva a fondo scala, nell’esempio a 100, poi ritorna a 0 e quindi mi troverei il led spento…come faccio a fargli capire ad arduino che quando raggiunge il fondo scala, rimane al massimo valore e viceversa?

questo è lo sketch:

#define    SOPRA         3520384096
#define    SOPRA2         2524690444
#define    SOTTO         3470051241
#define    SOTTO2         2474357589
#define    ACCESO        1393407612
#define    ACCESO2        397713960
#define    SPENTO        1520660722
#define    SPENTO2        147656742
#include <IRremote.h>

int ricevitore = 6, led = 5, statoLED; //collegare ricevitore IR ad un pin PWM
byte luminosita = 50, luminositaMAP;

IRrecv irrecv(ricevitore); // crea istanza irrecv
decode_results results;

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

void loop()
{
  luminositaMAP = map( luminosita, 0, 255, 0, 100);

  if (irrecv.decode(&results))
  {
    if ( results.value == SOPRA || results.value == SOPRA2 )
    {
      analogWrite(led, luminosita);
      luminosita = luminosita + 17;
      Serial.print("Luminosita': ");
      Serial.print(luminositaMAP);
      Serial.println(" %");
      irrecv.resume();
    }
  }

  if (irrecv.decode(&results))
  {
    if ( results.value == SOTTO || results.value == SOTTO2 )
    {
      analogWrite(led, luminosita);
      luminosita = luminosita - 17;
      Serial.print("Luminosita': ");
      Serial.print(luminositaMAP);
      Serial.println(" %");
      if (luminosita == 255)
        luminosita = 255;
      irrecv.resume();
    }
  }

  if (irrecv.decode(&results))
  {
    if ( results.value == ACCESO || results.value == ACCESO2 )
    {
      digitalWrite(led, HIGH);
      irrecv.resume();
    }
  }

  if (irrecv.decode(&results))
  {
    if ( results.value == SPENTO || results.value == SPENTO2 )
    {
      digitalWrite(led, LOW);
      irrecv.resume();
    }
  }
}

Premendo un tasto qualsiasi del mio telecomando, mi accorgo che stampa due valori diversi ad ogni tasto ma che si ripetono sempre. Per questo ho definito per esempio ‘ACCESO’ e ‘ACCESO2’.
Piccola parentesi: mi sono accorto che alcuni telecomandi invece ogni tasto equivale sempre ad un codice e non a due.

  1. il secondo problema sta nel fatto che alcune volte (sembra che sia casuale) arduino si blocchi e per interagire con arduino tramite IR sembra che devo riattaccare l’alimentazione… (il ricevitore però ad ogni tasto lampeggia) come mai?

se fai passi da 17 non arriva mai in modo preciso su 255 o 0.

byte luminosita = 50, luminositaMAP;

per primo usa dei int e poi

if (luminosita > 255) luminosita = 255; 
quando incrementi e quando decrementi
if (luminosita <0) luminosita = 0;
Ciao Uwe

Ciao Uwe, grazie mille per la risposta..sinceramente ero arrivato a questo:

if (luminosita > 255) luminosita = 255;

ma poi non avevo minimamente pensato al 17 come multiplo di 255...

Come mai poi dichiararli int? Dichiararli come byte occuperebbe minore spazio allo sketch...tanto è una variabile che deve arrivare massimo a 255 no?

In merito al 'tilt' dello sketch che per adesso risolvo con un riavvio di arduino, a cosa è dovuto? E' come se ad arduino gli viene dato un comando di non ricevere più nulla con gli infrarossi...o magari si blocca in qualche if dei tasti...

Un byte puó rapresentare numeri da 0 a 255. Non esistono numeri maggiori di 255. Per questo la condizione non si avererá mai. Devi usare un int che puó rapresentare numeri maggiori di 255 e numeri negativi.

Ciao Uwe

Ok uwe, tutto chiaro...grazie!!