Go Down

Topic: Reles (Read 3041 times) previous topic - next topic

santatu

Code: [Select]
#include <Bounce2.h>

// Variables estáticas
const byte pinBoton1 = 2;      // Declaramos la variable pin del Botón Posicion
const byte pinBoton2 = 3;      // Declaramos la variable pin del Botón Cruce
const byte pinBoton3 = 4;      // Declaramos la variable pin del Botón larga
const byte pinBoton4 = 5;      // Declaramos la variable pin del Botón intermitente derecho
const byte pinBoton5 = 6;      // Declaramos la variable pin del Botón intermitente izquierdo
const byte pinBoton6 = 7;      // Declaramos la variable pin del Botón limpiaparabrisas
const byte pinBoton7 = 8;      // Declaramos la variable pin del Botón 4 intermitentes
const byte pinBoton8 = 9;      // Declaramos la variable pin del Botón Ventiladores
const byte pinBoton9 = 10;     // Declaramos la variable pin del Botón paro Limpia

const byte srele1    = 22;     // Declaramos la variable pin para relé posicion
const byte srele2    = 24;     // Declaramos la variable pin para relé cruce
const byte srele3    = 26;     // Declaramos la variable pin para relé larga
const byte srele4    = 28;     // Declaramos la variable pin para relé intermitente derecho
const byte srele5    = 30;     // Declaramos la variable pin para relé intermitente izquierdo
const byte srele6    = 32;     // Declaramos la variable pin para relé limpaparabrisas
const byte srele7    = 34;     // Declaramos la variable pin para relé ventiladores
 

Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();
Bounce debouncer5 = Bounce();
Bounce debouncer6 = Bounce();
Bounce debouncer7 = Bounce();
Bounce debouncer8 = Bounce();
Bounce debouncer9 = Bounce();

// Variables dinámicas
bool statusBtn1 = false, statusBtn2 = false, statusBtn3 = false, statusBtn4 = false,
     statusBtn5 = false, statusBtn6 = false, statusBtn7 = false, statusBtn8 = false,
     statusBtn9 = false;
bool posicruceActivados = false;
bool intermitentesActivados = false;
int contador = 0;

#define RELAY_ON 0   
#define RELAY_OFF 1

int estadorele = LOW;
unsigned long tiempoPrevio = 0;       
const long intervalo = 400;
unsigned long tiempoActual = 0;

void setup() {
  // Inicializa el pin del LED como salida:
  digitalWrite (srele1, RELAY_OFF);
  digitalWrite (srele2, RELAY_OFF);
  digitalWrite (srele3, RELAY_OFF);
  digitalWrite (srele4, RELAY_OFF);
  digitalWrite (srele5, RELAY_OFF);
  digitalWrite (srele6, RELAY_OFF);
  digitalWrite (srele7, RELAY_OFF);


 
  pinMode(srele1, OUTPUT);
  pinMode(srele2, OUTPUT);
  pinMode(srele3, OUTPUT);
  pinMode(srele4, OUTPUT);
  pinMode(srele5, OUTPUT);
  pinMode(srele6, OUTPUT);
  pinMode(srele7, OUTPUT);
 
  // Inicializa el pin del botón como entrada:

  pinMode(pinBoton1, INPUT_PULLUP);
  pinMode(pinBoton2, INPUT_PULLUP);
  pinMode(pinBoton3, INPUT_PULLUP);
  pinMode(pinBoton4, INPUT_PULLUP);
  pinMode(pinBoton5, INPUT_PULLUP);
  pinMode(pinBoton6, INPUT_PULLUP);
  pinMode(pinBoton7, INPUT_PULLUP);
  pinMode(pinBoton8, INPUT_PULLUP);
  pinMode(pinBoton9, INPUT_PULLUP);
  digitalWrite( pinBoton1 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton2 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton3 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton4 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton5 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton6 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton7 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton8 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton9 ,HIGH);   // activar PULL UP interno

  Serial.begin(9600);

  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(pinBoton1);
  debouncer1.interval(20); // interval in ms
  debouncer2.attach(pinBoton2);
  debouncer2.interval(20); // interval in ms
  debouncer3.attach(pinBoton3);
  debouncer3.interval(20); // interval in ms
  debouncer4.attach(pinBoton4);
  debouncer4.interval(20); // interval in ms
  debouncer5.attach(pinBoton5);
  debouncer5.interval(20); // interval in ms
  debouncer6.attach(pinBoton6);
  debouncer6.interval(20); // interval in ms
  debouncer7.attach(pinBoton7);
  debouncer7.interval(20); // interval in ms
  debouncer8.attach(pinBoton8);
  debouncer8.interval(20); // interval in ms
  debouncer9.attach(pinBoton9);
  debouncer9.interval(20); // interval in ms
}

santatu

Lo pongo en dos partes porque es demasiado grande.

Code: [Select]
void loop(){




    // Update the Bounce instance :
    debouncer1.update();

    // Chequea si el botón está pulsado:
    if (debouncer1.fell()) {
      
       statusBtn1 = !statusBtn1;
       Serial.print("Status Btn1:");
       Serial.print(statusBtn1);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;  
    }
    
  
    if (statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, LOW);
      
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       digitalWrite(srele2, HIGH);
       digitalWrite(srele3, HIGH);
      
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

   // Update the Bounce instance :
    debouncer2.update();

    // Chequea si el botón está pulsado:
    if (debouncer2.fell()) {
      
       statusBtn2 = !statusBtn2;
       Serial.print("Status Btn2:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;  
    }
    
  
    if (statusBtn2 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       digitalWrite(srele2, LOW);
      
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn2 && posicruceActivados) {
       digitalWrite(srele2, HIGH);
       digitalWrite(srele3, HIGH);
      
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }
 // Update the Bounce instance :
    debouncer3.update();

    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
      
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;  
    }
    
  
    if (statusBtn3 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       digitalWrite(srele2, LOW);
       digitalWrite(srele3, LOW);
      
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn3 && posicruceActivados) {
       digitalWrite(srele3, HIGH);
      
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }
  
    
      debouncer4.update();
    
   if (debouncer4.fell()) {

    statusBtn4 = !statusBtn4;
    Serial.print("Status Btn4:");
    Serial.print(statusBtn4);
    Serial.print("cuenta:");
    Serial.println(contador++);
    if (!statusBtn4) { // Si el "statusBtn7" debería apagar
      estadorele = false; // Reportar a "estadorele" que este está apagado
      digitalWrite(srele4, HIGH);// Apagarlo de una vez
    }
    // Esta parte se agrega para evitar que el aparato quede fijamente encendido cuando no debiera
  }

  tiempoActual = millis();
//Si la diferencia es mayor que el intervalo de tiempo de parpadeo es cuando actualizamos el
//estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn4) {
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual;
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;

    digitalWrite(srele4, estadorele);
  }
    
    debouncer5.update();
    
   if (debouncer5.fell()) {

    statusBtn5 = !statusBtn5;
    Serial.print("Status Btn5:");
    Serial.print(statusBtn5);
    Serial.print("cuenta:");
    Serial.println(contador++);
    if (!statusBtn5) { // Si el "statusBtn7" debería apagar
      estadorele = false; // Reportar a "estadorele" que este está apagado
      digitalWrite(srele5, HIGH);// Apagarlo de una vez
    }
    // Esta parte se agrega para evitar que el aparato quede fijamente encendido cuando no debiera
  }

  tiempoActual = millis();
//Si la diferencia es mayor que el intervalo de tiempo de parpadeo es cuando actualizamos el
//estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn5) {
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual;
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;

    digitalWrite(srele5, estadorele);
  }
    debouncer6.update();
    // Chequea si el botón está pulsado:
    if (debouncer6.fell()) {
       statusBtn6 = !statusBtn6;
       Serial.print("Status Btn6:");
       Serial.println(statusBtn6);

       if (statusBtn6)
          digitalWrite(srele6, LOW);
       else
          digitalWrite(srele6, HIGH);
    }

     debouncer7.update();
    
   if (debouncer7.fell()) {

    statusBtn7 = !statusBtn7;
    Serial.print("Status Btn7:");
    Serial.print(statusBtn7);
    Serial.print("cuenta:");
    Serial.println(contador++);
    if (!statusBtn7) { // Si el "statusBtn7" debería apagar
      estadorele = false; // Reportar a "estadorele" que este está apagado
      digitalWrite(srele4, HIGH);
      digitalWrite(srele5, HIGH);// Apagarlo de una vez
    }
    // Esta parte se agrega para evitar que el aparato quede fijamente encendido cuando no debiera
  }

  tiempoActual = millis();
//Si la diferencia es mayor que el intervalo de tiempo de parpadeo es cuando actualizamos el
//estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn7) {
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual;
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;

    digitalWrite(srele4, estadorele);
    digitalWrite(srele5, estadorele);
  }
debouncer8.update();
    // Chequea si el botón está pulsado:
    if (debouncer8.fell()) {
       statusBtn8 = !statusBtn8;
       Serial.print("Status Btn8:");
       Serial.println(statusBtn8);

       if (statusBtn8)
          digitalWrite(srele7, LOW);
       else
          digitalWrite(srele7, HIGH);
    }
}

surbyte

te interesa ahora simplificarlo?

santatu

Porque no?
Todo lo que sea aprender, estoy dispuesto.

santatu

Hola, una vez cargado todo en el arduino y montado todo en el coche me he dado cuenta de que me ha faltado un pequeño detalle, explico.

El motor del limpiaparabrisas lo activo u funciona perfectamente, si le doy a parar se para sin problema, pero se paran las gomas donde cuadre.

El motor trae una salida GND en el punto exacto de parada, yo la use para que el arduino se detenga, con lo cual yo lo activo y el se para perfecto pero solo hace un ciclo.

Mi pregunta es la siguiente, como debo hacer para que al presionar el botón de apagado el motor se pare, pero al recibir la señal que el motor me proporciona?

no se si iniciando un contador al presionar el botón para que pare o hay alguna otra forma de hacerlo?

Saludos.

Lucario448

Quisiera ayudarte, pero algo que no me quedó claro es: qué es lo que hace el motor o qué señal manda cuando no está en la posición que debería?

santatu

Hola lucario.
cuando no esta en la posición de parada es infinito.
cuando el motor llega a la posición donde debe de parar la señal es GND.

Lucario448

cuando no esta en la posición de parada es infinito.
cuando el motor llega a la posición donde debe de parar la señal es GND.
De que estamos hablando? Continuidad (resistencia) o voltaje?

santatu

el conector del motor tiene tres pines,
1 + 12v
2 -
3 continuidad con el negativo.

Ya he agregado esa señal como un boton.

Code: [Select]
const byte pinBoton1 = 2;      // Declaramos la variable pin del Botón Posicion
const byte pinBoton2 = 3;      // Declaramos la variable pin del Botón Cruce
const byte pinBoton3 = 4;      // Declaramos la variable pin del Botón larga
const byte pinBoton4 = 5;      // Declaramos la variable pin del Botón intermitente derecho
const byte pinBoton5 = 6;      // Declaramos la variable pin del Botón intermitente izquierdo
const byte pinBoton6 = 7;      // Declaramos la variable pin del Botón limpiaparabrisas
const byte pinBoton7 = 8;      // Declaramos la variable pin del Botón 4 intermitentes
const byte pinBoton8 = 9;      // Declaramos la variable pin del Botón Ventiladores
const byte pinBoton9 = 10;     // Declaramos la variable pin del Botón paro Limpia


este es el codigo que activa o desactiva el rele:

Code: [Select]
debouncer8.update();
    // Chequea si el botón está pulsado:
    if (debouncer8.fell()) {
       statusBtn8 = !statusBtn8;
       Serial.print("Status Btn8:");
       Serial.println(statusBtn8);

       if (statusBtn8)
          digitalWrite(srele7, LOW);
       else
          digitalWrite(srele7, HIGH);
    }


hora es lo que no se como hacer.

Lucario448

#39
May 20, 2016, 10:50 pm Last Edit: May 20, 2016, 10:51 pm by Lucario448
Primera pregunta: que clase de Arduino estás usando?

Lo necesito saber porque para el momento exacto dónde se necesita que el limpiaparabrisas se detenga sin importar en qué parte del programa se encuentre, habrá que empezar a utilizar las llamadas "interrupciones".
Una "interrupción externa" (a partir de ahora lo llamaremos "ISR") sirve para eso mismo: nunca perder un pulso sin importar en qué parte del código se encuentre (incluso se llega a ejecutar dentro de un ciclo infinito); esto debido a que una ISR tiene mayor prioridad de ejecución que el programa principal.
Te hago la pregunta porque dependiendo del modelo del Arduino, NO TODOS los pines se pueden utilizar para ISR.


Segunda pregunta: el pin que detecta el paro del limpia está configurado como INPUT_PULLUP?

Eso se debe hacer si (por ejemplo) el botón del pin crea una conexión a tierra cuando es pulsado.
En tu caso, como dices que lo que sucede es que crea una conexión a tierra en la posición de parada, entonces es como el ejemplo antes mencionado.



santatu

Ok voy entendiendo.

el arduino que uso en un mega 2560.
y el pin esta declarado como INPUT_PULLUP.

Lucario448

De acuerdo. Entonces habrá que realizar varios cambios:

El pin 10 no es para ISR, cámbialo al pin 18. Este pin tampoco necesitará de un objeto Debouncer.

Declara la siguiente variable global así:
Code: [Select]
volatile boolean paraLimpia = false;

Después de declarar el pin, introduce la siguiente línea:
Code: [Select]
attachInterrupt(digitalPinToInterrupt(pinBoton9), pararLimpia, FALLING);

Esta parte del código debe quedar así:
Code: [Select]
debouncer8.update();
    // Chequea si el botón está pulsado:
    if (debouncer8.fell()) {
       statusBtn8 = !statusBtn8;
       Serial.print("Status Btn8:");
       Serial.println(statusBtn8);

       if (statusBtn8) // Si statusBtn8 es true
          digitalWrite(srele7, HIGH); // Encender relé
       else // Sino
          paraLimpia = true; // Pide a la ISR que detenga el limpiaparabrisas
    }


Agrega esta función al final del código:

Code: [Select]
void pararLimpia() {
  if (paraLimpia) {
    digitalWrite(srele7, LOW);
    paraLimpia = false;
  }
}



Has todos los cambios que te he dicho, y prueba a ver que tal :D

santatu

Hola lucario, me da este error, la verdad no se que significa.


Code: [Select]
Arduino:1.6.8 (Windows 10), Tarjeta:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

_7_botones_6_reles:3: error: expected constructor, destructor, or type conversion before '(' token

 attachInterrupt(digitalPinToInterrupt(pinBoton9), pararLimpia, FALLING);

                ^

F:\Alli\Domumentos\Arduino\_7_botones_6_reles\_7_botones_6_reles.ino: In function 'void loop()':

_7_botones_6_reles:304: error: a function-definition is not allowed here before '{' token

     void pararLimpia() {

                        ^

_7_botones_6_reles:310: error: expected '}' at end of input

 }

 ^

exit status 1
expected constructor, destructor, or type conversion before '(' token

Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.

Lucario448

Agrega esta función al final del código:

Code: [Select]
void pararLimpia() {
  if (paraLimpia) {
    digitalWrite(srele7, LOW);
    paraLimpia = false;
  }
}

Ups, creo que no fui muy claro en esta parte.
Cuando quise decir que al final del código, era que lo pusieras al final de loop, pero fuera de este.

Perdona el malentendido...  :smiley-sweat:

santatu

Ok gracias Lucario.

Ahora me compila bien, mañana lo cargaré en el arduino y lo compruebo.
Gracias.

Go Up