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

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 (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).

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. Abrir 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. Se 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.

Publicado el 3 comentarios

Typedef Struct

En C, el Typedef Struct es una característica que permite definir tipos de datos personalizados y estructuras de datos para organizar y manipular información de manera más eficiente y legible. Esta característica utiliza la palabra clave typedef junto con la palabra clave struct para definir una estructura con nombre propio.

Una estructura (struct) es un tipo de dato que permite agrupar diferentes variables bajo un solo nombre. Cada variable dentro de la estructura se llama «miembro» y puede ser de diferentes tipos, como enteros, flotantes, arreglos u otras estructuras. La idea detrás de las estructuras es crear un tipo de dato personalizado que contenga varios campos relacionados.

Supongamos se desea representar la información de una persona con su nombre, edad y número de identificación. Primero, se define el Typedef Struct en el área de declaraciones globales del código:

typedef struct {
  char nombre[50]; // Cadena de caracteres para el nombre
  int edad;        // Entero para la edad
  long int id;     // Entero largo para el número de identificación
} Persona;

En este ejemplo, se ha creado un Typedef Struct llamado Persona, que contiene tres miembros: nombre (una cadena de caracteres de hasta 50 caracteres), edad (un número entero) e id (un número entero largo).

Ahora se puede usar esta definición de estructura para crear variables de tipo Persona y acceder a sus miembros:

void setup() {
  Serial.begin(9600);

  // Crear una variable de tipo Persona
  Persona persona1;

  // Asignar valores a los miembros de la estructura
  strcpy(persona1.nombre, "Juan");
  persona1.edad = 30;
  persona1.id = 1234567890;

  // Mostrar la información en el monitor serial
  Serial.print("Nombre: ");
  Serial.println(persona1.nombre);
  Serial.print("Edad: ");
  Serial.println(persona1.edad);
  Serial.print("ID: ");
  Serial.println(persona1.id);
}

void loop() {
  // Nada aquí
}

En este código de ejemplo, hemos creado una variable persona1 de tipo Persona y luego hemos asignado valores a sus miembros. Finalmente, imprimimos la información en el monitor serial.

Publicado el Deja un comentario

Utilización de #define en el Preprocesador de la IDE

El preprocesador es una herramienta que se encarga de realizar ciertas tareas antes de que el código sea compilado. Su función principal es procesar las directivas del preprocesador, que son instrucciones que comienzan con el símbolo #, como #include, #define, #ifdef, entre otras.

#define

#define mantiene un conjunto caracteres definidos, algunos de ellos deben ser sustituidos por sus valores equivalentes. Proporciona un mecanismo por el que una parte de código de un programa se puede mostrar u ocultar dependiendo del valor de alguno de los caracteres definidos con la directiva

#define.

En este ejemplo, la construcción es la siguiente:

#define PEPE

void setup() {

  Serial.begin(115200);

#ifdef PEPE
  Serial.print("Bienvenido al sistema PEPE\n");
#else
  Serial.print("Bienvenido al otro sistema\n");
#endif

}

void loop() {

}