ESP32无限打印奇怪字符,可能是由于EMI(电磁干扰)



我正在研究ESP32 WebSocket通信。经过大量的努力工作,我面临着严重的问题,在串行监视器Esp32是打印奇怪的字符无限。因此,每次我都必须重新启动esp32板才能完美地运行esp32。

Esp32板控制设备(灯泡,灯管,插座等)完美,但这个问题只发生在风扇,每当我试图使用远程或手动控制。但它在面包板上运行得非常平稳,或者当我没有用交流电压为继电器模块供电时。串口监视器错误图像

我尝试了不同的不同的连接,但问题是相同的。当这个问题发生时Case1。当风扇与继电器连接并试图远程或手动开/关时。例2。风扇与继电器断开,但与手动开关连接,并试图接通开/关。

我发现或者也许我错了,每当我试图控制风扇时,它会产生高EMI(电磁干扰),并且EMI会导致错误(在串行监视器中无限打印随机字符)到ESP32。

这是主电路图

下面是代码:-
#include <ArduinoWebsockets.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#define ESP_NAME "Room 1"
//-----------------Appliances/Relay pins declaration or OUTPUT PINS------------------
#define Tubelight 22
#define Bulb 23
#define Fan 18
#define Socket1 19
//---------------Switches pin declaration or INPUT PINS-------------------
#define switch1 32
#define switch2 33
#define switch3 25
#define switch4 26
//--------------------Network Credentials------------------------------
const char* ssid = "xxxxxxxxxxxx"; //Enter SSID
const char* password = "xxxxxxxxxxxx"; //Enter Password
const char* websockets_connection_string = "wss://xxxxxxxx.glitch.me"; //server address
//------------------Eliminate Switch buttons debounce effect--------------------
unsigned long lastDebounceTime = 0;
int debounceDelay = 600;
//------------------------Switches Previous state---------------------
bool switch1_prev_state = HIGH; //here HIGH work as LOW in INPUT_PULLUP pinMode
bool switch2_prev_state = HIGH;
bool switch3_prev_state = HIGH;
bool switch4_prev_state = HIGH;
bool wb_config_state = false;
//------------------------Websocket Variables------------------------------
using namespace websockets;
WebsocketsClient clientt;
StaticJsonDocument<200> doc; //for parsing data sent from server
// This certificate was updated 15.04.2021, issues on Mar 15th 2021, expired on June 13th 2021
const char echo_org_ssl_ca_cert[] PROGMEM = 
"-----BEGIN CERTIFICATE-----n" 
"MIIEZTCCA02gAwIBAgIQQAF1BIMUpMghjISpDBbN3zANBgkqhkiG9w0BAQsFADA/n" 
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTn" 
"DkRTVCBSb290IENBIFgzMB4XDTIwMTAwNzE5MjE0MFoXDTIxMDkyOTE5MjE0MFown" 
"MjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxCzAJBgNVBAMTn" 
"AlIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwIVKMz2oJTTDxLsn" 
"jVWSw/iC8ZmmekKIp10mqrUrucVMsa+Oa/l1yKPXD0eUFFU1V4yeqKI5GfWCPEKpn" 
"Tm71O8Mu243AsFzzWTjn7c9p8FoLG77AlCQlh/o3cbMT5xys4Zvv2+Q7RVJFlqnBn" 
"U840yFLuta7tj95gcOKlVKu2bQ6XpUA0ayvTvGbrZjR8+muLj1cpmfgwF126cm/7n" 
"gcWt0oZYPRfH5wm78Sv3htzB2nFd1EbjzK0lwYi8YGd1ZrPxGPeiXOZT/zqItkeln" 
"/xMY6pgJdz+dU/nPAeX1pnAXFK9jpP+Zs5Od3FOnBv5IhR2haa4ldbsTzFID9e1Rn" 
"oYvbFQIDAQABo4IBaDCCAWQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8En" 
"BAMCAYYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pn" 
"ZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEn" 
"p7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEn" 
"AYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2Vun" 
"Y3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0n" 
"LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfn" 
"r52LFMLGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0Bn" 
"AQsFAAOCAQEA2UzgyfWEiDcx27sT4rP8i2tiEmxYt0l+PAK3qB8oYevO4C5z70kHn" 
"ejWEHx2taPDY/laBL21/WKZuNTYQHHPD5b1tXgHXbnL7KqC401dk5VvCadTQsvd8n" 
"S8MXjohyc9z9/G2948kLjmE6Flh9dDYrVYA9x2O+hEPGOaEOa1eePynBgPayvUfLn" 
"qjBstzLhWVQLGAkXXmNs+5ZnPBxzDJOLxhF2JIbeQAcH5H0tZrUlo5ZYyOqA7s9pn" 
"O5b85o3AM/OJ+CktFBQtfvBhcJVd9wvlwPsk+uyOy2HI7mNxKKgsBTt375teA2Twn" 
"UdHkhVNcsAKX1H7GNNLOEADksd86wuoXvg==n" 
"-----END CERTIFICATE-----n";
void onMessageCallback(WebsocketsMessage message)//get messages From server
{
Serial.print("Got Message: ");
Serial.println(message.data());
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, message.data());

