Publicado el Deja un comentario

Sensor PIR: Detectar movimiento / Leer una Entrada Digital

Un Sensor PIR, o Sensor de Infrarrojos Pasivos por sus siglas en inglés (Passive Infrared Sensor), es un tipo de sensor electrónico que detecta la radiación infrarroja. Estos sensores se utilizan comúnmente en aplicaciones de detección de movimiento, como sistemas de seguridad, control de iluminación y puertas automáticas. La característica «pasiva» de estos sensores radica en que no emiten energía por sí mismos; en cambio, detectan la radiación infrarroja emitida o reflejada por objetos en su campo de visión.

Principio de Detección

Los sensores PIR detectan cambios en la radiación infrarroja dentro de su rango de detección. Los seres humanos y otros animales de sangre caliente emiten radiación infrarroja, y el sensor puede detectar variaciones en esta radiación a medida que los objetos se mueven dentro de su campo de visión.

Material Piroeléctrico

Los sensores PIR utilizan un material piroeléctrico, el cual genera un voltaje cuando se expone a cambios rápidos de temperatura. Este material suele estar hecho de una sustancia cristalina que tiene la propiedad de generar una carga eléctrica en respuesta a cambios de temperatura.

Diseño

Detección con Dos Elementos

Los sensores PIR suelen constar de dos mitades o elementos. Cada mitad se encarga de detectar la radiación infrarroja de una zona específica en el campo de visión del sensor. La diferencia en la salida de estos dos elementos se utiliza para determinar si hay un cambio en el patrón de radiación infrarroja, indicando movimiento.

Lente de Fresnel:

  • La lente de Fresnel es una lente delgada y plana que se utiliza para enfocar la radiación infrarroja en los elementos sensoriales del PIR.
  • Su función principal es mejorar la sensibilidad y precisión del sensor PIR al dirigir la radiación infrarroja hacia los elementos detectores. También ayuda a ampliar el área de detección del sensor.
  • Se encuentran con variedad de diseños, como segmentos o anillos concéntricos, para optimizar la detección en diferentes direcciones.

Conexión a un microcontrolador:

Conectar el Sensor PIR al Microcontrolador:

  • VCC (Alimentación): Conectar al pin de alimentación del microcontrolador (por ejemplo, 5V en placa tipo Wemos D1 Mini).
  • GND (Tierra): Conectar al pin de tierra (GND) del microcontrolador.
  • OUT (Salida de señal): Conectar al pin de entrada/salida digital del microcontrolador (por ejemplo, un pin digital en un microcontrolador).

Algunos sensores PIR también pueden tener pines adicionales, como ajustes de sensibilidad o retardo.

Código para Compilar IDE de Desarrollo

El siguiente código es uno de los más simples para corroborar el correcto funcionamiento del sensor.

int pirPin = 2;  // El PIN de Señal

void setup() {
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
}

void loop() {
  int pirValue = digitalRead(pirPin);
  Serial.println(pirValue);
  delay(1000);  // Espera 1 segundo antes de realizar la próxima lectura
}

Observar la Salida

Abrir el Monitor Serie para ver la salida. Debería verse «1» cuando se detecte movimiento y «0» cuando no haya movimiento.

Publicado el 1 comentario

Sensor DHT11 y DHT22: Medir temperatura y humedad

¿Qué son los sensores DHT11 y DHT22?

Dichos sensores, el DHT11 y el DHT22 (o AM2302) son modelos de una familia de sensores de medición simultánea de temperatura y humedad.

Estos sensores disponen de un procesador interno que realiza el proceso de la medición, proporcionando la medición mediante una señal digital, por lo que es sencillo obtener la medición desde un microcontrolador como un Atmega 328P o un ESP32

Ambos sensores presentan una carcasa plástica similar. Se pueden diferencia ambos modelos por el color del mismo. El DHT11 presenta una carcasa azul, mientras que en el caso del sensor DHT22 el exterior es blanco.

DHT11 es el sensor más básico, y cuenta con características técnicas más básicas. Tiene mayor precisión y rango de temperatura (fundamental para medir la humedad ambiente por encima del 80%), pero a un costo económico mayor.

