miércoles, 1 de marzo de 2017

IOT ( internet de las cosas 3a parte )

Bienvenidos de nuevo. Continuando con la creación de una app para el móvil de las entradas anteriores. Hoy dedicaremos esta entrada del blog a escribir todo el código necesario para conectarnos a internet a través del wifi.

Para ello lo primero que haremos será abrir la pestaña (marcada con un cuadro rojo) de MainActivity, viendo algo parecido a esto:


A partir de aquí para el que nunca haya escrito código, es mirar las imágenes y te explota el cerebro.. pero no os preocupéis si no entendéis nada, iremos paso a paso. Os aseguro que el código funciona. O debería jajaja... En este momento es la hora crear un enlace entre la parte gráfica y la parte lógica y esto se hace escribiendo el siguiente código:


Si os fijáis por ejemplo el la linea de código: 
editText = (EditText)findViewById(R.id.et1);
et1 hace referencia a la linea de código que nosotros le asignamos a la id en la parte gráfica como podemos recordar con la siguiente linea de código:
android:id="@+id/et1"
Esta es la forma que tiene android para enlazar la parte gráfica a la parte lógica. 

A continuación añadimos la siguiente linea de código (marcada con un recuadro en rojo):

Y para finalizar creamos la conexión wifi de la siguiente forma:


Aquí lo que hemos hecho a sido crear un método que contiene todo lo necesario para mandar un dato a través de internet. Ahora solo nos falta mandar a llamar este método cada vez que nosotros apretemos los botones que hemos creado pasándole como parámetro el dato que nosotros deseemos. 

Para darle vida a los botones que hemos creado, hay que buscar alguna forma de que el programa sepa cuando nosotros apretemos el botón. Hay varias maneras de hacerlo, pero yo para no complicaros la vida haré la mas fácil. 


Como vemos dentro del método OnClick llamamos nuestro método ConexionWifi y entre comillas le mandamos el dato que deseemos. Y con esto si no hay ningún error en el código ya tenemos la aplicación lista para poder encender o apagar algo desde el móvil. Solo falta instalarla en el y abrirla, pero eso lo dejaremos para otra entrada. 

Hasta aquí tenemos la parte que envía los datos, en las próximas entradas explicare como hacer la parte que recibe los datos, para ello usaremos una placa arduino mega y un modulo wifi esp8266.

Un saludo! ;)

martes, 28 de febrero de 2017

IOT( internet de las cosas 2a parte)

Hola de nuevo. Siguiendo el proyecto de la entrada anterior, en esta añadiremos lo que se vera en la pantalla del móvil cuando abramos la aplicación. Debido a que el lenguaje de programación de android es muy complicado para gente que no ha programado nunca, no os preocupéis si cuando lo leáis os parezca que estáis descifrando runas antiguas, intentare comentaros por encima cada linea de código para que entendáis un poco lo que hace y en un futuro podáis modificarlo a vuestro gusto.

Sigamos!!


Lo primero es darle click en la pestaña marcada en rojo en la foto, con lo que os abrirá una pantalla como la siguiente:


En esta pantalla es donde se da forma al aspecto visual de la aplicación, donde se añaden botones, texto, etc. En resumen, es lo que vera la persona cuando abra la aplicación. Hay varias formas de añadir botones, texto, imágenes, etc... a la pantalla pero en esta ocasión vamos a hacerlo a través de código de programación, por lo que es necesario darle a la pestaña marcada en rojo. Nos abrirá la siguiente ventana:


Bien, una vez aquí tenemos que modificar el código quedando de la siguiente manera:


Si nos fijamos en las 2 partes veremos que se ha modificado lo siguiente:
  1. Hemos borrado los 4 paddings de 16dp.
  2. Hemos cambiado el RelativeLayout por un LinearLayout.
  3. Un LinearLayout necesita obligatoriamente una propiedad llamada orientation por lo que se la hemos añadido estableciendo su valor en vertical
  4. Hemos borrado el elemento TextView, ya que no es necesario para esta aplicación.
  5. Hemos añadido un EditText para que podamos introducir el numero IP del wifi al que deseemos mandarle los datos. Ademas le hemos añadido unas propiedades de ancho y alto, otra propiedad llamada id que se usara mas adelante y por ultimo una propiedad llamada hint, que sirve para enseñar un texto indicativo. 
  6. Para finalizar, hemos añadido 2 Button (Botones), dándoles las propiedades ancho y alto, así como la propiedad id y una nueva propiedad llamada text que sirve para añadir texto encima del botón.
