Ложное срабатывание резервуара для воды

Я пытаюсь сделать простую систему защиты от перелива воды для своего дома. Я создал его с помощью BC547 и NodeMCU (ESP8266). У меня есть простая схема:

Проблема в том, что к баку идут 2 провода. Что предполагает замыкание цепи, как только вода коснется обоих проводов. Но проблема здесь в том, что по умолчанию он замыкает цепь, даже не касаясь, это происходит только в моем резервуаре для воды на крыше. Сначала я попробовал эту схему локально на своем столе, и она работает нормально. Я так понимаю проблема может быть во влажности внутри бака? Может ли это быть причиной ложного срабатывания?

Вот как у меня есть мой код. #define РЕЛЕ_1 D1 #define TANK_CONNECTION D4

void setup() {
  Serial.begin(115200);
  delay(10);


  Serial.println("Started");
  secondsTick.attach(1, ISRwatchdog);

  //Установить контакты реле на выходы
  pinMode(RELAY_1, OUTPUT);
  pinMode(TANK_CONNECTION, INPUT);

  digitalWrite(RELAY_1, relay_on);
  delay(100);

}

void loop() {
  tankFull(); 
  delay(100);
}

void tankFull(){

  Serial.println(digitalRead(TANK_CONNECTION));
   if(!digitalRead(TANK_CONNECTION) && relay_on == 0){
      Serial.println(motorOnCount);
      motorOnCount++;
      motorOffCount = 0;
      if(motorOnCount >= 10){
        Serial.println("Motor Turn OFF");
        digitalWrite(RELAY_1, HIGH);
         if (client.connected()) {
            client.publish(motor_status, "off", true);
            client.publish(tank_full, "on", true);

          }
        motorOnCount=0;
        relay_on = 1;
      }
      delay(100);
   } else{
      motorOffCount++;
       if (client.connected()) {
          client.publish(tank_full, "off", true);
       }
      //Serial.println(motorOffCount);
      if(motorOffCount>=100){
        motorOffCount=0;
        motorOnCount = 0;

      }
   }
}

Очевидно, что это не полный код. Я просто пытаюсь поделиться схемой его работы для общего понимания настроек, которые у меня есть.

У кого-нибудь есть идеи о том, почему он всегда показывает полную цепь, даже не касаясь проводов. Я также пробовал с 5 В и 3,3 В, которые присутствуют на плате NodeMcu. Но ни один из них не работал должным образом.

, 👍1

Обсуждение

попробуйте pinMode(TANK_CONNECTION, INPUT_PULLUP); так как вам нужен подтягивающий резистор с этой схемой, @chrisl

ХОРОШО. И значение резистора здесь тоже будет иметь значение?, @user3201500

С помощью INPUT_PULLUP вы включаете внутренний подтягивающий резистор микроконтроллера. Преимущественно это что-то в пределах 10кОм, но здесь это не критично. Сопротивление резистора в базе транзистора также не должно быть критичным. Транзистор имеет только значительно меньшее сопротивление при включении, чем внутренний подтягивающий резистор. 1кОм вроде нормально. Вы можете попробовать меньшие значения, когда он не активируется должным образом после того, как вы активировали внутренний подтягивающий резистор., @chrisl

Пожалуйста, попробуйте INPUT_PULLUP. Если это сработает, я сформулирую правильный ответ., @chrisl

Конечно, я попробую это когда-нибудь и сообщу вам об этом., @user3201500

Вода не такая проводящая, как вы думаете, или какой-то проводящий осадок соединяет соединение, вместо этого посмотрите на переключатели уровня воды, у которых нет этих проблем., @ratchet freak

@ratchetfreak Я понимаю это. Но проблема в том, что мои оба провода находятся в ВОЗДУХЕ, а не в воде. И все же он показывает, что резервуар для воды полный! Так что воздух здесь выглядит проводящим :), @user3201500

@user3201500 user3201500, поэтому я упомянул проводящий осадок, @ratchet freak

@ratchetfreak любые предложения по переключателю уровня воды, я буду более счастлив, если смогу получить некоторое представление о том, сколько воды у меня есть в моем аквариуме., @user3201500

Я подозреваю, что это не будет большим доказательством EMI. А если у вас длинные провода, то INPUT_PULLUP может быть недостаточно., @KIIV

@KIIV да, это длинные провода. И правда, INPUT_PULLUP тоже не сработал., @user3201500

@chrisl любое другое предложение? Потому что того, что вы дали, достаточно. :( Никакого решения я не могу найти. Но я видел тысячи будильников и других вещей, работающих по одной и той же концепции., @user3201500

Предложение состоит в том, чтобы переместить транзистор как можно ближе к датчику. Это означает 3 провода (два для питания и один для сигнала). Ну, в основном используйте что-то вроде датчика воды arduino., @KIIV


1 ответ


2

Конечно, проблема в электромагнитных помехах, но не со стороны коллектора, а со стороны базы транзистора, даже провода с этой стороны короче, насколько я понял из комментариев.

Распространенной ошибкой является оставлять базу транзистора плавающей, см. здесь другое приложение, но с той же причиной и результатом, транзистор включается явно без причины. С плавающей базой ток электромагнитных помех не имеет другого пути, кроме как через базу транзистора, где он усиливается бета-излучением (от 110 до 800 для BC547).

Поместите резистор 10 кОм между базой транзистора и эмиттером, чтобы обеспечить путь для токов электромагнитных помех на землю. Попробуйте разные значения, меньше, если у вас все еще есть ложные срабатывания, больше, если датчик не включает транзистор.

Конечно, используйте INPUT_PULLUP, но внутренний резистор слишком высок, от 30 до 100 кОм, лучше использовать внешний резистор около 10 кОм или ниже от коллектора транзистора до 3V3, чтобы обеспечить хороший запас по шуму на стороне коллектора.

схема

,