Buenas tardes, ante todo, pido disculpas si este no es el apartado adecueado, he estado buscando por todo el foro y no he encontrado nada parecido.
La cuestión es que estoy intentando usar un arduino como controlador del alumbrado de un local. El problema es que consigo activar una salida desde un pulsador y apagarlo desde otro. También mantener una salida activa mientras se acciona un pulsador. Esto normalmente lo he realizado, usando un LOGO, que si que dispone de la opción de rele de impulsos o telerruptor. alguien sabe como programar esto en un Arduino.
int Pin_pulsador = 8; // Numero del pin en el que se conecta el pulsador al arduino
int Pin_led = 13; // Numero del pin en el que se conecta la salida del led ( o lo que se quiera conectar) al arduino
boolean Telerruptor = false; // Declaramos la variable del telerrupto y la ponemos en fase al arranque del arduino
void setup()
{
pinMode(Pin_pulsador,INPUT); // Declaramos la variable Pin_pulsador como entrada del arduino
pinMode(Pin_led,OUTPUT); // Declaramos la variable Pin_led como salida del arduino
}
void loop()
{
if (digitalRead(Pin_pulsador) == HIGH) // comprobamos si se acciona el pulsador
{
Telerruptor=!Telerruptor; // Invertimos la salida del telerruptos desde la ultima pulsacion
digitalWrite(Pin_led,Telerruptor); // Escribimos en la salida
delay(100); //Realizamos una pausa para evitar los rebotes de la pulsacion
}
}
Efectivamente así funciona. Lo que si que es cierto, que con pulsos cortos no funciona correctamente. De todas formas, ya he visto como solucionas el tema y me ha servido de una gran ayuda.
Me alegro que te ayude el ejemplo, si quieres realizar pulsaciones muy cortas entre una pulsación y otra te recomiendo que quites o bajes el tiempo del delay, yo lo he puesto como una seguridad por si la pulsación es mas larga de lo normal y a sí evitar que en una pulsación se encienda y se apague.
También te recomiendo nu usar mucho la función delay ya que retrasa el programa, yo suelo usar los millis y realizo unas comparaciones para sacar la pausa deseada.
Buenas, yo te tenia un ejemplo preparado. te lo pongo también para ser criticado por chapuzero jejeej
int PinPulsador=5; // Entrada que vas a funcionar como un pulsador
int PinConmutador1=6; // Entrada que vas a funcionar como un conmutador
int PinConmutador2=7; // Entrada que vas a funcionar como un conmutador
int PinLuzPulsador=13; // Pin que va a hacer de salida
int PinLuzConmutador=14; // Pin que va a hacer de salida
boolean C1Pulsado=false; // Conmutador 1 pulsado
boolean C2Pulsado=false; // Conmutador 1 pulsado
boolean LuzEncendida=false; // Estado de la luz
void setup()
{
pinMode(PinPulsador, INPUT); // pin del pulsador
pinMode(PinConmutador1, INPUT); // pin del pulsador
pinMode(PinConmutador2, INPUT); // pin del pulsador
pinMode(PinLuzPulsador, OUTPUT); // pin luz pulsador
pinMode(PinLuzConmutador, OUTPUT); // pin luz pulsador
digitalWrite(PinLuzPulsador, LOW); // luz apagado hasta pulsar
digitalWrite(PinLuzConmutador, LOW); // luz apagado hasta pulsar
}
void loop()
{
// Manejo del pulsador
digitalWrite(PinLuzPulsador, digitalRead(PinPulsador));// Ponemos en la salida el valor q hay en la entrada
// Conmutador
if (digitalRead(PinConmutador1) && !C1Pulsado) // Si pulsamos conmutador 1 pro primera vez o despues de soltarlo
{
C1Pulsado=true; // comnutador 1 pulsado hasta soltarlo
if (!LuzEncendida) // si la luz no esta encendida
{
LuzEncendida=true; // La luz esta encendida
digitalWrite(PinLuzConmutador, HIGH); // luz encendida
}
// esto sirve para poder apagar desde el mismo que enciende
else
{
LuzEncendida=false; // La luz esta encendida
digitalWrite(PinLuzConmutador, LOW); // luz apagada
}
}
if (!digitalRead(PinConmutador1) && C1Pulsado) // Hemos pulsado y soltado en conmutador 1
{
C1Pulsado=false; // comnutador 1 soltado
}
if (digitalRead(PinConmutador2) && !C2Pulsado) // Si pulsamos conmutador 2 por primera vez o despues de soltarlo
{
C2Pulsado=true; // comnutador 2 pulsado hasta soltarlo
if (LuzEncendida) // si la luz esta encendida
{
LuzEncendida=false; // La luz esta apagada
digitalWrite(PinLuzConmutador, LOW); // luz apagada
}
// esto sirve para poder encender desde el mismo que apaga
else
{
LuzEncendida=true; // La luz esta encendida
digitalWrite(PinLuzConmutador, HIGH); // luz encendida
}
}
if (!digitalRead(PinConmutador2) && C2Pulsado) // Hemos pulsado y soltado en conmutador 2
{
C2Pulsado=false; // comnutador 2 soltado
}
}
tienes algo parecido a un detector de flancos, no se si habra alguna manera mejor de hacerlo
Hola, te adjunto el código que te pase antes modificado, quitando el delay y poniendo un detector de flanco de subida del pulsador, que lo he echo con una memoria, no se si sera lo mejor pero funciona muy bien.
espero que te sirva.
Saludos
PD: si te das cuenta la parte del código la he separado en una función para que quede mas ordenado el código.
//Telerruptor. un pulsador controla un led. pulsas led= on vuelves a pulsar led=off off.
//Lógica positiva.
//se ha montado un circuito rc para evitar el rebote del pulsador
int pulsador=2;
int led=13;
int cnt_etapa=0; //contador de etapas y estado//
void setup(){
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(pulsador)==HIGH&&cnt_etapa==0){
digitalWrite(led,HIGH);
cnt_etapa=1;
}
if(digitalRead(pulsador)==LOW&&cnt_etapa==1){
cnt_etapa=2;
}
if(digitalRead(pulsador)==HIGH && cnt_etapa==2){
digitalWrite(led,LOW);
cnt_etapa=3;
}
if(digitalRead(pulsador)==LOW && cnt_etapa==3){
cnt_etapa=0;
}
Serial.println(cnt_etapa); //puedes dónde está el programa viendo en qué etapa está
}
Ofuscao. Me vas a perdonar, pero ese sketch tuyo es un intermitente que funciona mientras está el pulsador en on. No es un telerruptor ya que no mantiene el enclavamiento.
//Telerruptor. un pulsador controla un led. pulsas led= on vuelves a pulsar led=off off.
//Lógica positiva.
//se ha montado un circuito rc para evitar el rebote del pulsador
int pulsador=2;
int led=13;
int cnt_etapa=0; //contador de etapas y estado//
void setup(){
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(pulsador)==HIGH&&cnt_etapa==0){ //detecta pulsador on
digitalWrite(led,HIGH);
cnt_etapa=1;
}
if(digitalRead(pulsador)==LOW&&cnt_etapa==1){ //detecta pulsador off
cnt_etapa=2;
}
if(digitalRead(pulsador)==HIGH && cnt_etapa==2){ //detecta pulsador on
digitalWrite(led,LOW);
cnt_etapa=3;
}
if(digitalRead(pulsador)==LOW && cnt_etapa==3){ //detecta pulsador off
cnt_etapa=0;
}
Serial.println(cnt_etapa); //puedes dónde está el programa viendo en qué etapa está
}