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

El ESP 32

El ESP32 es el potente chip IoT de Espressif System. Con núcleos duales de 160 MHz, 4 MB de memoria flash, 520 KB de RAM y abundantes periféricos como WiFi y Bluetooth, proporciona una plataforma de procesamiento de alta capacidad que rivaliza incluso con las placas Linux de nivel básico.

A pesar de su potencia, el ESP32 está diseñado para programarse utilizando el conocido IDE de Desarrollo. Esto permite a los desarrolladores aprovechar el rendimiento del ESP32 sin dejar de utilizar la amplia gama de biblioteca. No es necesario sumergirse en una programación compleja de bajo nivel.

Se puede programar desde Drone que recorra los cielos o una:

Máquina Encapsuladora de Café

(Trabajo hecho en 2018)

Electrónica y programación para prototipo con ESP32, LCD, Controladoras de Motor paso a paso y transistor para motor DC y resistencia de sellado.


Control de potencia: Mosfet IRLB3034