Arduino Uno - Raspberry PI - Поплавковые датчики - Водяные насосы

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

Преимущество в том, что я могу легче расширять систему. Недостатком является то, что я еще не достиг той надежности, которую хотел бы иметь. Я инженер-программист с базовыми знаниями в области аппаратного обеспечения. Вот почему я решил начать с Малины.

Сначала я сделал настройку с помощью одного Raspberry PI нескольких поплавковых датчиков, подобных этому: https://www.hellasdigital.gr/electronics/sensors/humidity-sensor/tank-pool-water-level-liquid-sensor-float-switch/

и реле вроде этого: https://wiki.52pi.com/index.php/DockerPi_4_Channel_Relay_SKU:_EP-0099

Я видел, что иногда система зависала с открытыми реле! Это имело побочный эффект для рыхлой воды. Это самое ценное в аквапонике!

Таким образом, я думал о создании кластера. Таким образом, я сделал кластер из трех Распберри. У обоих были реле, и только у одного ПИ были датчики. Чтобы открыть водяной насос, оба ПИС должны были дать зеленый свет. Это сработало лучше, и когда один из ПИСАЮЩИХ повис, мы не потеряли воду.

Но опять же я думаю, что это было неприемлемо, что система зависала так часто (по крайней мере, несколько раз в неделю). Поэтому я подумал, что, может быть, если я использую для этой цели Arduino, то это будет лучше.

Вот что я сделал. Я создал простую программу (без кластера и одного Arduino). К сожалению, это имело даже худшие результаты!!!

Для Arduino я использовал обычные 5-вольтовые реле, такие как это: https://www.nettop.gr/index.php/hlektronika/relay/8-channel-5v-relay-module-with-light-coupling-5v.html и те же поплавковые датчики.

Я не верю, что это связано с программным обеспечением, но это должно быть аппаратное обеспечение. Проблема в том, что мои знания в области аппаратного обеспечения ограничены! Что я должен сделать, чтобы предотвратить это? Как вы думаете, это связано с водяными насосами и реле ?

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

Я вставляю ссылку на быстрый и грязный код Arduino также для вашей справки. Температура, при которой работали системы, могла быть довольно горячей (30 ~ 48 градусов по Цельсию) в течение нескольких часов.

Вот код для Arduino:

#define POT_1_FLOAT_SENSOR  2 
#define POT_1_RELAY_1       11     

#define PIPE_1_FLOAT_SENSOR  5 
#define PIPE_1_RELAY_1       9     

#define PIPE_2_FLOAT_SENSOR       3     
#define PIPE_2_RELAY_2      10     

#define PIPE_3_RELAY_3       12    
#define PIPE_3_FLOAT_SENSOR       4     

// pot 1
const unsigned long POT_1_MAX_WATERING_PERIOD = 120000;
const unsigned long POT_1_DRAIN_PERIOD = 70000;

unsigned long pot1StartMillis = 0;
unsigned long pot1DelayStartMillis = 0;

// Pipe 2
const unsigned long PIPE_2_MAX_WATERING_PERIOD = 300000;
const unsigned long PIPE_2_DRAIN_PERIOD = 300000;

unsigned long pipe2DelayStartMillis = 0;
unsigned long pipe2StartMillis = 0;

// Pipe 3
const unsigned long PIPE_3_MAX_WATERING_PERIOD = 760000;
const unsigned long PIPE_3_DRAIN_PERIOD = 300000;
unsigned long pipe3DelayStartMillis = 0;
unsigned long pipe3StartMillis = 0;

// Pipe 1
const unsigned long PIPE_1_MAX_WATERING_PERIOD = 180000;
const unsigned long PIPE_1_DRAIN_PERIOD = 300000;
unsigned long pipe1DelayStartMillis = 0;
unsigned long pipe1StartMillis = 0;



bool pot1RedFlag = false;
bool pot1SetStartTime = false;

bool pipe1RedFlag = false;
bool pipe1SetStartTime = false;

bool pipe2RedFlag = false;
bool pipe2SetStartTime = false;

bool pipe3RedFlag = false;
bool pipe3SetStartTime = false;



void setup() 
{
  Serial.begin(9600);
  // initialize the pushbutton pin as an input:
  pinMode(POT_1_FLOAT_SENSOR, INPUT_PULLUP);
  pinMode(POT_1_RELAY_1, OUTPUT);
  digitalWrite(POT_1_RELAY_1, LOW);

  pinMode(PIPE_1_FLOAT_SENSOR, INPUT_PULLUP);
  pinMode(PIPE_1_RELAY_1, OUTPUT);
  digitalWrite(PIPE_1_RELAY_1, LOW);

  pinMode(PIPE_2_FLOAT_SENSOR, INPUT_PULLUP);
  pinMode(PIPE_2_RELAY_2, OUTPUT);
  digitalWrite(PIPE_2_RELAY_2, LOW);

  pinMode(PIPE_3_FLOAT_SENSOR, INPUT_PULLUP);
  pinMode(PIPE_3_RELAY_3, OUTPUT);
  digitalWrite(PIPE_3_RELAY_3, LOW);
  
  pot1StartMillis = millis();
  pipe1StartMillis = millis();
  pipe2StartMillis = millis();
  pipe3StartMillis = millis();
}

