Show Posts
Pages: [1]
1  International / Software / Ayuda: no encuentro el fallo. Peqeño código on: March 01, 2013, 08:29:37 am
Buenos dias.

Estoy cacharreando con el Arduino Uno y hay una una parte de mi programa que no funciona.

Lo simplifiqué al máximo en un nuevo sketch, pero sigue sin funcionar.

Será un error tonto, pero no doy con el y estoy clavao. O me he vuelto tonto de repente o no se que pasa...

Por favor, tengase en cuenta que falta mucho código que eliminé simplemente por hacer desde el principio la disposición de mensajes que aparecerán en el display en función de los pulsadores.

Code:


#include <LiquidCrystal.h>
//Para el control de fecha y hora
#include <Wire.h>
LiquidCrystal lcd(12,11,5,4,3,2);
//Para el control de fecha y hora
#define DS1307_I2C_ADDRESS 0x68

//Para versión definitiva crear variables globales que unicamente necesiten ser globales

const int TAM=4;                      //En realidad será 300, pero para probarlo mejor así

int encoder,sensorValue,referencia,switch1State,switch2State,stage=1,posIni,error,control,modo=0;
const int piezo=8, selectorRef=7, LEDRef=13, controlPin=6;
float peralte[TAM];
static int encoderDone=0,pos,cm,k=0,peticionDato=0;

void setup(){
  Serial.begin(9600);
  //Configuración de entradas y salidas:
  pinMode(selectorRef,INPUT);        //SelectorRef
  pinMode(9,INPUT);                  //Encoder
  pinMode(piezo,OUTPUT);             //Piezo
  pinMode(LEDRef,OUTPUT);            //LED indicativo de por onde se toma la referencia
 
  //Inicialización peralte:
  for(int i=0;i<TAM;i++){
    peralte[i]=0;
  }
  //Inicialización LCD:
  lcd.begin(16,2);
  while (millis()<1500){
    lcd.setCursor(0,0);
    lcd.print("Peralte: (mm)");
    lcd.setCursor(0,1);
    lcd.print("Posicion: (mm)");
  }
   
  //Inicialización envio de datos por el puerto serie:
  Serial.print("Peralte(mm);");
  Serial.print("Referencia(mm);");
  Serial.print("Posicion;");
  Serial.print("Error;");
  Serial.println("Control;");
 
}

//Desplaza Vector:
void desplazaVector(float *vector,int tam){
  for(int i=tam-1;i>0;i--){
    vector[i]=vector[i-1];
  }
}

//Selecciona el modo de funcionamiento. Este puede ser registro o control. En el primero
//el sistema únicamente registra los datos y envia a PC. En el segundo modo de funcionamiento
//establece la acción de control. Para realizar el control, se selecciona si la referencia
//el peralte teórico será enviado desde PC o se toma de potenciómetro.
 

void loop(){
  long previousMillis=0,interval=1000;
  unsigned long currentMillis=millis();
  static int previousRef;
  char cadena[24];
  byte contador=0;
 
  static int sel;

  int OK=0;
 
  switch1State=digitalRead(selectorRef);      //Pulsador de selección
  //¡ATENCIÓN! modificar el pin del pulsador de OK. Esta versión es provisional y aprovecha el pulsador
  //conectado en el pin 9, correspondiente al encoder
  switch2State=digitalRead(9);               //Pulsador de OK
 
  lcd.clear();
 

    lcd.setCursor(0,0);
    lcd.print("Modo operacion");
    lcd.setCursor(0,1);
    lcd.print("Registro Control");
    while(sel<200){
      digitalWrite(LEDRef,HIGH);
    if (switch1State){
      sel++;
    }
 
    }
   digitalWrite(LEDRef,LOW);
}

//Seleccción de referencia por puerto serie o mediante potenciomentro
//Está por ver que la selección se realiza mediante pulsador. Mejor mediante contacto conmutado.
//Finalmente por pulsador y añadir dos etapas mas para poder seleccionar una posición en la que unicamente registre
2  International / Software / Re: Duda con funcion map y constrain on: February 11, 2013, 06:58:01 am
Estabas en lo cierto Cheyenne, aunque solo me funciona bien si primero mapeo y luego restrinjo.

Gracias de nuevo.
3  International / Software / Re: Duda con funcion map y constrain on: February 07, 2013, 07:04:55 am
Gracias Cheyenne. Probaré.

Un saludo.
4  International / Software / Duda con funcion map y constrain on: February 06, 2013, 05:31:21 am
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:
[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]
Pages: [1]