Inhoudsopgave:

Arduino IDE met Dual Core: afstandsbediening - Ajarnpa
Arduino IDE met Dual Core: afstandsbediening - Ajarnpa

Video: Arduino IDE met Dual Core: afstandsbediening - Ajarnpa

Video: Arduino IDE met Dual Core: afstandsbediening - Ajarnpa
Video: #168 ESP32 Dual Core on Arduino IDE including Data Passing and Task Synchronization 2024, November
Anonim
Image
Image
Demonstratie
Demonstratie

Deze video gaat helemaal over "multi". We hebben te maken met multitasking, multicores en multiclients. Een tijdje geleden heb ik een afstandsbediening gemaakt met twee ESP's: een client en een toegangspunt. Op basis hiervan zullen we vandaag een multiclient-server opzetten. Dit betekent dat we meerdere clients hebben die zijn verbonden in één ESP.

De les van vandaag omvat dus het maken van een server in ESP32, het toevoegen van nieuwe clients in de lus en het afhandelen van de verzoeken in een andere kern. Clients sturen informatie over de statusverandering van hun pinnen en de server zal deze statusveranderingen reproduceren.

Stap 1: Demonstratie

Stap 2: Server koppelen

Montageserver
Montageserver

Stap 3: Clientassemblage

Client montage
Client montage

Stap 4: Flow - Server

Stroom - Server
Stroom - Server

Stap 5: Flow - Klant

Stroom - Klant
Stroom - Klant

Stap 6: Client.ino

Declaraties en variabelen

#include //Dados da rede //Ontwerp ser giual no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 //Objeo wat kan worden gekoppeld aan een server WiFiClient-client; //Struct que definition os dados que vamos enviar (deve ser igual no server) typedef struct {int number; int-status; }Pin; //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 en 19 mas você pode alterar para os pinos que desejar Pin pins [PIN_COUNT] = { {.getal = 21}, {.getal = 19} };

Opstelling

void setup(){ Serial.begin(115200); //Tempo voor rekening van een conexão como perdida client.setTimeout (5000); //Verbinding maken met wifi en verbinding met oa server setupWiFi(); connectClient(); for(int i=0; i

Wifi instellen

void setupWiFi(){ Serial.print("Verbinding maken met " + String (SSID)); //Conectamos à rede WiFi criado pelo outro ESP WiFi.begin (SSID, PASWORD); // Esperamos conectar while (WiFi.status() != WL_CONNECTED) { Serial.print("."); vertraging (500); } //Zorg voor verbinding met WiFi Serial.println(); Serial.println("Verbonden!"); }

ConnectClient

void connectClient(){ Serial.println("Verbindende client"); // Esperamos conectar com o server while (!client.connect(WiFi.gatewayIP(), SERVER_PORT)) {Serial.print("."); vertraging (500); } //Zorg voor een goede verbinding met de server Serial.println(); Serial.println ("Cliënt verbonden!"); }

Lus

void loop(){ //Se não estiver conectado à rede WiFi, mandamos conectar if(WiFi.status()!= WL_CONNECTED) { setupWiFi(); } }

HandvatVerbinding

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

hasPinStatusChanged

//Verifica se o estado do pino na posição 'ik' do array mudou //Retorna 'true' se mudou ou 'false' caso contrário boolean hasPinStatusChanged (int i) {//Faz a leitura do pino int pinStatus = digitalRead (pinnen .nummer); //Se o estado do pino for diferente if(pins.status!= pinStatus) {//Guardamos o novo estado en retornamos true pins.status = pinStatus; retourneer waar; } //Só chegará 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 'ik' do arrayvoid sendPinStatus(int i) { client.write((uint8_t*)&pins, sizeof(Pin)); cliënt.flush(); }

Stap 7: Server.ino

Declaraties en variabelen

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

Opstelling

void setup(){ Serial.begin(115200); //Criamos a rede WiFi en 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 usamos) 2, //Prioridade daULL Caso queria manter uma referência para a tarefa que vai ser criada (no caso não precisamos) 0); // Numero do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1)}

Wifi instellen

void setupWiFi () {// Coloca este ESP como Access Point WiFi.mode (WIFI_AP); //SSID en verbinding maken met ESP WiFi.softAP (SSID, WACHTWOORD); }

Lus

void loop () { // Verificatie van de nieuwe client is gekoppeld aan WiFiClient client = server.available (); //Se sim colocamos ele geen vector if (client) { clients.push_back (client); } }

Klanten behandelen

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

Stap 8: Bestanden

Download de bestanden

PDF

INO

Aanbevolen: