Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-13 06:57
Ovaj video govori o "multi". Bavimo se multitaskingom, multi -core -om i multi -client -om. Prije nekog vremena napravio sam daljinski upravljač s dva ESP -a: klijentom i pristupnom točkom. Na temelju toga, danas ćemo postaviti višestruki poslužitelj. To znači da ćemo imati više klijenata povezanih u jednom ESP -u.
Dakle, današnja lekcija uključuje stvaranje poslužitelja u ESP32, dodavanje novih klijenata u petlji i rukovanje zahtjevima u drugoj jezgri. Klijenti će slati informacije o promjeni stanja svojih pinova, a poslužitelj će reproducirati te promjene stanja.
Korak 1: Demonstracija
Korak 2: Montiranje poslužitelja
Korak 3: Skupština klijenta
Korak 4: Tok - poslužitelj
Korak 5: Tok - klijent
Korak 6: Client.ino
Deklaracije i varijable
#include // Dados da rede // Deve serial no Server #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Objeto que vai fazer a conexão com or server WiFiClient client; // Struct que define os dados que vamos enviar (deve ser igual bez poslužitelja) 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 e 19 mas você pode alterar para os pinos que desejar Pin pins [PIN_COUNT] = { {.broj = 21}, {.broj = 19}};
Postaviti
void setup () {Serial.begin (115200); // Tempo para consurar a conexão como perdida client.setTimeout (5000); // Conectamos à rede WiFi i conectamos ao server setupWiFi (); connectClient (); za (int i = 0; i
Postavi WiFi
void setupWiFi () {Serial.print ("Povezivanje s" + niz (SSID)); // Conectamos à rede WiFi criado pelo out ESP WiFi.begin (SSID, PASSWORD); // Esperamos konektar while (WiFi.status ()! = WL_CONNECTED) {Serial.print ("."); kašnjenje (500); } // Se chegou aqui está conectado à rede WiFi Serial.println (); Serial.println ("Povezano!"); }
ConnectClient
void connectClient () {Serial.println ("Povezivanje klijenta"); // Esperamos conectar com o poslužitelju while (! Client.connect (WiFi.gatewayIP (), SERVER_PORT)) {Serial.print ("."); kašnjenje (500); } // Se chegou aqui está conectado com o poslužitelju Serial.println (); Serial.println ("Klijent povezan!"); }
Petlja
void loop () {// Se não estiver conectado à rede WiFi, mandamos conektar if (WiFi.status ()! = WL_CONNECTED) {setupWiFi (); }}
HandleConnection
void handleConnection (void* pvParameters) {// VAŽNO: A 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 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 .broj); // Se o estado do pino for 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
// Pošaljite zahtjev za poslužitelj da do pino na pozicionirate 'i' do arrayvoid sendPinStatus (int i) {client.write ((uint8_t*) & pins , sizeof (Pin)); client.flush (); }
Korak 7: Server.ino
Deklaracije i varijable
#include #include // Dados da rede // Deve ser igual no Client #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 // Criamos um poslužitelj na porta definida za 'SERVER_PORT' WiFiServerski poslužitelj (SERVER_PORT); // Vector onde vamos adicionar os clients conforme eles forem conectando std:: vector clients; // Struct que define os dados que vamos enviar (deve ser igual bez klijenta) typedef struct {int number; int status; } Pin;
Postaviti
void setup () {Serial.begin (115200); // Criamos a rede WiFi i inicijalizacija servera setupWiFi (); server.begin (); xTaskCreatePinnedToCore (handleClients, // Função que será executada "handleClients", // Ime da tarefa 10000, // Tamanho da pilha NULL, // Parâmetro da tarefa (nema caso não usamos) 2, // Prioritet 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á executada a tarefa (usamos o core 0 para o petlja ficar livre com o core 1)}
SetupWiFi
void setupWiFi () {// Coloca este ESP como Access Point WiFi.mode (WIFI_AP); // SSID e Senha para se povezuje s ESP WiFi.softAP (SSID, PASSWORD); }
Petlja
void loop () {// Verifica se um new client está tentando se povezuje WiFiClient client = server.available (); // Se sim colocamos ele no vector if (client) {clients.push_back (client); }}
HandleClients
void handleClients (void* pvParameters) {// VAŽNO: A tarefa não pode terminar, deve ficar presa em um loop petlje infinito while (true) {// Para cada client que temos no vector for (int i = 0; i
Korak 8: Datoteke
Preuzmite datoteke
INO