0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

網(wǎng)上找不到的源碼,ESP32 AP熱點(diǎn) TCPsever 多線程控制開關(guān)

李智勇06 ? 來源:李智勇06 ? 作者:李智勇06 ? 2024-06-11 08:02 ? 次閱讀

#include //如果是ESP8266 用#include

#include "Ticker.h"

//李智勇編碼,采用AP方式做服務(wù)端,可以方便控制各種設(shè)備,網(wǎng)上此方面的代碼放出不多不完整,在此放出, 沒有采用網(wǎng)上流行的多個(gè)客戶端,那樣當(dāng)新的客戶端不夠用時(shí),處理邏輯太麻煩,一個(gè)客戶端發(fā)過來消息,服務(wù)端接收,發(fā)送確認(rèn)消息,等控制指令結(jié)束發(fā)送斷開指令給客戶端,當(dāng)服務(wù)端接到新的連接,主動斷開上個(gè)連接,這樣就不會阻塞網(wǎng)絡(luò)連接。

Ticker ticker_1; //控制一號繼電器,用計(jì)時(shí)器模擬多線程

Ticker ticker_2; //控制二號繼電器

#define PIN_R1 23 //輸出控制,

#define PIN_R2 22 //輸出控制,

// 初始化一個(gè)WiFi服務(wù)器,端口為****

#define SERVER_PORT ****

#define CLOSE_CONNECT "Off" //發(fā)送關(guān)閉指令給客戶端,讓客戶端主動斷開

int count_OPEN = 0;

int count_R1 = -1; //第一次進(jìn)入打開

WiFiServer server(SERVER_PORT); //端口號,范圍 0-65535

// WiFiAPPSW是AP模式下的WiFi密碼

const String WiFiAPPSW = "12345678"; //設(shè)置AP模式下模塊所發(fā)出的WIFI的密碼

const String AP_NameString = "lizhiyong_CONTROL";

void setupWiFi() {
WiFi.mode(WIFI_AP);

WiFi.softAP(AP_NameString, WiFiAPPSW);

//自定義IP地址信息

WiFi.softAPConfig(IPAddress(192, ***, ***, ***), IPAddress(192, ***, ***, 1), IPAddress(255, 255, 255, 0));

Serial.println(WiFi.softAPSSID());

Serial.print("IP address: ");

Serial.println(WiFi.softAPIP());

Serial.print("SSID: ");

Serial.println(WiFi.softAPSSID());

server.begin();

}

void setup() {
pinMode(PIN_R1, OUTPUT); *

pinMode(PIN_R2, OUTPUT); *

*

*

Serial.begin(115200);

Serial.println("Begin now!!!");

setupWiFi();

}

WiFiClient serverClient;

void loop() {
//檢測服務(wù)器端是否有活動的客戶端連接

if (server.hasClient()) {
if (serverClient) serverClient.stop();

serverClient = server.available();

// Serial.println("hasClient " + serverClient.remoteIP());

}


//檢查客戶端的數(shù)據(jù)

if (serverClient && serverClient.connected()) {
if (serverClient.available()) {
Serial.print("Connected to client remoteIP:");

Serial.println(serverClient.remoteIP());

char data[1024] = { 0 };

// ind用于追蹤data數(shù)組中已存儲的數(shù)據(jù)量

int ind = 0;

// 接收客戶端發(fā)送的所有數(shù)據(jù)

Serial.println("Connected to client !!! ");

while (serverClient.available()) {
data[ind] = serverClient.read(); //讀取client端發(fā)送的字符,含有換行符

ind++;

}

String str = String(data);

Serial.println(str + String(str.length()));

if (str.indexOf("open") >= 0) { // compareTo equals 接收有回車符等不可見字符容易出錯

Serial.println("relay2 open is recive");

ticker_2.attach(0.1, relay2, 0); //二號繼電器打開。參數(shù)1

serverClient.print("relay2 open OK! "); //在client端回復(fù)

} else if (str.indexOf("close") >= 0) {
Serial.println("relay2 close is recive");

ticker_2.attach(0.1, relay2, 1); //參數(shù)0關(guān)斷

serverClient.print("relay2 close OK! "); //在client端回復(fù)

} else if (str.indexOf("time") >= 0) { //relay1打開后延時(shí)關(guān)閉

int time = str.substring(4).toInt(); //substring(4)從第4個(gè)數(shù)開始一直都末尾

ticker_1.attach(0.1, relay1, time); //繼電器 打開,延時(shí)time 后關(guān)閉,第一次執(zhí)行沒有延時(shí),

Serial.println("relay1 close is recive " + str.substring(4));

serverClient.print("relay1 time OK! "); //在client端回復(fù)

} else if (str.indexOf("hand") >= 0) { //relay1手動開關(guān)

Serial.println("relay1 hand " + String(count_R1));

if (count_R1 == -1) {
ticker_1.attach(0.1, relay1, -1); //手動打開關(guān)閉

Serial.println("relay1 hand open " + String(count_R1));

serverClient.print("relay1 hand open OK! "); //在client端回復(fù)

count_R1 = 0;

} else {
ticker_1.attach(0.1, relay1, 0); //-1 關(guān)閉指令

Serial.println("relay1 hand close ");

serverClient.print("relay1 hand close OK! "); //在client端回復(fù)

count_R1 = -1;

}

} else {
serverClient.print("OK! Got your request. "); //在client端回復(fù)

Serial.println("OK! Got your request. ");

}

serverClient.print(CLOSE_CONNECT); //在客戶端關(guān)閉端回復(fù)

}

}

}

void relay1(int action) { //控制繼電器1,參數(shù)整數(shù)型,0表示關(guān),-1表示開,其他數(shù)值表示開的延時(shí)

Serial.println("relay1 active !!! " + String(action));

if (action == 0) {
digitalWrite(PIN_R1, !digitalRead(PIN_R1)); // turn the LED on (HIGH is the voltage level)

Serial.println("relay1 open PIN_R1 !!! ");

ticker_1.detach();

} else if (action == -1) {
digitalWrite(PIN_R1, !digitalRead(PIN_R1)); // turn the LED off by making the voltage LOW

Serial.println("relay1 close PIN_R1 !!! ");

ticker_1.detach();

} else {
if (count_OPEN == 0) { //第一次 延時(shí)開,打開繼電器

ticker_1.attach(action, relay1, action); //保證下次進(jìn)來,并且把時(shí)間延長,因?yàn)榈谝淮芜M(jìn)沒有延時(shí)

digitalWrite(PIN_R1, !digitalRead(PIN_R1));

Serial.println(String(action) + " relay1 open !!! ");

count_OPEN = 1;

} else { //第二次延時(shí)關(guān),關(guān)閉繼電器

digitalWrite(PIN_R1, !digitalRead(PIN_R1));

count_OPEN = 0;

ticker_1.detach();

Serial.println(String(action) + " relay1 close !!! ");

}

}

}

