millis y delay, funcionamiento incorrecto [SOLUCIONADO]

Muy buenas a todos :slight_smile: , estoy frustrado tras una semana tratando de resolver un problema con Millis ya que la funci贸n delay funciona como debe, ahora quiero hacerlo funcionar con millis para que funcione el multiprocesos de arduino, pero tras intentar y buscar el error no me funciona el proyecto.
El proyecto consiste es una resistencia variada LDR (fotoresistencia) y este almacena en un array (NumA y NumB, son dos LDR).
Este debe almacenar en arrays la informacion hasta que el tiempo que se le determine (10000 = 10s).
Hay ejecute los dos pines (control y contro2, que son dos motores, obviamente conectadas a un transistor respectivo para su tipo un 2n2222a)
Queridos compa帽eros agradezco su tiempo y lectura, soy demasiado verde en arduino por eso ver谩n demasiadas cosas a reducir del c贸digo, que pensaba hacerlo al corregir el error.

Arduino uno

El funcionamiento es el deseado cuando esta con delay en funcionamiento, pero mi objetivo es que funcione con millis.
La desventaja que tiene delay es que tengo que esperar a que cargue el c贸digo denuevo (loops) para variar la resistencia y se ejecute, con millis no se ejecuta correctamente, se queda paralizado, y lo que quiero que haga es que en cualquier memento se puede variar los LDR, y cuando pase cierto tiempo se ejecuta toda la arrays.

Muchas gracias por su lectura :).

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

long Tiempo = 10000;
long TiempoA = 0;
 聽 聽 聽 聽 聽 聽 聽 聽 
long 聽NumA[] ={0};
long NumB[] ={0};

int Rue = 0;
int Rue1 = 0;

int fin = 0;
int fin1 =0;



void setup()
 聽{ 聽 聽pinMode(control, 聽OUTPUT) ;
 聽 聽 聽 pinMode(contro2, OUTPUT); 
 聽 聽 聽 
 聽 聽 聽 pinMode(indicador1, OUTPUT);
 聽 聽 聽 pinMode(indicador2, OUTPUT);
 聽 聽 聽 Serial.begin(9800); 聽
 聽 聽 聽
 聽}

void loop()
 聽{
 聽
 聽 聽 聽
 聽 聽 聽unsigned long Cronometro = millis();
 聽 聽 聽 int long n = analogRead(A1)/4; 聽 聽 // Las lecturas analogicas van hasta 1024 y no hasta 255
 聽 聽 聽 int long m = analogRead(A2)/4;
 聽 聽 聽 Serial.println(n);Serial.print(" LDR NUMERO A- ");
 聽 聽 聽 Serial.println(m);Serial.print(" LDR NUMERO B- ");
 聽 聽 聽 聽delay(200);
 聽 聽
 聽 聽 
 聽 聽 聽 if( 220 > n ){ 聽 聽 聽 聽
 聽 聽 聽 聽NumA[Rue1] = 1;
 聽 聽 聽 聽++Rue1;

 聽 聽 聽 聽}
 聽 聽 聽 聽
 聽 聽 聽 聽if(220 < n){
 聽 聽 聽 聽 聽NumA[Rue1] = 0;
 聽 聽 聽 聽 聽++Rue1;
 聽 聽
 聽 聽 聽 聽}
 聽 聽 聽 
 聽 聽 聽
 聽 聽 聽 
 聽 聽 聽 if(220 > m){
 聽 聽 聽 聽 聽NumB[Rue] = 1;
 聽 聽 聽 聽 聽++Rue;
 聽 聽
 聽 聽 聽}
 聽 聽 聽 聽
 聽 聽 聽 聽if(220 < m){
 聽 聽 聽 聽 聽 NumB[Rue] = 0;
 聽 聽 聽 聽 聽 ++Rue;
 聽 聽 聽 聽 
 聽 聽 聽 }
 聽 聽 聽delay(Tiempo);
 聽 聽 聽if (Cronometro - TiempoA < Tiempo){
 聽 聽 聽 聽 TiempoA = Cronometro; 
 聽 聽 聽digitalWrite(indicador1, HIGH);
 聽 聽 聽}
 聽 聽 聽else{ 
 聽 聽 聽 聽 digitalWrite(indicador1, LOW);
 聽 聽 聽} 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
 聽 聽 聽 
 聽 聽
 聽 聽
 聽
 聽 聽 聽 聽 聽
 聽 聽 聽if(NumA[fin1] == 1){
 聽 聽 聽 聽analogWrite (control, 255);
 聽 聽 聽 聽digitalWrite (indicador4,HIGH);
 聽 聽 聽 聽fin1=fin1+1;
 聽 聽 聽}
 聽 聽 聽else if(NumA[fin1] == 0){
 聽 聽 聽 聽analogWrite (control, LOW);
 聽 聽 聽 聽digitalWrite (indicador2,HIGH);
 聽 聽 聽 聽fin1=fin1+1;
 聽 聽 聽 聽}
 聽 聽 聽 
 聽 聽 聽 聽
 聽 聽 聽if(NumB[fin] == 1){
 聽 聽 聽 聽analogWrite (contro2, 255); 
 聽 聽 聽 聽digitalWrite (indicador4,HIGH);
 聽 聽 聽 聽fin=fin+1 ;
 聽 聽 聽}
 聽 聽 聽else if(NumB[fin] == 0){
 聽 聽 聽 聽analogWrite (contro2,LOW);
 聽 聽 聽 聽digitalWrite (indicador3,HIGH);
 聽 聽 聽 聽fin=fin+1;
 聽 聽 聽 聽}
 聽 聽 聽else{
 聽 聽 聽 digitalWrite (indicador2,LOW); 
 聽 聽 聽 digitalWrite (indicador3,LOW); 
 聽 聽 聽}
 聽}

Estaba modificando tu c贸digo pero encuentro algunas cosas incompatibles