Y con esto ya tenemos la parte gráfica completada. Si, ya se que es muy básico y queda muy fea, pero la idea es hacer una aplicación que funcione y, si queréis que sea mas bonita aprended a programar android y hacedla a vuestro gusto xD. 

COSAS QUE PODÉIS MODIFICAR SIN PELIGRO A ROMPER EL PROGRAMA:

  • Podéis cambiar el texto de los botones. En la propiedad text, entre comillas se coloca el texto que se desea que aparezca. 
  • De la misma forma podéis cambiar el mensaje de la propiedad hint.
  • Podéis cambiar el nombre de la id de los elementos. En la propiedad id entre comillas aparece "@+id/" seguido de un texto. Sólo podéis cambiar el TEXTO, de lo contrario os dará un error. 
  • Las demás propiedades si no sabéis programar es mejor no tocarlas. 
Para que no se haga una entrada muy larga y aburrida añadiremos unas ultimas lineas de código de programación y en la próxima entrada nos centraremos en crear una conexión wifi y dar las ordenes de mandar los datos a los botones. 

Bien, para que nuestra aplicación pueda enviar datos a través de wifi, hay que darle unos permisos especiales, de lo contrario no funcionará. Esto se consigue de la siguiente manera:

  
Si nos fijamos en la imagen hay una pestaña llamada manifests marcada en un recuadro rojo, si le damos click nos aparecerá un archivo en su interior. Dando doble click en éste lo abriremos. 


En este archivo añadiremos la siguiente linea de código quedando de esta manera:


Y con esto finalizamos esta entrada. Nos vemos en la próxima y seguimos programando! un saludo ;)

IOT ( internet de las cosas 1a parte)

Hola de nuevo gente, cada vez es mas común que los aparatos de casa tengan conexión a Internet para poder ser controlados a distancia a través de ethernet o wifi. Esta vez aprenderemos como podemos controlar lo que queramos desde una aplicación móvil creada por nosotros mismos. Comentar también, que para que no sea muy difícil de entender vamos a hacer un programa muy sencillo con 2 botones, uno para encender y el otro para apagar lo que tengamos conectado. De esta manera aprenderemos lo siguiente:

  1. Crear una conexión WIFI.
  2. Añadir botones a la aplicación del móvil y que estos hagan algo cuando los apretemos.   

Dado que no tengo un "pc mac" no puedo programar aplicaciones para iphone, así que solo servirá para móviles con sistema operativo android.

Hacer toda la explicación en una pagina, se haría muy largo y pesado de leer, voy a dividirlo en varias partes. Empecemos!!

Para crear una aplicación android necesitamos tener un programa instalado en nuestro pc, hay varios, pero el que yo uso es android studio y sera con el que trabajaremos en este blog. Este programa se descarga de la siguiente pagina:


Una vez en la pagina le damos al botón de descargar android studio y al finalizar la instalación ya lo tendremos todo listo para empezar a programar. Si lo ejecutáis os tendría que salir una pagina de inicio parecida a esta:


A continuación iremos paso a paso hasta finalizar nuestro proyecto. Bueno como es lógico clicaremos en "Start a new Android Studio project". Aparecera la siguiente pagina:


Aquí lo mas importante es la casilla de "Application name" que servirá para darle un titulo a nuestra aplicación, en mi caso a modo de demostración dejo el nombre que viene por defecto y le doy al botón de Next. (Vosotros ponerle el nombre que queráis, eso si la primera letra deberá ser en mayúsculas, sino dará un error). A continuación os saldrá la siguiente pantalla:


Bueno, en esta pantalla es donde se selecciona si tu aplicación sera una aplicación para móviles, para televisores, para gafas de realidad virtual.. etc, en nuestro caso como es para móviles solo dejamos seleccionada la primera opción. Luego el "Minium SDK", es la versión mínima que se requerirá al móvil para poder ser ejecutada la aplicación. Escogéis la que queráis. Por ultimo le dais a Next.


En esta pantalla, es donde seleccionamos el estilo de nuestra aplicación. Para no complicarnos la vida elegimos "Empty Activity", que viene a ser una pantalla vacía. Ya le añadiremos nosotros lo que queramos luego. Como siempre, luego le damos a Next.

  
En esta pantalla dejamos todo por defecto como esta y le damos a Finish. Una vez finalizado el proceso de carga (tarda un rato) deberíamos tener una pantalla parecida a la siguiente:


Una vez aquí ya tenemos nuestro proyecto con todos los archivos listos para que pueda ser ejecutado, solo que si ahora lo instalamos a nuestro móvil y lo abrimos, veríamos una pantalla en blanco, por lo que en la próxima entrada añadiremos mas código de programación y le daremos vida a nuestra aplicación. Un saludo.  

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.