Tabla de contenido:

Arduino IDE con doble núcleo: control remoto: 8 pasos
Arduino IDE con doble núcleo: control remoto: 8 pasos

Video: Arduino IDE con doble núcleo: control remoto: 8 pasos

Video: Arduino IDE con doble núcleo: control remoto: 8 pasos
Video: Cómo programar ESP8266 con el IDE de Arduino 2024, Mes de julio
Anonim
Image
Image
Demostración
Demostración

Este video trata sobre "múltiples". Estamos tratando con multitarea, multinúcleo y multiclientes. Hace un tiempo hice un control remoto con dos ESP: un cliente y un punto de acceso. En base a esto, hoy configuraremos un servidor multicliente. Esto significa que tendremos varios clientes conectados en un solo ESP.

Por lo tanto, la lección de hoy involucra la creación de un servidor en ESP32, la adición de nuevos clientes en el bucle y el manejo de las solicitudes en otro núcleo. Los clientes enviarán información sobre el cambio de estado de sus pines y el servidor reproducirá estos cambios de estado.

Paso 1: demostración

Paso 2: Montaje del servidor

Servidor de montaje
Servidor de montaje

Paso 3: ensamblaje del cliente

Asamblea del cliente
Asamblea del cliente

Paso 4: Flujo - Servidor

Flujo - Servidor
Flujo - Servidor

Paso 5: Flujo - Cliente

Flujo - Cliente
Flujo - Cliente

Paso 6: Client.ino

Declaraciones y variables

#include // Dados da rede // Deve ser giual no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Objeto que vai fazer a conexão com o server WiFiClient client; // Estructura que define los datos que vamos a enviar (deve ser igual sin servidor) typedef struct {int number; estado int; }Alfiler; // Quantidade de pinos que iremos ler e enviar o status #define PIN_COUNT 2 // Array com os pinos definidos // No vamos trabalhar com os 21 e 19 mas você pode alterar for os pinos que desejar Pin pins [PIN_COUNT] = { {.number = 21}, {.number = 19}};

Configuración

configuración vacía () {Serial.begin (115200); // Tempo para considerar una conexión como perdida client.setTimeout (5000); // Conectamos a WiFi e conectamos ao configuración del servidorWiFi (); connectClient (); para (int i = 0; i

Configurar WiFi

void setupWiFi () {Serial.print ("Conectando a" + Cadena (SSID)); // Conectamos a red WiFi criado pelo outro ESP WiFi.begin (SSID, CONTRASEÑA); // Esperamos conectar while (WiFi.status ()! = WL_CONNECTED) {Serial.print ("."); retraso (500); } // Se chegou aqui está conectado à rede WiFi Serial.println (); Serial.println ("¡Conectado!"); }

ConnectClient

void connectClient () {Serial.println ("Cliente de conexión"); // Esperamos conectar com o servidor while (! Client.connect (WiFi.gatewayIP (), SERVER_PORT)) {Serial.print ("."); retraso (500); } // Se chegou aqui está conectado com o server Serial.println (); Serial.println ("¡Cliente conectado!"); }

Círculo

bucle void () {// Si no está conectado a WiFi, mandamos conectar if (WiFi.status ()! = WL_CONNECTED) {setupWiFi (); }}

HandleConnection

void handleConnection (void * pvParameters) {// IMPORTANTE: A tarefa não pode terminar, deve ficar presa em um loop infinito while (true) {// Se no estiver conectado com o servidor, mandamos conectar if (! client.connected ()) {connectClient (); } // Para cada pino, verificamos se mudou o estado. Se mudou enviamos para o server o novo estado for (int i = 0; i

hasPinStatusChanged

// Verifica se o estado do pino na posição 'i' do array mudou // Retorna 'true' se mudou ou 'false' caso contrário boolean hasPinStatusChanged (int i) {// Faz a leitura do pino int pinStatus = digitalRead (pins .número); // Se o estado do pino for diferente if (pins .status! = PinStatus) {// Guardamos o novo estado e retornamos true pins .status = pinStatus; devuelve verdadero; } // Só chegará aqui se o estado não foi alterado // Então retornamos falso return false; }

sendPinStatus

// Envia para o servidor os dados do pino na posição 'i' do arrayvoid sendPinStatus (int i) {client.write ((uint8_t *) & pins , sizeof (Pin)); cliente.flush (); }

Paso 7: Server.ino

Declaraciones y variables

#include #include // Dados da rede // Deve ser igual no Client #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Criamos un servidor en un puerto definido por 'SERVER_PORT' WiFiServer server (SERVER_PORT); // Vector onde vamos a adicionar los clientes conforme eles forem conectando std:: vector clients; // Estructura que define los datos que vamos a enviar (deve ser igual sin cliente) typedef struct {int number; estado int; }Alfiler;

Configuración

configuración vacía () {Serial.begin (115200); // Criamos a red WiFi e iniciamos o server setupWiFi (); server.begin (); xTaskCreatePinnedToCore (handleClients, // Função que será ejecutada "handleClients", // Nome da tarefa 10000, // Tamanho da pilha NULL, // Parâmetro da tarefa (no caso não usamos) 2, // Prioridade da tarefa NULL, // Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos) 0); // Número do core que será ejecutada a tarefa (usamos o core 0 para o loop ficar livre com o core 1)}

ConfiguraciónWiFi

void setupWiFi () {// Coloca este ESP como punto de acceso WiFi.mode (WIFI_AP); // SSID e Senha para se conectarem a este ESP WiFi.softAP (SSID, PASSWORD); }

Círculo

void loop () {// Verifica si novo client está intentando conectar WiFiClient client = server.available (); // Se sim colocamos ele ningún vector if (cliente) {clientes.push_back (cliente); }}

Manejar Clientes

void handleClients (void * pvParameters) {// IMPORTANTE: A tarefa não pode terminar, deve ficar presa em um loop infinito while (true) {// Para cada cliente que temos no vector for (int i = 0; i

Paso 8: archivos

Descarga los archivos

PDF

INO

Recomendado: