Hola a todos, estoy queriendo empezar con arduino y estoy tratando de hacer andar 2 reles con 2 botones/pulsadores y puedo hacerlo funcionar con un codigo que saque de la web (no se si no lo saque de este foro jaja) que es este:
unsigned long start = 0;
bool pulsador = false;
int inputPin = 10; // estaba como "const int inputPin = 10;" asi parece funcionar igual..
int value = 0;
void setup() {
pinMode(7, OUTPUT);
Serial.begin(9600);
pinMode(inputPin, INPUT);
digitalWrite(7, LOW);
}
void loop(){
value = digitalRead(10); //lectura digital de pin 10..tambien se puede poner inputPin en vez de 10: "value = digitalRead(inputPin);"
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH) {
pulsador = true;
digitalWrite(7, HIGH);
start = millis();
}
if (pulsador && (millis()-start> 5000UL)) {
Serial.println("Encendido");
digitalWrite(7, LOW); // y quede HIGH por 20Seg y que se reinicie el contador cada vez que se recibe una señal del Sensor pir
pulsador = false; // no dejo que pase de nuevo hasta que se rearme.
}
}
pero para hacerlo andar con los 2 intente modificandolo asi:
unsigned long start = 0;
bool pulsador = false;
bool pulsador2 = false;
int inputPin = 2; // estaba como "const int inputPin = 10;" asi parece funcionar igual..
int inputPin2 = 4;
int value = 0;
int value2 = 0;
void setup() {
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void loop(){
value = digitalRead(2); //lectura digital de pin 10..tambien se puede poner inputPin en vez de 10: "value = digitalRead(inputPin);"
value2 = digitalRead(4);
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH) {
pulsador = true;
digitalWrite(7, HIGH);
start = millis();
}
if (value2 == HIGH) {
pulsador = true;
digitalWrite(8, HIGH);
start = millis();
}
if (pulsador && (millis()-start> 5000UL)) {
Serial.println("Encendido");
digitalWrite(7, LOW);
digitalWrite(8, LOW); // y quede HIGH por 20Seg y que se reinicie el contador cada vez que se recibe una señal del Sensor pir
pulsador = false; // no dejo que pase de nuevo hasta que se rearme.
}
if (pulsador2 && (millis()-start> 5000UL)) {
Serial.println("Encendido");
digitalWrite(7, LOW);
digitalWrite(8, LOW); // y quede HIGH por 20Seg y que se reinicie el contador cada vez que se recibe una señal del Sensor pir
pulsador2 = false; // no dejo que pase de nuevo hasta que se rearme.
}
}
pero no anda ni siquiera 1 con este código..pongo una foto de mi conexión..a quien pueda darme una idea le agradeceré mucho ...
Any...
Agrego que me recomendaron un software de automatizacion "arduino automation 2018" con el que si andan los 2 rele al pulsar cada botón pero genera muchos archivos con mucho código imposible de resumir para mi..
Hola. Para echar a andar esos dos relés, con los códigos que nos facilitas, no sé cómo podría funcionar. Por ejemplo, para lo que quieres hacer, hay una función millis() que no tiene ningún sentido, insisto, para lo que quieres hacer. Será mejor replantearte el código y estudiarlo porque echar a andar esos dos relés es bastante sencillo.
Si estás empezando a usar Arduino es recomendable que pienses el código, al menos bocetarlo, porque en este caso es muy sencillo.
-Habilita dos entradas digitales para los pulsadores
-Habilita dos salidas digitales para los relés
-Con un condicional, compara el estado de un pulsador y dependiendo de su estado, activa su salida o no
Y no tiene más. Es que no necesitas ni usar variables. Con estas tres líneas para plantearte el programa te va a funciona. Y para hacerlo más fácil, la última línea es igual pero duplicada.
Hola Esfinterman, gracias por tu respuesta..si la funcion millis me interesa como esta, porque no quiero que la activación sea inmediata ahora tiene 5 segundos que lo puedo ajustar o no dependiendo de como lo vaya a aplicar...pero de cualquier manera no logro que funcione...
Vale, eso es una condición nueva. Dices que el relé se activa cinco segundos después de pulsar el botón, correcto? ¿O se activa si mantienes pulsado el botón durante cinco segundos? No me queda claro.
En cualquier caso, como dices que has cogido el código de internet y no es tuyo, mi recomendación es que eches un par de pasos atrás y hagas tú mismo el código entendiéndolo. Empieza por el ejemplo sencillo que te he puesto. No sigue ningún tiempo, cierto, pero ya tienes un avance hecho por ti mismo. Luego vas complicando el código a tu manera, y así, si falla, sabes de dónde falla y puedes volver atrás para replantear el código o pensar en qué puedes estar fallando.
En este caso con los tiempos sí te harán falta un par de variables, una por cada relé y el código no será muy diferente al que te planteo. Necesitarás otro condicional para comparar el tiempo actual con el tiempo almacenado.
-Si el pulsador se pulsa...
--Almacena el tiempo actual en una variable "A"
-Si el tiempo actual es mayor que el almacenado en "A"+5000ms...
--Activa la salida
hola de nuevo y gracias otra vez por tu ayuda...el rele se activa después de 5 segundos, en el ejemplo que esta para uno solo funciona perfecto, pero en el que están los 2 no..el tema que acabo de darme cuenta, es que si los pulso juntos a los botones a los 5 segundos se activan los 2 y si suelto uno el otro queda encendido, pero no encienden si presiono de a 1 botón.. tal vez sea por la falta de variables que mencionas..
La he borrado yo porque creía que funcionaba pero probándolo bien, no funciona correctamente.
El que se te encienda al minuto es posible por el tamaño de la variable, que cuando llega a su fin, se desborda. Aún así, no deberían activarse. Sigo dándole vueltas al programita.
Una consulta mas sobre el código que esta funcionando..como puedo hacer ahora para que quede en encendido?porque tarda 5 seg en encender y cuando suelto el botón se apaga...
Hola, este es mi segundo post solicitando ayuda, y tomando el código logrado en ese post consulto:
unsigned long start = 0;
unsigned long start1 = 0;
int pulsador = false;
int pulsador2 = false;
int inputPin = 2;
int inputPin2 = 4;
int value = 0;
int value2 = 0;
void setup() {
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
void loop(){
value = digitalRead(2);
value2 = digitalRead(4);
if (value == HIGH) {
pulsador = true;
digitalWrite(7, HIGH);
start = millis();
}
if (value2 == HIGH) {
pulsador2 = true;
digitalWrite(8, HIGH);
start1 = millis();
}
if (pulsador && (millis()-start> 2000UL)) {
Serial.println("Encendido 1");
digitalWrite(7, LOW);
pulsador = false;
}
if (pulsador2 && (millis()-start1> 2000UL)) {
Serial.println("Encendido 2");
digitalWrite(8, LOW);
pulsador2 = false;
}
}
como puedo hacer para que al encender los reles, o sea presionando x mas de 5 seg cualquiera de los 2 botones (no se si se puede aprovechar algo de millis() expuesto en ese código) al soltar queden prendidos un tiempo también los rele, según el botón que se haya presionado..
Prueba esto instalando la librería OneButton para evitar rebotes del botón. Con un clic enciende el relay y con otro lo apaga. Luego se puede implementar mas funciones como doble clic y mas.
include "OneButton.h"
OneButton button1(2, true);
OneButton button2(4, true);
void setup() {
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
button1.attachClick(Click1);
button2.attachClick(Click2);
}
void loop() {
button1.tick();
button2.tick();
// Cualquier otra cosa que hagas va aquí
delay(10);
}
void Click1() {
static int a = LOW;
a = !a;
digitalWrite(7, a);
}
void Click2() {
static int b = LOW;
b = !b;
digitalWrite(8, b);
}
Hola Daniel_Arg, muchas gracias por tu respuesta..funciona excelente...como podría agregar un tiempo como tenia mi otro código para que al presionar tengan q pasar algunos segundos antes de activar..que no active enseguida, y después si que quede activo como hace ahora con tu código ayuda...
Hola, pues en tu código original hay variables globales que están declaradas pero no las utilizas, ahora en el código que te comparto al presionar el botón si el relay está encendido lo apaga y espera 5s para volverlo a encender: