Go Down

Topic: Duda con funcion map y constrain (Read 763 times) previous topic - next topic

AlvaroMozon

Muy buenas a todos. Soy nuevo por aquí y con Arduino, asi que obviamente me asaltan dudas de vez en cuando. En mi entorno personal nadie conoce Arduino, por lo que estoy solo.

La duda que hoy me surge es la siguiente y parte del project 4 del Arduino Starter Kit:

estoy haciendo uso de la función map y constrain para calibrar los sensores de luz, pero no me funciona como debería, pues se "sale" de los margenes. Ante alguna circunstancia (bajada de la lectura de algún sensor por debajo del mínimo almacenado) el comportamiento se vuelve impredecible y las variables redValue, greenValue y blueValue se me salen del rango (devuelve valores negativos).

No se si la función constrain hace lo que yo entiendo que hace: que las variables no se salgan en este caso de los valores [0,255].

Code: [Select]
[code]
//Project 4: Color Mixing Lamp

const int greenLEDPin=9;
const int redLEDPin=10;
const int blueLEDPin=11;
const int redSensorPin=A0;
const int greenSensorPin=A1;
const int blueSensorPin=A2;
const int LEDPin=13;

int redValue=0;
int greenValue=0;
int blueValue=0;
int redSensorValue=0, greenSensorValue=0, blueSensorValue=0;
int LEDState=LOW;
long previousMillis=0;
long interval=1000;
int redMin=1023,redMax=0,greenMin=1023,greenMax=0,blueMin=1023,blueMax=0;

void setup(){
  Serial.begin(9600);
 
  for(int i=9;i<12;i++){
    pinMode(i,OUTPUT);
  }
  pinMode(LEDPin,OUTPUT);
 
  while(millis()<10000){
    redSensorValue=analogRead(redSensorPin);
    if(redSensorValue>redMax)
      redMax=redSensorValue;
    if(redSensorValue<redMin)
      redMin=redSensorValue;
    greenSensorValue=analogRead(greenSensorPin);
    if(greenSensorValue>greenMax)
      greenMax=greenSensorValue;
    if(greenSensorValue<greenMin)
      greenMin=greenSensorValue;
    blueSensorValue=analogRead(blueSensorPin);
    if(blueSensorValue>blueMax)
      blueMax=blueSensorValue;
    if(blueSensorValue<blueMin)
      blueMin=blueSensorValue;
    digitalWrite(LEDPin,HIGH);
    Serial.print("red Max: ");
    Serial.print(redMax);
    Serial.print(" \t redMin: ");
    Serial.print(redMin);
    Serial.print(" \t green Max: ");
    Serial.print(greenMax);
    Serial.print(" \t greenMin: ");
    Serial.print(greenMin);
    Serial.print(" \t blue Max: ");
    Serial.print(blueMax);
    Serial.print(" \t blueMin: ");
    Serial.println(blueMin);
    delay(50);
  }
     
}

void loop(){
  redSensorValue=analogRead(redSensorPin);
  delay(5);
  greenSensorValue=analogRead(greenSensorPin);
  delay(5);
  blueSensorValue=analogRead(blueSensorPin);
 
  Serial.print("Raw Sensor Values \t Red: ");
  Serial.print(redSensorValue);
  Serial.print("\t Green: ");
  Serial.print(greenSensorValue);
  Serial.print("\t Blue: ");
  Serial.println(blueSensorValue);
  Serial.print(" redMax: ");
  Serial.print(redMax);
  Serial.print(" \t redMin: ");
  Serial.println(redMin);
  delay(100);
 
  //redValue=redSensorValueMap/4;
  constrain(redValue,0,255);
  redValue=map(redSensorValue,redMin,redMax,0,255);
  //greenValue=greenSensorValueMap/4;
  constrain(greenValue,0,255);
  greenValue=map(greenSensorValue,greenMin,greenMax,0,255);
  //blueValue=blueSensorValueMap/4;
  constrain(blueValue,0,255);
  blueValue=map(blueSensorValue,blueMin,blueMax,0,255);

 
  Serial.print("Mapped Sensor Values: \t Red:");
  Serial.print(redValue);
  Serial.print("\t Green: ");
  Serial.print(greenValue);
  Serial.print("\t Blue: ");
  Serial.println(blueValue);
  delay(100);
 
  analogWrite(redLEDPin,redValue);
  analogWrite(greenLEDPin,greenValue);
  analogWrite(blueLEDPin,blueValue);
 
  unsigned long currentMillis=millis();
 
  if (currentMillis-previousMillis>interval){
    previousMillis=currentMillis;
    if(LEDState)
      LEDState=LOW;
    else
      LEDState=HIGH;
     
    digitalWrite(LEDPin,LEDState);
  } 
 
}
[/code]

Cheyenne

Lo he visto de pasado pero creo que lo que tienes que hacer es:

redValue = constrain(redValue,0,255);
http://cuadricopterodiyarduino.blogspot.com/

AlvaroMozon

Gracias Cheyenne. Probaré.

Un saludo.

AlvaroMozon

Estabas en lo cierto Cheyenne, aunque solo me funciona bien si primero mapeo y luego restrinjo.

Gracias de nuevo.

Go Up