Buenos días, es mi primer mensaje en el foro y el problema que tengo es el siguiente:
Quiero programar un módulo de relés de tal forma que el primero se active desde el segundo 1 hasta el segundo 165 el segundo se active pasados 15 segundos y este activo igualmente hasta el segundo 165, el tercero se active a los 30 segundos y igualmente se apague al segundo 165 y el cuarto se active en el segundo 45 y se apague en el 165.
El módulo es un HL-54S V1.0 de cuatro relés y da igual que lo alimente por el arduino o por una fuente de alimentación externa conectada a GND y JDVcc. Logicamente si alimento por una externa los optoaclopadores los alimento por el arduino.
El hecho es que se comporta de una forma erratica, Si en el código cambio LOW por HIGH y HIGH por LOW, se encienden todos a la vez luego se apagan los tres primeros y el último se queda encendido todo el tiempo, si LOW e HIGH los permuto no funciona.
Creo que el fallo tiene que estar en el código, pero no lo veo. Si podéis echarme una mano.... muy agradecido
unsigned long time;
int rele1=2; // asigna el pin 2 para el relé1
int rele2=3; // asigna el pin 3 para el relé2
int rele3=4; // asigna el pin 4 para el relé3
int rele4=5; // asigna el pin 5 para el relé4
void setup(){
pinMode (rele1, OUTPUT); // declara el rele1 como salida
pinMode (rele2, OUTPUT); // declara el rele2 como salida
pinMode (rele3, OUTPUT); // declara el rele3 como salida
pinMode (rele4, OUTPUT); // declara el rele4 como salida
time= millis();
}
void loop(){
//RELE 1
if(millis()-time>1 && millis()-time<16500)
digitalWrite(rele1,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele1,LOW);
//RELE 2
if(millis()-time>1500 && millis()-time<16500)
digitalWrite(rele1,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele2,LOW);
//RELE 3
if(millis()-time>3000 && millis()-time<16500)
digitalWrite(rele3,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele3,LOW);
//RELE 4
if(millis()-time>4500 && millis()-time < 16500)
digitalWrite(rele3,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele3,LOW);
}
unsigned long time;
int rele1=2; // asigna el pin 2 para el relé1
int rele2=3; // asigna el pin 3 para el relé2
int rele3=4; // asigna el pin 4 para el relé3
int rele4=5; // asigna el pin 5 para el relé4
void setup(){
pinMode (rele1, OUTPUT); // declara el rele1 como salida
pinMode (rele2, OUTPUT); // declara el rele2 como salida
pinMode (rele3, OUTPUT); // declara el rele3 como salida
pinMode (rele4, OUTPUT); // declara el rele4 como salida
time= millis();
}
void loop(){
//RELE 1
if(millis()-time>1 && millis()-time<16500)
digitalWrite(rele1,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele1,LOW);
//RELE 2
if(millis()-time>1500 && millis()-time<16500)
digitalWrite(rele1,HIGH); // -> ¿por qué enciendes el 1? ¿No será el 2?
else
if (millis()-time>16500)
digitalWrite(rele2,LOW);
//RELE 3
if(millis()-time>3000 && millis()-time<16500)
digitalWrite(rele3,HIGH);
else
if (millis()-time>16500)
digitalWrite(rele3,LOW);
//RELE 4
if(millis()-time>4500 && millis()-time < 16500)
digitalWrite(rele3,HIGH); // Si es el relé 4 por qué usas el 3?
else
if (millis()-time>16500)
digitalWrite(rele3,LOW); // Si es el relé 4 por qué usas el 3?
}
Y aunque la secuencia:
if ( millis()-tiempo > minimo && millis()-tiempo < maximo ) {
funcion();
else
if ( millis-tiempo < maximo )
funcion2();
victorjam:
Por lo demás, para no llamar tanto a millis() optaría por crear una variable "t" y hacer solo una llamada al principio del loop
Ademas si solo quieres que la secuencia funciona una vez para que usas la variable time. mejor reusala asi:
unsigned long time;
const byte rele1 = 2; //asigna el pin 2 para el relé1
const byte rele2 = 3; //asigna el pin 3 para el relé2
const byte rele3 = 4; //asigna el pin 4 para el relé3
const byte rele4 = 5; //asigna el pin 5 para el relé4
void setup(){
pinMode(rele1, OUTPUT); //declara el rele1 como salida
pinMode(rele2, OUTPUT); //declara el rele2 como salida
pinMode(rele3, OUTPUT); //declara el rele3 como salida
pinMode(rele4, OUTPUT); //declara el rele4 como salida
}
void loop(){
time = millis();
//RELE 1
if (time > 1 && time < 16500)
digitalWrite(rele1, HIGH);
else
digitalWrite(rele1, LOW);
//RELE 2
if (time > 1500 && time < 16500)
digitalWrite(rele2, HIGH);
else
digitalWrite(rele2, LOW);
//RELE 3
if (time > 3000 && time < 16500)
digitalWrite(rele3, HIGH);
else
digitalWrite(rele3, LOW);
//RELE 4
if (time > 4500 && time < 16500)
digitalWrite(rele4, HIGH);
else
digitalWrite(rele4, LOW);
}