Tecnopatafísica

Ciencia y tecnología al alcance de todos

1. Descripción de la práctica

Este año, como cada año, nos planteamos un viaje que nos tendrá alejados de nuestra casa por un tiempo. Y como cada año, surgen una serie de preocupaciones ocasionadas por el abandono de nuestro hogar. ¿Qué pasa si se produce un cortocircuito y se quema la casa? ¿Me he dejado la calefacción encendida? ¿Se morirán las plantas por falta de agua? ¿Entrará alguien en casa?...

En este proyecto te proponemos que diseñes y construyas un sistema que publique en una página Web datos sobre la temperatura, humedad y sonido de manera periódica para que puedas consultarlo con tu teléfono en la playa/montaña y compruebes que todo marcha según lo esperado (o llames a familiares, los vecinos o la policia en caso de que percibas alguna anomalía!!!).

En este proyecto se va a usar las posibilidades de la placa Arduino para enviar información sobre una serie de parámetros físicos (temperatura, humedad y sonido ambiente) a una plataforma de Internet (Thingspeak) que se encargará del almacenamiento y la presentación de los datos enviados.

2. Objetivos

Los objetivos que persigue conseguir esta práctica son:

1) Conocer las principales características de la Informática física y sus posibilidades de uso actuales y futuras.

2) Adquirir un pensamiento crítico ante el uso de nuestros datos con fines comerciales que se proponen en el Cloud Computing o en el mundo del Big Data.

3) Dominar los conceptos principales de Internet y sus protocolos de comunicación.

4) Conocer los fundamentos de los lenguajes de programación y sus principales tipos.

5) Adquirir destrezas en el uso de plataformas basadas en microcontroladores como Arduino.

6) Controlar el concepto de sensor, conocer los principales sensores y ser capaz de montar circuitos con sensores usando Arduino.

7) Conocer las plataformas como Thingspeak y saber generar canales

8) Saber establecer la comunicación y el envío de datos desde Arduino via Ethernet a una plataforma de Internet.

3. Contenidos

Evolución de Internet

Estamos sin duda en un mundo cambiante en el que cada día más nuestras transacciones, nuestras comunicaciones y, en muchas ocasiones, nuestra interconexión con el mundo está cifrado en código binario. En el mundo de la información digital todos nuestros datos se mueven por espacios virtuales escapándose de nuestro control y dejando en entredicho conceptos como la privacidad o la seguridad.  Esta evolución de Internet que, sin duda, mueve al mundo en la misma dirección, nos presenta conceptos como BigData, Iot (Internet Of Things), Cloud Computing o Smart Cities que debemos conocer para formarnos una opinion propia. Para conocer estos conceptos se recomienda el enlace al proyecto del blog propio del profesor donde se muestran una serie de recursos seleccionados de cada uno de los temas (Tecnopatafísica: proyecto "Internet y su evolución").

Informática física

Copiando una frase de Juan Felix Mateos Barrado (introducción del vídeo que se muestra a continuación): "tradicionalmente la interacción entre el ser humano y los ordenadores ha sido el choque entre dos mundos completamente diferentes".  En el vídeo que se adjunta se definen los principales aspectos del concepto de la internet de las cosas

Arduino

Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares.

Arduino surge como plataforma ideal para facilitar a todos el acceso al mundo de la electrónica y robótica. Además de otra serie de ventajas Arduino es una filosofía que se apoya en el hardware y software libre que permite, con un coste muy bajo, de manera sencilla crear interesantes proyectos de diferentes disciplinas (técnicas o artísticas).

Entre los imnumerables recursos que se encuentran en la red sobre Arduino debemos comentar la página del creador (https://www.arduino.cc/) así como una serie de recursos que recomiendo para el desarrollo de proyectos: Luis Llamas (https://www.luisllamas.es/tutoriales-de-arduino/)Prometec (https://www.prometec.net/indice-tutoriales/) o Ardumania (https://www.ardumania.es/aprende/),

4. Diagrama del circuito

Una de las principales ventajas del sistema adoptado es la sencillez de montaje cuyo esquema se muestra a continuación usando la herramienta Frizting.

circuitofinal

5. Material a utilizar

Aparte de componentes generales usados en electricidad/electrónica como cables o conectores así como la alimentación de la placa Arduino que, en este caso, la realizaremos mediante conexión vía cable USB a nuestro ordenador, los componentes que usaremos en este proyecto son:

  1. Placa protoboard: Una placa de pruebas (en inglés: protoboard o breadboard) es un tablero con orificios que se encuentran conectados eléctricamente entre sí de manera interna, habitualmente siguiendo patrones de líneas, en el cual se pueden insertar componentes electrónicos y cables para el armado y prototipado de circuitos electrónicos y sistemas similares. Está hecho de dos materiales, un aislante, generalmente un plástico, y un conductor que conecta los diversos orificios entre sí. Uno de sus usos principales es la creación y comprobación de prototipos de circuitos electrónicos antes de llegar a la impresión mecánica del circuito en sistemas de producción comercial (https://es.wikipedia.org/wiki/Placa_de_pruebas)
    protoboard
  2. Arduino Uno: nuestra plataforma que hace de sistema de control de nuestro proyecto (https://www.arduino.cc/en/Main/ArduinoBoardUno)
    ArduinoUno R3 Front 450px
  3. Arduino Ethernet Shield: módulo o shield de Arduino que permite conectar la placa a Internet a través de un cable Ethernet. De esta manera Arduino y, por tanto, nuestro proyecto podrá conectarse con Internet para enviar los parámetros necesarios (temperatura, humedad y sonido) (https://www.arduino.cc/en/Main/ArduinoEthernetShield)
    ArduinoWithEthernetShield2
  4. Micrófono/ sensor de sonido: este micrófono adaptado para Arduino permite detectar variaciones en el sonido que usaremos como activador/trigger de la emisión de parámetros a la plataforma (cada vez que este sensor detecte un sonido superior a un valor umbral predefinido se medirá el valor de dicho sonido así como la temperatura y humedad para ser enviada a la plataforma de Internet).
    keyes
  5. Sensor DHT11: este sensor se encargará de realizar las medidas de la temperatura y la humedad que, con posterioridad, se envía a la plataforma de Internet (https://www.micropik.com/PDF/dht11.pdf)
    DHT11 Pinout keyes

6. Descripción detallada de los pasos a seguir

Para poder realizar con éxito este proyecto divideremos el mismo en diferentes módulos o sobproyectos que puedan ser probados de manera independiente y que nos permitan aislar los posibles fallos y ajustar los parámetros que optimicen nuestro proyecto.

  1. Subproyecto 1: Conexión, calibrado y medición de valores relacionados con el sonido
    • Medir diferentes valores del sonido en momentos concretos es una labor algo compleja, ¿por qué? Trata de contestar la pregunta analizando el sonido como magnitud física siguiendo el enlace que te muestro a continuación (https://www.internetdelascosas.cl/2014/08/07/usando-un-microfono-con-arduino/).
    • Conecta el micrófono al Arduino a través de la placa protoboard según el esquema presente en este mismo documento.
    • En este punto sería muy interesante que fueses capaz de probar que todo esta yendo como esperas y que el micrófono funciona y/o está bien conectado. Para ello usa el código presente en el siguiente enlace (https://www.internetdelascosas.cl/2014/08/07/usando-un-microfono-con-arduino/) súbelo a la placa y comprueba con ayuda del puerto serial que todo funciona según lo previsto. Ajusta además el valor umbral del sonido según las condiciones de ruido donde se estén realizando las mediciones de modo que el micrófono detecte pequeñas variaciones de sonido.
  2. Subproyecto 2: Conexión, calibrado y medición de valores relacionados con la temperatura y la humedad usando el sensor DHT11
    • Analiza el funcionamiento del sensor DHT11 y los diferentes algoritmos que usa para calcular los valores de la temperatura y la presión. ¿Cuál es el tiempo de respuesta que presenta este sensor? ¿Cuáles son sus principales ventajas e inconvenientes respecto a otro tipo de sensores que miden los mismos parámetros? Para contestar las preguntas anteriores puedes ayudarte del siguiente enlace (https://www.prometec.net/sensores-dht11/)
    • Conecta el sensor DHT11 al Arduino a través de la placa protoboard según el esquema presente en este mismo documento junto al micrófono.
    • En este punto sería muy interesante que fueses capaz de probar que todo esta yendo como esperas y que el sensor DHT11 funciona y/o está bien conectado. Para ello usa el código presente en el siguiente enlace (https://www.prometec.net/sensores-dht11/) súbelo a la placa y comprueba con ayuda del puerto serial que todo funciona según lo previsto. Realiza variaciones de la temperatura y de la humedad en el sensor para comprobar está bien calibrado. Realiza las necesarias variaciones en el código para calibrar valores en caso de que fuese necesario.
  3. Subproyecto 3: Conexión y envío de datos desde Arduino a Internet via Ethernet Shield
    • En este punto es conveniente una revisión de los conocimientos previos que se poseen de Internet, sus protocolos de comunicación y su evolución hacia el Iot.
    • Conecta el modulo Ethernet Shield a la placa Arduino y conecta un cable de red al ordenador para comprobar que se comunica con Internet.
    • En este punto sería muy interesante que fueses capaz de probar que todo esta yendo como esperas y somos capaces de conectarnos a Internet. Aunque no está entre los objetivos de esta práctica puedes probar la maravillosa funcionalidad del módulo que nos permite convertir Arduino en un propio servidor Web y crear nuestra propia página Web siguiendo los pasos del siguiente enlace (https://www.educachip.com/arduino-ethernet-shield/)
  4. Subproyecto 4: Creación de cuenta y canales en la plataforma Thingspeak.
    • Accede a la página de Thingspeak e investiga las diferentes posibilidades que ofrece el servicio gratuito de almacenamiento y análisis de datos. Trata de contestas las siguientes cuestiones:
      • ¿Por qué una empresa como la Thingspeak ofrece servicios gratuitos como estos?
      • ¿Cuál es el máximo de canales que nos permite crear?
      • ¿Qué sucede si enviamos información a la plataforma de forma continua aprovechando la velocidad de procesamiento de nuestra placa Arduino?
      • ¿Es posible desde la misma plataforma planificar y activar triggers o respuestas ante determinados valores de los datos recibidos?
      • ¿Cómo son los controles de seguridad y privacidad de nuestros datos que ofrece la versión gratuita?
    • Crea un usuario en la plataforma y para tu usuario crea y configura tres canales: uno para la recepción de datos de la temperatura, otro para la humedad y otro para el sonido. Anota las claves (KEYS) que necesites para añadir al programa con posterioridad.

Una vez realizados y comprobados los anteriores sobproyectos estamos preparados para culminar el proyecto final uniendo las diferentes partes.

Para ello monta el circuito completo según el esquema mostrado en apartados anteriores, conecta el cable Ethernet a tu ordenador/router y el Arduino a través de la conexión USB. Abre el software Arduino y pega el código que se muestra en el apartado siguiente teniendo mucho cuidado en modificar los siguientes aspectos:

7. Código de una posible solución

/**********************************************************************************************************************************************************************************
* NOMBRE: Internetdelascosas
* AUTOR: Daniel Pascual Gallegos
* FECHA: Diciembre del 2016
***********************************************************************************************************************************************************************************/

// Incluimos las librerias necesarias

// Para la conexion a Internet y el envio de datos
include <SPI.h>
include <Ethernet.h>
include <Wire.h>

// Para el sensor DHT11
include <DHT.h>

// Definicion e inicializacion de variables y constantes

// Para el sensor DHT11
byte contador;
byte humedadEntera = 0, humedadDecimal = 0, temperaturaEntera = 0, temperaturaDecimal = 0, checksum = 0;
byte lecturaDHT[41];
String temperaturaTotal=""; 
String humedadTotal=""; 

// Sensor de sonido
const int valorMedio = 0;
const int numeroEjemplos = 128;
int ejemplo;
long signal;
long lecturaMedia;
long mediaFinal=0;
const int factorMedia= 1;
const int umbral=1490;
boolean datoEnviado = true;

// Para la conexión via Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;
long ultimoIntentoConexion=0;

// Funciones

// Función sensor sonido modificada a partir de la existente en el libro Arduino Cookbook
// Para más información https://www.internetdelascosas.cl/2014/08/07/usando-un-microfono-con-arduino/
void sensorSonido()
{
   long sumaCuadrados = 0;
   for (int i=0; i<numeroEjemplos; i++)
   {
      ejemplo = analogRead(0); 
      signal = (ejemplo - valorMedio);
      signal *= signal;
      sumaCuadrados += signal;
   }
   lecturaMedia = sumaCuadrados/numeroEjemplos;
   mediaFinal=(((factorMedia-1)*mediaFinal)+lecturaMedia)/factorMedia;
}

// Funcion sensorTemperatura
// Función que usa el sensor de sonido conectado al pin 2
void sensorTemperatura()
{
   digitalWrite(2, HIGH);
   pinMode(2, OUTPUT);
   digitalWrite(2, LOW);
   delay(20);
   pinMode(2, INPUT);
   while (digitalRead(2) == HIGH) {}
   for (contador = 0; contador < 41; contador++)
   {
      lecturaDHT[contador] = pulseIn(2, HIGH);
    }
    for (contador = 0; contador < 41; contador++)
   {
      Serial.print(contador);
      Serial.print("\t");
      Serial.print(lecturaDHT[contador]);
      Serial.print("\n");
      if (lecturaDHT[contador] < 50)
      {
          lecturaDHT[contador] = 0;
      }
      else
     {
        lecturaDHT[contador] = 1;
     }
   }
   humedadEntera = lecturaDHT[1];
   for (contador = 2; contador <= 8; contador++)
   {
      humedadEntera = humedadEntera << 1;
      humedadEntera = humedadEntera | lecturaDHT[contador];
   }
   humedadDecimal = lecturaDHT[9];
   for (contador = 10; contador <= 16; contador++)
   {
      humedadDecimal = humedadDecimal << 1;
      humedadDecimal = humedadDecimal | lecturaDHT[contador];
   }
   temperaturaEntera = lecturaDHT[17];
   for (contador = 17; contador <= 24; contador++)
   {
      temperaturaEntera = temperaturaEntera << 1;
      temperaturaEntera = temperaturaEntera | lecturaDHT[contador];
   }
   temperaturaDecimal = lecturaDHT[25];
   for (contador = 10; contador <= 32; contador++)
   {
      temperaturaDecimal = temperaturaDecimal << 1;
      temperaturaDecimal = temperaturaDecimal | lecturaDHT[contador];
   }
   checksum = lecturaDHT[33];
   for (contador = 10; contador <= 40; contador++)
   {
      checksum = checksum << 1;
      checksum = checksum | lecturaDHT[contador];
   }
   Serial.print("\n");
   Serial.print("Humedad: ");
   Serial.print(humedadEntera);
   Serial.print(".");
   Serial.print(humedadDecimal);
   Serial.println(" %");
   Serial.print("Temperatura: ");
   Serial.print(temperaturaEntera);
   Serial.print(".");
   Serial.print(temperaturaDecimal);
   Serial.write(186);//signo º
   Serial.println(" C");
   Serial.print("Checksum recibido: ");
   Serial.println(checksum, BIN);
   Serial.print("Checksum calculado: ");
   Serial.println(humedadEntera + humedadDecimal + temperaturaEntera + temperaturaDecimal, BIN);

   if (checksum == humedadEntera + humedadDecimal + temperaturaEntera + temperaturaDecimal)
   {
      Serial.println("La lectura recibida es correcta.");
   }
   else
   {
      Serial.println("La lectura recibida NO es correcta.");
   }
}

void setup()
{
   Serial.begin(9600);
   Serial.println("ThingSpeak");
   Ethernet.begin(mac);
   Serial.print("Direccion ip: ");
   Serial.println(Ethernet.localIP());
   Serial.print("El valor umbral del sonido es ");
   Serial.println(umbral);
   Serial.println("Si desea enviar la temperatura, humedad y sonido active el sistema mediante un aplauso o ruido fuerte");
   pinMode(2, INPUT);
}

void loop()
{
   char peticion[] = "GET /update?api_key=TUAPIKEYTHINGSPEAK&field1=";

   sensorSonido();

   if (mediaFinal>umbral)
   {
      Serial.print("Se ha producido un ruido por encima de la media de valor: ");
      Serial.println(mediaFinal);

      // Para evitar mandar continuamente
      if (millis() - ultimoIntentoConexion > 3000)
      {
         ultimoIntentoConexion = millis();
         client.stop();//Terminar cualquier conexión previa
         delay(1000);
         Serial.print("Iniciando lectura\n");
         sensorTemperatura();

         if (client.connect("api.thingspeak.com", 80))
         {
            client.print(peticion);
            temperaturaTotal=String(temperaturaEntera) +"."+String(temperaturaDecimal);
            client.print(temperaturaTotal);
            client.print("&field2=");
            humedadTotal=String(humedadEntera) +"."+String(humedadDecimal);
            client.print(humedadTotal);
            client.print("&field3=");
            client.print(String(mediaFinal));
            client.println(" HTTP/1.1");
            client.println("Host: api.thingspeak.com");
            client.println();
            if (client.connected())
            {
               Serial.println("Datos enviados a ThingSpeak...");
               Serial.println();
               Serial.println("Si desea enviar la temperatura, humedad y sonido active el sistema mediante un aplauso o ruido fuerte");
            }
         }
      }
   }
}

8. Posibles ampliaciones

Para completar nuestro estudio de parámetros físicos se pueden obtener otros datos de gran importancia:

1) Mediante el uso de algún tipo de sensor barométrico (como por ejemplo el BP180) podemos enviar información de la altitud y la presión atmosférica a sus respectivos canales de Thingspeak.

2) Tal y como está la contaminación en nuestra ciudad (Madrid) sería interesante la medición del CO2 en el aire mediante el uso de un sensor adecuado y el envío de la información al correspondiente canal de Thingspeak.

Además, pese a que el objetivo del proyecto es la lectura de sensores y su comunicación con la red, se plantea como una mejora añadir actuadores que permitan crear una especie de invernadero que posibilite diferentes acciones como por ejemplo..

1) Cuando la temperatura alcance un valor máximo activar un sistema de alarma sonoro y visual que sirva de aviso

2) Cuando la temperatura alcance un valor máximo activar un sistema de ventilación/refrigeración hasta que se recupere el valor deseado.

3) Cuando la humedad se encuentre por debajo de un determinado valor suministrar agua mediante una bomba o sistema de riego.

9. Materias transversales

La conexion de este proyecto con otras disciplinas es amplio y puede resumirse en los siguientes aspectos:

  • Con respecto a las ciencias la conexión es evidente. Parte del proyecto se basa en la medición de parámetros físico-químicos como la temperatura, la presión, la humedad y el sonido conectando a la perfección con el temario de Física y Química de 3º y 4º ESO. Además estos parámetros interaccionan de manera decisiva con el medio físico con lo que entronca con contenidos de Biología y Ciencias Naturales de diferentes niveles de la ESO. Además la programación de algoritrmos permite desarrollar competencias matemáticas imprescindibles para entender el proceso.
  • Con respecto a la materia de Informática de 4º ESO es extraordinaria para introducir conceptos como Internet y sus protocolos de comunicación además de los propios de los lenguajes de programación.
  • Con respecto a las ciencias sociales y/o humanidades el contacto es evidente. El futuro, nos guste más o menos, va encaminado hacia una sociedad cada vez más dependiente de los avances de la tecnología. En este campo destaca la evalución de Internet y conceptos como el Big Data o las Smart Cities plantean una serie de debates que pueden ser analizados desde el área de Ciencias Sociales o desde perspectivas más éticas o existencialistas (Ética o Filosofía). Además se presenta los lenguajes de porgramación como un tipo de lenguaje de símbolos y palabras en inglés.. (Lengua Castellana o Inglés)

10. Dificultades encontradas y cómo se han resuelto.

Lo más importante de este proyecto con respecto a proyectos que conllevan otro tipo de sensores o actuadores que obligan al uso de numerosas conexiones y cableado es que el montaje es extraordinariamente sencillo y con un número de cables pequeño realizamos todas las conexiones. Por tanto, por la parte del montaje no han surgido numerosas dificultades.

Las mayores dificultades pueden presentarse en cuanto a la codificación. No es demasiado extensa pero el uso de valores medios para medir parámetros exige tener bastante dominio sobre el código para evitar caer en el cálculo y/o envío de parámetros incorrectos o no bien calibrados. En este tipo de dificultades la mejor manera de actuar es mediante el método de prueba-ajuste-prueba hasta que el resultado coincida con el esperado.

Referente a la conexión a la red y el envío de datos a la plataforma hay numerosos recursos que pueden ayudarnos a la configuración en caso de que surgiesen problemas particulares.

11. Cuestionario de autoevaluación.

Vamos a evaluar los conceptos aprendidos en el desarrollo de la práctica. Contesta a las siguientes cuestiones:

Internet y su evolución

  1. ¿Qué es Internet? ¿Cuáles son los principales protocolos de comunicación?
  2. Define de manera breve los siguientes conceptos relacionados con la evolución de Internet: BigData, Iot (Internet Of Things) y Cloud Computing.
  3. Analiza las ventajas e inconvenientes que presentan estas tecnologías y trata de contestar a preguntas como:
    1. ¿Es un adelanto real que mejore nuestra vida cotidiana o es, sencillamente, otra necesidad que nos impone la sociedad de consumo?
    2. ¿Cómo afecta el desarrollo/uso de esta tecnología al medio ambiente (huella ecológica)? ¿Y al consumo energético?
    3. ¿Consideras que la vulnerabilidad de nuestros datos (dónde compramos, qué consumimos, cómo y con quién nos relacionamos, por qué lugares del mundo nos movemos, qué leemos y hasta qué sentimos)?
  4. ¿Qué es Thinkspeak? ¿Cuál es la función de plataformas como Thingspeak? Analiza posiibles aplicaciones cotidianas actuales o futuras de este tipo de plataformas
  5. Define el concepto de informática física y analiza posiibles aplicaciones cotidianas actuales o futuras.

Electrónica y Arduino

  1. ¿Qué es Arduino? ¿Cuál es su función? ¿Cuáles son las principales ventajas que presenta respecto a otros productos diseñados para realizar funciones similares?
  2. Define los conceptos de electrónica analógica y digital y muestra ejemplos de componentes que actúen de cada una de las maneras.
  3. Define el concepto de sistema automatizado.
  4. ¿Qué es un sensor? Cita ejemplos de diferentes sensores y aplicaciones en el mundo actual.
  5. ¿Qué es un sistema de control como Arduino?
  6. ¿Qué es un actuador? Cita ejemplos de diferentes actuadores y aplicaciones en el mundo actual.
  7. Explica el funcionamiento los sensores presentes en el proyecto actual (micrófono y DHT11).

Arduino y la programación informática

  1. ¿Qué es un lenguaje de programación? Cita, al menos, tres lenguajes de programación.
  2. En todos los lenguajes de programación (entre ellos el de Arduino) existen las variables ¿Qué son? ¿Para qué se utilizan? ¿Qué significan los términos definir e inicializar una variable?
  3. ¿Qué son las declaraciones, instrucciones, estamentos u órdenes?
  4. ¿Qué son las funciones o métodos de los lenguajes de programación? ¿Para qué son utilizados? ¿Conoces alguna función del lenguaje de programación de Arduino? ¿Cuál es la sintaxis general de las funciones en cualquier lenguaje de programación?
  5. Indica para qué se utilizan los siguientes símbolos en el lenguaje de programación de Arduino (y en muchos otros lenguajes de programación):
    Símbolo "punto y coma" ";"
    Símbolo de las "llaves" "{", "}"
    Símbolo "/* */"
    Símbolo "//"
  6. ¿Cuál es la estructura básica que debe tener cualquier lenguaje de Arduino? ¿Qué funciones son necesarias en cualquier programa de Arduino?
  7. ¿Qué significado tiene el término compilar asociado a un programa informático? Un programa no tiene errores de compilación, ¿quiere esto decir que realiza las funciones para las que fue desarrollado?
  8. ¿Para qué sirve la función setup () del lenguaje de programación de Arduino? ¿ y la función loop()?
  9. Analiza las estructuras de control de Arduino y trata de explicar, con tus propias palabras, para que consideras que se utilizan los operadores:
    if
    if----else
    for
    while
  10. Analiza las diferentes funciones que se usan para trabajar con pines digitales y explica su función.
  11. Analiza las diferentes funciones que se usan para trabajar con pines analógicos y explica su función.
  12. Analiza las diferentes funciones que se usan para comunicar con el puerto serial y explica su función.

12. Licencia de publicación

Licencia de Creative Commons

Creative Commons Reconocimiento 4.0 Internacional License.

Spanish English French German Italian Portuguese Russian

Redes sociales

facebook iconotwitterGoogle plus iconpinterest

Artículos

TIC