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 1 comentario

Funciones y métodos integrados en Arduino IDE

Cuando se trata de desarrollar proyectos electrónicos, Arduino IDE se ha convertido en una plataforma popular gracias a sus características únicas y su versatilidad. Además de su similitud con la sintaxis de C y C++, Arduino ofrece una serie de funciones y métodos específicos que permiten interactuar de manera eficiente con los componentes electrónicos. En este artículo, destacaremos algunas de las particularidades de Arduino y cómo aprovechar al máximo su potencial en tus proyectos.

Una de las grandes ventajas de Arduino IDE es la amplia variedad de bibliotecas predefinidas disponibles. Estas bibliotecas contienen funciones listas para usar que simplifican la interacción con dispositivos y módulos comunes. Al importar una biblioteca específica, se obtiene acceso instantáneo a métodos que facilitan tareas como leer sensores, controlar motores, comunicarse con pantallas y mucho más. La biblioteca estándar de Arduino es solo el comienzo; existen innumerables bibliotecas de terceros creadas por la comunidad Arduino que ofrecen aún más funcionalidades especializadas.

Además de las bibliotecas, Arduino también ofrece una serie de funciones y métodos integrados que son fundamentales para el desarrollo de proyectos electrónicos. Algunos ejemplos destacados son:

  1. digitalRead() y digitalWrite(): Estas funciones permiten leer y escribir valores digitales en los pines de Arduino. Son esenciales para interactuar con botones, interruptores y otros dispositivos que funcionan con señales digitales.
  2. analogRead() y analogWrite(): Arduino también cuenta con pines analógicos, y estas funciones permiten leer y escribir valores analógicos. Son especialmente útiles para trabajar con sensores de luz, temperatura y otros dispositivos que generan señales analógicas.
  3. Serial: Arduino tiene soporte para la comunicación serial, lo que permite establecer una conexión con otros dispositivos, como una computadora. La clase Serial ofrece métodos para enviar y recibir datos a través del puerto serie, lo que es esencial para la depuración y la interacción con otros sistemas.
  4. Wire: Esta biblioteca permite la comunicación I2C, un protocolo ampliamente utilizado para conectar múltiples dispositivos en un bus de dos hilos. Con los métodos proporcionados por la biblioteca Wire, es posible enviar y recibir datos entre Arduino y otros dispositivos compatibles con I2C.

Estas son solo algunas de las particularidades de Arduino que te permitirán aprovechar al máximo su potencial en tus proyectos. Explorar las bibliotecas, funciones y métodos específicos de Arduino te brindará un mayor control sobre tus componentes electrónicos y te permitirá crear proyectos más sofisticados. Además, no olvides que la comunidad Arduino es muy activa, por lo que siempre puedes buscar ejemplos, tutoriales y proyectos similares para inspirarte y aprender nuevas formas de utilizar Arduino en tus creaciones.

En conclusión, al destacar las particularidades de Arduino, como sus funciones y métodos específicos, los lectores podrán comprender mejor cómo aprovechar al máximo el potencial de Arduino en sus proyectos electrónicos. Explorar las bibliotecas predefinidas, aprender sobre las funciones integradas y estar al tanto de la comunidad Arduino te abrir

Publicado el 2 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. Recuerda que necesitarás abrir el Monitor Serie en el IDE de Arduino para ver los mensajes que se imprimen.

Publicado el Deja un comentario

Instalar Base de Datos MySQL en NodeRED + Raspberry Pi

Instalar una base de datos MySQL en Node-RED ejecutándose en una Raspberry Pi

1. Instalación MySQL Server en la Raspberry Pi:

En una terminal en Raspberry Pi y se ejecutan los siguientes comandos para instalar MySQL Server:

sudo apt update
sudo apt install mysql-server

2. Configurar MySQL:

Después de instalar MySQL, se puede ejecutar el siguiente comando para realizar la configuración inicial:

sudo mysql_secure_installation

Se siguen las instrucciones en pantalla para mejorar la seguridad de la instalación.

3. Instalación el nodo node-red-node-mysql:

cd ~/.node-red

npm install node-red-node-mysql

node-red-stop && node-red-start

Abre Node-RED en tu Raspberry Pi y dirígete a la pestaña de administración (generalmente http://tu_raspberry_pi:1880).

Haz clic en el menú en la esquina superior derecha y selecciona «Manage palette». En la pestaña «Install», busca node-red-node-mysql y haz clic en «Install».

4. Configurar el nodo MySQL en Node-RED:

Ahora, podrás utilizar el nodo MySQL en tus flujos de Node-RED. Conéctate al nodo configurándolo con los detalles de tu servidor MySQL, como la dirección IP, el puerto, el nombre de usuario y la contraseña.

5. Crear una base de datos y tablas:

Usa un cliente MySQL (como MySQL Workbench o la línea de comandos) para conectarte a tu servidor MySQL. Crea una base de datos y las tablas necesarias para tu aplicación.

Ejemplo en la línea de comandos:

Publicado el Deja un comentario

Sesiones en PHP

Una sesión es una forma de almacenar información (en variables) que se utilizará en varias páginas

A diferencia de una cookie, la información no se almacena en el equipo del usuario

¿Qué es una sesión PHP?



Cuando trabaja con una aplicación, la abre, hace algunos cambios y luego la cierra. Esto es muy parecido a una sesión. La computadora sabe quién eres. Sabe cuándo inicia la aplicación y cuándo finaliza. Pero en Internet hay un problema: el servidor web no sabe quién es usted ni qué hace, porque la dirección HTTP no mantiene el estado.

Las variables de sesión resuelven este problema almacenando la información del usuario que se utilizará en varias páginas (por ejemplo, nombre de usuario, color favorito, etc.). De forma predeterminada, las variables de sesión duran hasta que el usuario cierra el navegador.

Entonces; Las variables de sesión contienen información sobre un solo usuario y están disponibles para todas las páginas en una aplicación.

Iniciar una sesión de PHP


Se inicia una sesión con la función session_start ().

Las variables de sesión se establecen con la variable global de PHP: $ _SESSION.

Ahora, creemos una nueva página llamada «demo_session1.php». En esta página, iniciamos una nueva sesión de PHP y establecemos algunas variables de sesión:

Publicado el Deja un comentario

ESP8266 NodeMCU HTTP GET y HTTP POST con Arduino IDE (JSON, codificación de URL, texto)

El ESP8266 NodeMCU es una plataforma de desarrollo basada en el chip ESP8266, que permite la conexión a redes Wi-Fi y es muy utilizada para proyectos de Internet de las cosas (IoT).

Se pueden utilizar el Arduino IDE para programar el ESP8266 NodeMCU y realizar operaciones HTTP GET y POST. A continuación, ejemplos para ambas operaciones, incluyendo manejo de JSON y codificación de URL:

1. HTTP GET con ESP8266 NodeMCU:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char *ssid = "nombre_de_tu_wifi";
const char *password = "contraseña_de_tu_wifi";
const char *url = "http://ejemplo.com/api/data"; // Cambia esto por tu URL

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Conectando a WiFi...");
  }
  Serial.println("Conectado a WiFi");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;

    Serial.print("Realizando GET a: ");
    Serial.println(url);

    http.begin(url);

    int httpCode = http.GET();
    if (httpCode > 0) {
      String payload = http.getString();
      Serial.println("Respuesta del servidor:");
      Serial.println(payload);
    } else {
      Serial.print("Error en la conexión. Código de error: ");
      Serial.println(httpCode);
    }

    http.end();
  }

  delay(5000); // Espera 5 segundos antes de realizar la siguiente solicitud
}

2. HTTP POST con ESP8266 NodeMCU (enviando JSON):

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char *ssid = "nombre_de_tu_wifi";
const char *password = "contraseña_de_tu_wifi";
const char *url = "http://ejemplo.com/api/data"; // Cambia esto por tu URL

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Conectando a WiFi...");
  }
  Serial.println("Conectado a WiFi");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;

    Serial.print("Realizando POST a: ");
    Serial.println(url);

    http.begin(url);
    http.addHeader("Content-Type", "application/json");

    // Construye el objeto JSON
    String jsonPayload = "{\"sensor\": \"temperatura\",\"value\": 25.5}";

    int httpCode = http.POST(jsonPayload);
    if (httpCode > 0) {
      String payload = http.getString();
      Serial.println("Respuesta del servidor:");
      Serial.println(payload);
    } else {
      Serial.print("Error en la conexión. Código de error: ");
      Serial.println(httpCode);
    }

    http.end();
  }

  delay(5000); // Espera 5 segundos antes de realizar la siguiente solicitud
}

Se deben cambiar nombre_de_tu_wifi y contraseña_de_tu_wifi con los detalles de tu red Wi-Fi, y http://ejemplo.com/api/data con la URL a la que deseas hacer la solicitud. Además, puedes ajustar el contenido del JSON según tus necesidades en el ejemplo de POST.

Publicado el 3 comentarios

¿Cómo instalar la librería LiquidCrystal_I2C?

//Usamos la de Marco Schwartz

  1. En el programa Arduino IDE, abre el menú «Herramientas» (Tools).
  2. En el menú «Herramientas», selecciona «Gestor de bibliotecas» (Library Manager).
  3. En la ventana del «Gestor de bibliotecas», en el campo de búsqueda, escribir «LiquidCrystal_I2C» y presiona Enter.
  4. Debería verse la biblioteca «LiquidCrystal I2C» en los resultados de la búsqueda. Haz clic en el botón «Instalar» (Install) que se encuentra junto a la biblioteca.
  5. El Arduino IDE descargará e instalará la biblioteca automáticamente.
  6. Una vez que la instalación esté completa, se verá un mensaje que indica que la biblioteca se ha instalado con éxito.

Publicado el

Driver LED: BARRA con tecnología INDEXABLE

Este prototipo diseñado en Barcelona cuenta con sensoor de movimiento y control por ENCODER/DIAL retroiluminado

Ofrece respuesta interactiva y conexión con las de su tipo.

Deja una pregunta abierta ¿Por qué no?

No todo lo que es oro brilla. Y es que las lámparas en general parecieran brillar más que la calidad de su luz.

CHEBA fue diseñada para brillar por lo que tiene adentro.