Hola, quería programar 2 relés, al encender el arduino que un relé este encendido 5 min y se apague, y el otro que permanezca siempre encendido 7 segundos y 1 segundo apagado todo el tiempo, ciclico.
Con la función delay no lo consigo
Se me ocurre que podrías hacerlo con variables, por ejemplo:
#define RELE1 5
#define RELE2 6
int estadoRele1 = HIGH;
int estadoRele2 = HIGH;
int tiempoRele2 = millis();
setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
tiempoRele2 = millis();
}
loop () {
// El relé 1 se apaga a los 5 minutos de encender el arduino: 5 * 60 seg * 1000 milisegundos = 300000
int tiempoActual = millis();
if (tiempoActual >= 300000 && estadoRele1 == HIGH) {
estadoRele1 = LOW;
digitalWrite(RELE1, LOW);
}
// El relé 2 estará encendido 7 segundos y un 1 apagado (entiendo que en bucle)
if (estadoRele2 == HIGH && tiempoActual - tiempoRele2 >= 7000) {
digitalWrite(RELE2, LOW);
estadoRele2 = LOW;
tiempoRele2 = tiempoActual;
}
if (estadoRele2 == LOW && tiempoActual - tiempoRele2 >= 1000) {
digitalWrite(RELE2, HIGH);
estadoRele2 = HIGH;
tiempoRele2 = tiempoActual;
}
}
Se puede organizar mejor el código y separarlo en funciones, pero como aproximación te puedes hacer una idea. Espero que te sirva.
Saludos.
Deberías comenzar los hilos 1 y 2 de esta sección que dicen cómo y dónde crear tu tópico/tema.
Tu consulta será movida a Software ya que no pertenece a la sección Proyectos.
Muchas gracias por el código.
Me devuelve este error:
2_reles:8: error: expected constructor, destructor, or type conversion before ';' token
setup() {
^
/Users/DabicDBC/Documents/Arduino/2_reles/2_reles.ino:8:7: warning: ISO C++ forbids declaration of 'setup' with no type [-fpermissive]
setup() {
^
/Users/DabicDBC/Documents/Arduino/2_reles/2_reles.ino: In function 'int setup()':
2_reles:8: error: ambiguating new declaration of 'int setup()'
In file included from sketch/2_reles.ino.cpp:1:0:
/Users/DabicDBC/Downloads/Arduino 2.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:153:6: note: old declaration 'void setup()'
void setup(void);
^
exit status 1
expected constructor, destructor, or type conversion before ';' token
solucionado!
void! :-[
Muchas gracias!
Exacto!
A veces se me olvida declarar el tipo devuelto por las funciones, desarrollo sobre todo en javascript y como ahí no hay que declararlo se me va la cabeza xD.
#define RELE1 5
#define RELE2 6
int estadoRele1 = HIGH;
int estadoRele2 = HIGH;
int tiempoRele2 = millis();
void setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
tiempoRele2 = millis();
}
void loop () {
// El relé 1 se apaga a los 5 minutos de encender el arduino: 5 * 60 seg * 1000 milisegundos = 300000
int tiempoActual = millis();
if (tiempoActual >= 300000 && estadoRele1 == HIGH) {
estadoRele1 = LOW;
digitalWrite(RELE1, LOW);
}
// El relé 2 estará encendido 7 segundos y un 1 apagado (entiendo que en bucle)
if (estadoRele2 == HIGH && tiempoActual - tiempoRele2 >= 7000) {
digitalWrite(RELE2, LOW);
estadoRele2 = LOW;
tiempoRele2 = tiempoActual;
}
if (estadoRele2 == LOW && tiempoActual - tiempoRele2 >= 1000) {
digitalWrite(RELE2, HIGH);
estadoRele2 = HIGH;
tiempoRele2 = tiempoActual;
}
}
Espero que te sea de ayuda.
¡Por cierto! Ten en cuenta que tendrás que modificar los pines por los que tengas conectados a tus relés.
Saludos!
#define RELE1 5
#define RELE2 6
int estadoRele1 = LOW;
int estadoRele2 = HIGH;
int tiempoRele2 = millis();
void setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE1, LOW);
digitalWrite(RELE2, HIGH);
tiempoRele2 = millis();
}
void loop () {
// El relé 1 se apaga a los 5 minutos de encender el arduino: 5 * 60 seg * 1000 milisegundos = 300000
int tiempoActual = millis();
if (tiempoActual >= 30000 && estadoRele1 == LOW) {
estadoRele1 = HIGH;
digitalWrite(RELE1, HIGH);
}
// El relé 2 estará encendido 7 segundos y un 1 apagado (entiendo que en bucle)
if (estadoRele2 == LOW && tiempoActual - tiempoRele2 >= 1000) {
digitalWrite(RELE2, HIGH);
estadoRele2 = HIGH;
tiempoRele2 = tiempoActual;
}
if (estadoRele2 == HIGH && tiempoActual - tiempoRele2 >= 7000) {
digitalWrite(RELE2, LOW);
estadoRele2 = LOW;
tiempoRele2 = tiempoActual;
}
}
El problema me surge ahora en el RELE1 si pongo más de 30.000 millisegundos el rele no se desactiva...
Como lo puedo solucionar?
Muchas gracias
@Dabic no comprendes o no has leído las normas?
Vienes de escribir en el foro en inglés. Luego escribes en la sección Proyectos, muevo el hilo no dices ni disculpa.
Te he pedido en el post#2 que edites tu post.
En el post#3 pones errores y no usas código y lo edite y te envié por privado como hacerlo y nada.
Ahora sigues posteando códigos sin etiquetas.
Te pido que tomes en serio mis advertencias porque estoy a punto de cerrar tu hilo si llego a ver una nueva falta.
Pido perdón por todos los errores cometidos en el foro...
Mis disculpas.
Claro, eso es porque las variables que almacenan millis estaban declaradas como int, que admite valores desde -32.768 a 32.767. Prueba declarándolas como unsigned long. Y ten cuidado porque no son 30.000 milisegundos, sino 300.000 (sin el punto)
#define RELE1 5
#define RELE2 6
int estadoRele1 = HIGH;
int estadoRele2 = HIGH;
unsigned long tiempoRele2 = millis();
void setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
tiempoRele2 = millis();
}
void loop () {
// El relé 1 se apaga a los 5 minutos de encender el arduino: 5 * 60 seg * 1000 milisegundos = 300000
unsigned long tiempoActual = millis();
if (tiempoActual >= 300000 && estadoRele1 == HIGH) {
estadoRele1 = LOW;
digitalWrite(RELE1, LOW);
}
// El relé 2 estará encendido 7 segundos y un 1 apagado (entiendo que en bucle)
if (estadoRele2 == HIGH && tiempoActual - tiempoRele2 >= 7000) {
digitalWrite(RELE2, LOW);
estadoRele2 = LOW;
tiempoRele2 = tiempoActual;
}
if (estadoRele2 == LOW && tiempoActual - tiempoRele2 >= 1000) {
digitalWrite(RELE2, HIGH);
estadoRele2 = HIGH;
tiempoRele2 = tiempoActual;
}
}
Te adjunto un enlace hacia el sketch: Arduino Cloud
Muchísimas gracias @danitetus, funciona perfecto.
Muchas gracias por tu ayuda.
¡De nada! Me alegro mucho @dabic.
Saludos.
Comunicate conmigo por privado.
Y si le añado un lcd keypad shield, para subir o bajar 1 segundo a uno u otro relé y que los cambios queden guardados al apagar el arduino...
Gracias y saludos.
Bueno ahí estás incrementando ligeramente la funcionalidad y complejidad del montaje. Te recomiendo que le eches un ojo a algún tutorial sobre como leer y escribir en la EEPROM de tu Arduino para conseguir preservar el estado de tus variables ante un reinicio, como este:
También te vendría bien aprender como conectar y leer de teclados matriciales para modificar el estado de tus variables con el sketch en marcha (aunque si es para incrementar y reducir una variable con dos pulsadores te valdría), aquí te dejo uno.
Por último necesitarías saber que display LCD quieres usar, para saber como se conecta y con que librería podrías manipularlo más fácilmente.
La pantalla LCD ya incluye 6 botones creo que el modelo es 1602.