Taula de continguts:

IDE Arduino amb doble nucli: control remot: 8 passos
IDE Arduino amb doble nucli: control remot: 8 passos

Vídeo: IDE Arduino amb doble nucli: control remot: 8 passos

Vídeo: IDE Arduino amb doble nucli: control remot: 8 passos
Vídeo: Amazing arduino project 2024, De novembre
Anonim
Image
Image
Demostració
Demostració

Aquest vídeo tracta sobre "multi". Ens ocupem de multitarea, multicore i multiclients. Fa un temps, vaig fer un control remot amb dos ESP: un client i un punt d’accés. Basat en això, avui crearem un servidor multiclient. Això significa que tindrem diversos clients connectats en un únic ESP.

Per tant, avui la lliçó implica la creació d’un servidor a ESP32, l’addició de nous clients al bucle i la gestió de les sol·licituds en un altre nucli. Els clients enviaran informació sobre el canvi d'estat dels seus pins i el servidor reproduirà aquests canvis d'estat.

Pas 1: demostració

Pas 2: muntatge del servidor

Servidor de muntatge
Servidor de muntatge

Pas 3: Muntatge del client

Muntatge de clients
Muntatge de clients

Pas 4: Flux: servidor

Flow: servidor
Flow: servidor

Pas 5: Flux: client

Flux: client
Flux: client

Pas 6: Client.ino

Declaracions i variables

#include // Dados da rede // Deve ser giual no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Objecte que faré una connexió amb el servidor WiFiClient client; // Struct que define os dados que vamos enviar (deve ser igual no server) typedef struct {int number; estat int; } Pin; // Quantidad de pinos que iremos ler e enviar o status #define PIN_COUNT 2 // Array com os pinos definidos // No caso vamos trabalhar com os 21 e 19 mas você pots alterar para os pinos que desejar Pin pins [PIN_COUNT] = { {.number = 21}, {.number = 19}};

Configuració

configuració nul·la () {Serial.begin (115200); // Temps per considerar una connexió com a pèrdua client.setTimeout (5000); // Connecteu-vos a WiFi i connecteu-vos al servidor setupWiFi (); connectClient (); per a (int i = 0; i

Configuració de WiFi

void setupWiFi () {Serial.print ("Connexió a" + cadena (SSID)); // Connecta't a rede WiFi criado pelo outro ESP WiFi.begin (SSID, PASSWORD); // Esperem connectar while (WiFi.status ()! = WL_CONNECTED) {Serial.print ("."); retard (500); } // Se chegou aqui està connectat a rede WiFi Serial.println (); Serial.println ("Connectat!"); }

ConnectClient

void connectClient () {Serial.println ("Connectant client"); // Esperem connectar-se amb el servidor mentre (! Client.connect (WiFi.gatewayIP (), SERVER_PORT)) {Serial.print ("."); retard (500); } // Es va arribar aqui està connectat amb el servidor Serial.println (); Serial.println ("El client està connectat!"); }

Bucle

void loop () {// No es connecta a WiFi, es connecta si (WiFi.status ()! = WL_CONNECTED) {setupWiFi (); }}

HandleConnection

void handleConnection (void * pvParameters) {// IMPORTANTE: A tarefa no can terminar, deve ficar presa em um loop infinito while (true) {// Se não estiver connectado com o server, mandamos connectar if (! client.connected ()) {connectClient (); } // Para cada pino, verificamos se mudou o estado. Se mudou enviamos for o server o novo state 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 .number); // Se o estado do pino for diferente if (pins .status! = PinStatus) {// Guardamos o novo estado e retornamos true pins .status = pinStatus; tornar cert; } // Sóc arribará aqui se o estado não foi alterado // Então retornamos falso return false; }

sendPinStatus

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

Pas 7: Server.ino

Declaracions i variables

#include #include // Dados da rede // Deve ser igual no Client #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Criamos um server na porta definida per 'SERVER_PORT' WiFiServer server (SERVER_PORT); // Vector onde vamos adicionar os clients conforme ellos forem conectando std:: vector clients; // Struct que define os dados que vamos enviar (deve ser igual no client) typedef struct {int number; estat int; } Pin;

Configuració

configuració nul·la () {Serial.begin (115200); // Criamos a rede WiFi i iniciamos o server setupWiFi (); server.begin (); xTaskCreatePinnedToCore (handleClients, // Funció que serà executada "handleClients", // Nome da tarefa 10000, // Tamanho da pilha NULL, // Parámetro da tarefa (no caso no usamos) 2, // Prioritat da tarefa NULL, // Cas queria mantenir uma referência para a tarefa que vai ser criada (no caso no precisamos) 0); // Número do core que serà executat a tarefa (usamos o core 0 para o loop ficar livre com o core 1)}

Configuració de Wi-Fi

void setupWiFi () {// Coloca aquest ESP com a punt d'accés WiFi.mode (WIFI_AP); // SSID i Senha per connectar-se a aquest ESP WiFi.softAP (SSID, PASSWORD); }

Bucle

void loop () {// Verifica se un cliente nuevo está intentando conectar WiFiClient client = servidor.available (); // Se sim colocamos ele no vector if (client) {clients.push_back (client); }}

HandleClients

void handleClients (void * pvParameters) {// IMPORTANTE: A tarefa no can terminar, deve ficar presa em a loop infinito while (true) {// Per a cada client que no tenim vector per (int i = 0; i

Pas 8: fitxers

Descarregueu els fitxers

PDF

INO

Recomanat: