Servos y sensores climáticos


Se trata de un proyecto sencillo realizado por Miguel Torres Gordo donde nos muestra como mostrar la hora, la temperatura y la humedad en una habitación con pocos módulos. El diseño muestra solo la hora y los minutos, porque los segundos no son relevantes y obviamente encarecen el proyecto.

La foto muestra una posible distribución de la pantalla, pero se deja a la imaginación del lector cómo podrían usarse, por ejemplo, en una caja hecha con una impresora 3D.

Proyecto finalizado

Materiales necesarios

  • Chip Nano V3.0 CH340 presoldado, versión mejorada con cable USB
  • MAX7219 Módulo de pantalla LED de matriz de puntos 8×32 4 en 1
  • KY-015 DHT 11 Módulo de sensor de temperatura ( del que por cierto hemos tratado en numerosos proyectos en este blog)
  • Reloj en tiempo real DS3231 I2C (idéntico al DS1307).Alternativamente con modificaciones DS1302 Serial Real Time Clock RTC Real Time Clock Module. Este tipo de módulos lo hemos tratado tambien en numerosos ejemplos en este blog
  • Micro servomotor digital MG995 o micro servomotor SG90 Micro servomotor 9G o micro servomotor MG90S
  • MB 102 Kit de placa de pruebas – 830 Breadboard, adaptador de fuente de alimentación 3.3V 5V, 65pcs Jumpers
  • Fuente de alimentación externa (9V – 12V)

Software requerido

IMPORTANTE: Encuentre las bibliotecas que faltan en el IDE de Arduino a través de «Herramientas -> Administrar bibliotecas…»

Circuito y descripción de su funcionamiento

El módulo DS1302 RTC( que hemos tratado tambien en numerosos ejemplos en este blog )es responsable de proporcionar la hora en el microcontrolador, mientras que el módulo DHT-11 mide la temperatura y la humedad ( del que por cierto hemos usado tratado en este blog). A continuación, el microcontrolador utiliza la información para controlar el grupo de módulos LED de 8×8 para la hora y los servomotores para mostrar la temperatura y la humedad.

Es muy importante que introduzcamos una batería adecuada, ya que aunque este módulo funcionará correctamente sin ella, si desconectamos el módulo del circuito, se reiniciará la hora.

Para establecer la fecha y la hora actuales, debemos configurar el siguiente circuito usando los pines SDA/SCL de nuestra placa Arduino o compatible:

Configuración de RTC
RTC (I2C)Nano V3
VCC5V
GNDGND
CLKA5 (SCL)
DATA4 (SDA)
RST

A continuación, ejecutamos el sketch DS1307_setup.ino, abrimos el Monitor Serie y podemos ver tanto la fecha como la hora en que se ha guardado el módulo. Estos datos son los datos que proporciona el sistema operativo del PC en el momento en que se ejecuta el boceto. Si nos fijamos en el boceto, podemos ver que la línea de código

clock.setDateTime(__DATE__, __TIME__);

es el que carga el módulo con los dos datos del sistema. A partir de ese momento, hemos configurado el módulo con la hora y la fecha y gracias a la batería, estos datos no se eliminarán del módulo cuando se corte el voltaje.

Además en el diseño tenemos dos servos , un sensor dht11 y 4 Display que completen el total de conexiones junto a los hilos de alimentación de 5v DC correspondientes para cada módulo:

  • GND y VIN para alimentación de todos los dispositivos.
  • A4 y A5 para la conexión del DS1302.
  • D13, D11 y D10 para los 4 displays (MAX7219).
  • D3 y D4 para los dos servos.
  • D2 para el DHT11.

Después de configurar la hora y la fecha, unto con los otros módulos en el circuito y ejecutamos el boceto clock_temperature_humidity.ino. Cuando hayamos terminado de cargar, deberíamos ver la hora exacta en la matriz de LED y los dos servomotores deberían moverse hasta que se posicionen en el valor de la temperatura y la humedad en el ambiente.

Circuito

Para cargar el boceto en el microcontrolador, elimine la línea entre +5V y Vin.

Ampliada

Tenemos la fuente de alimentación de 5V DC, el microcontrolador, el módulo RTC DS1302, DHT-11, el array de LED y los 2 servomotores.

Foto de la construcción

Analicemos el código:

En primer lugar, cargamos las librerías que son necesarias para la ejecución del boceto. Los tres primeros son para la matriz LED, los dos siguientes son para usar el módulo DS1307, el penúltimo es la biblioteca para el módulo DHT-11 y el último es para usar los servomotores:

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Wire.h>
#include <DS3231.h>
#include <DHT.h>
#include <Servo.h>

Después de las librerías, tenemos que configurar las conexiones de los módulos con los pines del microcontrolador. Luego el tipo de controlador y el número de módulos LED de la matriz (4 en nuestro caso). A continuación, el tipo de módulo DHT. Creamos las instancias de cada módulo y las variables necesarias para almacenar los datos de las mismas:

// Define hardware type, size, and output pins MAX7219 8x32 4 in 1 Dot Matrix LED Display Module
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 10

// Define hardware type andi pins DHT-11
#define DHTPIN 2
#define DHTTYPE DHT11

// Create a new instance of the MD_Parola class with hardware SPI connection:
MD_Parola reloj = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

// Create a instance of DHT-11 sensor and variables for temperature and humidity
DHT dht(DHTPIN, DHTTYPE);
float t, hu;

// Instances of the servos for humidity and temperature
Servo servoTemperature;
Servo servoHumidity;

// Instance for the DS3231 clock
DS3231 clock;
RTCDateTime dt;

Después de configurar los parámetros del módulo, inicializamos los módulos en la función setup() del boceto:

      // Initialization of Monitor Serial
      Serial.begin(9600);
      Serial.println("Initialize RTC module");
  
      // Initialization of DS3231 Module
      clock.begin();

      // Initialization MAX7219 LED Matrix Display
      reloj.begin();                // Intialize the object
      reloj.setIntensity(0);        // Set the intensity (brightness) of the display (0-15)
      reloj.displayClear();         // Clear the display

      // Initialization DHT-11 module
      dht.begin();

      // Servo pins connections
      servoTemperature.attach(3);
      servoHumidity.attach(4);

La función loop() genera los valores medidos y los cálculos necesarios para la visualización.

En primer lugar, analizaremos los datos de temperatura y humedad. Asignamos el valor de temperatura a la variable t y el valor de humedad a la variable hu. Si no recibimos ningún dato, lo comunicamos a través del monitor de serie. Los rangos de valores con los que trabajaremos van de 0 a 50 grados centígrados de temperatura y de 0% a 100% de humedad. Sabemos que los servomotores suelen tener un rango de ángulo de 180 grados. Para que los servomotores marquen los datos correctamente, realizamos una sencilla operación matemática para asignar los valores máximos de los rangos a los 180 grados del ángulo de los servomotores.

     // Temperature and humidity reading
      t = dht.readTemperature();
      hu = dht.readHumidity();
      if (isnan(hu) || isnan(t)) {
              Serial.println("DHT sensor reading failure !!!");
      }

...
      servoTemperature.write((t*180)/50);   // Move the servos to value
      servoHumidity.write((hu*180)/100);

Como alternativa, puede utilizar la función map().

El procedimiento para registrar y mostrar las horas y los minutos es muy sencillo. Solo una nota: cuando el módulo DS1302 envía las horas y los minutos, envía los dígitos mínimos necesarios, es decir, del 0 al 9 solo un dígito. Entonces, si obtenemos menos de 10 horas o 10 minutos, solo veremos un dígito a la vez. Esto daría la impresión de un mal funcionamiento o no se ve bien. Así que siempre tenemos que mostrar dos dígitos en las horas y los minutos.

Con la primera línea, pedimos al módulo DS1302 que recupere los datos de fecha y hora. A continuación, creamos dos variables (h y m) para almacenar los datos en el formato de cadena de la hora y los minutos. Si los valores son menores que 10, la instrucción if va precedida de un 0 como carácter, no como un dígito, con concat. Ahora solo tenemos que mostrar estos datos en la matriz LED. Para mostrar que el reloj está corriendo, mostramos dos cadenas muy similares. Uno con la separación entre horas y minutos con dos puntos y otro sin dos puntos. La visualización se realiza en incrementos de 500 ms, lo que corresponde a medio segundo. Por lo tanto, los dos puntos parpadean.

La función delay() bloquea el flujo del programa, lo que no es relevante en este caso, ya que hay tiempo suficiente para leer y mostrar los datos.

      dt = clock.getDateTime();               // Reading data from the RTC module

      String h;                               // Variable for the hours
      String m;                               // Variable for the minutes
  
      int hora = (dt.hour);                   // The variable "hora" is used 
      if (dt.hour<10) {                       // to set the time to always show two digits 
	            h = "0";                        // two digits in the clock hours.
	            h.concat((String) hora);
      } else {
	            h = (String) hora;
      }

      int minuto = (dt.minute);               // The variable "minuto" is used
      if (dt.minute<10) {                     // to set the minutes to always
	            m ="0";                         // two digits en the clock minutes
	            m.concat((String) minuto);
      } else {
	            m = (String) minuto;
      }
      
      String r = h + ":" + m;                 // Hour and minutes with colon separation
      String q = h + " " + m;                 // Hour and minutes without colon separation

      Serial.print("Hora: ");
      Serial.print(dt.hour);   	Serial.print(":");
      Serial.print(dt.minute); 	Serial.print(":");
      Serial.print(dt.second); 	Serial.println("");
      Serial.print( "T = " );
      Serial.print(t);
      Serial.print(" ºC, H = ");
      Serial.print(hu);
      Serial.print( "%, " );

      reloj.setTextAlignment(PA_CENTER);    // Configuration the text centered
      reloj.print(r);                       // We change the text showing the separation
      delay(500);                           // and without it every half second for the
      reloj.print(q);                       // sensation of movement.
      delay(500);

A continuación el código completo:

/**************************************************************************************
 *   Easy Arduino project with clock, temperature and humidity measurement            *
 *   Last revisión 10-12-2021 - Getafe (Madrid) - España                              
 *   Miguel Torres Gordo                                                              
*************************************************************************************/

// Required Arduino libraries
#include <MD_Parola.h>                          // Matrix LED Display Module
#include <MD_MAX72xx.h>                         // MAX7219
#include <SPI.h>                                // SPI Communications

#include <Wire.h>                               // I2C communications protocol
#include <DS3231.h>                             // Real Time Clock Module

#include <DHT.h>                                // Temperature and Humidity module

#include <Servo.h>                              // Servomotors

// Define hardware type, size, and output pins MAX7219 8x32 4 in 1 Dot Matrix LED Display Module
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 10

// Define hardware type andi pins DHT-11
#define DHTPIN 2
#define DHTTYPE DHT11

// Create a new instance of the MD_Parola class with hardware SPI connection:
MD_Parola reloj = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

// Create a instance of DHT-11 sensor and variables for temperature and humidity
DHT dht(DHTPIN, DHTTYPE);
float t, hu;

// Instances of the servos for humidity and temperature
Servo servoTemperature;
Servo servoHumidity;

// Instance for the DS3231 clock
DS3231 clock;
RTCDateTime dt;


void setup() {

      // Initialization of Monitor Serial
      Serial.begin(9600);
      Serial.println("Initialize RTC module");
  
      // Initialization of DS3231 Module
      clock.begin();

      // Initialization MAX7219 LED Matrix Display
      reloj.begin();                // Intialize the object
      reloj.setIntensity(0);        // Set the intensity (brightness) of the display (0-15)
      reloj.displayClear();         // Clear the display

      // Initialization DHT-11 module
      dht.begin();

      // Servo pins connections
      servoTemperature.attach(3);
      servoHumidity.attach(4);

}

void loop() {

      // Temperature and humidity reading
      t = dht.readTemperature();
      hu = dht.readHumidity();
      if (isnan(hu) || isnan(t)) {
              Serial.println("DHT sensor reading failure !!!");
      }
     
      dt = clock.getDateTime();               // Reading data from the RTC module

      String h;                               // Variable for the hours
      String m;                               // Variable for the minutes
  
      int hora = (dt.hour);                   // The variable "hora" is used 
      if (dt.hour<10) {                       // to set the time to always show two digits 
	            h = "0";                        // two digits in the clock hours.
	            h.concat((String) hora);
      } else {
	            h = (String) hora;
      }

      int minuto = (dt.minute);               // The variable "minuto" is used
      if (dt.minute<10) {                     // to set the minutes to always
	            m ="0";                         // two digits en the clock minutes
	            m.concat((String) minuto);
      } else {
	            m = (String) minuto;
      }
      
      String r = h + ":" + m;                 // Hour and minutes with colon separation
      String q = h + " " + m;                 // Hour and minutes without colon separation

      Serial.print("Hora: ");
      Serial.print(dt.hour);   	Serial.print(":");
      Serial.print(dt.minute); 	Serial.print(":");
      Serial.print(dt.second); 	Serial.println("");
      Serial.print( "T = " );
      Serial.print(t);
      Serial.print(" ºC, H = ");
      Serial.print(hu);
      Serial.print( "%, " );

      reloj.setTextAlignment(PA_CENTER);    // Configuration the text centered
      reloj.print(r);                       // We change the text showing the separation
      delay(500);                           // and without it every half second for the
      reloj.print(q);                       // sensation of movement.
      delay(500);

      // To display the value of temperature and humidity we assign
      // a maximum value (50ºC and 100% of humidity) to the 180 degrees of the servomotor and
      // by means of a rule of three we display the actual values.
      
      servoTemperature.write((t*180)/50);   // Move the servos to value
      servoHumidity.write((hu*180)/100);
            
}

¿Cuál es el lenguaje de programación mas complicado de aprender?


La dificultad de un lenguaje de programación puede variar según la experiencia y el enfoque del programador. Sin embargo, algunos lenguajes son conocidos por su complejidad. Aquí te menciono algunos de los más «complicados»: Haskell, C++, Ensamblador o Malbolge.

El lenguaje C

Pongamos C. El lenguaje C es un lenguaje compilado (mas complicado, o al menos un poco mas). Imperativo (fácil en teoría), con tipado débil y estático (se comprueba en la compilación).En principio te aseguro que C, es muy fácil de aprender. Pero tremendamente difícil de usar bien.

El motivo es que hay lenguajes fáciles de aprender, pero no tanto de implementar cosas en la práctica. Hay que dominar muchos detalles, que en el caso del C pasarían por librerías, como interactuar con hardware, acceso directo a memoria… es un lenguaje de bajo nivel que accede directamente al hardware en algunos casos, y eso lo hace complejo.

Y por cierto si hablamos de C++ aunque aunque C++ se basa en C ( digamos que es la versión orientada a objetos de C y por tanto mucho mas poderoso) , C++ puede ser aun mas difícil de dominar debido a su compleja sintaxis y la gestión manual de memoria:

  1. Sintaxis Compleja: C++ tiene una sintaxis más compleja debido a sus características avanzadas como la programación orientada a objetos, la sobrecarga de operadores y las plantillas.
  2. Gestión de Memoria: Aunque ambos lenguajes requieren gestión manual de memoria, C++ introduce conceptos adicionales como constructores, destructores y el uso de new y delete, lo que añade una capa extra de complejidad
  3. Características Avanzadas: C++ incluye muchas características avanzadas que no están presentes en C, como la herencia múltiple y las excepciones, lo que puede ser abrumador para los principiantes.

Por cierto Arduino se programa principalmente en C y C++. De hecho, el entorno de desarrollo integrado (IDE) de Arduino está diseñado específicamente para facilitar la escritura de código en estos lenguajes, adaptándolos a las necesidades de las placas Arduino.

2024 04 06 20 52 20 arduino   Buscar con Google y 5 páginas más   Personal  Microsoft​ Edge

Ensamblador

Digamos ensamblador. Este lenguaje de bajo nivel requiere un conocimiento profundo del hardware y es conocido por ser muy detallado y específico. Es un lenguaje muy simple, imperativo y… poco mas. No tiene tipos de datos y en algunos aspectos es extremadamente simple. Pero es realmente complicado de usar. Estás usando las instrucciones de la CPU directamente. Solo puedes trabajar en binario e incluso cosas que das por supuestas en otros lenguajes como muchas operaciones matemáticas, aquí se hacen codificándolas desde cero. Incluso, ni que decir que si quieres usar decimales, tendrás que tratarlos como bytes de datos.