void loop() 
{
  checkAbstractWateringTimer(pot1SetStartTime, pot1RedFlag, pot1DelayStartMillis, 
                                POT_1_DRAIN_PERIOD, POT_1_MAX_WATERING_PERIOD,
                                pot1StartMillis, POT_1_FLOAT_SENSOR, POT_1_RELAY_1);

  checkAbstractWateringTimer(pipe1SetStartTime, pipe1RedFlag, pipe1DelayStartMillis, 
                                PIPE_1_DRAIN_PERIOD, PIPE_1_MAX_WATERING_PERIOD,
                                pipe1StartMillis, PIPE_1_FLOAT_SENSOR, PIPE_1_RELAY_1);

  checkAbstractWateringTimer(pipe2SetStartTime, pipe2RedFlag, pipe2DelayStartMillis, 
                                PIPE_2_DRAIN_PERIOD, PIPE_2_MAX_WATERING_PERIOD,
                                pipe2StartMillis, PIPE_2_FLOAT_SENSOR, PIPE_2_RELAY_2);

   checkAbstractWateringTimer(pipe3SetStartTime, pipe3RedFlag, pipe3DelayStartMillis, 
                                PIPE_3_DRAIN_PERIOD, PIPE_3_MAX_WATERING_PERIOD,
                                pipe3StartMillis, PIPE_3_FLOAT_SENSOR, PIPE_3_RELAY_3);

  delay(200);
}

void checkAbstractWateringTimer(bool &abstractSetStartTime, bool &abstractRedFlag, unsigned long &abstractDelayStartMillis, 
                                unsigned long abstractDrainPeriod, unsigned long abstractMaxWateringPeriod,
                                unsigned long &abstractStartMillis, int abstractFloatSensor, int abstractRelay) {
  if (!abstractSetStartTime || (abstractSetStartTime && millis() - abstractDelayStartMillis >= abstractDrainPeriod)) {
    
    if(digitalRead(abstractFloatSensor) == LOW && !abstractRedFlag) // Need one more condition in order to emulate the delay...
    {    
      digitalWrite(abstractRelay, LOW);
      Serial.println("Pot 1 pump is open");
  
      // Set it only once at the beginning
      if (pot1SetStartTime) {
        abstractStartMillis = millis();
        abstractSetStartTime = false;
      }
      
      Serial.print("duration ");
      Serial.println(millis() - abstractStartMillis);
  
      if (millis() - abstractStartMillis >= abstractMaxWateringPeriod)  //test whether the MAX watering period has elapsed
      {
        // Close pump and do not oopen it again. Red Flag...      
        Serial.println("Pot 1 pump is closed and the red flag is ON");
        digitalWrite(abstractRelay, HIGH);
        abstractRedFlag = true;
      }
    } 
    else 
    {
      Serial.println("Pot 1 Pump is closed");
      digitalWrite(abstractRelay, HIGH);
      abstractSetStartTime = true;
      abstractDelayStartMillis = millis();
    }    
  }  
}

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

-- ОБНОВЛЕНИЕ -- И когда я использовал Raspberry, и Arduino, я не включал никаких резисторов между контактами поплавкового датчика и землей. Есть ли вероятность, что это связано с нестабильностью, которую я испытал?

Может быть, мне следует добавить резистор (10K) между выводом поплавкового датчика и землей?

Спасибо

, 👍0

Обсуждение

Re “для Arduino я не могу точно сказать, была ли вся система заморожена”: заставьте встроенный светодиод мигать в loop(). Если он перестает мигать, значит, он заморожен., @Edgar Bonet

Спасибо, Эдгар, хорошая идея у меня получится., @Investigator

- Может быть, мне стоит добавить резистор (10 Ком) между выводом поплавкового датчика и землей?` -- Нет, у вас есть (примерно) 30 тысяч внутренних подтягивающих резисторов. Добавление выдвижного резистора 10k просто все перепутает. Однако добавление 10k pullups к 5V помогло бы с шумоподавлением., @Majenko

если реле заставляют ваш блок питания падать в напряжении, это может повлиять на ваши датчики., @Abel

Маенко спасибо вам за ваш комментарий. Вы хотите сказать, что я должен следовать чему-то вроде этого: https://en.wikipedia.org/wiki/Pull-up_resistor и на Vin я должен поместить 5 вольт, а на Vout я должен подключить его к моему цифровому входу. Правильно ? Извините за подтверждение, но мои аппаратные знания ограничены., @Investigator

Спасибо тебе, Абель, за твой комментарий. Мне кажется, я понимаю, что вы говорите. У меня есть источник питания 12 В, и если я помню, из моей головы рассчитан на 1,5 ампера. Мой вопрос в том, что мне делать, если ваше утверждение верно? Купить лучший источник питания?, @Investigator

Маженко Я тоже немного подробнее прочитал о подтягивающих резисторах по этой ссылке: https://learn.sparkfun.com/tutorials/pull-up-resistors/all Я подключаю поплавковый датчик следующим образом: https://www.gadgetronicx.com/interfacing-float-sensor-arduino/ Как вы, возможно, заметили, в моем коде я использую INPUT_PULLUP. Я понимаю, что добавление резистора 10K pullup к 5V, как вы сказали, поможет с шумоподавлением, в то время как я должен оставить свой код как есть. Правильно ? Я имею в виду, что иметь внутренний подтягивающий резистор плюс внешний было бы прекрасно. Или я тоже должен адекватно адаптировать свой код?, @Investigator

Считаете ли вы целесообразным использовать внешний источник питания для 8-модульного реле ? Есть ли в этом хоть какой-то смысл?, @Investigator

Как долго тянется кабель? Есть ли какое-либо электрически шумное оборудование вблизи кабельных трасс? Рассмотрите возможность использования какой-либо формы гальванической развязки для сопряжения поплавковых датчиков с микроконтроллером. Реле требуют тока привода от 50 до 60 мА, но контакты Arduino могут подавать только 40 мА., @tim

Привет Тим спасибо за ваш полезный вклад. Это вы предлагаете мне подключить релейный модуль к внешнему источнику питания (vin и заземление, я полагаю, будут поступать от другого источника питания). Теперь про шум можно было. У меня там чертовски много кабелей! Максимальное расстояние для каждого поплавкового датчика составляет менее пяти метров. Я займусь исследованием гальванической изоляции. Спасибо!!!, @Investigator

Тим, если у вас есть ссылка, связанная с "гальванической изоляцией", было бы здорово!!!!, @Investigator

Привет Тим Я использовал эту ссылку для правильного питания реле от внешнего источника питания https://lastminuteengineers.com/two-channel-relay-module-arduino-tutorial/. Спасибо!, @Investigator

Я думаю, что сначала попробую с этими двумя модификациями. Внешний источник питания и подтягивающие резисторы. Обычно это должно быть довольно быстро, если это будет работать или нет., @Investigator

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

Я надеюсь, что он не рухнет в течение следующего часа или около того.... :D но даже если это произойдет, я знаю, что мы сможем найти первопричину в этой теме!!!, @Investigator

Рад, что мы смогли помочь. Texas Instruments имеет большую серию видеороликов на тему [гальванической изоляции](https://training.ti.com/ti-precision-labs-isolation-what-galvanic-isolation), в котором обсуждаются методы индуктивной, емкостной и оптической изоляции. Что-то еще нужно рассмотреть, это дебаунсинг сигнала поплавкового датчика либо в аппаратном обеспечении с RC-фильтром низких частот, либо с помощью [программного дебаунсера](https://github.com/TimMathias/Arduino-Debouncer). Для более сильных подтягиваний вы можете попробовать резисторы 1K, хотя это будет использовать больше тока., @tim

Ребята, я хотел бы принять ваши ответы (и не один). Возможно ли это? Если не ответ хотя бы Тима. Вам нужно отправить ответ вместо комментария, чтобы я его принял?, @Investigator

До сих пор все выглядело нормально. Никакого переполнения. Единственное, что я заметил, это то, что он перестал работать после нескольких часов работы. Но, я полагаю, это может быть другая проблема. Может быть, переполнение или что-то еще., @Investigator

Еще раз привет, Тим/всем, к сожалению, этим утром у нас был перелив воды. Это означает, что один конкретный датчик не подал правильный сигнал на Arduino. Я смотрел видео с гальванической развязкой от TI. Это здорово, но я думаю, что в релейном модуле у них уже есть оптосоединители. Теперь я подумываю о том, чтобы ввести RC-фильтр низких частот, как вы сказали каждому поплавковому датчику. У вас есть какие-либо предложения по значениям резистора и конденсатора? Подтягивающие резисторы составляют 10К. Я изменю их на 1 тыс. Есть еще какие-нибудь предложения?, @Investigator

Есть ли какая-то разница, если я использую два ардуино? Один для управления поплавковыми датчиками, а другой-реле? После этого этим двоим придется пообщаться., @Investigator

Как вы думаете, у меня не будет этих проблем, которые я испытываю сейчас с этим датчиком ? https://www.hellasdigital.gr/electronics/sensors/humidity-sensor/gravity-photoelectric-water-liquid-level-sensor-for-arduino-sen0205/, @Investigator

Вы правы, что в релейных модулях уже есть изоляторы, но вы упустили из виду, что датчики не имеют никакой изоляции. Вам нужно изолировать сигналы в обоих направлениях - как на входах, так и на выходах., @tim


2 ответа


Лучший ответ:

1

Как и просили, я собрал свои комментарии в ответ.

Как долго тянутся кабельные трассы? Есть ли какое-либо электрическое шумное оборудование рядом с кабельными трассами? Рассмотрите возможность использования какой-либо формы гальванической развязки для подключения датчиков поплавка к микроконтроллеру. У Texas Instruments есть отличная серия видеороликов на тему гальванической развязки, в которых обсуждаются методы индуктивной, емкостной и оптической развязки. Изолируйте сигналы в обоих направлениях – как на входах, так и на выходах.

Для более сильных подтягиваний вы можете попробовать резисторы 1K, хотя при этом будет потребляться больший ток.

Что-то еще, что следует учитывать, - это отключение сигналов датчика поплавка либо в аппаратном обеспечении с помощью RC-фильтра нижних частот, либо с помощью программного обеспечения (которое я разместил на GitHub).

Реле требуют тока привода от 50 до 60 мА, но контакты Arduino могут подавать только 40 мА, поэтому рекомендуется использовать внешний источник питания.

Резервирование, т. е. наличие нескольких датчиков для одного и того же измерения, защитит от потери одного датчика, вызывающего хаос в критической системе, например, потерю драгоценной воды в жарком климате. У вас может быть 3 поплавковых датчика для каждого уровня воды в разных местах, а затем используйте систему голосования >= 2 для принятия мер. Система также должна отмечать, когда датчики расходятся, чтобы кто-то мог исследовать проблему. А также проложите кабели по 3 различным путям. Такое физическое разделение защитит от одного локализованного события (например, своенравного трактора или удара молнии), повредившего все датчики одновременно.

Также рассмотрите отказоустойчивый режим. Например, это может заключаться в отключении всех водяных клапанов при несогласии датчиков, а затем отправке кому-либо предупреждения и/или подаче сигнала тревоги.

Поскольку ваша аквапонная ферма находится снаружи, подумайте о защите от ударов молнии, например, используйте диоды TVS на всех входах и выходах.

Вы можете добавить датчики обратной связи к реле, чтобы проверить, действительно ли они отреагировали на команды Arduino включить или выключить, т. е. Сравнить значение команды со значением датчика FB. Эти датчики могут быть выдвижными/выдвижными резисторами.

Эти дополнительные датчики реле FB и датчики поплавка могут быть включены в отказоустойчивую логику. Некоторые примеры включают:

  1. Если реле включено, когда оно должно быть выключено, отметьте несоответствие.
  2. Если для заполнения бака требуется 5 минут, а входное реле включено более 5 минут, это может быть переполнение или неисправные датчики. >
  3. Если поплавковые датчики сообщают, что бак пуст, но входное реле включено более 5 минут, значит, что-то не так, например, протекающий бак или ненадежные датчики. >
  4. Если для слива бака требуется 10 минут, но поплавковые датчики показывают, что он все еще полон через 11 минут, значит, что-то не так, например, заблокирован слив или неточные датчики.
  5. Включены ли входное и выходное реле одновременно? Является ли это действительным условием?

Существует множество перестановок. Счастливого кодирования...

,

0

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

Вообще для меня ВСЕ комментарии из этой темы были очень важны.

Спасибо вам!

,

Что-то еще, что следует учитывать, - это избыточность, т. Е. наличие нескольких датчиков для одного и того же измерения. Это защитит от потери одного датчика, вызывающего хаос в критической системе, например, потерю драгоценной воды в жарком климате. У вас может быть 3 плавающих датчика в каждом месте, а затем используйте систему голосования >= 2 для принятия мер. Система также должна отмечать, когда датчики расходятся во мнениях, чтобы кто-то мог исследовать проблему., @tim

До сих пор я предполагал, что это крытая аквапоническая ферма. Если это на открытом воздухе, вам также следует подумать о защите от ударов молнии, например, с помощью диодов TVS на всех входах и выходах. И небольшая поправка к моему предыдущему комментарию: 3 датчика для каждого измерения должны находиться в разных местах, но на одном и том же уровне воды. А также проложите кабели по 3 различным путям. Это физическое разделение защитит от одного локализованного события (например, своенравного трактора или удара молнии), которое одновременно повредит все датчики., @tim

Да, действительно, он находится на открытом воздухе на крыше моего дома. Я посмотрю на диоды, о которых вы говорите. Еще раз спасибо вам за замечательные аппаратные идеи, которые вы мне даете. Я ценю их., @Investigator