Índice:

Arduino IDE com Dual Core: Controle remoto: 8 etapas
Arduino IDE com Dual Core: Controle remoto: 8 etapas

Vídeo: Arduino IDE com Dual Core: Controle remoto: 8 etapas

Vídeo: Arduino IDE com Dual Core: Controle remoto: 8 etapas
Vídeo: Beyond the Basics: Automatic Gatekeeper With IR Sensor And ChatGPT Generated Arduino Code 2024, Novembro
Anonim
Image
Image
Demonstração
Demonstração

Este vídeo é sobre “multi”. Estamos lidando com multitarefa, multicores e multiclients. Há um tempo atrás fiz um controle remoto com dois ESPs: um cliente e um ponto de acesso. Com base nisso, hoje vamos configurar um servidor multicliente. Isso significa que teremos vários clientes conectados em um único ESP.

Assim, a lição de hoje envolve a criação de um servidor no ESP32, a adição de novos clientes no loop e o tratamento das solicitações em outro núcleo. Os clientes enviarão informações sobre a mudança de estado de seus pinos e o servidor reproduzirá essas mudanças de estado.

Etapa 1: Demonstração

Etapa 2: Montagem do servidor

Servidor de Montagem
Servidor de Montagem

Etapa 3: Montagem do cliente

Montagem do Cliente
Montagem do Cliente

Etapa 4: Fluxo - Servidor

Fluxo - Servidor
Fluxo - Servidor

Etapa 5: Fluxo - Cliente

Fluxo - Cliente
Fluxo - Cliente

Etapa 6: Client.ino

Declarações e variáveis

#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 servidor WiFiClient client; // Struct que define os dados que vamos enviar (deve ser igual no servidor) typedef struct {int number; status interno; }Alfinete; // Quantidade 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ê pode alterar para os pinos que desejar Pin pins [PIN_COUNT] = { {.number = 21}, {.number = 19}};

Configurar

void setup () {Serial.begin (115200); // Tempo para considerar uma conexão como perdida client.setTimeout (5000); // Conectamos à rede WiFi e conectamos ao servidor setupWiFi (); connectClient (); para (int i = 0; i

Configurar WiFi

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

ConnectClient

void connectClient () {Serial.println ("Conectando cliente"); // Esperamos conectar com o servidor while (! Client.connect (WiFi.gatewayIP (), SERVER_PORT)) {Serial.print ("."); atraso (500); } // Se chegou aqui está conectado com o servidor Serial.println (); Serial.println ("Cliente conectado!"); }

Ciclo

void loop () {// Se não estiver conectado à rede 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 não estiver conectado com o servidor, mandamos conectar if (! client.connected ()) {connectClient (); } // Para cada pino, verificamos se mudou o estado. Se mudou enviamos para o servidor o novo estado para (int i = 0; i

hasPinStatusChanged

// Verifica se o estado do pino na posição 'i' do array mudou // Retorna 'verdadeiro' se mudou ou 'falso' caso contrário boolean hasPinStatusChanged (int i) {// Faz a leitura do pino int pinStatus = digitalRead (pins .number); // Se o estado do pino para diferente if (pins .status! = PinStatus) {// Guardamos o novo estado e retornamos true pins .status = pinStatus; return true; } // 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)); client.flush (); }

Etapa 7: Server.ino

Declarações e variáveis

#include #include // Dados da rede // Deve ser igual no Cliente #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Criamos um servidor na porta definido por 'SERVER_PORT' servidor WiFiServer (SERVER_PORT); // Vector onde vamos adicionar os clientes conforme eles são conectando std:: vector clients; // Struct que define os dados que vamos enviar (deve ser igual no client) typedef struct {int number; status interno; }Alfinete;

Configurar

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

SetupWiFi

void setupWiFi () {// Coloca este ESP como Access Point WiFi.mode (WIFI_AP); // SSID e Senha para se conectar a este ESP WiFi.softAP (SSID, PASSWORD); }

Ciclo

void loop () {// Verifica se um novo cliente está tentando se conectar WiFiClient client = server.available (); // Se sim colocamos ele no vetor if (client) {clients.push_back (client); }}

HandleClients

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

Etapa 8: Arquivos

Baixe os arquivos

PDF

EU NÃO

Recomendado: