Pages: [1] 2   Go Down
Author Topic: Almacenando variables y ejecutando procesos en paralelo, Arduino Uno.  (Read 2215 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas.

Soy nuevo en este mundo del Arduino y debido a que nunca me adentre mucho al mundo de la programación se me hace un poco más difícil ejecutar procesos en este.

Bueno, el caso es que necesito que el arduino me lea el estado de 6 LDR (HIGH ó LOW), y que me almacene una variable que sólo se actualice de acorde al último HIGH presentado, y que me active alguna salida de acorde a su última posición. Digamos que cada LDR presenta una posición, puesto que el último HIGH presentado es la última posición presentada es la posición que me interesa. El arduino tiene que esperar un tiempo (digamos 10 segundos) y cuando este se términe tiene que analizar la última posición que presento HIGH y activarme una salida de acorde a esto.

He tratado de múltiples maneras de hacer esto, pero no puedo dejar la última posición fija, sino que cuando cierto LDR presenta un HIGH se activa la salida tal, pero cuando el LDR vuelve a un LOW quiero que la salida tal aún se quede encendida a menos que luego de que pasen los 10 segundos el arduino revise la última posición y esta última posición sea diferente a la que ya está.

No se si me dí a entender bien. Gracias de antemano.

Logged

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola wOvalle,
si puedes adjunta el código que has hecho.
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 5
Posts: 330
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues no, no se te entiende muy bien. Para empezar las LDR dan lecturas analógicas por lo que no te pueden dar HIGH o LOW, lo puedes sacar por código.

Puedes leer las seis LDRs y guardar sus valores en un array y detectar si hay un cambio de estado en la últmima y que sea el disparador. Por poder se puede hacer TODO LO QUE QUIERAS, divide el problema en partes más sencillas y atácalas una a una y si necesitas ayuda trata de ser lo más explicito posible.

Postea el código que tienes, esquemas, todo lo que nos pueda ayudar a comprender mejor lo que quieres hacer y por que no te funciona.
Logged


Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Para empezar las LDR dan lecturas analógicas por lo que no te pueden dar HIGH o LOW,
Tambien se pueden utilizar en las entradas digitales, los niveles en los que considera que tienes un 0 o un 1 son siempre iguales aunque hay una zona que puede tener errores, el caso es que si hay mucha diferencia en los cambios de luz podrás utilizalos para entradas digitales.

Lo que tienes que hacer es utilizar unas variables de control para saber cual de las variables ha sido la última en cambiar, se me ocurre a botepronto que puedes asignar un tiempo transcurrido desde la últma vez que evaluas, y cada 10 segundos veas que variable tiene el mayor tiempo. por ejemplo:

a los 2 segundos se activa D1, a los 3 segundos se activa D3, a los 5 segundos D7.... (solo deberás asignar la variable en el caso de que pase de 0 a 1 la entrada digital) y luego cada 10 segundos evaluas cual de las entradas tiene el mayor tiempo, activas la salida correspondiente y reseteas todas las variables.

« Last Edit: July 10, 2011, 05:05:43 pm by coleoptero » Logged

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A mi me gusta leer los ldr en analógico, tal como lo hace josemanu, ya que no todos dan los mismos valores, y después puedes poner condiciones si tal LDR es mayor o menor que haz ....
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 5
Posts: 330
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

SrDonGato, no hacen falta las mayusculas, y si, por poder se pueden leer LDRs por las entradas digitales, pero su calibrado puede ser una pesadilla. Coincido con nayma mejor en analógico y si supera cierto nivel pues haces tal o cual.

Hay fotosensores de barrera que tienen un led y un fototransistor que si se pueden conectar directamente a una entrada digital por que el led hace que la lectura sea muy estable.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas.

Pido disculpas por la tardanza de este mensaje, esperaba alguna notificación en mi correo de que alguien había comentado en mi post, pero nunca llego.

josemanu: En este caso leeré el valor digital del LDR, puesto que donde estarán colocados no entrara luz y un led sera el que me active o me de un HIGH en el LDR correspondiente, por lo que la precisión de la lectura no es tan importante, pero a la vez hacerlo con un LDR me es mas cómodo que con un fototransistor.

SrDonGato: Me pareció buena idea. Como le diría al Arduino que a los 2 segundos se activo D5? Con el comando Millis?

Anexo el código que tengo hasta ahora:

Code:
void setup() {
int leds[] = {1,2,3,4,5,6,7,8,9,10}; //Definiendo el arreglo Leds para activar las salidas.
for (int i=0; i<11; i++) //Recorriendo el arreglo para ir activando.
{pinMode(leds[i], OUTPUT);}
}

void loop()
{
  int in[] = {A0, A1, A2, A3, A4, A5}; //Arreglo de entradas.
  int leds[] = {1,2,3,4,5,6}; //Arreglo de salidas.
  int s[]={0,1,2,3,4,5}; //Arreglo donde le designa una posicion a la entrada.

   
  for (int i=0; i<6; i++)
  {s[i] = digitalRead(in[i]);}  //Almacenando el estado de la entrada.
 
     
 for (int i=0;i<6;i++) //Encendiendo el led correspondiente a la entrada activada.
{if (s[i]== HIGH)
 {digitalWrite(leds[i],HIGH);
 }
  else
  {digitalWrite(leds[i], LOW);}}

delay(10000);}

En el código eliminé la parte donde estaba tratando de almacenar la variable, puesto que me estaba alterando lo poco que tenía hecho bien.

Muchísimas gracias por sus respuestas y disculpas nuevamente por mi descuido.
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cada vez que evaluas pones Tinicio=millis()
 luego cada vez que na variable pase de 0 a 1 se asignas un tiempo, millis()-Tinicio
luego cada 10 segundos evaluas cual de las variables tiene el tiempo mayor tiempo. actuas sobre las salidas y reseteas variable de tiempo de inicio y de cada una de las salidas.

Estoy de vacas y no tengo mucho tiempo para el foro ultimamente, seguro hay mas formas de hacerlo , se me ocurrió esa a botepronto, en unos dias puedo hacerte algo de codigo

un saludo

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias SrDonGato. Anoche logré hacerlo con 2 variables, hoy lo ampliaré a 6.

También necesito decirle al Arduino que si otro pin se activa, se detenga el proceso. He tratado de hacerlo con funciones pero no he podido. ¿Alguna idea de como hacer esto?
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

con un simple IF puedes hacerlo,

IF patilla tal = 0 funciona normalmente ( lo que tienes hecho)

else  no hagas nada.....

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nunca pensé en eso...  smiley

Estoy fuera de la cuidad dígase fuera del arduino. Mañana haré unas pruebas. Muchísimas gracias SrDonGato.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas!

Ya me he dedicado 100% al proyecto y ahora tengo un error que no he sido capaz de arreglar.

He logrado que me almacene la variable demás, pero ahora no se porque después de unos segundos no me funciona, dígase me deja de leer el estado de las entradas y deja fija la última entrada en la que estuvo un HIGH, Ya he intentado todo lo que se me ha ocurrido y nada. Me gustaría saber si me pueden dar un "empujonsito"  smiley-grin

Code:
#include <Stepper.h>
Stepper motor(200, 13,12,11,10);
long q,w,e,r;
int a,s,d,f;
int higher;
int posicion;
int act = 0;

//Funcion Digital Read
int ldr(int p, int o)
{
  p = digitalRead(o);
  return p;
}

//Funcion Almacenar Millis en variable
long time(int o,long p)
{
  if (o == 0)
  {
    p = millis();
  }
  if (o == 1)
  {
    p = p;
  }
  return p;
}

//Funcion leer cual es mayor
long mayor(int h, int j, int k, int l)
{
  int v = 0;
  int b = h;
  if (j > b)
  {
    b = j;
    v = 1;
  }
  if (k > b)
  {
    b = k;
    v = 2;
  }
  if (l > b)
  {
    b = l;
    v = 3;
  }
  return v;
}

//Funcion declarar posicion
int pos(int c,int v)
{
  c= v * 45;
  return c;
}


void setup()
{
  Serial.begin(9600);
}

void loop()
{   
  motor.setSpeed(60);
  a = ldr(a,A1);
  s = ldr(s,A2);
  d = ldr(d,A3);
  f = ldr(f,A4);


  q = time(a,q);
  w = time(s,w);
  e = time(d,e);
  r = time(f,r);

  higher = mayor(q,w,e,r);
  posicion = pos(posicion,higher);

  Serial.println(millis());
  Serial.print("Mayor: ");
  Serial.println(higher);
  Serial.print("Posicion: ");
  Serial.println(posicion);
  Serial.print("Posicion actual: ");
  Serial.println(act);
  Serial.println("        ");
  delay(1000);


}




Puesto a que no llevo mucho tiempo en el área de programación, puede que mi programa no sea eficiente, por ahora me he limitado a que funcione.

Muchísimas gracias de antemano.
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Para que el código sea más claro tanto para ti como para los demás utiliza nombres de variables más específicos, con letras es dificil ver lo que estas haciendo realmente.

No he visto que cada cierto tiempo resetees el tiempo de referencia, tienes que hacer diferenciales de tiempo con el teimpo de referencia.

para evaluar cual es mayor si tienes A,B,C y D puesdes asi tb

if (A>B && A>C && A>D) return X // si a es mayor que las demas retorna X (lo que quieras)

 tendras un problema si alguna de las variables son iguales y son las mayores cosa improbable aunque puedes contemplarlo en el código tambien poniendo if A==B y demas..

y así con las demás

lo que debes hacer en tu programa.

en el setup()
TiempodeReferencia = millis();

en el loop()
si patilla LDR1 pasa de LOW a HIGH entonces TiempoLDR1=millis()-TiempodeReferencia;
si patilla LDR2 pasa de LOW a HIGH entonces TiempoLDR2=millis()-TiempodeReferencia;
igual con las demas....

cada 10 segundos

if ( (millis() - TiempodeReferencia) > 10000) // si han pasado mas de 10 segundos desde que tomastes la referencia
{
   ahora evaluas cual de los tiempos almacenados es mayor ( con tu funcion o como te digo yo, como mejor lo entiendas)
   ahora pones la posicion que quieras en el motor
   pones a 0 los TiempoLDRX; //para la siguiente evaluacion
   TiempodeReferencia=millis(); // cada 10 segundos tienes que establecer de nuevo la referencia, asi esto solo lo hace 1 vez

}


espero que se entienda asi

un saludo


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas SrDonGato.

Antes que nada me encantaría expresarle lo agradecido que estoy con usted por la gran ayuda que me ha brindado.

He arreglado el problema. El problema estaba en la función "mayor",  las variables debían estar declaradas como long y las tenía en int, esto hacia que cuando el tiempo en milisegundos  tomaba un valor mas alto que 32,768 (el cual es el límite de los integers) el programa dejaba de comparar cual era mayor.

Con respecto al tiempo de referencia no lo he establecido aún puesto que me había enfocado en la lectura y análisis de los LDR, ahora me toca establecer el tiempo y lo programaré como usted me aconseja.

Nuevamente, muchísimas gracias por la ayuda brindada.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas.

Pido excusas por reabrir este post pero no podía dejar morir este hilo sin antes agradecerle con mucho aprecio al SrDonGato.

Estaba programando un Arduino puesto que estoy haciendo como proyecto para poder aprobar la asignatura Electrónica II una ventana sensible al ambiente. Se alinea con la dirección del viento, reacciona a la lluvia y al sol excesivo.  Hoy ya pudimos hacer funcionar los motores y la ventana en conjunto con el programa en el Arduino, ya lo que faltan son detalles.

Muchísimas gracias SrDonGato no habría podido lograr este proyecto si no hubiese sido por usted.
Logged

Pages: [1] 2   Go Up
Jump to: