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

image

image

Прошу под кат, там интересней ;)

Я как бы разобрался и у меня даже получилось отрегулировать, но на это я затратил время и нервы. Тогда то я и понял, что цифровое реле было бы здорово, просто нажал на кнопки и выставил нужное. Конечно меня могут многие осудить по нескольким статьям:

— ты дурак, что не можешь разобраться с простейшим реле давления и двумя пружинками.
— механика рулит, она будет работать вечно.
— зачем там что то регулировать: один раз выставил сантехник за XX*(курс страны) рублей и все

Без проблем, можно список продолжать долго, но по натуре своей инженерской, хотелось бы развиваться и улучшать все вокруг себя, а не крутить пружинки и думать, когда там подгорят контакты механического реле и начнет срабатывать тепловое реле защиты насоса, когда вы весь в мыле :D, а ещё лучше Ваша жена :)

Надо отдать должное, механическое реле у меня работает уже 4-ый год и с ним (тьфу тьфу тьфу) Серьёзного пока ничего не случалось, только приходилось перестраивать, очищать контакты, начало искрить и эти “ЩЕЛК!” в гараже немного напрягали и… пугали моего мышонка, так, что ему пришлось убежать.

Побег


Так как я увлекаюсь автоматизацией и прошел путь от 1-wire до arduino через esp, могу и делаю разные поделки в доме, точнее устройства, для облегчения быта. Круг друзей знает о списке проектов, которые я стараюсь завершить и реализовать, но времени на то совсем нет. То стройка баня подвернется на целое лето (750 часов), то снег навалит :), а тут уже и Новый Год на носу!

image

Меня так же многие “любят” потролить, особенно из ИТ сферы. Но это только веселит, жизнь штука интересная и без этого никак. Так же огромное спасибо всем тем, кто меня поддерживает — без Ваших добрых слов, драйв был бы не тот. Спасибо жене за понимание любви к моим платам )

Из лирики, прыгаем в реальность. Я обратился в поиски цифрового реле и понял, что весьма сложно в этом направлении, либо забугорное под 100$ и совсем не так, как хотелось бы… либо механика за 15$. Привожу в $, так как давно известно, если бы мы перешли на $ — то даже бабушки не парились, как с монетами. А я ж такой негодяй — дом подключил к интернету, а реле давления нет — сумасшедший!

Тема для тролей: Я начал работать с Arduino китайского происхождения, не оригинальные, а китайские, работают так же, где то есть мелкие погрешности, но они меня не задевают так, чтобы извергать лаву негатива и трясти esp8266, которая от статики умирает быстрее, чем вы воткнете её в Ваш компьютер, да ещё с питанием 3.3, которое надо пойти и найти), если это только не NodeMCU, которые я обожаю.

Я люблю и esp8266 и Arduino и людей, но чтобы вот так сесть быстро собрать рабочее и СТАБИЛЬНОЕ устройство для автоматизации — arduino незаменимая штука + Wiring C-шный язык очень помогает быстро реализовать то, что требуется. (тут никто и не упрекнет, что ты написал на тормозном Lua скриптовом языке). esp8266 (моё мнение) — хороша там, где не надо АЦП мерять и интернет нужен. Хотя её “сгорание\сырость” очень разочаровывает.

Возвращаемся к нашим баранам, то-есть реле :)

По итогу нашел в Китае датчик за 5$, с АЦП 0-5V и решил попробовать. Даже не так, я тупо загорелся его применить и собрать устройство. Сразу пошли бурные эротические фантазии, как будут мигать светодиодики ) и нажиматься кнопки для регулировки, а на китайском иконическом синем экране будут гореть заветные циферки и все это будет работать с реальным давлением в нашей гребенке.

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

Когда прилетел датчик, я понял — что датчик очень качественно выполнен.

image

Далее, я понял что он начинает показывать данные не с нуля, а с 0.5В и до 4.5В. от 0 до 12Bar. Я очень обрадовался, так как мне было приятно осознавать сингулярность данного девайса, можно отслеживать, когда датчик умрет и не будет показывать заветные 0.5 на выходе.

Врезка датчика в текущую систему с оставлением механики “на всякий случай”.

image

Одно печально, не было никаких данных по датчику, как обсчитывать его показания, но так как была линейная прямая на графике, пришлось (стыдно, но я признаюсь) — открывать учебник АЛГЕБРА и учиться заново, вспоминать, как же там строят прямую линейную зависимость в уравнении :) по двум точкам и о чуда, я быстренько получил (можете постыдить меня) заветную простую формулу, в которой после преобразования АЦП сигнала в ВОЛЬТЫ, я понимал, сколько у меня давление в Bar. Так как датчик сам выдавал от 0 до 1.2Mpa — то не сложно перевести в Bar — зная что:

1 Pa = 1.0E-5 bar
тоесть 1200000Pa = 12Bar
Так как у нас давление от насоса не превышает и 4Bar — этого датчика хватит за глаза!

Дальше я взял Arduino Uno — она у меня лишняя валялась, я обычно её использую для быстрого навесного проектирования, проверки, а потом применяю Arduino Nano, так как она лишена левого обвеса и её размеры в 3 раза меньше! И да простят меня ардуинщики китайского происхождения, мне жалко было смотреть, как она валяется без дела, надо пустить её в девайс! Подумал я и купил пластиковую IP55 коробку небольших размеров, выпили отверстие под экран, который я купил 4 года назад! Карл! И тогда не догадывался, что этот LCD 16*2 пойдет в такое полезно дело. Взял на авторынке 2 авто кнопки, спаял провода, даже плату не проектировал отдельно, как я делаю для Nano — так как Uno тупо большая и совсем не для таких целей.

image

Алгоритм достаточно простой и ещё проходит полевые испытания, код проекта для более тесного ознакомления расположен тут.

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

В алгоритм я постарался заложить следующие принципы:

— Инициализация данных: при старте, проверяются и инициируются все переменные для работы
— Первичный опрос датчика: проверяется, если датчик не вышел из строя (в случае выхода, на всякий случай вырубается насос-реле) данные рассчитываются и переводятся в текущее давление в гребенке (распределительная гребенка, к которой подключены соседи+приход от насоса+гидроаккумулятор), если все в пределах нижнего и верхнего установленного давления, тогда продолжаем слушать и рассчитывать данные
— Данные выводятся визуально на экран ввиде:

нижнее давление — текущее давление — высокое давление
индекс падения давления — [ блоки, показывают давление в системе ]

Это позволяет быстро оценить ситуёвину, что происходит.

image

— Если текущее давление ниже НИЖНЕГО: врубается твердотельное реле на 15A(проверенное годами) и насос тихо, быстро, без искр и щелчков, включается и подает воду. ВЕРХНЕЕ давление отключает реле. Насос никогда не включится и обязательно выключится, если что то с показаниями датчика, которые выходят за пределы разумного. Это безопасность.

— Индекс падения давления я рассчитываю тогда, когда в гребенке остается половина давления и каждые 10 секунд проверяется предыдущее и текущее, если разница составит меньше установленного по дефолту 0.05 — тогда меняется текущий индекс и включается насос на ОПЕРЕЖЕНИЕ, тоесть по логике идет быстрое водопотребление и что бы предугадать включение насоса, я такой логикой и пользуюсь. Логика не срабатывает пока на 100%, так как я ещё тестирую этот момент, есть огрехи связанные с millis() таймингом самой ардуины, тут меня это немного напрягает, но я найду решение по четкому подсчету. Логика срабатывает в начале, а потом индекс падает в 0.01 и логика больше не работает, но это никак не влияет на вкл и выкл насоса. Тут можно холиварить на тему “насос должен включаться определенное количество раз в час и не больше” — у Вас есть на это право ), спорить не буду — данная тема анализируется.

— есть кнопки боковые, которые позволяют устанавливать НИЗКИЙ и ВЫСОКИЙ порог включения и выключения насоса ДИНАМИЧЕСКИ, без перезагрузки, просто тупо на лету — смотрите на экран и нажимаете кнопочки боковые…. удобно-на! данные сразу пишутся в EEPPROM и при включении блока загружаются оттуда (это такая постоянная память на запись чисел от 0 до 255 byte type, мало но хватает на мелкие прихоти). При этом есть момент, заключается в том, что числа с плавающей точкой записать настолько трудно и геморно, что просто было решено с моей стороны так: зная, что число x.x0 это давление float типа, его можно легко конвертировать в byte если умножить на 10 и записать в память, тоесть: example: 1.80 * 10 = 18 — после умножения число float отбрасывает последний ноль автоматически и мы получается число, которое укладывается в byte типа, при чтении, мы его делим на 10.0 и получаем обратную форму для работы в нашей система и типа float.

— Все добро будет доступно для «только чтение» вне дома, что позволит понимать ситуацию с давлением не только артериальным, но и в трубах!

image

Ну вот вроде бы и все, простите, кого напрягают подробности кода, дурацких ТИПОВ данных и интимных подробностей загрузки данных из памяти, пропускайте это, так как, зная, что есть люди из ИТ сферы, они будут задавать всякого рода вопросы или наоборот, посмеются с моих простых алгоритмов, которые не применяют модные ИИ \ ML и прочие мега крутые и big data алгоритмы. Надеюсь так же инженеры поймут другие части, связанные с механической часть.

Вообщем, вывод такой: можно делать все, можно делать легко, делать это в интерес и как сказал когда-то один мой любимый комментатор: можно быть взрослым и “играться с детскими игрушками”.

image

полевые испытания


Ваш кэп, автоматизатор, capable guy и хорошего дня Вам!

Косяки:

— Продолжаю тестировать индекс падения давления для преждевременного включения
— Arduino uno (Китай) — выявились проблемы с таймером millis() — буду проверять на arduino nano (раньше такого не было, предполагаю кривая модель) (не оргинал, поэтому не ною ))
— Погрешность заявлена 1.5% — от 1.2Bar — это 0.18Bar — пофакту — у меня где то 0.3 относительно моего манометра, но я не знаю сколько он врет… поэтому 2% допускаю погрешость max — можно заложить в алгоритм (как я делаю) погрешность и бдет более менее похоже на правду. Не спутники же запускать — сойдет )

upd: ценник в районе 15-18$ вышел по итогу за изделие.

С наступающим Новым Годом! Пусть у Вас сбудутся все Ваши планы, будут построены БАНИ, в доме будет ТЕПЛО и вся Ваша дружная семья будет с Вами! Пусть в новом году будет только хорошие новости.

Комментарии (135)


  1. oppol
    08.12.2017 09:16

    Для таких устройств желательно использовать автоматический RESET в случае зависания. А то если контроллер зависнет в момент включения насоса, могут возникнуть потом некоторые траты за электричество и всякое такое.
    Микроконтроллеры ATmega имеют встроенный механизм WatchDog Timer. В Ардуино он не прописан, но добрые люди сделали поддержку этой функции
    www.cyber-place.ru/showthread.php?t=550&page=13


    1. lonelymyp
      08.12.2017 10:09

      Там механическое реле осталось для таких случаев.


      1. Alex_Bogdanovich Автор
        08.12.2017 10:49

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


  1. DES3
    08.12.2017 10:21

    А не было мысли поставить второй датчик после магистрального фильтра, чтобы этот самый фильтр менять не визуальным контролем, а по достижению порогового значения дельты показаний двух датчиков?


    1. Alex_Bogdanovich Автор
      08.12.2017 10:22

      меняю раз в 3-5 месяца(ев) и как то ОК — не напрягает ;)


      1. DES3
        08.12.2017 10:35

        У меня колодец и потребность выше — в среднем раз в месяц замена фильтра происходит. Да и хочется оперировать более объективным критерием нежели визуальное загрязнение и уже по факту ослабевший напор воды из под крана. Пока не встретил готового решения.


        1. Alex_Bogdanovich Автор
          08.12.2017 10:48

          если найдете решение — буду рад услышать его, возможно поделитесь статьей. спасибо


        1. iig
          08.12.2017 16:30

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


  1. dovzh
    08.12.2017 10:36

    защита от сухого хода предусмотрена?


    1. Alex_Bogdanovich Автор
      08.12.2017 10:47

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


      1. batman12345
        08.12.2017 12:41

        Может уж тогда и плавный пуск вкорячить, чтобы не было бросков тока в момент включения (реализуется программно либо на U2008B). Заменить оптореле связкой MOC + симистор. Шунтировать симистор относительно слаботочным реле, чтобы уменьшить безполезный нагрев…
        много чего можно добавить


        1. iig
          08.12.2017 12:45

          Плавный пуск асинхронного двигателя выглядит немного сложнее ;) Дешевле купить еще один насос.


          1. batman12345
            08.12.2017 12:47

            А вот производители электроинструмента не видят в этом ничего сложного


            1. iig
              08.12.2017 13:24

              Ссылку на электроинструмент с асинхронным двигателем, плавным пуском и ценой в студию ;)


            1. kotomyava
              08.12.2017 15:58

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


              1. batman12345
                08.12.2017 16:34

                Вы правы, но только наполовину.
                Асинхронным двигателем нужно управлять по закону U/F, т.е. с изменением частоты должно меняться и напряжение. Однако, не вижу причин по которым двигатель не мог бы стартовать с пониженного напряжения.


                1. iig
                  08.12.2017 17:09

                  не вижу причин по которым двигатель не мог бы стартовать с пониженного напряжения

                  Стартовый ток. Ну не умеет асинхронник крутиться медленно.


                  1. Vanellope
                    09.12.2017 01:54

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


                    1. kotomyava
                      09.12.2017 10:44

                      Они традиционны для универсальных двигателей, не для асинхронных.


                      1. Vanellope
                        09.12.2017 11:53

                        Ну здрасьте. Например GE Astat Plus — как раз для асинхронников и как раз симисторный.


                        1. iig
                          11.12.2017 12:05

                          Загуглил.

                          Устройства плавного пуска General Electric серии Astat Plus — полупроводниковые устройства плавного пуска для трехфазных двигателей переменного тока


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


                1. kotomyava
                  09.12.2017 10:43

                  И что это даст, кроме вероятности того, что он не стартует вовсе?


      1. mazy
        08.12.2017 13:03

        можно добавить дачик протока
        ebay.to/2y7wGgc
        заодно по нему можно будет считать потребление и косвенно загрязнение фильтра.


  1. dovzh
    08.12.2017 11:39

    я себе поставил вот такую управлялку: fiting.com.ua/p362188900-rele-davleniya-zaschitoj.html


  1. mehos
    08.12.2017 11:49

    За изделие и прямые руки, безусловно, плюс. Но если исключить из текста все приветствия, поздравления, хвалебные слова самому себе и прочие оправдания, то останется примерно 10 строчек. Из которых половина о том как можно умножить и разделит на 10 чтобы хранить все в памяти в человекопонятном виде вместо того, чтобы хранить значение от 0 до 255 (как на выходе с АЦП) и преобразовывать в человекопонятное при выводе на экран.


  1. iig
    08.12.2017 12:34

    Задача надуманная. Ладно бы плавный пуск насоса организовали… А так это замена 1 типового модуля на 4 редких (датчик-источник питания-контроллер-индикатор; куда бежать, если в пятницу вечером датчик с алиэкспресса сломается?). Механическое реле (при правильной регулировке) просто работает годами. Если напрягают щелчки — можно завернуть в шумоподавитель (хотя, раз оно осталось в системе и продолжает щелкать — думаю, это не повредит).
    Гидроаккумулятор должен быть литров на 100, раз от него запитаны еще и соседи.
    Давление воздуха в нем (без воды!) должно быть 1.5..1.7 атм.
    Нижнее давление в в автоматике должно быть на 0.2-0.3 атм выше чем давление воздуха — тогда не будет провалов давления при пуске насоса.
    Датчик давления (или реле) желательно монтировать поближе к гидроаккумулятору.


    1. Ksiw
      08.12.2017 14:57

      Хороший коммент.
      Не надо сочинять новый механизм там, где достаточно грамотно настроить имеющийся.


  1. vvzvlad
    08.12.2017 12:58
    +2

    Не буду спрашивать, нафига там вообще float, а спрошу, в чем проблема с записью его в EEPROM?


    1. Alex_Bogdanovich Автор
      08.12.2017 14:13

      www.arduino.cc/en/Reference/EEPROMWrite
      value: the value to write, from 0 to 255 (byte)

      возможно профи ардуинщики меня тыкнут куда то :) в другой мануал

      float чем вам не нравится? он применяется в давлении так как цена изменения давления идет 0.01 — мне так захотелось учитывать.

      аналог выдет от 0 до 1023 — тоесть от 0 до 5V
      этот сенсор выдает от 0.5-4.5В

      так как 0-1023 это больше чем byte (uint16_t), а выводить как вы визуально будет еданные без float?

      Если есть конкретнеы предложение, буду рад выслушать, спасибо :)


      1. vvzvlad
        08.12.2017 14:33

        byte(int/uint8_t) — это как раз и значения от 0 до 255. А uint16_t — это значения от 0 до 65к, 1024 туда поместятся. А еще проще умножать сразу на коэффициент пересчета(какой, там, 11?) и хранить значение в миллибарах каких-нибудь. Т.е. давление у вас 3бар, АЦП выдает 274, вы умножаете на 11, получаете 3014 и его храните. А если надо вывести на экран/в лог — вычисляете сначала целую часть, деля на 1000, а потом дробную, беря остаток от деления. Все сравнения внутри программы ведете в миллибарах.
        Таким образом, избавляетесь от float, ускоряя операции, и экономите на памяти, храня два байта вместо 4, да еще и не теряя в точности.

        А по поводу EEPROM, что вам мешает записать эти два байта, составляющие uint16_t(или 4 в случае float) в разные ячейки?


        1. Alex_Bogdanovich Автор
          08.12.2017 14:46

          спасибо за подход, рассмотрим его в рамках оптимизации кода.

          изначально я тоже хотел хранить и оперировать АЦП данными, но потом решил перейти на более простую и понятную форму (каждый делает так как ему удобно)

          касательно памяти — не вижу проблем сторить большие даные разбивая на адресные пространства.

          спасибо за время


          1. vvzvlad
            08.12.2017 14:52

            Что-то типа.
            #define EEPROM_OFFSET_VALUE = 0x10
            #define ADC_MBAR_FACTOR = 11
            
            typedef union u8_u16_t
            {
               uint16_t u16;
               uint8_t u8[2];
            } u8_u16_t;
            
            uint16_t read_value()
            {
               u8_u16_t value;
               value.u8[0] = EEPROM.read(EEPROM_OFFSET_VALUE+0);
               value.u8[1] = EEPROM.read(EEPROM_OFFSET_VALUE+1);
               return value.u16;
            }
            
            void write_value(uint16_t value_u16)
            {
               u8_u16_t value;
               value.u16 = value_u16;
               EEPROM.write(EEPROM_OFFSET_VALUE+0, value.u8[0]);
               EEPROM.write(EEPROM_OFFSET_VALUE+1, value.u8[1]);
            } 
            
            void measure()
            {
               uint16_t raw_value = ADC.read(1);
               write_value(raw_value*ADC_MBAR_FACTOR);
            }
            
            void print()
            {
               uint16_t valuembar = read_value();
               printf("Value: %u.%u\n", valuembar / 1000, valuembar % 1000);
            }
            
            


          1. juray
            08.12.2017 17:59

            Про формат данных хочу вставить пять копеек «на гипотетически возможное будущее»:

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

            А вот как только возникнет задача передачи данных на другое устройство (например, на комп для мониторинга), то лучше сразу предусмотреть в протоколе передачи некую стандартизацию формата — и хорошо бы привязать или к какому-то уже существующему стандарту, или просто заложить «человеко-понятную» форму (самый простой пример — ASCII-протокол через UART, который можно посмотреть тупо в терминале).

            Другими словами, передавать в канал «сырой» замер АЦП чревато следующим сценарием: делаем мы следующую версию нашего устройства, с другой разрядностью АЦП (12 вместо 10 или наоборот), а того веселее (и вероятнее) — если меняются параметры цепи между датчиком и АЦП (делитель или усилитель), или сам датчик (с другой характеристикой) — и привет.

            Можно конечно, и принимающее устройство перешить на «понимание» этого нового формата, но это годится только в случае единичной поделки для себя. А вот когда делаешь такие штуки на сторону, и устройства гуляют не комплектом, а по отдельности, тут вопросы совместимости и появляются (кстати, я на эти грабли уже наступал, почему и делюсь соображениями).

            Возможный способ — в новой версии сделать перед передачей в канал конвертацию, имитирующую старый формат — по сути получается, что мы фиксируем тот первый вариант «сырого АЦП» в качестве стандарта. Но «еще один самопальный стандарт» — это всё-таки фу. Через несколько итераций может получиться "эффект лошадиной задницы".

            В общем, повторюсь — всё это не актуально в случае единичных поделок «для себя». Просто хорошая привычка, могущая пригодиться при дальнейшем развитии. А оно ведь как бывает — сделал для себя, потом зашёл сосед, увидел — и попросил и ему такое сделать (за вознаграждение или просто в рамках добрососедских отношений — это уже по ситуации), потом еще знакомым рассказал — и пошла писать губерния.


  1. AlexanderAmelkin
    08.12.2017 14:07

    было решено с моей стороны так: зная, что число x.x0 это давление float типа, его можно легко конвертировать в byte если умножить на 10 и записать в память


    Поздравляю! Вы «изобрели» формат записи с фиксированной точкой. ;)

    А вообще вы молодец. Спасибо. Интересно. Люблю малую автоматизацию.


    1. Alex_Bogdanovich Автор
      08.12.2017 14:08

      Спасибо, «изобрели» формат записил — это хорошая шутка, посмеялся ))))
      Как ктото писал — «нафига переводить, и в чем трабла записи в EEPPROM float типа?» — да дело в том что EEPPROM сейвит по мануалу 0-255 byte тип или как любят писать: uint8_t тип.


      1. Alexeyslav
        08.12.2017 14:46

        Вообще это просто минимальная порция данных для записи, никто не запрещает хоть 16 ячеек по очереди записывать! А float в контроллере представлен 4-мя такими байтами, если мне память не изменяет.


        1. Alex_Bogdanovich Автор
          08.12.2017 14:48

          да все верно — я хотел быстро записать в одну ячейку без разбивок.


          1. AlexanderAmelkin
            08.12.2017 16:38

            Там даже разбивать ничего не надо. Пишите подряд и всё. Все I2C EEPROM имеют режим последовательной страничной записи. Один раз посылаем адрес микросхемы и бит записи, потом адрес стартовой ячейки, а потом данные без стопа. Стоп — только после последнего байта. Адрес инкрементируется в микросхеме сам.

            Ну и раз уж у вас Ардуина с её библиотеками, то там это делается через EEPROM.put():
            www.arduino.cc/en/Tutorial/EEPROMPut


            1. juray
              08.12.2017 18:04

              а там точно епром именно I2C используется, а не внутренний AVR- микроконтроллера?


              1. AlexanderAmelkin
                08.12.2017 19:17

                Может и внутренний. Не имел дела с ардуинами, честно говоря. Но всё равно в API есть функция EEPROM.put(), которая любые переменные сохраняет.


                1. juray
                  09.12.2017 20:53

                  я к тому вёл, что если встроенный — то не в каждом AVR есть страничный режим, вот в AT90CANxxx — нет.
                  Впрочем, автоинкремент адреса байтов может быть реализован в API и программно. Тем более, что пользователь может указать такой начальный адрес, что попадёт на границу страниц.


      1. AlexanderAmelkin
        08.12.2017 16:28

        Ну и что, что он «сейвит» байты. Это как-то до сих пор никому не мешало хранить там хоть 16, хоть 32, хоть 64 бита, хоть строки любой длины (лишь бы влезло). Процедура записи 4 байт мало отличается от таковой для 1 байта.

        Кстати, вот совершенно справедливое было высказано тут предложение хранить данные в EEPROM в «сыром» виде, как выдаёт АЦП. И ничего отбрасывать или округлять не надо было бы. А всей этой арифметикой заниматься уже непосредственно перед выводом на экран.


        1. Alex_Bogdanovich Автор
          08.12.2017 16:30

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


          1. iig
            08.12.2017 16:35

            Более того, если сдвинете на 2 разряда то, что вычитали из АЦП — можно спокойно сохранять 1 байт, разницы никто не увидит. Вряд ли у этих датчиков точность в 0.1%, а даже для 1% (что тоже вряд ли) 255 уровней достаточно.


          1. AlexanderAmelkin
            08.12.2017 16:46

            Ну так а сравниваете-то вы это сохранённое значение с чем? Правильно, с показаниями АЦП. В итоге, при каждом сравнении приходится переводить данные АЦП в человекочитаемый формат, сохранённый в EEPROM. А хранили бы в формате, выдаваемом АЦП, сэкономили бы на этой конверсии. В вашем случае, правда, это не критично, но в других системах может быть и важно.

            Ну и верно тут ранее заметили, что эти 0-1023 легко можно поделить на 4 отбрасыванием двух младших битов и никто не заметит разницы.


  1. allexb
    08.12.2017 15:21

    Цифровое реле от $20


    1. Alex_Bogdanovich Автор
      08.12.2017 15:32

      это реле из семейства реле, которые работают с насосами напрямую и скорее всего для насосов колодцев. у меня насос со своим пускатель насоса (блок) который защищает реле давления от высоких токов…


      1. donvictorio
        09.12.2017 03:36

        частный случай.
        в большинстве случаев этой релюхи за глаза.
        можно даже пневмореле использовать, просто сделать вертикальный глухой отвод и втулить датчик вверху.
        тоже цена около $20


  1. AlexanderAmelkin
    08.12.2017 16:50

    Помимо прочего, очень не рекомендую когда-либо писать в коде вот так:

    P_c = ((11.5 * Vout + 2.25) / 4.5) + Pcorrection;


    Тут сразу две проблемы:
    1. Через пару лет, когда полезете разбираться в коде, будете долго вспоминать, что это за циферки такие и почему они именно такие
    2. Если эту формулу вы используете более, чем в 1 месте, то потом есть риск поменять её в одном месте и забыть поменять в другом.


    Решение состоит в том, чтобы никогда не использовать «магические числа», а заменять их макросами с понятными именами (и комментами в месте определения макросов). Ну а если формула используется в коде несколько раз, то лучше и её всю заменить на макро или инлайн функцию.


    1. Alex_Bogdanovich Автор
      09.12.2017 17:55

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


  1. t3hk0d3
    09.12.2017 17:53

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

    Схема работы такова:
    — Насос через фильтр грубой очистки закачивает из скважины воду в 300 литровый бак на чердаке дома.
    — На выходе из бака стоит фильтр тонкой очистки воды и повышающий насос с датчиком расхода.
    — При открытии крана вода сначала самотеком идет, но почти моментально срабатывает датчик расхода и начинает давить повышающий насос.

    Плюс в том что при отстутствии электричества водоснабжение в доме не пропадает, потому-что вода самотеком, хоть и с небольшим напором, течет из бака к потребителям. Гравитация рулит :)

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

    Эта ардуинка подключена через I2C шину к stm-ке которая обслуживает пульт управления и датчик давления в баке (для измерения уровня воды через давление). Стм-ка посылает команды на включение насоса ардуинке если уровень воды опускается ниже 10%.


  1. prostorsp
    09.12.2017 17:54

    Было бы неплохо прикрутить импульсный счётчик воды. Для измерения расхода и как датчик сухого хода. Правда в этом случае его нужно ставить до насоса. Ещё полезная функция защита от протечек. При очень медленном снижении давления в течении определенного периода времени включается закрывающий клапан.


  1. soul32bit
    09.12.2017 17:54

    Разрешите поделиться опытом. Так случилось, что живу в Крыму и несколько лет занимаюсь этой темой (насосы, скважины).

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

    1. Механика. Простенькая конструкция с двумя пружинами и гайками, позволяющими настроить давление включения и отключения (на самом деле настраивается P и ?P но по сути это одно и то же). Обязательно наличие гидроаккумулятора. Есть версии с защитой от сухого хода, но на практике они ненадежны.

    2. Электроника. Гидроаккумулятор не нужен. Как правило устройство содержит микропроцессор и 2 датчика — датчик давления и датчик протока воды. Прошу заметить — оба датчика механические а сигнал к микропроцессору обычно поступает через герконы. Присутствует защита от сухого хода, в продвинутых схемах присутствует защита мотора по току.

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

    На практике я много раз наблюдал смерть насосов с электронным реле давления и ни разу (НИ РАЗУ!) с механическим. В чем проблема? Да в том, что вода в Крыму грязная. Если из скважины, то с песком, а если из магистрали, то жесткость воды удивляет — трубы «зарастают» на глазах. Что происходит с электроникой? Вечером вы приходите домой и обнаруживаете, что мотор все время включен. Почему? Да просто засорился датчик протока воды (или датчик давления) и микроконтроллер думает, что открыт кран и тупо включает мотор. Мотор работает (краны закрыты), вода нагревается до кипятка, гидравлическая часть плавится. А ее стоимость — половина нового мотора. В случае засорения механического реле все происходит наборот — мотор не включается. Улавливаете разницу?

    И еще классческий недостаток электронных реле. Программа (по тем или иным причинам) частенько отключает мотор. И чтобы его включить — нужно нажать на кнопку. Это доводит до белого каления как пользователей, так и обслуживающий персонал. Да, механика тоже может погубить мотор. Например в сети пониженное напряжение и мотор никак не может развить двление для отключения реле. Или залипли контакты. Сухой ход в конце концов. Но почему-то на практике я этого не встречал ни разу.

    А теперь теория. Самое слабое место в механическом реле давления — гидроаккумулятор. Именно он плохо переносит морозы, именно он требует периодической проверки давления и именно в нем обычно рвется «груша». Поэтому легко понять тех, кто предпочитает электронные реле. Но давайте рассмотрим ситуацию с научной точки зрения. Что происходит, когда, например вы решили побриться и открыли кран тоненькой струйкой?

    1. Механика. Да ничего такого, штатный режим работы. При падении давления, например до 1,8 атмосфер насос включается, закачивает воду в гидроаккумулятор и при достижении 3 атмосфер отключается. (Параметры 1,8 и 3 — регулируются).

    2. Электроника. Мотор все время включен. Давление в системе зависит от модели мотора и может быть как 3 атмосферы (обычно), а может быть и 4...5 атмосфер. Суть в том, что электроника видит, что вода течет и не отключает мотор.

    Улавливаете? В механике мотор всегда работает в благоприятном режиме — через дюймовую трубу периодически наполняет гидроаккумулятор. В электронике мотор постоянно включен до тех пор, пока открыт кран (а это точно не дюйм и даже не пол дюйма). Пробовали дышать через тоненькую трубку под водой?

    Заключение. Электронное реле — это механика + электроника, а механическое — это только механика. Как вы думаете, что надежнее? К тому-же электронное реле постоянно эксплуатирует мотор в неблагоприятном для него режиме да и статистика не в пользу электроники… Выводы делайте сами.

    p.s. Состоятельным клиентам я ставлю механику и электронику в паре — получается чудесный тандем. Электроника защищает от сухого хода и повышенного тока (это то, чего не хватает механике). А механика всегда отключает мотор (и электронику) при достижении 3 атмосфер — это действительно чудесный тандем. В случае прорыва груши электроника продолжает работать и имеется возможность ремонта гидроаккумулятора без отключения водоснабжения.

    p.p.s. Надежность — это дублирование. Это правило всегда используется в связи и почему-то не используется в черных ящиках самолетов, ну да бог с ними. То бишь два китайских датчика давления — это уже очень надежно, а + механическое реле — почти совершенно. Потому что микропроцессоры иногда зависают, а порты выгорают. Простите, за многословность — это мой первый комментарий на Гиктаймсе :-)


    1. iig
      11.12.2017 13:09

      Если вместо водяной схемы нарисовать электрическую, где вместо насоса — источник тока, вместо гидроаккумулятора — конденсатор, вместо труб — провода (с сопротивлением и индуктивностью), вместо крана — резистор — все просто и понятно.

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


  1. Alex_Bogdanovich Автор
    10.12.2017 21:32

    огромное всем спасибо за разносторонние посылы и информацию, спасибо!