ejemplo:

unsigned long Cronometro = millis();

if (Cronometro - TiempoA < Tiempo){
聽 聽 聽 聽  TiempoA = Cronometro; 
聽 聽 聽 digitalWrite(indicador1, HIGH);
聽 聽 聽 }
聽 聽 聽 else{ 
聽 聽 聽 聽  digitalWrite(indicador1, LOW);
聽 聽 聽 }

en cada loop cargas Cronometro con el valor de millis(). Hasta ahi bien.
luego suponiendo que no uses el delay y lo reemplaces por millis() que es tu objetivo...
el c贸digo dice

Siempre que estemos dentro de 10 seg poner indicador1 en HIGH
pero como a cada momentos actualizas TiempoA con el valor de cronometro ocurre que esa condici贸n se da siempre.

Que quieres hacer? Que el sistema arranque y luego de 10 seg encienda indicador 1 y luego que?
porque a continuaci贸n pones que lo apague y entonces no es posible hacer una cosa o la otra.

Otro error al final.

Vas haciendo comparaciones para

 if(NumB[fin] == 1){
聽 聽 聽 聽 analogWrite (contro2, 255); 
聽 聽 聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 聽 聽 fin=fin+1 ;
聽 聽 聽 }
聽 聽 聽 else if(NumB[fin] == 0){
聽 聽 聽 聽 analogWrite (contro2,LOW);
聽 聽 聽 聽 digitalWrite (indicador3,HIGH);
聽 聽 聽 聽 fin=fin+1;
聽 聽 聽 聽 }
聽 聽 聽 else{
聽 聽 聽  digitalWrite (indicador2,LOW); 
聽 聽 聽  digitalWrite (indicador3,LOW); 
聽 聽 聽 }

Numb[fin] que cargas con 0 o 1 seg煤n se ve antes, de modo que para que un else if == 0 si la 煤nica posiblidad es que sea 0
y aun mas contradictorio es que de este if(NumB[fin] == 0){} surge al final un nuevo else que pone indicador2 y 3 a LOW.

Asi que te voy a pedir primero y disculpa por el primer comentario:

  1. Las normas dicen que hay que usar signos de puntuaci贸n y no escribir como si uno hablara sin puntos y comas. As铆 que acepta la cr铆tica constructiva.
    Edit茅 tu comentario para poder entender bien que quieres decir, pero eso deber铆as hacerlo tu.

  2. Intenta explicar que son indicador1 2 y 3 y cuando deben estar ON/OFF

  3. Lo mismo con los arrays. Veo que puede crecer de modo importante en cantidad de elementos pero no queda claro con que objetivo terminas con un NumA[] de N elementos que para peor, no tiene limites, asi que puedes agotar la memoria RAM del Arduino si que llegue a un final.

Luego iremos viendo si hay mas consultas.

Surbyte muchas gracias por la ayuda, mil disculpas por las faltas de signo puntuaci贸n en el mensaje.
deje puesto mal, unas parte del c贸digo ya explico,

if (Cronometro - TiempoA < Tiempo){
聽 聽 聽 聽  TiempoA = Cronometro; 
聽 聽 聽 digitalWrite(indicador1, HIGH);
聽 聽 聽 }
聽 聽 聽 else{ 
聽 聽 聽 聽  digitalWrite(indicador1, LOW);
聽 聽 聽 }

if (Cronometro - TiempoA < Tiempo){} hay adentro se posiciona el resto del c贸digo

if(NumA[fin1] == 1){
聽 聽 聽 聽 analogWrite (control, 255);
聽 聽 聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 聽 聽 fin1=fin1+1;
聽 聽 聽 }
聽 聽 聽 else if(NumA[fin1] == 0){
聽 聽 聽 聽 analogWrite (control, LOW);
聽 聽 聽 聽 digitalWrite (indicador2,HIGH);
聽 聽 聽 聽 fin1=fin1+1;
聽 聽 聽 聽 }
聽 聽 聽  
聽 聽 聽 聽 
聽 聽 聽 if(NumB[fin] == 1){
聽 聽 聽 聽 analogWrite (contro2, 255); 
聽 聽 聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 聽 聽 fin=fin+1 ;
聽 聽 聽 }
聽 聽 聽 else if(NumB[fin] == 0){
聽 聽 聽 聽 analogWrite (contro2,LOW);
聽 聽 聽 聽 digitalWrite (indicador3,HIGH);
聽 聽 聽 聽 fin=fin+1;
聽 聽 聽 聽 }
聽 聽 聽 else{
聽 聽 聽  digitalWrite (indicador2,LOW); 
聽 聽 聽  digitalWrite (indicador3,LOW); 
聽 聽 聽 }

Asi es,es contradictorio, tambi茅n el consumo de ram es extenso por lo que, no causaba problemas cuando esta
con delay,hay que colocar una limitaci贸n de tiempo en la creaci贸n de las variables del array para solucionar el problema de la creaci贸n excesiva , al ultimo del c贸digo, necesito que lee cada posiciones de los arrays , tome un camino engorroso para leer los arrays porque es la mas efectiva que se me ocurr铆a, ahora el problema de ello es que estoy repitiendo el mismo c贸digo, y el else al final seria absurdo por lo que nunca se ejecutar铆a esa parte del final del c贸digo,

disculpas me he olvidado especificar los indicadores:
indicador1 me sirve para indicar cuando ya paso el tiempo y este se enciende
indicador2 me sirve cuando el arrays esta en 0, caso contrario se debe apagar, el motor1
indicador3 me sirve cuando el arrays esta en 0, caso contrario se debe apagar, el motor2
indicador4 me sirve para indicar que por lo menos uno de los arrays esta en 1

Ahora lo que tengo que solucionar primero, es colocar un contador que controle la creaci贸n de cada variable del array, para as铆 evitar un consumo muy grande de la RAM.

Bueno lo de los indicadores lo entiendo y no lo entiendo.
Generalmente todos usamos Serial.print para indicar que pasa y no leds para hacerlo pero si te pidieron que fuera asi, quien soy para discutirlo.
Es mucho mas pr谩ctico usar el monitor serie para indicar qu茅 hace el programa.

ambi茅n el consumo de ram es extenso por lo que, no causaba problemas cuando esta
con delay,hay que colocar una limitaci贸n de tiempo en la creaci贸n de las variables del array para solucionar el problema de la creaci贸n excesiva

No estoy de acuerdo. Jamas vi que un delay controle cuanta RAM vas a utilizar.
El limite lo pones tu restringiendo el tama帽o comparando hasta donde llegan esos contadores. Ser谩 100 ser谩 mas.. eso lo manejas tu y la cantidad de RAM disponible.

Igualmente no entiendo que quieres hacer o que debe hacer tu programa.
Dos LDR ok
La lectura que supere 220 es un 1 y la que no es un 0. Lo alamacenas en un array.

Para que almacenas muchos valores en un array si solo comparas el 煤ltimo? y en funci贸n de eso tomas acci贸nes?

Disculpa, me exprese mal,el delay al detener todo, la creaci贸n de los arrays se detienen, por lo que si se activar los LDR no recibe informaci贸n la placa, solo cuando termine el conteo del delay, en ese momento se crean los valores de los LDR.
hay se activa los motores, por lo que los arrays solo almacena los d铆gitos que se alcanza a procesar por el delay.

Para que almacenas muchos valores en un array si solo comparas el 煤ltimo? y en funci贸n de eso tomas acci贸nes?

el prop贸sito del proyecto es que capte la luz , procese esta informaci贸n, y despues de determinado tiempo (10s) ejecute la orden de rodar los motores, si almacena que el LDR estuvo activo 220 > n, guarda esa informacion, y la expresa despues del determinado tiempo ( un LDR para cada Motor) cada vez que se activa n se crea 1 en la primer lugar, sigue al segundo puesto, si el segundo puesto no estuvo activo su valor sera 0

mi edici贸n actual

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

unsigned long Tiempo = 10000;
unsigned long TiempoA = 0;



byte uno = 0;
byte dos = 0;


void setup()
聽 {聽 聽 pinMode(control,聽 OUTPUT) ;
聽 聽 聽  pinMode(contro2, OUTPUT); 
聽 聽 聽  
聽 聽 聽  pinMode(indicador1,OUTPUT);
聽 聽 聽  pinMode(indicador2,OUTPUT);
聽 聽 聽  pinMode(indicador3,OUTPUT);
聽 聽 聽  pinMode(indicador4,OUTPUT);
聽 聽 聽  Serial.begin(9600);聽 
聽 }

void loop()
聽 {
聽 聽 聽 聽 unsigned long Cronometro聽 = millis(); 
聽 聽 聽  int n = analogRead(A1)/ 4;聽 聽  // Las lecturas analogicas van hasta 1024 y no hasta 255
聽 聽 聽  int m = analogRead(A2)/ 4;
聽 聽 聽  Serial.println(n);Serial.print(" LDR NUMERO 1- ");
聽 聽 聽  Serial.println(m);Serial.print(" LDR NUMERO 2- ");
聽 聽 聽  Serial.println(uno);
聽 聽 聽  Serial.println(dos);
聽 聽  //聽 Serial.println(TiempoA);
聽 聽 聽  delay(300);
聽 聽 聽  
聽 聽 聽  
聽 聽 聽  Serial.println(Cronometro - TiempoA);
聽 聽 聽  if (Cronometro - TiempoA < Tiempo)
聽 聽 聽  {
聽 聽 聽 聽 聽  if( 220 > n ){
聽 聽 聽 聽 聽 uno = 1;
聽 聽 聽 聽 }
聽 聽 聽 聽 if(220 > m){
聽 聽 聽 聽 聽 dos = 1;
聽 聽 聽 聽 }
聽 聽 聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 聽 聽 digitalWrite (indicador1,LOW);
聽 聽 聽 聽 
聽 聽 聽  }
聽 聽 聽  
聽 聽 聽  else {
聽 聽 聽 聽 TiempoA = Cronometro;
聽  
聽 聽 聽  digitalWrite (indicador4,LOW);
聽 聽 聽 聽 digitalWrite (indicador1,HIGH);
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 if (uno == 1){
聽 聽 聽 聽 analogWrite (control,聽 255) ;
聽 聽 聽 聽 digitalWrite (indicador3, HIGH);
聽 聽 聽 聽 
聽 聽 聽 聽 }
聽 聽 聽 聽 else if(uno == 0){
聽 聽 聽 聽 analogWrite (control,聽 LOW) ;
聽 聽 聽 聽 digitalWrite (indicador3, LOW);
聽 聽 聽 聽 }
聽 聽 聽 聽 if (dos == 1){
聽 聽 聽 聽 analogWrite (contro2, 255);
聽 聽 聽 聽 digitalWrite (indicador2,HIGH);
聽 聽 聽 聽 
聽 聽 聽 聽  }
聽 聽 聽 聽 else if (dos == 0){
聽 聽 聽 聽  analogWrite (contro2, LOW);
聽 聽 聽 聽  digitalWrite (indicador2,LOW); 
聽 聽 聽  }
聽 聽 
聽 聽 聽  }
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 
 
聽 }

quisiera que me ayudaran por favor, como aplico la misma funci贸n de anti-rebote de los botones ,aplicando al sensor ldr, para cuando se ilumine y se mantenga solo genere una sola variable y no muchas en el mismo momento .

El segundo y ultimo problema ya para culminar es el uso de arrays correctamente, como deber铆a usarla para almacenar este tipo de datos y que lo pueda leer para que los motores se encienda, si en el arrays almacena por ejemplo almacena 1. 1 == HIGH; -enciende el motor.

Si esta en 1, se le determina un tiempo de encendido, el siguente termino es 0, se apaga el motor por el tiempo que se le determine, as铆 sucesivamente, los LDR generan los valores de n y m. mientras no pasen de los 10s , que se le dio (Millis resuelto), si pasan de los 10s se ejecuta la acci贸n de leer toda la expresi贸n del arrays, para que el motor ejecute la acci贸n de encenderse o apagarse

control = 9 ; Motor1 pin 9
contro2 = 8 ; Motor2 pin 8

indicador1 =10; led 1 pin 10
indicador2 =11; led 2 pin 11
indicador3 =12; led 3 pin 12
indicador4 =13; led 4 pin 13

Tiempo = 10000; Tiempo que se le da para que almacene los valores del LDR
TiempoA = 0; Tiempo a cambiar por el actual Tiempo

uno = 0; a sustituir por array Datos1
dos = 0; a sustituir por array Datos2

Datos1[] = {}; primer arrays a querer almacenar
Datos2[] = {}; segundo arrays a querer almacenar

Establecido todos los pines exceptuando el pin del LDR

void setup()
聽 {聽 聽 pinMode(control,聽 OUTPUT) ;
聽 聽 聽  pinMode(contro2, OUTPUT); 
聽 聽 聽  
聽 聽 聽  pinMode(indicador1,OUTPUT);
聽 聽 聽  pinMode(indicador2,OUTPUT);
聽 聽 聽  pinMode(indicador3,OUTPUT);
聽 聽 聽  pinMode(indicador4,OUTPUT);
聽 聽 聽  Serial.begin(9600);聽 
聽 }

establecido el tiempo a comenzar (millis), estableciendo el pin del LDR , imprimir los valores de las variables que son n,m, uno, dos,TiempoA. Un delay para evitar exceso de texto impreso del monitor serial.

void loop()
聽 {
聽 聽 聽 聽 unsigned long Cronometro聽 = millis(); 
聽 聽 聽  int n = analogRead(A1)/ 4;聽 聽  // Las lecturas analogicas van hasta 1024 y no hasta 255
聽 聽 聽  int m = analogRead(A2)/ 4;
聽 聽 聽  Serial.println(n);Serial.print(" LDR NUMERO 1- ");
聽 聽 聽  Serial.println(m);Serial.print(" LDR NUMERO 2- ");
聽 聽 聽  Serial.println(uno);
聽 聽 聽  Serial.println(dos);
聽 聽  //聽 Serial.println(TiempoA);
聽 聽 聽  delay(300);

establesco que "if" (Cronometro - TiempoA es menor a Tiempo ), eso reescribe los valores de las variables uno y dos. el pin 4 se enciende para indicar que paso correctamente los 10s

Serial.println(Cronometro - TiempoA);
聽 聽 聽  if (Cronometro - TiempoA < Tiempo)
聽 聽 聽  {
聽 聽 聽 聽 聽  if( 220 > n ){
聽 聽 聽 聽 聽 uno = 1;
聽 聽 聽 聽 }
聽 聽 聽 聽 if(220 > m){
聽 聽 聽 聽 聽 dos = 1;
聽 聽 聽 聽 }
聽 聽 聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 聽 聽 digitalWrite (indicador1,LOW);
聽 聽 聽 聽 
聽 聽 聽  }

entonces "else" lee los valores de las variables uno y dos, ejecuta si se enciende o se apaga, asimismo cada motor tiene un led que indica si un motor esta apagado o encendido, y para indicar que se esta ejecutando esta parte del c贸digo se enciende el led indicador 1

else {
聽 聽 聽 聽 TiempoA = Cronometro;
聽  
聽 聽 聽  digitalWrite (indicador4,LOW);
聽 聽 聽 聽 digitalWrite (indicador1,HIGH);
聽 聽 聽 聽 
聽 聽 聽 聽 
聽 聽 聽 聽 if (uno == 1){
聽 聽 聽 聽 analogWrite (control,聽 255) ;
聽 聽 聽 聽 digitalWrite (indicador3, HIGH);聽 聽 //led 3
聽 聽 聽 聽 
聽 聽 聽 聽 }
聽 聽 聽 聽 else if(uno == 0){
聽 聽 聽 聽 analogWrite (control,聽 LOW) ;
聽 聽 聽 聽 digitalWrite (indicador3, LOW);
聽 聽 聽 聽 }
聽 聽 聽 聽 if (dos == 1){
聽 聽 聽 聽 analogWrite (contro2, 255);
聽 聽 聽 聽 digitalWrite (indicador2,HIGH);聽 聽 聽  //led 2
聽 聽 聽 聽 
聽 聽 聽 聽  }
聽 聽 聽 聽 else if (dos == 0){
聽 聽 聽 聽  analogWrite (contro2, LOW);
聽 聽 聽 聽  digitalWrite (indicador2,LOW);聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽  }

}

Funcionamiento final es el poder poder iluminar con una linterna los LDR, despu茅s de los 10 segundo se encienda un led que indique que se esta ejecutando la acci贸n de lectura, una vez leyendo, se encienda los motores dependiendo donde se ilumino, y no se enciendo por el tiempo que se ilumina sino, por la cantidad de veces que recibi贸 la luz. as铆, poder calibrar el rodaje y el tiempo que rueda para lograr un carrito que pueda completar un laberinto.
no se si se entienda lo que quiero hacer, Agradezco muchos a los user que est谩n leyendo :slight_smile: .

esta inspirado en un carrito seguidor de luz

Muy buenas, aqu铆 mi actualizaci贸n de mi c贸digo.

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

unsigned long Tiempo = 10000;
long TiempoA = 0;

byte Datos1[99] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //esos "0" los agregue solo para testear que 
byte Datos2[99] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //la lectura de los arrays es la correcta 

int Menu ;

byte uno = 0;
byte dos = 0;

boolean estadoAnte1 ;
boolean estadoAnte2 ;

boolean result1 聽;
boolean result2 聽;

byte posicion = 0;
byte posicion2 = 0;
byte posicion3 = 0;
byte posicion4 = 0;

byte posicionD = 0;
byte posicionD2 = 0;

int n ; 聽 聽 
int m ;

int stast = false;
int lug = LOW;

void setup()
 聽{ 聽 聽pinMode(control, 聽OUTPUT) ;
 聽 聽 聽 pinMode(contro2, OUTPUT); 
 聽 聽 聽 
 聽 聽 聽 pinMode(indicador1,OUTPUT);
 聽 聽 聽 pinMode(indicador2,OUTPUT);
 聽 聽 聽 pinMode(indicador3,OUTPUT);
 聽 聽 聽 pinMode(indicador4,OUTPUT);
 聽 聽 聽 Serial.begin(9600); 聽
 聽 聽 聽 
 聽}

void loop()
 聽{
 聽 聽 聽 
 聽 聽 unsigned long 聽 Cronometro 聽= millis();
 聽 聽 int n = analogRead(A1)/ 4; 聽 聽 // Las lecturas analogicas van hasta 1024 y no hasta 255
 聽 聽 int m = analogRead(A2)/ 4;
 聽 聽 Serial.print(" LDR NUMERO 1- ");Serial.println(n);
 聽 聽 Serial.print(" LDR NUMERO 2- ");Serial.println(m);
 聽 聽 Serial.print(" Datos 1 - "); Serial.println(Datos1 [posicion3] );
 聽 聽 Serial.print(" Datos 2 - ");Serial.println(Datos2 [posicion4] );
 聽 聽 // 聽Serial.println(TiempoA);
 聽 聽 聽 Serial.print(" El Tiempo Transcurrido - "); Serial.println(Cronometro - TiempoA);
 聽 聽 聽 
 聽 聽 聽 delay(300);
 聽 聽 聽 
 聽 聽 聽 
 聽 聽 聽 聽
 聽 聽 聽// 聽if (Tiempo >(Cronometro - TiempoA) 聽 )
 聽 聽 聽 if (Cronometro - TiempoA > Tiempo 聽 ){
 聽 聽 聽 聽 聽 TiempoA = Cronometro; 
 聽 聽 聽 聽 聽 if (stast == false)
 聽 聽 聽 聽 聽 聽 聽 stast = true;
 聽 聽 聽 聽 聽 else
 聽 聽 聽 聽 聽 聽 聽 stast = false;
 聽 聽 聽 聽 聽 
 聽 聽 聽 }
 聽 聽 聽
 聽 聽 聽 
 聽 聽 聽 聽
 聽 聽 聽 if (stast == true)
 聽 聽 聽 { 聽 聽 聽 
 聽 聽 聽 聽 聽 funcion1();
 聽 聽 聽}
 聽 聽 聽if (stast == false)
 聽 聽 聽{
 聽 聽 聽 聽 聽 funcion2();
 聽 聽 聽}

 聽}



 聽
 聽 聽 聽 聽 void funcion1()
 聽 聽{
 聽 聽 聽
 聽 聽 聽 聽Serial.println(posicion3);
 聽 聽 聽 聽Serial.println(posicion4);
 聽 聽 聽 聽digitalWrite (indicador4,LOW);
 聽 聽 聽 聽digitalWrite (indicador1,HIGH);
 聽 聽 聽 聽
 聽 聽 聽 聽
 聽 聽 聽 聽if (Datos1[posicion3] == 1){
 聽 聽 聽 聽analogWrite (control, 聽255) ;
 聽 聽 聽 聽digitalWrite (indicador3, HIGH);
 聽 聽 聽 聽posicion3 ++;
 聽 聽 聽 聽
 聽 聽 聽 聽}
 聽 聽 聽 聽else if(Datos1[posicion3] == 0){
 聽 聽 聽 聽analogWrite (control, 聽LOW) ;
 聽 聽 聽 聽digitalWrite (indicador3, LOW);
 聽 聽 聽 聽posicion3 ++;
 聽 聽 聽 聽}
 聽 聽 聽 聽if (Datos2[posicion4] == 1){
 聽 聽 聽 聽analogWrite (contro2, 255);
 聽 聽 聽 聽digitalWrite (indicador2,HIGH);
 聽 聽 聽 聽posicion4 ++;
 聽 聽 聽 聽 }
 聽 聽 聽 聽else if (Datos2[posicion4] == 0){
 聽 聽 聽 聽 analogWrite (contro2, LOW);
 聽 聽 聽 聽 digitalWrite (indicador2,LOW); 
 聽 聽 聽 聽 posicion4 ++;
 聽 聽 聽 }
 聽 聽 聽 
 聽 聽}
 聽 void funcion2()
 聽 {

 聽 聽 聽 聽
 聽 聽 聽 聽Serial.println(posicion);
 聽 聽 聽 聽Serial.println(posicion2);
 聽 聽 聽 聽digitalWrite (indicador1,LOW);
 聽 聽 聽 聽digitalWrite (indicador4,HIGH);

 聽 聽 聽 if ( 220 > n ){ 聽 聽 聽 聽 聽 聽 聽 聽 //activaci贸n si 220 > LDR1
 聽 聽 聽 聽 
 聽 聽 聽 聽 聽Datos1[posicion] = 1;
 聽 聽 聽 聽 聽posicion ++;
 聽 聽 聽 聽}
 聽 聽 聽// 聽estadoAnte1 = result1;
 聽 聽 聽 聽if ( 220 < n ){
 聽 聽 聽 聽 
 聽 聽 聽 聽 聽Datos1[posicion] = 0;
 聽 聽 聽 聽 聽posicion ++;
 聽 聽 聽 聽}
 聽 聽 聽 聽if ( 220 > m ){ 聽 聽 聽 聽 聽 聽 聽 聽 聽 // activaci贸n si 220 > LDR2
 聽 聽 聽 聽 聽
 聽 聽 聽 聽 聽Datos2 [posicion2] = 1;
 聽 聽 聽 聽 聽posicion2 ++;
 聽 聽 聽 聽}
 聽 聽 聽// 聽estadoAnte2 = result2;
 聽 聽 聽 聽if ( 220 < m ){ 聽 聽 聽 聽 聽 聽 聽 聽 聽 

 聽 聽 聽 聽 聽Datos2 [posicion2] = 0;
 聽 聽 聽 聽 聽posicion2 ++;
 聽 聽 聽 聽}
 聽 聽 聽 聽//////////////////////////////////////////////////////////////
 聽 聽 聽 聽if (posicion == 99){
 聽 聽 聽 聽 聽posicion = 0;
 聽 聽 聽 聽 聽posicion3 = 0;
 聽 聽 聽 聽}
 聽 聽 聽 聽if (posicion2 == 99){
 聽 聽 聽 聽 聽posicion2 = 0;
 聽 聽 聽 聽 聽posicion4 = 0;
 聽 聽 聽 聽}
 聽 聽 聽 }

estoy muy alegre que ya me falte tan poco, teste TODO, y ya el problema es que la lectura de los LDR sin haber disminuido a 220 env铆a la se帽al de que se activa (cuya activaci贸n se debe solo si 220 > LDR ). En total, env铆a al arrays de que es "1" cuando aun no baja de los 220 ("1" si lee que ha estado presente la cantidad de luz indicada anteriormente).

surbyte establec铆 ya una cantidad fija de 99 Arrays m谩ximos, a la cual por cada ronda provocada por el cambio de millis solo genera alrededor de 26 variables del arrays, y si llega a alcanzar los 99 se reinicia y lo vuelve a sobre escribir con valor "0" .

ahora ya todo el problema esta en la escritura del array . por medio del monitor serial saco a entender los valores que esta recibiendo por medio de los LDR . :slight_smile:

Me da gusto que hayas progresado con tu propio esfuerzo.

Ahora una consulta : porque el limite es 220? 220x4 = 880 de 1023
No comprendo para que divides x 4 y luego comparas con 220 y no lo dejas como esta sin dividir y solo comparas con 880.
Eso no cambia lo que pasa.

Otra cosa que no comprendo es que tu array dice ser de 99 elementos pero inicializas 17. fue para que no se llene el c贸digo o tienes los 99 a 0?

Bueno he hecho algunos cambios que te pido compruebes.
en lugar de 220 ahora no dividimos lo leido del AD y queda como esta asi que las comparaciones son con 880 = 220x4

Algunos else if eliminados porque consultar por una condici贸n y luego hacer un else de la opuesta es lo mismo que hacer

if (condicion)
聽  // true
else
聽  // false

no como tu haces

if (condicion)
聽  // true
else if (!condicion)
聽  // false

El c贸digo modificado:
Como veo que solo activas o desactivas el elemento del array, mejor que usar byte es usar bool y solo manejas bits con lo que podrias ampliar la capacidad de ambos arrays simplemente cambiando NUMERO_DATOS a otro valor.

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

unsigned long TIEMPO = 10000;
unsigned long TiempoA = 0;

#define NUMERO_DATOS聽  99
bool Datos1[NUMERO_DATOS]; //esos "0" los agregue solo para testear que 
bool Datos2[NUMERO_DATOS]; //la lectura de los arrays es la correcta 

int Menu ;

byte uno = 0;
byte dos = 0;

boolean estadoAnte1 ;
boolean estadoAnte2 ;

boolean result1聽 ;
boolean result2聽 ;

byte posicion = 0;
byte posicion2 = 0;
byte posicion3 = 0;
byte posicion4 = 0;

byte posicionD = 0;
byte posicionD2 = 0;

int n ;聽 聽  
int m ;

bool stast = false;
int lug = LOW;

void setup()
聽 {聽 聽 pinMode(control,聽 OUTPUT) ;
聽 聽 聽  pinMode(contro2, OUTPUT); 
聽 聽 聽  
聽 聽 聽  pinMode(indicador1,OUTPUT);
聽 聽 聽  pinMode(indicador2,OUTPUT);
聽 聽 聽  pinMode(indicador3,OUTPUT);
聽 聽 聽  pinMode(indicador4,OUTPUT);
聽 聽 聽  Serial.begin(9600);聽 
聽 聽 聽  memset(Datos1, false, sizeof(Datos1));
聽 聽 聽  memset(Datos2, false, sizeof(Datos2));
聽 }

void loop()聽 {聽 聽  
聽 聽 

聽 聽 int n = analogRead(A1);聽 聽  // Las lecturas analogicas van hasta 1024 y no hasta 255
聽 聽 int m = analogRead(A2);
聽 聽 Serial.print(" LDR NUMERO 1- ");Serial.println(n);
聽 聽 Serial.print(" LDR NUMERO 2- ");Serial.println(m);
聽 聽 Serial.print(" Datos 1 - ");聽 聽 Serial.println(Datos1[posicion3]);
聽 聽 Serial.print(" Datos 2 - ");聽 聽 Serial.println(Datos2[posicion4]);
聽 聽 //聽 Serial.println(TiempoA);
聽 聽 
聽 聽 unsigned long Cronometro = millis();
聽 聽 Serial.print(" El Tiempo Transcurrido - "); Serial.println(Cronometro - TiempoA);
聽 聽  
聽 聽 delay(300);
聽 聽 聽 
聽 聽 if (Cronometro - TiempoA > TIEMPO){
聽 聽 聽  stast = !stast;
聽 聽 聽  TiempoA = Cronometro; 
聽 聽 }聽 聽 
聽 聽 聽 
聽 聽 if (stast)聽 聽 聽  
聽 聽 聽 聽  funcion1();
聽 聽 else 
聽 聽 聽 聽  funcion2();
}

void funcion1()聽 {
聽 聽 聽 
聽 聽 Serial.println(posicion3);
聽 聽 Serial.println(posicion4);
聽 聽 digitalWrite (indicador4,LOW);
聽 聽 digitalWrite (indicador1,HIGH);

聽 聽 if (Datos1[posicion3] == 1) {
聽 聽 聽 聽 analogWrite (control,聽 255) ;
聽 聽 聽 聽 digitalWrite (indicador3, HIGH);
聽 聽 聽 聽 posicion3++;
聽 聽 }
聽 聽 else {
聽 聽 聽 聽 analogWrite (control,聽 LOW) ;
聽 聽 聽 聽 digitalWrite (indicador3, LOW);
聽 聽 聽 聽 posicion3++;
聽 聽 }
聽 聽 if (Datos2[posicion4] == 1){
聽 聽 聽 聽 analogWrite (contro2, 255);
聽 聽 聽 聽 digitalWrite (indicador2,HIGH);
聽 聽 聽 聽 posicion4++;
聽 聽 }
聽 聽 else {
聽 聽 聽 聽 analogWrite (contro2, LOW);
聽 聽 聽 聽 digitalWrite (indicador2,LOW); 
聽 聽 聽 聽 posicion4++;
聽 聽 }聽 
}

void funcion2()聽  {
聽 聽 
聽 聽 Serial.println(posicion);
聽 聽 Serial.println(posicion2);
聽 聽 digitalWrite (indicador1,LOW);
聽 聽 digitalWrite (indicador4,HIGH);

聽 聽 if ( 880 > n ){聽 聽 聽 聽 聽 聽 聽 聽  //activaci贸n si 880 > LDR1
聽 聽 聽 聽 Datos1[posicion++] = true;
聽 聽 }
聽 聽 else {聽 聽 //聽 if ( 880 <= n ){
聽 聽 聽 聽 Datos1[posicion++] = false;
聽 聽 }

聽 聽 if ( 880 > m ){聽 聽 聽 聽 聽 聽 聽 聽 聽  // activaci贸n si 880 > LDR2
聽 聽 聽 聽 Datos2[posicion2++] = true;
聽 聽 }
聽 聽 else聽 { // if ( 880 <= m ){聽 聽 聽 聽 聽 聽 聽 聽 聽 聽  
聽 聽 聽 聽 Datos2[posicion2++] = false;
聽 聽 }
聽 聽 //////////////////////////////////////////////////////////////
聽 聽 if (posicion >= NUMERO_DATOS){
聽 聽 聽 聽 posicion = 0;
聽 聽 聽 聽 posicion3 = 0;
聽 聽 }
聽 聽 if (posicion2 >= NUMERO_DATOS){
聽 聽 聽 聽 posicion2 = 0;
聽 聽 聽 聽 posicion4 = 0;
聽 聽 }
}

Observemos como se comporta el tema de los valores que dices que no lo hacen correctamente.

Buenas :D, ya encontre el problema, al inicio esta

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

unsigned long TIEMPO = 10000;
unsigned long TiempoA = 0;

#define NUMERO_DATOS聽  99
bool Datos1[NUMERO_DATOS]; //esos "0" los agregue solo para testear que 
bool Datos2[NUMERO_DATOS]; //la lectura de los arrays es la correcta 

int Menu ;

byte uno = 0;
byte dos = 0;

boolean estadoAnte1 ;
boolean estadoAnte2 ;

boolean result1聽 ;
boolean result2聽 ;

byte posicion = 0;
byte posicion2 = 0;
byte posicion3 = 0;
byte posicion4 = 0;

byte posicionD = 0;
byte posicionD2 = 0;

int n ;聽 聽  
int m ;

bool stast = false;
int lug = LOW;

la declaraci贸n al inicio de los LDR son el causante del problema, "n" y "m".

elimin谩ndolo y pasando la declaraci贸n de las variables al la funcion2 (tambi茅n el serialPrint que me muestra los resultados que recibo del los LDR).
Logre que los resultados dejen de ser err贸neos, este error provocaba que los resultados sean positivo aun cuando no se iluminaba la cantidad requerida para encenderlo.
lo que me deja desconcertante el porque y la raz贸n de ello. es como que se reiniciaba los valores o lanzaba valores altos?

no encuentro mucha informaci贸n de memset, lo estoy investigando por lo que no hay mucho en espa帽ol sobre ello.

la declaraci贸n de 99 no es especifica solo es para evitar lo mismo, la excesiva cantidad de memoria.

hay el c贸digo con la peque帽a modificaci贸n .

const int control = 9 ;
const int contro2 = 8 ;

const int indicador1 =10;
const int indicador2 =11;
const int indicador3 =12;
const int indicador4 =13;

unsigned long TIEMPO = 10000;
unsigned long TiempoA = 0;

#define NUMERO_DATOS聽  99
bool Datos1[NUMERO_DATOS]; //esos "0" los agregue solo para testear que 
bool Datos2[NUMERO_DATOS]; //la lectura de los arrays es la correcta 

int Menu ;

byte uno = 0;
byte dos = 0;

boolean estadoAnte1 ;
boolean estadoAnte2 ;

boolean result1聽 ;
boolean result2聽 ;

byte posicion = 0;
byte posicion2 = 0;
byte posicion3 = 0;
byte posicion4 = 0;

byte posicionD = 0;
byte posicionD2 = 0;


bool stast = false;
int lug = LOW;

void setup()
聽 {聽 聽 pinMode(control,聽 OUTPUT) ;
聽 聽 聽  pinMode(contro2, OUTPUT); 
聽 聽 聽  
聽 聽 聽  pinMode(indicador1,OUTPUT);
聽 聽 聽  pinMode(indicador2,OUTPUT);
聽 聽 聽  pinMode(indicador3,OUTPUT);
聽 聽 聽  pinMode(indicador4,OUTPUT);
聽 聽 聽  Serial.begin(9600);聽 
聽 聽 聽  memset(Datos1, false, sizeof(Datos1));
聽 聽 聽  memset(Datos2, false, sizeof(Datos2));
聽 }

void loop()聽 {聽 聽  
聽 聽 

聽 聽 
聽 聽 Serial.print(" Datos 1 - ");聽 聽 Serial.println(Datos1[posicion3]);
聽 聽 Serial.print(" Datos 2 - ");聽 聽 Serial.println(Datos2[posicion4]);
聽 聽 //聽 Serial.println(TiempoA);
聽 聽 
聽 聽 unsigned long Cronometro = millis();
聽 聽 Serial.print(" El Tiempo Transcurrido - "); Serial.println(Cronometro - TiempoA);
聽 聽  
聽 聽 delay(300);
聽 聽 聽 
聽 聽 if (Cronometro - TiempoA > TIEMPO){
聽 聽 聽  stast = !stast;
聽 聽 聽  TiempoA = Cronometro; 
聽 聽 }聽 聽 
聽 聽 聽 
聽 聽 if (stast)聽 聽 聽  
聽 聽 聽 聽  funcion1();
聽 聽 else 
聽 聽 聽 聽  funcion2();
}

void funcion1()聽 {
聽 聽 聽 
聽 聽 Serial.println(posicion3);
聽 聽 Serial.println(posicion4);
聽 聽 digitalWrite (indicador4,LOW);
聽 聽 digitalWrite (indicador1,HIGH);

聽 聽 if (Datos1[posicion3] == 1) {
聽 聽 聽 聽 analogWrite (control,聽 255) ;聽 聽 聽 
聽 聽 聽 聽 posicion3++;
聽 聽 }
聽 聽 else {
聽 聽 聽 聽 analogWrite (control,聽 LOW) ;聽 聽  
聽 聽 聽 聽 posicion3++;
聽 聽 }
聽 聽 if (Datos2[posicion4] == 1){
聽 聽 聽 聽 analogWrite (contro2, 255);聽 
聽 聽 聽 聽 posicion4++;
聽 聽 }
聽 聽 else {
聽 聽 聽 聽 analogWrite (contro2, LOW);
聽 聽 聽 聽 posicion4++;
聽 聽 }聽 
聽 聽 聽  posicion2 = 0;聽 
聽 聽 聽  posicion = 0;
}

void funcion2()聽  {
聽 聽 
聽 聽 Serial.println(posicion);
聽 聽 Serial.println(posicion2);
聽 聽 digitalWrite (indicador1,LOW);
聽 聽 digitalWrite (indicador4,HIGH);
聽 聽 int n = analogRead(A1);聽 聽  // Las lecturas analogicas van hasta 1024 y no hasta 255
聽 聽 int m = analogRead(A2);
聽 聽 Serial.print(" LDR NUMERO 1- ");Serial.println(n);
聽 聽 Serial.print(" LDR NUMERO 2- ");Serial.println(m);
聽 聽 if ( 880 > n ){聽 聽 聽 聽 聽 聽 聽 聽  //activaci贸n si 880 > LDR1
聽 聽 聽 聽 Datos1[posicion++] = true;
聽 聽 聽 聽 digitalWrite (indicador3, HIGH);
聽 聽 }
聽 聽 else {聽 聽 //聽 if ( 880 <= n ){
聽 聽 聽 聽 Datos1[posicion++] = false;
聽 聽 聽 聽 digitalWrite (indicador3, LOW);
聽 聽 }

聽 聽 if ( 880 > m ){聽 聽 聽 聽 聽 聽 聽 聽 聽  // activaci贸n si 880 > LDR2
聽 聽 聽 聽 Datos2[posicion2++] = true;
聽 聽 聽 聽 digitalWrite (indicador2,HIGH);
聽 聽 }
聽 聽 else聽 { // if ( 880 <= m ){聽 聽 聽 聽 聽 聽 聽 聽 聽 聽  
聽 聽 聽 聽 Datos2[posicion2++] = false;
聽 聽 聽 聽 digitalWrite (indicador2,LOW);
聽 聽 }
聽 聽 posicion3 = 0;
聽 聽 posicion4 = 0;
}

agradezco mucho de antemano,para arreglar lo ultimo.

posicion3 = 0 al final de la funci贸n 2
posicion4 = 0 al final de la funci贸n 2

posicion = 0 al final de la funci贸n 1
posicion2 = 0 al final de la funci贸n 1
esto es para que los arrays se reinicie cada vez que termine la lectura y volver desde cero todas las escrituras :smiley: .

Problema resuelto. :smiley: :smiley: :smiley: :smiley:

abrir茅 un offtopic (demorare ...) para publicar mi carrito, esquemas codigo y una explicacion a detalle de como funciona, editare un poco el codigo para cambiar los intervalos de tiempo con un potenciometros y un boton para hacer que cambie a modo seguidor de luz (ya esta terminado todo, solo unifico :slight_smile: ) .

Pero comprendiste la diferencia entre usar byte y bool?

Si solo te interesa el estado para que usar byte que son 8 bits u ocho estados posibles.

La gran diferencia es que pasas de casi 200 bytes de consumo de SRAM a solo 200 bits/8 = 25 bytes

As铆 que podr铆as multiplicar x 8 la longitud de tus arrays si fuera necesario.

muchas gracias surbyte, si, bool es para almacenar datos binario, en cambio byte almacena 8 .
Cuando comenc茅 a escribir el c贸digo nunca pensaba en limitaciones de la ram .

disculpa las molestias, donde puedo conseguir una pagina que hable referente a memset?
esta bien si busco en paginas referente a c++ ?

Todas tus dudas siempre las buscas asi en Google: Arduino memset o arduino Lo_que_quieras_encontrar