void relay2(int level) { //控制繼電器2,參數(shù)是高低電平,決定吸合

digitalWrite(PIN_R2, level); // turn the LED on (HIGH is the voltage level)

Serial.println("relay2 active !!! " + String(level));

ticker_2.detach(); //都是執(zhí)行一次,模擬多線程,用delay會阻塞服務(wù)器響應(yīng)

}


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 繼電器
    +關(guān)注

    關(guān)注

    132

    文章

    5263

    瀏覽量

    147622
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78759
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    626

    瀏覽量

    28976
  • ESP32
    +關(guān)注

    關(guān)注

    17

    文章

    936

    瀏覽量

    16669
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32作為STA時(shí)連接不上另一作為APESP32,為什么?

    使用的是ESP32 CSI Toolkit的官方代碼,想要實(shí)現(xiàn)ESP32分別作為AP 和STA能互連,并且收集CSI。目前遇到的問題是:ESP32作為STA時(shí)能連接我自己的手機(jī)
    發(fā)表于 06-19 06:39

    ESP32熱點(diǎn)時(shí),用蘋果手機(jī)連接模塊,為什么在斷開時(shí)檢測不到?

    ESP32熱點(diǎn)時(shí),如果用安卓手機(jī)或者電腦連接模塊,在斷開連接時(shí),模塊能檢測到安卓手機(jī)/電腦斷開了。但是用蘋果手機(jī)連接模塊,在斷開時(shí),模塊好像經(jīng)常檢測不到蘋果手機(jī)斷開了。是通過
    發(fā)表于 06-26 07:29

    ESP32會不會有多線程問題,需要加鎖嗎?

    ESP32會不會有多線程問題,需要加鎖嗎
    發(fā)表于 07-19 08:05

    ESP32多線程 #硬聲創(chuàng)作季

    ESP多線程
    Hello,World!
    發(fā)布于 :2022年09月23日 20:47:12

    請問arduino如何能實(shí)現(xiàn)多線程控制 ?

    請教一下,arduino如何能實(shí)現(xiàn)多線程控制 ???
    發(fā)表于 07-27 23:51

    micropython esp32刷固件adc多線程如何去實(shí)現(xiàn)呢

    micropython esp32刷固件adc多線程如何去實(shí)現(xiàn)呢?
    發(fā)表于 01-25 06:09

    ESP32作為STA時(shí)連接不上另一作為APESP32是哪里的問題?

    使用的是ESP32 CSI Toolkit的官方代碼,想要實(shí)現(xiàn)ESP32分別作為AP 和STA能互連,并且收集CSI。目前遇到的問題是:ESP32作為STA時(shí)能連接我自己的手機(jī)
    發(fā)表于 02-16 08:09

    如何使用std::future/std::promise 和 std::packaged_task來促進(jìn)esp32上的多線程

    我正在考慮使用 std::future/std::promise 和 std::packaged_task 來促進(jìn) esp32 上的多線程。我知道多任務(wù)函數(shù)之間的抽象分層如下:std::thread
    發(fā)表于 03-02 08:44

    基于多線程的雷達(dá)數(shù)據(jù)實(shí)時(shí)處理系統(tǒng)

    為了解決多普勒天氣雷達(dá)實(shí)時(shí)處理系統(tǒng)研發(fā)過程中并發(fā)線程難以進(jìn)行控制的問題,設(shè)計(jì)了一種多線程控制
    發(fā)表于 12-01 17:02 ?18次下載
    基于<b class='flag-5'>多線程</b>的雷達(dá)數(shù)據(jù)實(shí)時(shí)處理系統(tǒng)

    ESP32驅(qū)動1.54寸彩屏的應(yīng)用

    前段時(shí)間,ESP32憑借替代AP6212的完美性,以及驅(qū)動各種規(guī)格彩屏的全能性等技能,收獲到了一大波粉絲。如今,ESP32又上了物聯(lián)網(wǎng)熱點(diǎn),它對外宣稱自己在彩屏應(yīng)用上又有了新手筆!
    發(fā)表于 06-28 11:32 ?2009次閱讀

    四、ESP32單片機(jī)wifi的AP與STA模式使用

    ESP32單片機(jī)wifi的AP與STA模式使用關(guān)于WIFI的AP與STA簡介ESP32串口通信ESP32開啟
    發(fā)表于 11-26 17:51 ?90次下載
    四、<b class='flag-5'>ESP32</b>單片機(jī)wifi的<b class='flag-5'>AP</b>與STA模式使用

    使用MicroPython在Raspberry Pi上通過雙核編程的多線程控制LED

    在本教程中,我們將使用 MicroPython在 Raspberry Pi Pico 上通過雙核編程的多線程控制兩個(gè) LED 。
    的頭像 發(fā)表于 07-25 17:41 ?7043次閱讀
    使用MicroPython在Raspberry Pi上通過雙核編程的<b class='flag-5'>多線程控制</b>LED

    使用ESP32、Python和javascript的遠(yuǎn)程控制繼電器

    電子發(fā)燒友網(wǎng)站提供《使用ESP32、Python和javascript的遠(yuǎn)程控制繼電器.zip》資料免費(fèi)下載
    發(fā)表于 11-10 10:27 ?1次下載
    使用<b class='flag-5'>ESP32</b>、Python和javascript的遠(yuǎn)<b class='flag-5'>程控制</b>繼電器

    使用ESP32連接騰訊云實(shí)現(xiàn)遠(yuǎn)程控制

    上次給大家分享了如何使用ESP32實(shí)現(xiàn)藍(lán)牙通信,今天跟大家聊聊如何使用ESP32連接騰訊云實(shí)現(xiàn)遠(yuǎn)程控制。本次實(shí)驗(yàn)用到MQTT協(xié)議,同樣,我用miropython編寫程序?qū)崿F(xiàn),最終可以通過騰訊連連微信
    的頭像 發(fā)表于 11-22 09:19 ?3281次閱讀

    如何使用Alexa和ESP32控制

    電子發(fā)燒友網(wǎng)站提供《如何使用Alexa和ESP32控制.zip》資料免費(fèi)下載
    發(fā)表于 06-07 11:02 ?0次下載
    如何使用Alexa和<b class='flag-5'>ESP32</b><b class='flag-5'>控制</b>