Go Down

Topic: Estado Pulsador (Read 1 time) previous topic - next topic

daviten

ahi dice led pin y boton pin, lo del arduino que se cae es otro problema que tengo otro hilo, pero hace bastante no recibo respuestas. compre otro arduino y otro ethernet y otro arduino uno para cambiar todo.

surbyte

#61
Oct 12, 2017, 05:07 am Last Edit: Oct 12, 2017, 05:09 am by surbyte
Quote
Libreria Bounce2 ejecuta un ejemplo como bounce.ino y esta resuelto.
Este ejemplo es genérico y sirve como guia para resolver lo que necesitas en tu caso
El LED es parte de este ejemplo. Olvídalo.

Solo debías modificar el pin del boton que es tu RELE, no hacia falta volver a copiar el ejemplo que se ve en el vínculo sin modificaciones.

Entonces en lugar de 2 debes poner 8 y luego solo tiene un antirebote de 5 mseg y ahi te indique que pongas 100 asi que si hubieras puesto esto

Code: [Select]

#include <Bounce2.h>

#define BUTTON_PIN 8
#define LED_PIN 13

// Instantiate a Bounce object
Bounce debouncer = Bounce();

void setup() {

  // configura el boton con un resistor externo pull-up del valor mostrado en la figura anterior:
  pinMode(BUTTON_PIN,INPUT);

  // After setting up the button, setup the Bounce instance :
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(100); // interval in ms

  //Setup the LED :
  pinMode(LED_PIN,OUTPUT);

}

daviten

Llego a casa y lo pruebo , puedo hacerlo con 8 pulsqdores? Tengo 8 lamparas, lo raro es que vos prendes y apagas y funciona bien cada tanto hqce ruido.

surbyte

Cuando hablas de que prendes y apagas te referis a la lámpara?
El que hace ruido es el relé?

Quote
puedo hacerlo con 8 pulsqdores?
Claro porque no pero vas a tener que repetir cosas con nombres distinos te muestro con supuestos 3 reles conectados a 8, 9 y 10.

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

#define BUTTON_PIN1  8
#define BUTTON_PIN2  9
#define BUTTON_PIN3 10


// Instantiate a Bounce object
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();

void setup() {

  Serial.begin(9600); // o la velociad del monitor serie que quieras

  // Setup the button with an internal pull-up :
  pinMode(BUTTON_PIN,INPUT_PULLUP);

  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(BUTTON_PIN1);
  debouncer1.interval(100); // interval in ms
  debouncer2.attach(BUTTON_PIN2);
  debouncer2.interval(100); // interval in ms
  debouncer3.attach(BUTTON_PIN3);
  debouncer3.interval(100); // interval in ms
}

void loop() {
  // Actualiza la instancia
  debouncer1.update();
  debouncer2.update();
  debouncer3.update();

  // obtiene el valor actualizado
  bool value1 = debouncer1.read();

  Serial.println(value1?"Rele1 : ON":"Rele1 : OFF");

  bool value2 = debouncer2.read();

  Serial.println(value2?"Rele2 : ON":"Rele2 : OFF");

  bool value3 = debouncer3.read();

  Serial.println(value3?"Rele3 : ON":"Rele3 : OFF");

}


daviten

Listo , lo hice y funciona! pero no me queda claro el ms en 100, en el ejemplo viene en 5, lo probe en 5 y hace lo mismo, siempre cambia rapido el estado pero hay veces cuando tiene rebote demora 3 segundos en mandarme el estado.

daviten