Las características del DHT11 son realmente escasas, especialmente en rango de medición y precisión.

  • Medición de temperatura entre 0 a 50, con una precisión de 2ºC
  • Medición de humedad entre 20 a 80%, con precisión del 5%.
  • Frecuencia de muestreo de 1 muestras por segundo (1 Hz)

El modelo DHT22 tiene unas características relativamente muy superiores (según aplicaciones en entornos comunes):

  • Medición de temperatura entre -40 a 125 ºC, con una precisión de 0.5ºC
  • Medición de humedad entre 0 a 100%, con precisión del 2-5%.
  • Frecuencia de muestreo de 2 muestras por segundo (2 Hz)

EL DHT22 (sin llegar a ser un sensor de alta precisión) tiene cualidades que suelen ser más útiles para emplearlo en proyectos reales de monitorización o registro, que requieran una precisión convencional.

/*
Ejemplo de sketch de prueba para varios sensores de humedad/temperatura DHT



Biblioteca de sensores DHT: https://github.com/adafruit/DHT-sensor-library
Biblioteca Adafruit Unified Sensor: https://github.com/adafruit/Adafruit_Sensor
*/

#include "DHT.h"
#define DHTPIN 2     // Conectar el sensor a este pin


/*
Conectar una resistencia de 10K desde el pin 2 (datos) al pin 1 (alimentación) del sensor
Inicializa el sensor DHT.
enga en cuenta que las versiones anteriores de esta biblioteca tomaron un tercer parámetro opcional para
ajusta los tiempos para procesadores más rápidos. Este parámetro ya no es necesario
a medida que el algoritmo de lectura DHT actual se ajusta para funcionar en procesos más rápidos.

*/


DHT dht(DHTPIN, DHTTYPE);

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)


void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}
Publicado el 1 comentario

Código para conectar dos ESP32 por Wi-Fi (Sin router de por medio)

Servidor:

#include <WiFi.h>
const char* ssid = "Nombre_Red_Servidor";
const char* password = "Contraseña_Servidor";
WiFiServer server(80);
int buttonPin = 5;
int buttonState = 0;
void setup() {
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
  // Configurar el ESP32 como un punto de acceso
  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  server.begin();
  Serial.println("Server started");
}
void loop() {
  WiFiClient client = server.available();
  if (client) {
    //Serial.println("New client connected");
    while (client.connected()) {
      // Leer el estado del botón
      buttonState = 99;
      //String response = String(buttonState) + "," + String(analogRead(A0)) + "," + String(random(100));
      //client.println(response);
      if (client.available()) {
        String request = client.readStringUntil('\r');
        Serial.print("Client says: ");
        Serial.print(request);
        Serial.print(", ");
        int b = request.length();
        //Serial.print("b=");
        //Serial.println(b);
        if (b > 2) {
          int value1 = request.substring(0, request.indexOf(',')).toInt();
          request = request.substring(request.indexOf(',') + 1);
          int value2 = request.toInt();
          Serial.print("Received values from client: ");
          Serial.print(value1);
          Serial.print(", ");
          Serial.println(value2);
        }
      }
      //////// cada 3 segundos envia
      static unsigned long a;
      if (millis() > a + 5000) {
        a = millis();
        // Enviar dos variables simuladas al servidor
        int value1 = 2; // Valor simulado 1
        int value2 = 4; // Valor simulado 2
        int value3 = 6; // Valor simulado 2
          String response = String(value1) + "," + String(value2)+ "," + String(value3);
        //String response = String(buttonState) + "," + String(analogRead(A0)) + "," + String(random(100));
        Serial.print("Sending response: ");
        Serial.println(response);
        client.println(response);
        client.stop();
      }
    }
    //Serial.println("Client disconnected");
  }
}

Cliente:

