
สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12



วิดีโอนี้เกี่ยวกับ "หลายรายการ" เรากำลังจัดการกับการทำงานหลายอย่างพร้อมกัน มัลติคอร์ และลูกค้าหลายราย เมื่อไม่นานมานี้ ฉันสร้างรีโมตคอนโทรลด้วย ESP สองตัว: ไคลเอนต์และจุดเข้าใช้งาน จากสิ่งนี้ วันนี้เราจะตั้งค่าเซิร์ฟเวอร์หลายไคลเอนต์ ซึ่งหมายความว่าเราจะมีลูกค้าหลายรายเชื่อมต่ออยู่ใน ESP เดียว
ดังนั้น บทเรียนในวันนี้เกี่ยวข้องกับการสร้างเซิร์ฟเวอร์ใน ESP32 การเพิ่มไคลเอนต์ใหม่ในลูป และการจัดการคำขอในแกนอื่น ลูกค้าจะส่งข้อมูลเกี่ยวกับการเปลี่ยนแปลงสถานะของหมุด และเซิร์ฟเวอร์จะทำซ้ำการเปลี่ยนแปลงสถานะเหล่านี้
ขั้นตอนที่ 1: การสาธิต
ขั้นตอนที่ 2: การติดตั้งเซิร์ฟเวอร์

ขั้นตอนที่ 3: การประกอบไคลเอ็นต์

ขั้นตอนที่ 4: โฟลว์ - เซิร์ฟเวอร์

ขั้นตอนที่ 5: โฟลว์ - ลูกค้า

ขั้นตอนที่ 6: Client.ino
การประกาศและตัวแปร
#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 เซิร์ฟเวอร์ WiFiClient ไคลเอ็นต์; // โครงสร้าง que กำหนด os dados que vamos enviar (deve ser igual ไม่มีเซิร์ฟเวอร์) typedef struct { หมายเลข int; สถานะ int; }เข็มหมุด; // จำนวนพินอส que iremos ler e enviar o สถานะ #define PIN_COUNT 2 //Array com os pinos definidos // ไม่มี 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} };
ติดตั้ง
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); //Tempo Paraพิจารณา a conexão como perdida client.setTimeout(5000); //Conectamos à rede WiFi และ conectamos ao เซิร์ฟเวอร์ setupWiFi (); connectClient(); สำหรับ(int i=0; i
ตั้งค่า WiFi
เป็นโมฆะ setupWiFi () { Serial.print ("กำลังเชื่อมต่อกับ" + สตริง (SSID)); //Conectamos à rede WiFi criado pelo outro ESP WiFi.begin(SSID, PASSWORD); // Esperamos conectar ในขณะที่ (WiFi.status () != WL_CONNECTED) { Serial.print ("."); ล่าช้า (500); } //Se chegou aqui está conectado à rede WiFi Serial.println(); Serial.println("เชื่อมต่อแล้ว!"); }
ConnectClient
เป็นโมฆะ connectClient () { Serial.println ("กำลังเชื่อมต่อไคลเอ็นต์"); // Esperamos conectar com o เซิร์ฟเวอร์ในขณะที่ (!client.connect (WiFi.gatewayIP (), SERVER_PORT)) { Serial.print ("."); ล่าช้า (500); } //Se chegou aqui está conectado com o เซิร์ฟเวอร์ Serial.println(); Serial.println("ลูกค้าเชื่อมต่อแล้ว!"); }
ห่วง
void loop(){ //Se não estiver conectado à rede WiFi, mandamos conectar if(WiFi.status() != WL_CONNECTED) { setupWiFi(); } }
HandleConnection
โมฆะ handleConnection (เป็นโมฆะ * pvParameters) { // สำคัญ: ปลายทาง tarefa não pode, deve ficar presa em um loop infinito ในขณะที่ (จริง) {// Se não estiver conectado com o เซิร์ฟเวอร์, mandamos conectar ถ้า (!client.connected ()) { connectClient (); } //Para cada pino, ยืนยัน se mudou o estado. Se mudou enviamos สำหรับเซิร์ฟเวอร์ o novo estado for(int i=0; i
hasPinStatusเปลี่ยนแล้ว
//ยืนยัน se o estado do pino na posição 'i' do array mudou//Retorna 'จริง' se mudou ou 'เท็จ' caso contrário boolean hasPinStatusChanged (int i) { // Faz a leitura do pino int pinStatus = digitalRead (พิน .หมายเลข); // Se o estado do pino สำหรับที่แตกต่างกัน if (pins .status != pinStatus) { //Guardamos o novo estado e retornamos หมุดจริง .status = pinStatus; คืนค่าจริง; } //Só chegará aqui se o estado não foi alterado //Então retornamos f ยังคืนค่าเท็จ; }
sendPinStatus
//Envia para o เซิร์ฟเวอร์ os dados do pino na posição 'i' do arrayvoid sendPinStatus(int i) { client.write((uint8_t*)&pins, sizeof(Pin)); client.flush(); }
ขั้นตอนที่ 7: Server.ino
การประกาศและตัวแปร
#include #include //Dados da rede //Deve ser igual no Client #define SSID "ESP32Server" #define PASSWORD "87654321" #define SERVER_PORT 5000 //เซิร์ฟเวอร์ Criamos กับ porta definida por 'SERVER_PORT' เซิร์ฟเวอร์ WiFiServer (SERVER_PORT); //Vector onde vamos adicionar os ไคลเอ็นต์สอดคล้อง eles forem conectando std::vector ไคลเอ็นต์; // โครงสร้าง que กำหนด os dados que vamos enviar (deve ser igual ไม่มีไคลเอนต์) typedef struct { หมายเลข int; สถานะ int; }เข็มหมุด;
ติดตั้ง
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); //Criamos ทำซ้ำ WiFi และเริ่มต้นหรือเซิร์ฟเวอร์ setupWiFi (); เซิร์ฟเวอร์.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, //Priofaridade NU, // Caso queria manter uma referência para a tarefa que vai ser criada (ไม่มี caso não precisamos) 0); // หมายเลข do core que será executada a tarefa (usamos o core 0 para o loop ficar livre com o core 1) }
ตั้งค่า WiFi
เป็นโมฆะ setupWiFi () { //Coloca este ESP como Access Point WiFi.mode (WIFI_AP); //SSID และ Senha สำหรับการเชื่อมต่อ este ESP WiFi.softAP(SSID, PASSWORD); }
ห่วง
วงเป็นโมฆะ () { // Verifica se um novo client está tenando se conectar WiFiClient client = server.available (); // Se sim colocamos ไม่มีเวกเตอร์ if (ไคลเอนต์) { clients.push_back (ไคลเอนต์); } }
จัดการลูกค้า
โมฆะ handleClients (เป็นโมฆะ * pvParameters) { // สำคัญ: ปลายทาง tarefa não pode, deve ficar presa em um loop infinito ในขณะที่ (จริง) {// ลูกค้า Para cada que temos ไม่มีเวกเตอร์สำหรับ (int i = 0; i
ขั้นตอนที่ 8: ไฟล์
ดาวน์โหลดไฟล์
ไฟล์ PDF
ฉันไม่
แนะนำ:
ATtiny85 RF รีโมทคอนโทรล: 3 ขั้นตอน

ATtiny85 RF Remote Control: หมายเหตุ: "เกมซ่อนหาเสมือน" แสดงวิธีใช้รีโมตประเภทนี้กับโมดูล RXC6 ซึ่งจะถอดรหัสข้อความโดยอัตโนมัติ ดังที่ฉันได้กล่าวไว้ในคำแนะนำก่อนหน้านี้ ฉันเพิ่งเริ่มเล่นกับ ATtiny85 chi
รีโมทคอนโทรล Wi-Fi สำหรับ Hayward ColorLogic: 3 ขั้นตอน

รีโมทควบคุม Wi-Fi สำหรับ Hayward ColorLogic: Hayward ColorLogic เป็นส่วนเสริมยอดนิยมสำหรับสระว่ายน้ำ สปา บ่อน้ำ และคุณสมบัติทางน้ำอื่นๆ ไฟแต่ละดวงมีชุดไฟ LED สว่างพร้อมตรรกะเพื่อให้มีสีทึบและการแสดงแสงเป็นโหล หน่วยเหล่านี้ใช้ไฟ 12 VAC ซึ่งทำให้
All Band Receiver พร้อม SI4732 / SI4735 (FM / RDS, AM และ SSB) พร้อม Arduino: 3 ขั้นตอน

All Band Receiver พร้อม SI4732 / SI4735 (FM / RDS, AM และ SSB) พร้อม Arduino: เป็นโปรเจ็กต์เครื่องรับย่านความถี่ทั้งหมด ใช้ห้องสมุด Arduino Si4734 ห้องสมุดนี้มีตัวอย่างมากกว่า 20 ตัวอย่าง คุณสามารถฟัง FM ด้วย RDS สถานี AM (MW) ในพื้นที่ SW และสถานีวิทยุสมัครเล่น (SSB) เอกสารทั้งหมดที่นี่
อินเทอร์เฟซ ESP32 พร้อม SSD1306 Oled พร้อม MicroPython: 5 ขั้นตอน

อินเทอร์เฟซ ESP32 พร้อม SSD1306 Oled พร้อม MicroPython: Micropython เป็นการเพิ่มประสิทธิภาพของ python และมีขนาดเล็กของ python ซึ่งหมายถึงการสร้างสำหรับอุปกรณ์ฝังตัวซึ่งมีข้อจำกัดด้านหน่วยความจำและใช้พลังงานต่ำ Micropython สามารถใช้ได้กับคอนโทรลเลอร์หลายตระกูล ซึ่งรวมถึง ESP8266, ESP32, Ardui
PWM พร้อม ESP32 - Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: 6 ขั้นตอน

PWM พร้อม ESP32 | Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: ในคำแนะนำนี้เราจะดูวิธีสร้างสัญญาณ PWM ด้วย ESP32 โดยใช้ Arduino IDE & โดยทั่วไปแล้ว PWM จะใช้เพื่อสร้างเอาต์พุตแอนะล็อกจาก MCU ใดๆ และเอาต์พุตแอนะล็อกนั้นอาจเป็นอะไรก็ได้ระหว่าง 0V ถึง 3.3V (ในกรณีของ esp32) & จาก