// Test if parsing succeeds.
if (error){
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
//store status of appliance
bool sts = doc["status"]=="ON"?LOW:HIGH; //here relay work in reverse
if(doc["room_name"] == ESP_NAME)
{
if(doc["appliance"] == "Tubelight")
{
digitalWrite(Tubelight, sts);
}
else if(doc["appliance"] == "Bulb")
{
digitalWrite(Bulb, sts);
}
else if(doc["appliance"] == "Fan")
{
digitalWrite(Fan, sts);
}
else if(doc["appliance"] == "Socket1")
{
digitalWrite(Socket1, sts);
}
}
else
{
Serial.println("False Room Name");
}
}
void onEventsCallback(WebsocketsEvent event, String data) {
if(event == WebsocketsEvent::ConnectionOpened) {
Serial.println("Connnection Opened");
} else if(event == WebsocketsEvent::ConnectionClosed) {
Serial.println("Connnection Closed");
wb_config_state = false;
//        clientt.connect(websockets_connection_string);
} else if(event == WebsocketsEvent::GotPing) {
Serial.println("Got a Ping!");
} else if(event == WebsocketsEvent::GotPong) {
Serial.println("Got a Pong!");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); //Connecting to wifi
while(WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);
}
Serial.println("nSuccessfully Connected with WiFi.");

//-------------------Pinmode Setup----------------------
//for relay or output
pinMode(Tubelight, OUTPUT);
pinMode(Bulb, OUTPUT);
pinMode(Fan, OUTPUT);
pinMode(Socket1, OUTPUT);
//pinMode for Switches
pinMode(switch1, INPUT_PULLUP);
pinMode(switch2, INPUT_PULLUP);
pinMode(switch3, INPUT_PULLUP);
pinMode(switch4, INPUT_PULLUP);
//-----------Prevent relay from jump start----------------
digitalWrite(Tubelight, HIGH);
digitalWrite(Bulb, HIGH);
digitalWrite(Fan, HIGH);
digitalWrite(Socket1, HIGH);
}
void loop() 
{
if(WiFi.status() == WL_CONNECTED)
{
if(wb_config_state==false){
wb_config();
wb_config_state = true;
}else{clientt.poll();}
}
else{
WiFi.reconnect();
}
mannual(); 
}
void wb_config()
{
//--------------------Websocket communication establishment-------------------
clientt.onMessage(onMessageCallback);// run callback when messages are received
clientt.onEvent(onEventsCallback);// run callback when events are occuring
clientt.setCACert(echo_org_ssl_ca_cert);// Before connecting, set the ssl fingerprint of the server
clientt.addHeader("User-Agent", "Satya");//Add header
clientt.connect(websockets_connection_string);// Connect to server
clientt.ping();// Send a ping
}
void mannual()
{
//--------------------------------Switch 1----------------------------------
if((digitalRead(switch1)==HIGH)&& switch1_prev_state==LOW && debounce())
{
//    Serial.println("Switch 1 / Tubelight --> OFF");
build_send_data("Tubelight", "OFF");
digitalWrite(Tubelight, HIGH);
switch1_prev_state = HIGH;
lastDebounceTime = millis();
}
if(digitalRead(switch1)==LOW && switch1_prev_state==HIGH && debounce())
{
//    Serial.println("Switch 1 / Tubelight --> ON");
build_send_data("Tubelight", "ON");
digitalWrite(Tubelight, LOW);
switch1_prev_state = LOW;
lastDebounceTime = millis();
}

//--------------------------------Switch 2----------------------------------
if((digitalRead(switch2)==HIGH)&& switch2_prev_state==LOW && debounce())
{
//    Serial.println("Switch 2 / Bulb --> OFF");
build_send_data("Bulb", "OFF");
digitalWrite(Bulb, HIGH);
switch2_prev_state = HIGH;
lastDebounceTime = millis();
}
if(digitalRead(switch2)==LOW && switch2_prev_state==HIGH && debounce())
{
//    Serial.println("Switch 2 / Bulb --> ON");
build_send_data("Bulb", "ON");
digitalWrite(Bulb, LOW);
switch2_prev_state = LOW;
lastDebounceTime = millis();
}
//--------------------------------Switch 3----------------------------------
if((digitalRead(switch3)==HIGH)&& switch3_prev_state==LOW && debounce())
{
//    Serial.println("Switch 3 / Fan --> OFF");
build_send_data("Fan", "OFF");
digitalWrite(Fan, HIGH);
switch3_prev_state = HIGH;
lastDebounceTime = millis();
}
if(digitalRead(switch3)==LOW && switch3_prev_state==HIGH && debounce())
{
//    Serial.println("Switch 3 / Fan --> ON");
build_send_data("Fan", "ON");
digitalWrite(Fan, LOW);
switch3_prev_state = LOW;
lastDebounceTime = millis();
}
//--------------------------------Switch 4----------------------------------
if((digitalRead(switch4)==HIGH)&& switch4_prev_state==LOW && debounce())
{
//    Serial.println("Switch 4 / Socket1 --> OFF");
build_send_data("Socket1", "OFF");
digitalWrite(Socket1, HIGH);
switch4_prev_state = HIGH;
lastDebounceTime = millis();
}
if(digitalRead(switch4)==LOW && switch4_prev_state==HIGH && debounce())
{
//    Serial.println("Switch 4 / Socket1 --> ON");
build_send_data("Socket1", "ON");
digitalWrite(Socket1, LOW);
switch4_prev_state = LOW;
lastDebounceTime = millis();
}
}
void build_send_data(String appliance, String sts)
{
if(WiFi.status() == WL_CONNECTED)
{
doc["from"] = "ESP32";
doc["client_name"] = ESP_NAME;
doc["room_name"] = "Room 1";
doc["appliance"] = appliance;
doc["status"] = sts; 

String send_data;
serializeJson(doc, send_data);

Serial.print("Send Message : ");
Serial.println(send_data);

clientt.send(send_data);
}
}
bool debounce()
{
return ((millis() - lastDebounceTime)> debounceDelay);
}

请帮助我解决我的问题,并原谅我英语中的任何错误😊。

你能尝试在开关(引脚的开关侧)上使用下拉(或上拉)电阻吗?问题是如果5V(我希望你不要把5V应用到引脚上?)从开关上掉下来,引脚是浮动的。

最新更新