sábado, 8 de octubre de 2016

Diferenciar entre pulsación corta y pulsación larga

Siguiendo con el tema de pulsadores en una casa para encender o apagar luces, persianas o lo que deseemos hay una particularidad que se puede lograr con programación que aumenta las características de un pulsador. Por si solo, sólo tenemos 2 posiciones, encendido (Mientras se esta apretando el pulsador) y apagado (cuando se suelta). Pero gracias a la programación podemos medir el tiempo en que el pulsador esta apretado, dándole así nuevas funciones... como por ejemplo apretar menos de 2 segundos y encender o apagar la luz de la entrada y si apretamos mas de 2 segundos apagamos cualquier luz que hubiera encendida en la casa. (muy útil cuando te vas de casa y te olvidaste de apagar la luz de la habitación por ejemplo).

A modo de practica os dejo el esquema de conexión donde conectaremos 3 pulsadores a la placa Arduino y 2 luces. El funcionamiento sera el siguiente: los 2 primeros pulsadores encenderán o apagarán la primera luz, el tercer pulsador encenderá o apagara la segunda luz, pero con la particularidad que si éste se aprieta mas de 2 segundos apagara cualquier luz que este encendida.

ESQUEMA DE CONEXIÓN:


Recordemos que las resistencias de los pulsadores serán de un valor de 10 kilo-ohmios, y la de los leds de 220 ohmios. 

CÓDIGO DE PROGRAMACIÓN:

const int pulsadores[] = {2, 3, 4};
const int nPulsadores = 3;

const int Luz[] = {11, 12};
const int nLuces = 2;

int estadoLuz[] = {LOW, LOW};
int estadoBoton[] = {HIGH, HIGH, HIGH};
int estadoBotonAnterior[] = {HIGH, HIGH, HIGH};

long lastDebounceTime = 0;  
long debounceDelay = 50;

long tempPulsacionIni = 0;
long tempPulsacionFin = 0;
long intervalo = 0;

int apagarLuces = LOW;

void setup() {
  for(int i = 0; i < nPulsadores; i++){
      pinMode(pulsadores[i], INPUT);
    }
  for(int i = 0; i < nLuces; i++){
      pinMode(Luz[i], OUTPUT);
    }
  for(int i = 0; i < nLuces; i++){
      digitalWrite(Luz[i], LOW);
    }
}

void loop() {
  for(int i = 0; i < nPulsadores; i++){
      leerPulsador(i);
    }
}

void leerPulsador(int pulsador){
  int lecturaPulsador = digitalRead(pulsadores[pulsador]);
  if (lecturaPulsador != estadoBotonAnterior[pulsador]) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (lecturaPulsador != estadoBoton[pulsador]) {
      estadoBoton[pulsador] = lecturaPulsador;
      if(estadoBoton[0] == LOW || estadoBoton[1] == LOW){
          estadoLuz[0]= !estadoLuz[0];
        }
      if(estadoBoton[2] == LOW){
          tempPulsacionIni = millis();
        }
      if(estadoBoton[2] == HIGH && tempPulsacionIni > 50){
          tempPulsacionFin = millis();
          intervalo = tempPulsacionFin - tempPulsacionIni;
          if(intervalo > 50 && intervalo < 2000){
              estadoLuz[1] = !estadoLuz[1];
              tempPulsacionIni = 0;
            }else if(intervalo >= 2000){
                apagarLuces = HIGH;
                tempPulsacionIni = 0;
              }
        }
    }
  }
  if(apagarLuces == HIGH){
        estadoLuz[0] = LOW;
        estadoLuz[1] = LOW;
        apagarLuces = LOW;
    }
  for(int i = 0; i < nLuces; i++){
      digitalWrite(Luz[i], estadoLuz[i]);
    }
  estadoBotonAnterior[pulsador] = lecturaPulsador;  
}

Si bien el programa funciona, me di cuenta de que a la hora de apagar todas las luces se apagan de golpe, con lo que por ejemplo si es de noche y tienes el pulsador al fondo del pasillo te obliga a ir a oscuras hasta la puerta de la calle. No creéis que seria mejor darle un tiempo prudencial, que una vez apretado el pulsador para que nos apague todas las luces las mantenga encendidas 5 segundos y nos de tiempo a salir de casa? Luego se apagan solas. Como siempre para conseguir eso hay que modificar el código de programación. A continuación os dejo el código modificado por si alguien quiere ver la diferencia entre los dos programas. Hasta pronto!! 

const int pulsadores[] = {2, 3, 4};
const int nPulsadores = 3;

const int Luz[] = {11, 12};
const int nLuces = 2;

int estadoLuz[] = {LOW, LOW};
int estadoBoton[] = {HIGH, HIGH, HIGH};
int estadoBotonAnterior[] = {HIGH, HIGH, HIGH};

long lastDebounceTime = 0;  
long debounceDelay = 50;

long tempPulsacionIni = 0;
long tempPulsacionFin = 0;
long intervalo = 0;

int apagarLuces = LOW;
long previousMillis = 0;
long crono = 5000;

void setup() {
  for(int i = 0; i < nPulsadores; i++){
      pinMode(pulsadores[i], INPUT);
    }
  for(int i = 0; i < nLuces; i++){
      pinMode(Luz[i], OUTPUT);
    }
  for(int i = 0; i < nLuces; i++){
      digitalWrite(Luz[i], LOW);
    }
}

void loop() {
  for(int i = 0; i < nPulsadores; i++){
      leerPulsador(i);
    }
}

void leerPulsador(int pulsador){
  int lecturaPulsador = digitalRead(pulsadores[pulsador]);
  if (lecturaPulsador != estadoBotonAnterior[pulsador]) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (lecturaPulsador != estadoBoton[pulsador]) {
      estadoBoton[pulsador] = lecturaPulsador;
      if(estadoBoton[0] == LOW || estadoBoton[1] == LOW){
          estadoLuz[0]= !estadoLuz[0];
        }
      if(estadoBoton[2] == LOW){
          tempPulsacionIni = millis();
        }
      if(estadoBoton[2] == HIGH && tempPulsacionIni > 50){
          tempPulsacionFin = millis();
          intervalo = tempPulsacionFin - tempPulsacionIni;
          if(intervalo > 50 && intervalo < 2000){
              estadoLuz[1] = !estadoLuz[1];
              tempPulsacionIni = 0;
            }else if(intervalo >= 2000){
                previousMillis = millis();
                apagarLuces = HIGH;
                tempPulsacionIni = 0;
              }
        }
    }
  }
  if(apagarLuces == HIGH){
      long currentMillis = millis();
      if(currentMillis - previousMillis > crono){
          previousMillis = currentMillis;
          estadoLuz[0] = LOW;
          estadoLuz[1] = LOW;
          apagarLuces = LOW;
        }
    }
  for(int i = 0; i < nLuces; i++){
      digitalWrite(Luz[i], estadoLuz[i]);
    }
  estadoBotonAnterior[pulsador] = lecturaPulsador;  
}
  

viernes, 7 de octubre de 2016

Realizar conmutadas con pulsadores.

Hola de nuevo visitantes del blog, en la entrada anterior vimos como encender y apagar algo a través de un pulsador. Sin embargo en una instalación real, cuando entras en tu cuarto por ejemplo, puedes encender la luz desde varios sitios, no solo de uno.

En esta entrada lo que vamos a hacer es convertir nuestros pulsadores en conmutadores o conmutadores de cruce gracias a la programación. La manera en que conectaremos los pulsadores es la siguiente. 


No recuerdo si lo dije en la otra entrada pero las resistencias de los pulsadores deben ser de un valor de 10 kilo-ohmios y la del diodo led de 220 ohmios. 