Lo estoy haciendo asi, pero ahora me cuelga el arduino con este codigo...

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <Bounce2.h>
#define BUTTON_PIN 8
Bounce debouncer1 = Bounce();
char mess[15];
int estadopin3 = 0;
int estadopin4 = 0;
int estadopin5 = 0;
int estadopin6 = 0;
int estadopin7 = 0;
int estadopin31 = 0;
int estadopin33 = 0;
int estadopin35 = 0;
int alarma = 0;
int estadoalarma = 0;
int voz = 0;
int estadovoz = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 200);
IPAddress myDns(192,168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(23);
EthernetClient client;
void setup() {
  pinMode(BUTTON_PIN,INPUT_PULLUP);
  debouncer1.attach(BUTTON_PIN);
  debouncer1.interval(5); // interval in ms
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(31, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(35, OUTPUT);
  Ethernet.begin(mac, ip, myDns, gateway, subnet);
  server.begin();
}
void loop() {
  if(digitalRead(37) == HIGH && alarma == 1)
  {
      server.print("ala");
      alarma = 0;   
  }
  debouncer1.update();   
EthernetClient client = server.available();       
  if (client) {
    if (client.available() > 0) {
      char c = client.read();
      //Mandar estados al iniciar app
      if(c == '*'){
      sprintf(mess,"pin%i%i%i%i%i%i%i%i%i%i",debouncer1.read(),digitalRead(4),digitalRead(5),digitalRead(7),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35),digitalRead(6));       
      server.print(mess);
      }
      //PIN3
      if(c == '1')
      digitalWrite(3, HIGH);
      if(c == '2')
      digitalWrite(3, LOW);
      //PIN4
      if(c == '3')
      digitalWrite(4, HIGH);
      if(c == '4')
      digitalWrite(4, LOW);
      //PIN5
      if(c == '5')
      digitalWrite(6, HIGH);
      if(c == '6')
      digitalWrite(6, LOW);
      //PIN8
      if(c == '7')
      digitalWrite(33, HIGH);
      if(c == '8')
      digitalWrite(33, LOW);
      //PIN31
      if(c == '9')
      digitalWrite(5, HIGH);
      if(c == 'm')
      digitalWrite(5, LOW);
      //PIN33
      if(c == 'n')
      digitalWrite(7, HIGH);
      if(c == 'b')
      digitalWrite(7, LOW);
      if(c == 'q')
      alarma = 1;
      if(c == 'w')
      alarma = 0;
      if(c == 'c')
      voz = 1;
      if(c == 'v')
      voz = 0;
      if(c == 'z')
      digitalWrite(35, HIGH);
      if(c == 'x')
      digitalWrite(35, LOW);
    }
 
  }     
//Cambio de estado de pin3 me manda el aviso

      if(estadopin3 != debouncer1.read() || estadopin4 != digitalRead(4) || estadopin5 != digitalRead(5) || estadopin6 != digitalRead(6) || estadopin7 != digitalRead(7) || estadopin31 != digitalRead(31) || estadopin33 != digitalRead(33) || alarma != estadoalarma || voz != estadovoz || estadopin35 != digitalRead(35))
      {
      sprintf(mess,"pin%i%i%i%i%i%i%i%i%i%i",debouncer1.read(),digitalRead(4),digitalRead(5),digitalRead(7),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35),digitalRead(6));       
      server.print(mess);
      estadopin3 = debouncer1.read();
      estadopin4 = digitalRead(4);
      estadopin5 = digitalRead(5);
      estadopin6 = digitalRead(6);
      estadopin7 = digitalRead(7);
      estadopin31 = digitalRead(31);
      estadopin33 = digitalRead(33);
      estadoalarma = alarma;
      estadovoz = voz;
      estadopin35 = digitalRead(35);
      }
//Mando cambio de distancia tanque sensor

//Fin Loop
}

daviten

no hay otra forma de saber el estado de la lampara? me parece medio embole tener que hacer estos con todas las lamparas de la casa, resistencia anti rebote, etc.- tendria que ser super sencillo hacerlo...


surbyte

Quote
http://domotica-arduino.es/comprar-online/es/conexion-a-tornillo/163-arduino-detector-220v.html
Eso te lo puse en el post#29.


Quote
lo hice y funciona! pero no me queda claro el ms en 100, en el ejemplo viene en 5, lo probe en 5 y hace lo mismo, siempre cambia rapido el estado pero hay veces cuando tiene rebote demora 3 segundos en mandarme el estado.
El ejemplo es para un pulsador y vos tenes un rele. No tiene nada que ver un pulsador con un rele, aunque funcionalmente sean lo mismo.
Yo te dije que uses 100mseg y es porque en un RELE, sus contactos rebotan!!!

El rebote no lo eliminas con 5 mseg

Quote
no hay otra forma de saber el estado de la lampara? me parece medio embole tener que hacer estos con todas las lamparas de la casa, resistencia anti rebote, etc.- tendria que ser super sencillo hacerlo...
No era molesto ponerle una fuente que demoraba 3seg en avisarte pero poner un rele si lo es?


La mejor solucion es usar SONOFF pero requiere todo otro set de elementos de mayor complejidad aunque en lo que respecta a la lampara y su estado se simplifica pero tu comenzaste el hilo con esta opcion.
No es mi responsabilidad.

daviten

Lo que no probe hacer es usar pinMode INPUT_PULLUP , y en lugar de hacerlo con el cable de 5v, hacerlo con GND, dara menos ruido? sera la solucion?

surbyte

Es lo mismo.
Ruido de que ruido hablas?
Rebote no es ruido.

daviten

Si rebote a eso me referia.

surbyte

El rebote se elemina con la rutina antirebote y para eso te sugerí la librería Bounce2 y usar 100 mseg.

daviten

Voy a probar con esto , asi no cargo tanto arduino con codigos y retraso todo...

DEBOUNCE POR HARDWARE

Aplicar un debounce por hardware tiene la ventaja de no incrementar el tiempo de ejecución de nuestro código. Además, en general, es una solución más robusta. Por contra, tiene la desventaja de aumentar la complejidad de nuestro montaje.

La forma más sencilla de aplicar un debounce por hardware es colocar un condensador en paralelo con el dispositivo (pulsador, interruptor, sensor…). Un condensador del orden de 1uF debería ser suficiente para filtrar la mayoría del ruido.

El esquema de conexión es el siguiente.


surbyte

#74
Oct 19, 2017, 01:15 am Last Edit: Oct 19, 2017, 01:18 am by surbyte
Usar un capacitor para filtrar ruido es como arrastrar un auto con motor funcionado usando un caballo.

El Arduino no se carga Daviten, esta para eso!!
Si 100 mseg no son suficientes usa mas.

Go Up