Etiqueta: IDE

  • Controlar un ESP32 (o esp8266) con Android utilizando AppInventor2

    Controlar un ESP32 (o esp8266) con Android utilizando AppInventor2

    App Inventor 2 es una plataforma en línea de código abierto que permite crear aplicaciones para dispositivos Android sin necesidad de conocimientos avanzados de programación. F

    App Inventor 2 fue desarrollado por Google y posteriormente transferido al MIT (Instituto Tecnológico de Massachusetts).

    Para este proyecto se creará una aplicación en App Inventor que se conecte a un slider a través de Bluetooth y lo controle desde un dispositivo programado con Arduino IDE

    Aplicación en App Inventor que se conecte a un slider a través de Bluetooth y se controle desde un dispositivo Arduino con un ESP32, puedes seguir estos pasos generales:

    Lado de la Aplicación en App Inventor:

    1. Crear la Interfaz Gráfica:

    2. Comienza un nuevo proyecto

    3. Componentes Bluetooth: Añadir el componente Bluetooth al diseño.

    4. Configurar Bluetooth:

    • Configurar el componente Bluetooth para buscar dispositivos y establecer la conexión.
    1. Programar la Interacción con el Slider:
      • Programar la lógica que enviará los datos del slider a través de Bluetooth al dispositivo Arduino cuando se modifique su valor.
    2. Manejar la Conexión y Desconexión:
      • Implementar lógica para gestionar la conexión y desconexión con el dispositivo Bluetooth.
    3. Diseñar la Interfaz de Usuario:
      • Diseñar la interfaz de usuario para mostrar el estado de la conexión y otra información relevante.

    En la pantalla de diseño, agrega un componente Slider desde la paleta de componentes.

    
    
    Manejo del Slider y envío de datos:
    
    En el bloque "BluetoothClient1.SendText", el valor del slider se convierte a una cadena (Text), ya que el módulo Bluetooth envía datos como texto.
    
    Asegúrate de configurar correctamente el BluetoothClient1.Address con la dirección Bluetooth de tu dispositivo.
    
    Conecta tu dispositivo Android a tu Arduino mediante Bluetooth.
    

    Lado del Dispositivo Arduino (ESP32):

    1. Preparar todo para poder configurar el ESP32 con Arduino IDE.
    2. Programar la Lógica del Arduino Controlar el Slider (recibir datos)
      • Escribe un programa para el ESP32 que escuche los datos enviados por la aplicación a través de Bluetooth.
      • Implementa la lógica que ajustará el valor del slider según los datos recibidos a través de Bluetooth.

    Controlar un slider en App Inventor 2 y enviar los datos al ESP32 a través de Bluetooth

    Asegurarse tener un módulo Bluetooth conectado al microcontrolador.

    // Importar la librería para el módulo Bluetooth
    #include <SoftwareSerial.h>
    
    SoftwareSerial BTSerial(10, 11); // RX, TX
    
    void setup() {
      Serial.begin(9600);
      BTSerial.begin(9600);
    }
    
    void loop() {
      if (BTSerial.available()) {
        int valor = BTSerial.parseInt();
        if (valor >= 0 && valor <= 255) {
          // Aquí puedes utilizar el valor recibido como desees
          analogWrite(9, valor); // Por ejemplo, controlar un LED con el valor del slider
        }
      }
    }
    

    Este código utiliza la librería SoftwareSerial para comunicarse con el módulo Bluetooth en los pines 10 y 11. Luego, lee el valor entero enviado desde la aplicación y lo utiliza para controlar un LED conectado al pin 9 (se puede ajustar esto según tu configuración).

  • Medición de pulso cardíaco con Sensor AD8232 y Arduino IDE

    El AD8232 es un pequeño chip que se utiliza para medir la actividad eléctrica del corazón.

    Esta es la experiencia de ayudar a montar un sistema básico de monitorización cardíaca usando el sensor AD8232 y un entorno Arduino IDE. Veremos desde la configuración del hardware y la lectura de la señal ECG hasta los pasos para filtrar y visualizar el pulso en tiempo real. El objetivo es ofrecer una guía práctica, apta tanto para quien se inicia en electrónica biomédica como para quienes buscan incorporar un pequeño proyecto de pulso a sus aplicaciones IoT.

    El AD8232 es un pequeño chip que se utiliza para medir la actividad eléctrica del corazón. Se buscará registrar la actividad eléctrica como un ECG o electrocardiograma. La electrocardiografía se utiliza para ayudar a diagnosticar diversas afecciones cardíacas, así como aprender más del corazón y hasta para armar detectores de mentiras.

    Según su datasheet, “La potencia, el tamaño y el nivel de integración resultantes permiten a los diseñadores desarrollar dispositivos de monitorización cardíaca y de frecuencia cardíaca para su uso fuera de entornos de cuidados intensivos en áreas como la gestión de la salud personal y la monitorización remota de la salud.”

    NOTA: Este dispositivo no está diseñado para diagnosticar o tratar ninguna condición.

    Entendiendo el ECG

    En términos generales, veamos qué representa un ECG y cómo podemos detectarlo. El ECG se divide en dos intervalos básicos, el intervalo PR y el intervalo QT, que se describen a continuación.

    Sistema de conducción eléctrica del corazón: 1. Nodo SA; 2. Nódulo AV.

    El corazón tiene cuatro cámaras: dos aurículas y dos ventrículos, izquierdos y derechos. La aurícula derecha recibe la sangre venosa del cuerpo y la envía al ventrículo derecho el cual la bombea a los pulmones, lugar en el que la sangre se oxigena y libera dióxido de carbono (CO2) y del que pasa a la aurícula izquierda. De aquí la sangre se deriva al ventrículo izquierdo, de donde se distribuye, al contraerse éste, a todo el cuerpo y regresa a la aurícula derecha cerrando el ciclo cardíaco.

    Fuente de todo el contenido sobre el corazón: Wikipedia

    Antes de sumergirnos en los detalles de la señal ECG, conviene recordar que la calidad de la medición depende en gran medida de una correcta colocación de los electrodos y de un adecuado filtrado del ruido. Asegúrate de mantener los cables lo más cortos posible y de trabajar en un entorno con mínimas interferencias eléctricas. Además, el sensor AD8232 incorpora detectores de “leads-off” (LO+ y LO–) que nos ayudarán a verificar si la piel y los electrodos están en buen contacto antes de empezar la lectura.

    Actividad eléctrica del corazón

    Intervalo PR

    El intervalo PR es la onda inicial generada por un impulso eléctrico que viaja desde la aurícula derecha hacia la izquierda. La aurícula derecha es la primera cámara en ver un impulso eléctrico. Este impulso eléctrico hace que las cámaras se “despolaricen”. Esto lo obliga a contraerse y drenar la sangre desoxigenada de la vena cava superior e inferior hacia el ventrículo derecho. A medida que el impulso eléctrico viaja a través de la parte superior del corazón, hace que la aurícula izquierda se contraiga. La aurícula izquierda es responsable de recibir sangre recién oxigenada desde los pulmones hacia el ventrículo izquierdo a través de las venas pulmonares izquierda y derecha. Las venas pulmonares están rojas en el diagrama porque transportan sangre oxigenada. Todavía se les llama venas porque las venas llevan la sangre hacia el corazón. ¡Ciencia!

    Intervalo QT El Intervalo QT

    El QRS es un proceso complejo que genera el “bip” característico en los monitores cardíacos. Durante QRS ambos ventrículos comienzan a bombear. El ventrículo derecho comienza a bombear sangre desoxigenada hacia los pulmones a través de las arterias pulmonares izquierda y derecha. Las arterias pulmonares son azules en el diagrama porque transportan sangre desoxigenada. Todavía se les llama arterias porque las arterias llevan la sangre fuera del corazón. ¡Ciencia, otra vez! El ventrículo izquierdo también comienza a bombear sangre recién oxigenada a través de la aorta y hacia el resto del cuerpo. Después de la contracción inicial viene el segmento ST. El segmento ST es bastante silencioso eléctricamente, ya que es el momento en que los ventrículos esperan ser “repolarizados”. Finalmente, la onda T se hace presente para “re-ploarizar” activamente o relajar los ventrículos. Esta fase de relajación reinicia los ventrículos para ser llenados nuevamente por las aurículas.

    Conexión de AD8232 con Microcontrolador:

    Prueba con Arduino IDE

    Conexión del hardware

    En este texto, se conectará el AD8232 a un microcontrolador Arduino Uno y a un módulo ESP32 con pantalla OLED. ¡Construiremos un monitor cardíaco simple que le permitirá medir la actividad eléctrica del corazón en tiempo real!

    Prueba con Arduino Uno

    Arduino Uno original (usado para este proyecto)

    Prueba con ESP32 + OLED

    Para una cómoda representación del pulso

    También probaré el ECG con un ESP32 que cuenta con una pantalla integrada.

    Conexión de pines

    El monitor de frecuencia cardíaca AD8232 cuenta con nueve conexiones desde el IC. Estos pines provienen de los pines en el IC, pero en realidad son agujeros a los que puede soldar cables o pines de cabecera.

    Conectaremos cinco de los nueve pines de la placa Arduino y al ESP32 respectivamente. Los cinco pines que necesita están etiquetados GND, 3.3v, OUTPUT, LO- y LO+.

    Board LabelFunciónConexión Uno/ESP32
    GNDGroundGND
    3.3v3.3v Power Supply3.3v
    OUTPUTOutput SignalA0
    LO-Leads-off Detect –11
    LO+Leads-off Detect +10
    SDNShutdownNo usado

    Conexión del Sensor AD8232 con Arduino Uno (Atmega328P), ESP8266 y ESP32

    AD8232Atmega328PESP8266ESP32
    OUTPUTA5A023
    LO+21
    LO-32
    3.3V3.33.33.3
    GNDGNDGNDGND

    Código Para compilar Atmega 328P – Medición de pulso cardíaco:

    // Previous values
    int val;
    float lowPass1;
    float highPass1;
    float rawSignal, rawSignal1, rawSignal2, rawSignal3;
    int threshold1;
    long bpm;
    unsigned long t1, t2;
    unsigned long milliseconds;
    
    // -------- Functions --------- //
    static inline void initTimer(void) {
      /*Write code to initialize Timer 1*/
      TCNT1 = 65223; //  preload timer 65536-16MHz/256/200Hz (sampling frequency of the ECG)
      TCCR1B |= (1 << CS12); // prescaler value of 256
      TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
    }
    
    static inline void initIOPorts(void) {
      /*Write code to initialize the GPIO ports (pins) that you need*/
      DDRB = 0b00100000;
    }
    
    static inline void initADC(void) {
      /*Write code to initialize the ADC*/
      ADMUX |= (1 << REFS0); // reference voltage on ADC as AVcc
      ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADC clock prescaler of 128
      ADCSRA |= (1 << ADATE); // Enables ADC auto trigger
      ADCSRB |= (1 << ADTS2) | (1 << ADTS1); // ADC triggers when Counter1 overflows
      ADCSRA |= (1 << ADIE); // ADC interrupts enabled
      ADCSRA |= (1 << ADEN); // enable ADC
      ADCSRA |= (1 << ADSC); // start ADC conversion
    }
    
    void tiempo(void);
    
    // ------ Interrupt Service Routine ------ //
    ISR(TIMER1_OVF_vect) {
      /*This is the interrupt service routine for Timer 1 Overflow*/
      PORTB ^= 0b00100000;
      TCNT1 = 65223;   // preload timer
      rawSignal = analogRead(A0);
      tiempo();
      val = 1;
    }
    
    ISR(ADC_vect) {
      /*This is the interrupt service routine for the ADC
         It is executed when the ADC completes a conversion.
      */
      if (ADC > 512) // turn LED on or off
      {
        PORTB = 0b00100000;
        // measure();
    
      }
      else
        PORTB = 0b00000000;
    
      rawSignal = ADC; //Store the ADC value in the variable ECG_rawsignal
      val = 1;
    }
    
    void tiempo(void) {
      static int counter;
      static int counter2;
      static long segundos;
      counter++;
      //Contador de segundos /////////////////////////////////////////////////////
      if (counter > 200) {
        counter = 0;
        segundos++;
        // Serial.print("***************************** Segundos de ejecición: ");
        // Serial.print(segundos);
        // Serial.println(" segundos *****************************");
      }
    
      /////////////////////////////////// Contador de milliseconds ///////////////
      milliseconds = milliseconds + 5;
    
    
    }
    
    boolean serialMonitor = 0;
    
    unsigned long lastMillisBpm[] = {0, 0, 0, 0, 0}; //A cuántos millis se detectó beat
    
    unsigned long lastTimeBeat[] = {0, 0, 0, 0, 0}; //Tiempo entre pulso y pulso
    
    int main(void) {
    
    
      Serial.begin(115200); //Sets the data rate bits/s for serial data submission
    
      pinMode(LED_BUILTIN, OUTPUT);
    
      noInterrupts(); //Disable interrupts
      initIOPorts(); //Initiate GPIO module
      initTimer(); // Initiate timer module
      initADC(); //Initiate ADC module
      interrupts(); //Enable interrupts
    
      while (1) {
    
        Serial.flush(); //Waits for the transmission of outgoing serial data to complete
        if (val == 1) { //Tests if val is equal to 1
          // Filtered signal calculation
    
          float highPass = -0.5096 * rawSignal - 0.6456 * rawSignal1 + 0.6456 * rawSignal2 + 0.5096 * rawSignal3;
          float lowPass = 0.91 * lowPass1 + 0.045 * highPass + 0.045 * highPass1;
    
          // Comparison with threshold
          int threshold;
          if (lowPass < 0) lowPass = -lowPass; // Calculates the module
          if (lowPass > 10) threshold = 400;
          else threshold = 0;
    
    
          // Print the values on serial plotter/
    
          if (serialMonitor) {
    
    
            Serial.print(rawSignal);
            Serial.print(",");
            Serial.print(highPass);
            Serial.print(",");
            Serial.print(lowPass);
            Serial.print(",");
            Serial.print(threshold);
            Serial.print(",");
            Serial.println(bpm);
            //  Serial.print(",");
            //  Serial.println(milliseconds);
          }
          //   if ()
    
          rawSignal1 = rawSignal;
          rawSignal2 = rawSignal1;
          rawSignal3 = rawSignal2;
          highPass1 = highPass;
          lowPass1 = lowPass;
    
          static int QRS = 0;
          static int j = 0;
    
          if (threshold == 400) {
            if (!QRS) {
    
              int k = j - 1;
              if (k < 0) k = 4;
    
              if ( milliseconds > lastMillisBpm[k] + 300 ) {
    
                //Rutina de detección
                QRS = 1;
                if (!serialMonitor)Serial.print("QRS complex detected");
                lastMillisBpm[j] = milliseconds;
    
                //Compara los ultimos 2
                long lastTime = lastMillisBpm[k] - lastMillisBpm[j] ;
                if (lastTime > 300 && lastTime < 1200) {
                  lastTimeBeat[k] = lastTime;
                }
    
                int nuevosBpm=600000/lastTime;
    
                j++;
    
    
              }
              else
              {
                if (!serialMonitor)Serial.println("Discard the pulse");
              }
    
    
    
    
    
    
    
              if (j > 5) j = 0;
            }
            else {
              //There was a pulse
    
    
    
            }
    
            digitalWrite(LED_BUILTIN, HIGH);
          }
          else
            QRS = 0;
          digitalWrite(LED_BUILTIN, LOW);
    
    
          long testPulse = lastMillisBpm[2] - lastMillisBpm[1];
    
          bpm = 60000 / (testPulse);
          if (!serialMonitor) Serial.print(testPulse);
          if (!serialMonitor) Serial.print(",");
          if (!serialMonitor) Serial.println(bpm);
    
    
    
          ///////////////////////////////////////////Serial.println("bpm" + bpm);
    
          threshold1 = threshold;
          val = 0;
        }
      }
      return 0; /* This line is never reached */
    }
    

    Ahora la detección de pulsaciones:

    Con este montaje y el código de ejemplo ya puedes capturar y procesar tu pulso cardíaco en tiempo real. Como siguiente paso, podrías mejorar la visualización integrando una pantalla OLED o enviando los datos a una plataforma web (por ejemplo, usando MQTT o HTTP). Asimismo, explorar ajustes de filtro más avanzados o implementar detección automática de arritmias te permitirá convertir este prototipo en una herramienta aún más potente para proyectos de salud conectada.

  • Placa OLED TTGO LoRa32 SX1276

    LoRa es una tecnología inalámbrica versátil y eficiente en energía que se utiliza comúnmente en aplicaciones de IoT, seguimiento remoto y comunicaciones de larga distancia. Su capacidad para alcanzar distancias significativas con bajo consumo de energía la hace adecuada para una variedad de casos de uso en los que se requiere una conectividad inalámbrica confiable y de bajo costo.

    TTGO LoRa32 SX1276 OLED es una placa de desarrollo ESP32 con un chip LoRa integrado y una pantalla OLED SSD1306 de 0,96 pulgadas. En esta guía, le mostraremos cómo: enviar y recibir paquetes LoRa (comunicación punto a punto) y usar la pantalla OLED con Arduino IDE.

    Utilizando Arduino IDE para la comunicación LoRa y la pantalla OLED SSD1306 de 0,96 pulgadas. Asegúrate de que ya tengas Arduino IDE instalado en tu computadora antes de empezar.

    Paso 1: Preparación del Hardware

    Asegurarse de que la placa TTGO LoRa32 SX1276 OLED esté correctamente conectada al ordenador a través de un cable USB.

    Paso 2: Instalación del Soporte de ESP32 en Arduino IDE

    1. Abrir Arduino IDE.
    2. “Archivo” -> “Preferencias”.
    3. En la sección “URLs adicionales de tarjetas de gestor de tarjetas”, agregar la siguiente URL, clic en
    1. https://dl.espressif.com/dl/package_esp32_index.json
    2. “Herramientas” -> “Placa” -> “Gestor de tarjetas…”
    3. Busca “esp32” e instala el soporte para ESP32 de Espressif.

    Paso 3: Instalación de las Bibliotecas Necesarias

    Para utilizar LoRa y la pantalla OLED, se debe instalar las siguientes bibliotecas:

    1. Biblioteca ESP32 LoRa: “Herramientas” -> “Gestor de Bibliotecas…”, buscar “ESP32 LoRa”. Instala la biblioteca proporcionada por Sandeep Mistry.
    2. Biblioteca Adafruit SSD1306: “Herramientas” -> “Gestor de Bibliotecas…”, buscar “Adafruit SSD1306”. Instalar la biblioteca de Adafruit.

    Paso 4: Código de Ejemplo para la Comunicación LoRa

    A continuación, un ejemplo de código básico para enviar y recibir datos LoRa entre dos placas TTGO LoRa32 SX1276 OLED.

    #include <Wire.h>
    #include <Adafruit_SSD1306.h>
    #include <SPI.h>
    #include <LoRa.h>
    
    #define OLED_RESET    -1
    #define SCREEN_WIDTH  128
    #define SCREEN_HEIGHT 64
    
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    void setup() {
      if (!LoRa.begin(433E6)) {
        Serial.println("Error initializing LoRa.");
        while (1);
      }
    
      display.begin(SSD1306_I2C_ADDRESS, OLED_RESET);
      display.display();
      delay(2000);
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(0, 0);
      display.print("LoRa Sender");
      display.display();
      delay(2000);
    }
    
    void loop() {
      display.clearDisplay();
      display.setCursor(0, 0);
      display.print("Sending LoRa...");
      display.display();
    
      // Enviar un mensaje
      LoRa.beginPacket();
      LoRa.print("¡Hola, mundo!");
      LoRa.endPacket();
      delay(10000); // Esperar 10 segundos antes de enviar el siguiente mensaje
    }
    

  • ¿Cómo programar CHIPS?

    ¿Cómo programar CHIPS?

    “Arduino IDE” es un programa de código abierto que se utiliza como herramienta para la programación de microcontroladores

  • ESP32 / ESP8266 Escribir en una Base de datos MySQL usando PHP y Arduino IDE

    Este artículo pretende explicar cómo conectar un módulo con un ESP32/ESP8266 a un servidor WEB que reciba los datos.

    El microcontrolador será el cliente de una “página WEB”, accederá con información a un vínculo para insertar información en una Base de Datos

    Actualizado: 2/7/2025

    CONTEXTO

    Insertar datos directamente en una base MySQL desde un microcontrolador resulta sencillo, pero puede presentar riesgos de seguridad y escalabilidad. Como alternativa, se puede usar una API REST o un broker MQTT. Este artículo muestra un enfoque con PHP y HTTP, con medidas básicas de protección.

  • Cómo medir temperatura y humedad con Arduino y los sensores DHT11-DHT22

    Cómo medir temperatura y humedad con Arduino y los sensores DHT11-DHT22

    Medir la temperatura y la humedad es una tarea común en muchos proyectos de electrónica y automatización del hogar. En este tutorial, te mostraré cómo utilizar Arduino en combinación con los sensores de temperatura y humedad DHT11 y DHT22 para obtener lecturas precisas de estos parámetros ambientales. Estos sensores son ampliamente utilizados debido a su costo asequible, su facilidad de uso y su precisión razonable.

    Materiales necesarios:

    • Placa de desarrollo tipo (por ejemplo, Arduino UNO)
    • Sensor DHT11 o DHT22
    • Resistencia de 10k ohmios
    • Protoboard o breadboard
    • Cables de conexión

    Paso 1: Conexiones eléctricas Conecta el sensor DHT11 o DHT22 a la placa Arduino según el siguiente esquema:

    • Conecta el pin de datos del sensor (generalmente marcado como “out” o “data”) al pin digital 2 de Arduino.
    • Conecta la alimentación del sensor (VCC) al pin de 5V de la placa de desarrollo.
    • Conecta el pin de tierra del sensor (GND) al pin GND del circuito.
    • Si se está utilizando el sensor DHT22, conectar una resistencia de 10k ohmios entre el pin de datos y el pin de alimentación (VCC).

    Paso 2: Código de programación Abre el entorno de desarrollo de Arduino IDE y crea un nuevo proyecto. Asegúrate de tener instalada la biblioteca “DHT” en tu entorno. Luego, copia y pega el siguiente código:

    #include <DHT.h>
    
    #define DHTPIN 2 // Pin digital al que está conectado el sensor
    #define DHTTYPE DHT11 // Si utilizas el DHT22, cambia esta línea por DHT22
    
    DHT dht(DHTPIN, DHTTYPE);
    
    void setup() {
      Serial.begin(9600);
      dht.begin();
    }
    
    void loop() {
      float humidity = dht.readHumidity();
      float temperature = dht.readTemperature();
    
      if (isnan(humidity) || isnan(temperature)) {
        Serial.println("Error al leer el sensor DHT!");
        return;
      }
    
      Serial.print("Humedad: ");
      Serial.print(humidity);
      Serial.print("% - Temperatura: ");
      Serial.print(temperature);
      Serial.println("°C");
    
      delay(2000); // Espera 2 segundos antes de tomar la siguiente lectura
    }
    
    

    Paso 3: Compilar y cargar el programa Verifica que la placa Arduino esté conectada correctamente a tu computadora y selecciona el tipo de placa y puerto en el entorno de Arduino. Luego, compila y carga el programa en la placa.

    Paso 4: Verificación y lecturas Una vez cargado el programa, abre el monitor serial en el entorno de Arduino. Deberías comenzar a ver las lecturas de temperatura y humedad que se actualizan cada 2 segundos.

    Conclusión: En este tutorial, aprendiste cómo utilizar Arduino y los sensores DHT11 y DHT22 para medir la temperatura y la humedad ambiental. Puedes utilizar esta información para una amplia gama de proyectos, como sistemas de monitoreo climático, control de invernaderos, etc.