A continuación os pondré el código de programación para que funcione. Lo que hace es encender o apagar la luz desde cualquiera de los 3 pulsadores de manera que ya podríamos encender la luz desde la puerta de la habitación y desde cada lado de la cama por ejemplo. Comentar que en este código entran en juego funciones, bucles "for" y arrays.. Como esta enfocado a todo el mundo sin que tenga ni remota idea de programar después del código os diré como modificarlo por si queréis cambiarlo a vuestro gusto. 

CÓDIGO DE PROGRAMACIÓN: 

const int pulsadores[] = {2, 3, 4};
const int nPulsadores = 3;

const int Luz = 12;

int estadoLuz = LOW;
int estadoBoton[] = {HIGH, HIGH, HIGH};
int estadoBotonAnterior[] = {HIGH, HIGH, HIGH};

long lastDebounceTime = 0;  
long debounceDelay = 50;    

void setup() {
  for(int i = 0; i < nPulsadores; i++){
      pinMode(pulsadores[i], INPUT);
    }
  pinMode(Luz, OUTPUT);
  digitalWrite(Luz, LOW);
}

void loop() {
  for(int i = 0; i < nPulsadores; i++){
      leerPulsador(i);
    }
}

void leerPulsador(int pulsador){
  int lecturaPulsador = digitalRead(pulsadores[pulsador]);
  if (lecturaPulsador != estadoBotonAnterior[pulsador]) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (lecturaPulsador != estadoBoton[pulsador]) {
      estadoBoton[pulsador] = lecturaPulsador;
      if(estadoBoton[0] == LOW || estadoBoton[1] == LOW || estadoBoton[2] == LOW){
          estadoLuz= !estadoLuz;
        }
    }
  }
  digitalWrite(Luz, estadoLuz);
  estadoBotonAnterior[pulsador] = lecturaPulsador;  
}

Como agregar otro pulsador para que tambien se encienda y apague desde este:

Aveces como electricista es imposible predecir desde cuantos sitios quiere que se encienda la luz, por lo que os enseñare como añadir otro pulsador y siguiendo este sistema podremos añadir los que queramos... 

En el montaje tan solo tendríamos que añadir otro pulsador y resistencia y conectarla igual que los otros conectando el pulsador al pin 5 de Arduino por ejemplo. Luego en la parte de código tendríamos que seguir estos pasos:

  1.  En la linea de código const int pulsadores[] = {2, 3, 4}; añadir el nuevo pulsador, quedando así: const int pulsadores[] = {2, 3, 4, 5};
  2.  En la linea de código const int nPulsadores = 3; cambiaríamos el valor 3 por un 4, ya que ahora tenemos 4 pulsadores.
  3. En las lineas int estadoBoton[] = {HIGH, HIGH, HIGH};int estadoBotonAnterior[] = {HIGH, HIGH, HIGH}; añadiremos también el estado del cuarto pulsador quedando de esta manera: int estadoBoton[] = {HIGH, HIGH, HIGH, HIGH};int estadoBotonAnterior[] = {HIGH, HIGH, HIGH, HIGH};
  4. Y por ultimo en la linea de código  if(estadoBoton[0] == LOW || estadoBoton[1] == LOW || estadoBoton[2] == LOW) añadiremos también el cuarto pulsador quedando así: if(estadoBoton[0] == LOW || estadoBoton[1] == LOW || estadoBoton[2] == LOW || estadoBoton[3] == LOW)
Como vemos es muy fácil encender o apagar una luz desde cualquier sitio, tan solo tenemos que modificar el código de programación y decirle a cada pulsador lo que queremos que encienda o apague. En cambio en una instalación normal, si quisieras encenderlo desde otro lugar tendrías que ir desmontando cajas de empalme y añadiendo cableado nuevo pasándolo por los tubos que hay dentro de la pared hasta llegar al conmutador deseado.. un follón vamos.


martes, 27 de septiembre de 2016

Entradas Digitales. Conexión de Pulsadores a arduino.


Muy buenas ;) En entradas anteriores vimos como encender y apagar aparatos desde el ordenador. Sin embargo, cuando tu entras a una habitación lo mas normal es que para encender la luz, por ejemplo, le des al interruptor o conmutador. Bien aunque son 2 elementos muy prácticos en una instalación eléctrica normal son muy limitados en una instalación domótica.. ya que solo tienen 2 posiciones: On - Off. Por eso yo siempre prefiero el Pulsador.. que a diferencia de estos dos tiene la particularidad de que mientras esta pulsado esta en On y cuando lo sueltas esta en Off. Que ventaja tiene esto?? pues a simple vista ninguna, debido a que para que la luz este encendida tendremos que estar apretando constantemente el pulsador, ya que al soltarlo se va a apagar.

Ahora imaginemos que a través de programación creamos un programa que detecte cada vez que el pulsador a sido apretado y nos guarde la información en una memoria. entonces la cosa ya cambia.. se abre un mundo lleno de posibilidades. solo por poner un ejemplo:

- apretamos una vez y encendemos la luz, volvemos a apretar y la luz se apaga.

- apretamos una vez y encendemos una luz, volvemos a apretar y se enciende el ventilador, volvemos a apretar y nos lo apaga todo.

- apretamos menos de 2 segundos y se enciende una luz, apretamos mas de 2 segundos y se enciende la calefacción.

Como vemos, con un interruptor solo podemos controlar un único elemento, con un único pulsador podemos controlar todos los elementos que queramos. ventajas?? donde??

Bien, hay 2 formas de conectar un pulsador a arduino, a través de una resistencia pull-up o a través de una resistencia pull-down. No os preocupéis si os habéis quedado con cara de locos sin entender nada ya que es electrónica pura y dura y no es mi intención daros la brasa con explicaciones teóricas. Así que solo conectarlo como os diré y os va a funcionar. Decir que las 2 formas de conexión son correctas pero en esta entrada me centrare a la conexión a través de la resistencia pull-up. Si alguien se anima a conectarlo de la otra forma va a tener que modificar la programación para que le funcione correctamente. (No es difícil, pero para alguien que no sabe programar puede dar lugar a dolores de cabeza serios). A continuación los esquemas.

Conexión pull-up

Conexión pull-down
A continuación os dejo el código de programación para que lo podáis subir a vuestro arduino y ver su funcionamiento. De momento os dejaré el ejemplo mas fácil que se trata de encender y apagar una luz mediante pulsaciones.

CÓDIGO DE PROGRAMACIÓN:

const int buttonPin = 2;  
const int ledPin = 13;    
int ledState = HIGH;      
int buttonState = LOW;          
int lastButtonState = LOW;
long lastDebounceTime = 0;
long debounceDelay = 50;  

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
}

void loop() {
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState);
  lastButtonState = reading;
}

El código no tiene ningún secreto, de hecho es uno de los ejemplos que trae el programa Arduino, mas adelante vamos a ver como modificar este código para darle mas funcionalidad y que se adapte mas a una instalación real. También recordar que para que la luz se encienda o apague esta deberá ir conectada a través de un rele conectando sus terminales al pin GND y Pin 13 de Arduino como vimos en una entrada del blog anterior.

PREGUNTA??

Que pasa si en vez de conectar el rele al Pin 13 quiero conectarlo al 12?? se puede??

- Claro que se puede, de hecho por ejemplo la placa "Arduino Uno" dispone del pin 0 al pin 13 para conectarle lo que quieras, aunque el pin 0 y 1 se recomienda utilizarlos para fines de transmisión rx - tx. Tan solo tendrás que modificar el código descrito arriba para que funcione de la siguiente manera:

En la linea de código const int ledPin = 13; deberás cambiar el 13 por un 12 y listo!! que fácil!! lo mismo si quieres conectar tu pulsador en otro pin que no sea el numero 2. cambias el valor de la linea de código const int buttonPin = 2; por el numero del pin al que lo quieras conectar.

Y POR ULTIMO...

Comentar que una instalación normal, dependiendo del país, los interruptores o conmutadores manejan voltajes en su interior de 220v por lo que el cableado suele ser de 1,5 mm para controlar el alumbrado. En caso de una instalación domotica hecha con Arduino los pulsadores se conectan a la placa y esta, es la que controla el encendido o el apagado. Debido a que esta placa maneja voltajes y intensidades muy inferiores nos permite reducir la sección del cableado a cable telefónico por ejemplo, reduciendo así el gasto económico de la instalación.  











miércoles, 25 de mayo de 2016

CONECTAR UN RELE A NUESTRA PLACA ARDUINO.

Debido que aun soy un novato y no se como funciona esto de los derechos de autor... me he tomado la libertad de dibujaros el esquema de conexión con paint xD. Muy poco profesional... lo se. 

Bueno al lío. En la entrada anterior vimos la forma de conectar un diodo led a nuestra placa y hacer que se encendiera y apagara desde nuestro ordenador. Al principio me lo flipé, pero luego me dije, vale funciona pero no hace nada útil. Tendría mas sentido si en vez de una simple bombilla pudiera encender una estufa, o un ventilador o porque no.. las luces de casa. El problema es que esta placa solo proporciona un voltaje de 5v y todos los electrodomésticos de la casa funcionan a 220v. (como veis le falta muchísimo voltaje). Pero para eso se inventaron los reles, para poder hacer funcionar algo que requiere mucho voltaje a partir de algo que te da poco. 

Hoy en dia.. en el año 2016, aun he ido a instalaciones de casas inteligentes y me he dado cuenta que algunos electricistas no han evolucionado, y cuando se ven con la necesidad de colocar un rele, aun optan por reles mecánicos. ( Funcionan muy bien pero ya están desfasados tecnológicamente). 

Ejemplo de rele mecánico.

La principal desventaja que en mi humilde opinión veo es que son ruidosos, los escuchas en todo momento cuando se activan o desactivan, lo que puede llegar a ser molesto, sobretodo de noche. 
Hoy en día, existe una variante y son los reles de estado solido. la diferencia es que no son mecánicos, sino electrónicos por lo que hacen lo mismo pero en silencio. 

Ejemplo de rele de estado solido.

Podemos utilizar cualquier rele?? obviamente no, el que manda aquí es sobretodo la potencia. Y para eso estudiamos matemáticas en el colegio.. hay una formula que relaciona el voltaje de nuestra casa con la potencia del electrodoméstico que es la siguiente: Potencia(W) = Intensidad(A) * Voltaje(V). 
Sabiendo la potencia y el voltaje podemos despejar la intensidad y con eso podemos comprar el rele deseado. por ejemplo si tenemos un ventilador de 700(w) de potencia conectado a 220(v) voltios... despejamos la intensidad y nos da... 3,18(A) amperios, así que tendremos que elegir un rele que aguante mas de 3,18 amperios, de lo contrario lo quemaríamos. 

Bueno después de un poco de teoría sobre el rele, vamos a la practica.. aquí tenéis la forma simplificada de conectar el rele a vuestra placa: 


Este rele es uno de los muchos modelos de estado solido que existen, como vemos tiene 4 terminales, numerados del 1 al 4. Este en concreto aguanta hasta 40(A) amperios soportando una carga de 8.800(W) vatios.. una burrada vamos. Al terminal 1 y 2 le conectaremos nuestra lampara, ventilador, o lo que queramos. El terminal 4 ira conectado al pin GND de nuestra placa y el terminal 3 al pin que tengamos configurado como salida, si seguimos el ejemplo de la entrada anterior lo conectaríamos al pin 13. Espero que os haya servido de ayuda y... nos vemos en la próxima entrada ;)



Primer proyecto. Encender una luz desde nuestro ordenador por cable usb

Muy buenas gente, en el anterior vídeo hicimos un pequeño programa para nuestra placa, que era capaz de saber que dato se le había mandado y en función del valor recibido enviar un mensaje u otro. En esta entrada vamos a ir un poco mas allá y modificando un poco el programa conseguiremos encender o apagar una luz desde nuestro ordenador.

El montaje físico de esta practica es realmente sencillo.  Los materiales que necesitaremos son los siguientes:


  1. Placa arduino.
  2. cable usb.
  3. diodo led (cualquier color).
Nota: en caso de querer encender una luz a 220v (una lampara de casa) necesitaremos tambien un modulo de relés para poder controlar una salida de alto voltaje a partir de los 5v que nos proporciona nuestra placa.

Nota2: mencionar que en la electrónica muchas veces hablaremos de polaridad, o positivo y negativo, PRESTANDOLE MÁXIMA ATENCIÓN, a la hora de su conexión.. ya que de ello dependerá su correcto funcionamiento. 


Diodo Led Verde
Modulo de 4 relés de estado solido.

El montaje físico es muy sencillo:
Vemos que el led tiene 2 patillas o terminales, una mas larga que la otra. El terminal mas largo corresponde al terminal positivo(+) y el corto al negativo(-). Dicho esto conectaremos el terminal positivo al pin 13 de nuestra placa arduino y el terminal negativo al pin GND de la placa que corresponde al pin 14 como se muestra en la siguiente imagen. Con esto ya tendremos el montaje listo.


El código de programación seria el siguiente: 

void setup() {
  Serial.begin(9600); // inicializamos la conexion serial.
  Serial.println("hola yo soy arduino."); // imprimimos en pantalla hola yo soy arduino.
  pinMode(13, OUTPUT); // configuramos el pin 13 como salida digital.
}

void loop() {
  while(Serial.available() > 0){ // mientras haya datos disponibles...
      char c = Serial.read(); // leemos los datos y los guardamos en formato caracter en una variable llamada c.
      if(c == '0'){ // si c = 0
          Serial.println("Luz apagada."); // imprime en pantalla luz apagada.
          digitalWrite(13, LOW); // mandamos 0v al pin 13.
        }else if(c == '1'){ // si c = 1
            Serial.println("Luz encendida."); // imprime en pantalla luz encendida.
            digitalWrite(13, HIGH); // mandamos 5v al pin 13.
          }else{ // sino ...
              Serial.println("Comando incorrecto.. por favor, introduzca 0 para apagar o 1 para encender."); // imprime este codigo.
            }
    }
}

Solo tenéis que copiar todo el código y cargarlo en vuestra placa a través del cable usb y estará listo para recibir ordenes desde vuestro ordenador como hicimos en la entrada del bloc anterior.  

Para los que les guste el tema de la programación hoy hemos aprendido 2 nuevas instrucciones:

  • pinMode(); Sirve para definir si lo que esta conectado a nuestra placa es una entrada o una salida. Entre paréntesis se le pasa como primer parámetro el pin que queremos configurar, y como segundo parámetro le decimos si va a ser una entrada "INPUT" o una salida "OUTPUT".

  • digitalWrite(); Con esta instrucción activamos o desactivamos el pin. Entre paréntesis le pasamos como primer parámetro el pin que queremos manipular, y como segundo parámetro le decimos si queremos activar el pin "HIGH" o desactivarlo "LOW".

Decir que nosotros hemos utilizado este pequeño programa para encender o apagar una luz, pero si nosotros en lugar de una luz conectamos un ventilador, un enchufe, una estufa, o cualquier cosa que queramos encender o apagar... también nos va a servir (Siempre y cuando lo hagamos a través de un rele).  Un placer gente y nos vemos en la próxima entrada :P