Как избежать электромагнитных помех на входе ESP32
Я реализовал простую схему, подобную следующей, чтобы реализовать датчик дождя, к которому я могу получить доступ через HTTP:
Со следующим рисунком:
#include <WebServer.h>
#include <WiFi.h>
#include <WiFiClient.h>
/**
* Эта константа вычисляется с помощью следующей процедуры:
* - Площадь плювиометра 55 см^2
* - Объем тестовой воды 100 см^2
* Результирующая высота воды 1,82 см. Используя это количество воды, генерирует 40 тиков плювиометра. Таким образом, каждый клещ составляет 0,455 мм дождя.
*/
const double millimetersPerTick = 0.455;
const char* ssid = "*********";
const char* password = "*********";
WebServer server(80);
/* LED pin */
byte ledPin = 2;
/* pin that is attached to interrupt */
byte interruptPin = 14;
/* hold the state of LED when toggling */
volatile byte state = LOW;
volatile int interruptCounter = 0;
int numberOfInterrupts = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR handleInterrupt() {
portENTER_CRITICAL_ISR(&mux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&mux);
}
void setup() {
Serial.begin(115200);
// WIFI initialization
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode(ledPin, OUTPUT);
/* set the interrupt pin as input pullup*/
pinMode(interruptPin, INPUT_PULLUP);
/* attach interrupt to the pin
function blink will be invoked when interrupt occurs
interrupt occurs whenever the pin change value */
// Notify wifi connection
digitalWrite(ledPin, HIGH);
delay(2000);
digitalWrite(ledPin, LOW);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, RISING);
server.on("/", []() {
server.send(200, "text/plain", String(millimetersPerTick * numberOfInterrupts));
numberOfInterrupts = 0;
});
server.onNotFound([]() {
server.send(404, "text/plain", "Not found");
});
server.begin();
}
void loop() {
server.handleClient();
if(interruptCounter>0) {
portENTER_CRITICAL(&mux);
interruptCounter--;
portEXIT_CRITICAL(&mux);
numberOfInterrupts++;
Serial.print("An interrupt has occurred. Total: ");
Serial.println(numberOfInterrupts);
state = !state;
digitalWrite(ledPin, state);
delay(100);
state = !state;
digitalWrite(ledPin, state);
}
}
Основная проблема этой схемы заключается в том, что если я подключаю вилку переменного тока, она страдает от помех от бытового электричества. Например, если я включаю свет, вызывается прерывание. Я также пытался купить такой же электромагнитный фильтр, но это не уменьшило проблему. Что я могу сделать, чтобы избежать этого?
2 ответа
Я должен проверить получше, но, похоже, у других есть эта проблема с герконовыми переключателями, которые в некоторой конфигурации действуют как антенны и принимают помехи (см. Здесь и здесь).
если включение света вызывает проблему, я не уверен, что это проблема с беспроводной связью., @dandavis
Я исследовал источник питания, показанный на вашей фотографии, и нашел этот комментарий:
esp8266 хилинк
- Постоянная частота дискретизации АЦП на ESP8266 или ESP32
- Драйверы для чипа последовательного порта CH9102X
- ESP32: отключить детектор отключения питания
- Преобразование строки в IP-адрес
- Какую плату выбрать в PlatformIO для ESP Wroom 32?
- esp32 Stack canary watchpoint срабатывает
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- esp32-cam публикует изображение в mqtt
Я думаю, что это тот момент, когда вы должны попробовать другой вывод прерывания(ы)., @Sener
Я должен лучше проверить, но, похоже, у других есть эта проблема с герконами, которые в какой-то конфигурации действуют как антенны и принимают помехи (см. [здесь](https://forum.arduino.cc/index.php?topic=485107.0) и [здесь](https://forum.arduino.cc/index.php?topic=485107.0))., @Alessandro Dionisi
я бы попробовал два дешевых/простых исправления: 1. ферритовый шарик или два на входе переменного тока и выходе постоянного тока. 2. сглаживающий конденсатор через vout вашего hilink (100-2200u)., @dandavis
Я попробовал с батарейным блоком, и это происходит. Я подозреваю, что проблема в длинном проводе для геркона, который работает как антенна., @Alessandro Dionisi
@dandavis У меня похожая проблема, но я использую DC-DC преобразователь для питания ESP32. Не могли бы вы подсказать, куда я могу подключить сглаживающие конденсаторы?, @Just doin Gods work