Hace falta un extenso conocimiento de librerías, hardware y otras cosas complicaditas para usar ese lenguaje debidamente.

Ahora veremos lo opuesto, un lenguaje estructurado, tipado fuerte y… jodido o no.

programacion   Buscar con Google y 2 páginas más   Personal  Microsoft​ Edge

Java

Digamos Java o alguno similar. Lenguajes orientados totalmente al objeto. Tipado fuerte y con una cantidad de abstracción bastante elevada.

Aquí la cosa es «mas fácil» en algunos aspectos, y muy complicada en otros. Hay que aprender y no hablo de conocer la definición, sino saber como se usan montones de conceptos que son propios de este tipo de lenguajes.

Cosas como encapsulado, interfaces, objetos, métodos… conceptos abstractos que se usan en este tipo de programación y que si no tienes muy claro, te darán auténticos quebraderos de cabeza. Cosas que pueden hacer la construcción de grandes programas fácil, pero que hacen innecesariamente complicado el hacer cosas pequeñas. Mucha gente se frustra con esto, no digamos ya con el manejo de errores a base de excepciones que hay que tratar.

Es un lenguaje complejo de aprender, mas que nada por la cantidad de conceptos abstractos que son raros para el que no los usa, pero que son esenciales para este tipo de programación. Incluso su descripción suena rara.

Este tipo de abstracciones y herramientas, no aparecen en otros lenguajes que a veces se consideran «mas difíciles». Ojo con lo que quieres, puede que lo consigas.

javabuild

Mas rarezas de lenguajes Haskell.. Malbolge y muchos mas

Haskell

Este lenguaje basado en el cálculo lambda y en la teoría de tipos, funcional es famoso por su curva de aprendizaje empinada debido a su sintaxis abstracta y su enfoque en la inmutabilidad y las funciones de orden superior. Haskell se destaca por su capacidad para expresar ideas abstractas y su énfasis en la inmutabilidad y la programación declarativa.

Haskell es un lenguaje de programación funcional conocido por su sintaxis concisa y su enfoque en la declaración de qué debe hacerse en lugar de cómo hacerlo paso a paso. Aunque su curva de aprendizaje puede ser empinada debido a su sistema de tipos sofisticado y su paradigma funcional puro, ofrece grandes ventajas como código más confiable, conciso y elegante. Es ideal para aplicaciones que requieren un alto nivel de abstracción y precisión, como en el ámbito matemático y científico.

Los principales desafíos al aprender Haskell incluyen su sintaxis abstracta, la necesidad de un cambio de mentalidad para pensar en términos funcionales y la complejidad de su sistema de tipos. Sin embargo, con dedicación y los recursos adecuados, es posible dominar este lenguaje y aprovechar sus beneficios. La comunidad de Haskell es muy activa y dispuesta a ayudar a quienes están empezando.

Prolog

Prolog (Programming in Logic) es un lenguaje de programación lógica que resuelve problemas aplicando reglas lógicas. A diferencia de los lenguajes imperativos, Prolog se enfoca en la declaración de hechos y reglas, lo que permite expresar problemas de manera más natural. Los principales desafíos al aprender Prolog incluyen:

  • Cambio en la forma de pensar y resolver problemas.
  • Complejidad en el proceso de resolución de consultas.
  • Adaptación al paradigma de programación lógica.

Rust

Desarrollado por Mozilla Research, Rust es conocido por su seguridad y rendimiento. Su sistema de tipos estáticos y gestión de memoria sin errores lo hacen ideal para software de alto rendimiento y sistemas embebidos. Los desafíos de Rust incluyen:

  • Complejidad del sistema de tipos estáticos.
  • Enfoque riguroso en la seguridad que puede ralentizar el desarrollo.
  • Necesidad de aprender nuevas técnicas de programación.

Lisp

Lisp (List Processing) es uno de los lenguajes más antiguos y desafiantes. Ha influido en muchos lenguajes modernos como Clojure. Los desafíos de Lisp incluyen:

  • Sintaxis basada en paréntesis.
  • Enfoque en la programación funcional.

Brainfuck

Brainfuck, creado en 1993 por Urban Müller, es un lenguaje minimalista con solo ocho comandos. Es un verdadero desafío debido a su:

  • Sintaxis inusual y minimalista.
  • Falta de estructuras familiares.
  • Necesidad de codificar cada operación explícitamente.

Malbolge

Malbolge es un lenguaje esotérico diseñado para ser extremadamente difícil de programar. Sus desafíos incluyen:

  • Diseño oscuro y confuso.
  • Técnicas de programación altamente inusuales.

¿Muy bien ..pero cuál es el lenguaje de programación más fácil de aprender?

En mi opinión, los lenguajes mas sencillos son los interpretados, con tipado débil y paradigma imperativo. Si esto te suena a chino, a ver que expliquemos:

  • Interpretados son los lenguajes que escribes en un editor, y luego se ejecutan en un intérprete que va línea por línea ejecutando los comandos. Si hay un error, se detiene en la línea donde aparece ese error y te informa de ello.
  • Tipado débil quiere decir que las variables se declaran de manera simple, sin importar el tipo de dato que contengan.
  • Paradigma imperativo es el paradigma mas antiguo, se indica línea por línea lo que queremos que haga ese programa.

Ojo, un lenguaje puede tener esas características, y no ser fácil de dominar. Aquí deberíamos de aclarar un punto, y es que consideras fácil, y que consideras difícil. Aprender a usar un lenguaje como digamos Python, Basic.. es sencillo. Dominarlo no tanto.

  • Python es ampliamente considerado uno de los lenguajes «más fáciles de aprender» para principiantes. Su sintaxis es clara y concisa, similar al lenguaje natural, lo que facilita su comprensión. Además, cuenta con una gran comunidad y una amplia variedad de bibliotecas que lo hacen muy versátil.
  • JavaScript también es una excelente opción, especialmente si estás interesado en el desarrollo web. Aunque puede tener algunas particularidades, su popularidad y la gran cantidad de recursos disponibles hacen que sea un lenguaje muy accesible.
  • Ruby es otro lenguaje conocido por su sintaxis elegante y su enfoque en la productividad. Es una buena opción para aquellos que buscan un lenguaje que les permita escribir código de manera rápida y eficiente.

Otros lenguajes considerados fáciles para principiantes incluyen:

  • Visual Basic: Con un entorno de desarrollo visual intuitivo, es ideal para aquellos que se inician en la programación.
  • PHP: Ampliamente utilizado para el desarrollo web, es relativamente fácil de aprender y tiene una sintaxis similar a C.

¿Y cuales son los lenguajes de programación más utilizados?

El lenguaje de programación más utilizado varía según el contexto y el ámbito de aplicación. Sin embargo, algunos lenguajes destacan en diversas encuestas y rankings:

  1. JavaScript: Dominante en el desarrollo web frontend, es esencial para crear la parte interactiva de las páginas web. También se usa en el backend con frameworks como Node.js.
  2. Python: Con una sintaxis sencilla y legible, es ideal para una amplia gama de aplicaciones, incluyendo desarrollo web, ciencia de datos, machine learning e inteligencia artificial.
  3. Java: Un lenguaje robusto y versátil, ampliamente utilizado en aplicaciones empresariales, desarrollo de Android y sistemas embebidos.
  4. C#: Desarrollado por Microsoft, es popular para aplicaciones de escritorio, desarrollo de juegos (con Unity) y aplicaciones web con .NET.
  5. C++: Ofrece un gran control sobre el hardware, siendo utilizado en desarrollo de sistemas, videojuegos y aplicaciones de alto rendimiento.

Otros Lenguajes Populares

  • SQL: Específico para la gestión de bases de datos relacionales.
  • PHP: Muy utilizado en el desarrollo web backend.
  • Go: Desarrollado por Google, es eficiente y moderno, ideal para sistemas distribuidos y aplicaciones de red.
  • Swift: El principal lenguaje para desarrollar aplicaciones iOS y macOS.
  • R: Utilizado en análisis estadístico y visualización de datos.

Estos lenguajes son fundamentales en sus respectivos campos y ofrecen diversas ventajas según las necesidades del proyecto.

image 20
Quizás en resumen no sean tan importante elegir un lenguaje u otro según cual sea el mas usado o la dificultad o no de este sino mas bien a que se adapte a una tarea o problema especifico que necesitemos abordar…