#include <WiFi.h>
const char* ssid = "Nombre_Red_Servidor"; // Reemplaza con el SSID de tu red
const char* password = "Contraseña_Servidor"; // Reemplaza con la contraseña de tu red
const char* serverIP = "192.168.4.1"; // Reemplaza con la dirección IP del servidor
const int serverPort = 80;
void setup() {
  Serial.begin(115200);
  Serial.println("Conectándose a la red WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Conectado a la red WiFi. Dirección IP: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  // Simular dos valores enteros para enviar al servidor
  int value1 = 1; // Valor simulado 1 (número aleatorio entre 0 y 9)
  int value2 = 3; // Valor simulado 2 (número aleatorio entre 0 y 99)
  // Construir la solicitud al servidor en el formato "value1,value2"
  String request = String(value1) + "," + String(value2);
  Serial.print("Enviando solicitud al servidor: ");
  Serial.println(request);
  // Establecer la conexión con el servidor
  WiFiClient client;
  if (client.connect(serverIP, serverPort)) {
    // Enviar la solicitud al servidor
    client.println(request);
    // Esperar la respuesta del servidor
    String response = client.readStringUntil('\r');
    Serial.print("Respuesta del servidor: ");
    Serial.println(response);
    
    // Si necesitas utilizar los valores de la respuesta separados por comas, puedes hacerlo de la siguiente manera:
    int serverValue1 = response.substring(0, response.indexOf(',')).toInt();
    response = response.substring(response.indexOf(',') + 1);
    int serverValue2 = response.substring(0, response.indexOf(',')).toInt();
    //response = response.substring(response.indexOf(',') + 1);
    //int serverValue3 = response.toInt();
    Serial.print("Valores recibidos del servidor: ");
    Serial.print(serverValue1);
    Serial.print(", ");
    Serial.print(serverValue2);
    //Serial.print(", ");
    //Serial.println(serverValue3);
  }
  
  // Esperar 5 segundos antes de enviar una nueva solicitud
  delay(5000);
}
Publicado el 1 comentario

La diferencia entre struct y typedef struct.

En lenguaje C y C++, una estructura (struct) es un tipo de dato que te permite combinar diferentes variables de tipos distintos en una sola entidad. Por ejemplo, puedes tener una estructura llamada «Punto» que almacene las coordenadas x e y.

Ejemplo de estructura:

struct Punto {
    int x;
    int y;
};

Luego, para usar esta estructura y declarar variables de tipo «Punto», normalmente deberías hacerlo así:

struct Punto miPunto;
miPunto.x = 10;
miPunto.y = 5;

La palabra clave struct debe ir antes del nombre de la estructura cada vez que declares una variable.

Sin embargo, si usas «typedef struct», puedes crear un nuevo nombre para esta estructura. Esto te permite omitir la palabra clave struct al declarar variables de esa estructura.

Ejemplo con «typedef struct»:

typedef struct {
    int x;
    int y;
} Punto;

Punto miPunto;
miPunto.x = 7;
miPunto.y = 3;

La diferencia entre «struct» y «typedef struct» es cómo declaras variables de ese tipo de estructura. Con «typedef struct», puedes crear un alias para la estructura y usar ese alias directamente sin necesidad de escribir la palabra struct.

Publicado el 1 comentario

Utilización de Estructuras struct{};

Así como las matrices permiten definir el tipo de variables que pueden contener varios elementos de datos del mismo tipo, ee manera similar, las Estructuras son otro tipo de datos definido por el usuario que permite combinar elementos de datos de diferentes tipos.

En C, las estructuras son una colección de variables agrupadas por conveniencia.

En C++ son lo mismo que una clase excepto que los miembros de la estructura son públicos por defecto.

struct pcb
{
  String model ; // Nombre del modelo
  int npd ;       // Numero de pines digitales
  int npa ;       // Numero de pines analogicos
  float volt ;    // Tension de funcionamiento
} ;

void setup() {

  Serial.begin(115200);
  pcb PLACA_UNO_R3;

  // Asignación de valores
  PLACA_UNO_R3.model = "uno" ;
  PLACA_UNO_R3.npd = 13 ;
  PLACA_UNO_R3.npa = 5 ;
  PLACA_UNO_R3.volt = 5.0F ;

  // Lectura de valores
  int numpd = PLACA_UNO_R3.npd ;
  float voltage = PLACA_UNO_R3.volt ;

  Serial.print("\nVoltaje: ");
  Serial.println(voltage);
  
  Serial.print("Numero de pines digitales: ");
  Serial.println(numpd);
  
  Serial.print("Numero de pines analogicos: ");
  Serial.println(PLACA_UNO_R3.npa);  
    
  Serial.print("Modelo de PCB: ");
  Serial.println(PLACA_UNO_R3.model);

}

void loop() {

}
Publicado el 3 comentarios

Utilizar ambos núcleos de un ESP32

FreeRTOS (Free Real-Time Operating System) es un sistema operativo de tiempo real de código abierto diseñado para sistemas embebidos y aplicaciones en tiempo real. Un sistema operativo es un software que administra los recursos del hardware y proporciona una interfaz para que las aplicaciones se ejecuten en un dispositivo, como un microcontrolador o microprocesador.

En el contexto de los microcontroladores, como el ESP32, los sistemas operativos en tiempo real (RTOS) como FreeRTOS son útiles para administrar tareas concurrentes que deben ejecutarse de manera independiente y en un orden específico. Esto permite que las tareas se ejecuten en paralelo y que el sistema pueda responder rápidamente a eventos en tiempo real.

Las tareas son como pequeños programas que se ejecutan de forma independiente y tienen su propia parte de la memoria (pila) para almacenar datos locales y trabajar en una tarea específica. Un RTOS permite que las tareas compartan el tiempo de ejecución del procesador, lo que permite una mejor utilización de los recursos del sistema.

En FreeRTOS, xTaskCreatePinnedToCore es una función utilizada para crear tareas que se ejecutarán en un núcleo de procesador específico en sistemas multi-núcleo, como el ESP32.

Se utiliza FreeRTOS para crear dos tareas: parpadearLedNucleo0 y parpadearLedNucleo1. Cada tarea controla un LED y los hace parpadear con diferentes intervalos de tiempo. Al usar FreeRTOS, estas tareas se pueden ejecutar en núcleos diferentes del ESP32, lo que permite que las tareas de parpadeo se realicen en paralelo sin bloquear la ejecución del programa principal.

FreeRTOS también proporciona mecanismos para sincronización y comunicación entre tareas, lo que permite que las tareas se comuniquen y cooperen en la resolución de problemas complejos.

const int ledPinNucleo0 = 2;
const int ledPinNucleo1 = 4;

void parpadearLedNucleo0(void *parameter) {
  (void)parameter; // Ignorar el parámetro, ya que no lo usamos en este ejemplo

  while (true) {
    digitalWrite(ledPinNucleo0, HIGH);
    Serial.println("LED Núcleo 0 encendido");
    delay(500);
    digitalWrite(ledPinNucleo0, LOW);
    Serial.println("LED Núcleo 0 apagado");
    delay(500);
  }
}

void parpadearLedNucleo1(void *parameter) {
  (void)parameter; // Ignorar el parámetro, ya que no lo usamos en este ejemplo

  while (true) {
    digitalWrite(ledPinNucleo1, HIGH);
    Serial.println("LED Núcleo 1 encendido");
    delay(300);
    digitalWrite(ledPinNucleo1, LOW);
    Serial.println("LED Núcleo 1 apagado");
    delay(300);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(ledPinNucleo0, OUTPUT);
  pinMode(ledPinNucleo1, OUTPUT);

  xTaskCreatePinnedToCore(parpadearLedNucleo0, "Nucleo 0 LED", 10000, NULL, 1, NULL, 0);
  xTaskCreatePinnedToCore(parpadearLedNucleo1, "Nucleo 1 LED", 10000, NULL, 1, NULL, 1);
}

void loop() {
  // Nada que hacer en loop, ya que las tareas se encargan del parpadeo de los LEDs
}

Con estos cambios, se mostrarán mensajes en el monitor serie cada vez que los LEDs cambien de estado, lo que te permitirá verificar el funcionamiento correcto del código y seguir el comportamiento de los LEDs. Recordar abrir el Monitor Serie en el IDE de Desarrollo / en un programa como PUTTY para ver los mensajes que se imprimen.

Publicado el Deja un comentario

Configurar HUE-CAM con Wi-Fi

Paso 1

Conectá HUE CAM a la corriente

Paso 2

Desde Android, Windows o iOS, ingresa a la configuración Wi-Fi y conéctate a la red Wi-Fi «GER.AR INGENIERÍA»

Paso 3
Ahora con tu dispositivo conectado por Wi-Fi a HUE-CAM, Se abrirá un Portal-Web que te llevará a la página de configuración.

Windows

Desde tu navegador WEB: Se abrirá una página de configuración:

En Setup: Se ingresarán los datos relativos a Telegram: Token e IDBot

En Configure WiFi: Se colocarán las credenciales de Wi-Fi de tu red

Publicado el Deja un comentario

Conectar HUE-CAM con Bot de Telegram

Paso 1 (Crear un nuevo TelegramBot)

Asegúrese de haber instalado Telegram en su teléfono o computadora portátil, luego, en la barra de búsqueda, busque @botfather.

Ingrese: /start

A continuación el Bot ofrecerá diferentes comandos.

Ingrese: /newbot

Ya se ha creado un nuebo bot! Ahora a hablar con él:

A continuación, solicitará el nombre de su nuevo Bot (que aparecerá luego como remitente en el chat )

En este caso, se escoge el nombre Test-cam

Elegido el nombre del Bot, pedirá un Usuario. Este debe ser único a nivel mundial. A veces hay que probar más que una vez.

Toma nota del número de API HTTP. Son 46 caracteres.

Ahora yendo al menú principal de Telegram, escriba en el buscador: IDBot

ingrese los comandos: /start y /getid

Con su número de ID para el Bot de Telegram, ya está todo listo para configurar la Cámara HUE CAM en la red Wi-Fi

Toma nota del número de IDBot. Son 10 caracteres numéricos.

Listo! Ya Tiene los dos datos que necesita para recibir Imágenes desde su HUE-CAM:

Telegram_token= «XXXXXXXXX-XXXXXXXXX-XXXXXXXXX-XXXXXXXXX-XXXXXX»

IDBot =»0123456789″

Publicado el Deja un comentario

SK6812

SK6812 es un conjunto de circuito de control inteligente y un circuito emisor de luz en una de las fuentes LED controladas. Cada elemento es un píxel, contenido dentro del circuito de amplificación de forma de señal de pestillo de datos de interfaz digital inteligente, circuito de fuente de alimentación, un circuito de corriente constante incorporado, oscilador RC de alta precisión, la salida es impulsada por tecnología PWM, garantiza efectivamente los píxeles en el color de la luz alta consistencia. Protocolo de datos usando el modo de comunicación unipolar NRZ, el píxel se restablece después del final de DIN, acepta los datos transmitidos desde el controlador a 24 bits, el primero en enviar datos por la primera extracción de píxel a píxel, pestillo de datos interno, los datos restantes después El circuito de procesamiento de plástico interno después de dar forma a la amplificación a través de la salida del puerto DO comenzó a girar a la siguiente cascada de píxeles, cada píxel a través de una señal de transmisión, reducir. El píxel que utiliza la tecnología de reenvío de forma automática hace que el número de cascadas sin límite de transmisión de señal del píxel, solo velocidad de transmisión de señal limitada. El LED tiene un bajo voltaje de conducción, protección ambiental y ahorro de energía, alto brillo, ángulo de dispersión, buena consistencia, baja potencia, larga vida útil, etc. El circuito de control está integrado en el LED anterior, circuito más simple, pequeño volumen, fácil instalación. Campo de aplicación principal: ● Guirnalda de luces LED a todo color, módulo LED a todo color, luces LED súper duras y suaves, tubo de barandilla LED, apariencia LED/iluminación de escena ● Punto de luz LED, pantalla de píxeles LED, pantalla con forma de LED, una variedad de productos electrónicos, equipos eléctricos, etc.