Go Down

Topic: dubbio funzione map e blocco sketch infrarossi  (Read 679 times) previous topic - next topic

Gianky00

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:
Code: [Select]
#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.

2) 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?

uwefed

#1
May 14, 2017, 07:19 am Last Edit: May 14, 2017, 07:21 am by uwefed
se fai passi da 17 non arriva mai in modo preciso su 255 o 0.

Code: [Select]
byte luminosita = 50, luminositaMAP;
per primo usa dei int e poi

Code: [Select]
if (luminosita > 255) luminosita = 255; 
quando incrementi  e quando decrementi
Code: [Select]
if (luminosita <0) luminosita = 0;  
Ciao Uwe

Gianky00

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...

uwefed

#3
May 15, 2017, 08:00 am Last Edit: May 16, 2017, 06:40 am by uwefed
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

Gianky00


Go Up