Как избежать электромагнитных помех на входе ESP32

Я реализовал простую схему, подобную следующей, чтобы реализовать датчик дождя, к которому я могу получить доступ через HTTP:

image

Со следующим рисунком:

#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

Обсуждение

Я думаю, что это тот момент, когда вы должны попробовать другой вывод прерывания(ы)., @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


2 ответа


0

Я должен проверить получше, но, похоже, у других есть эта проблема с герконовыми переключателями, которые в некоторой конфигурации действуют как антенны и принимают помехи (см. Здесь и здесь).

,

если включение света вызывает проблему, я не уверен, что это проблема с беспроводной связью., @dandavis


1

Я исследовал источник питания, показанный на вашей фотографии, и нашел этот комментарий: from randomnerdtutorials

esp8266 хилинк

,