СУЗ-40 на Arduino

Нет ответов
Dmitriy7000
Offline
Зарегистрирован: 19.04.2016

После грозы выгорело управление насосом. Погорели оптопары, одна или две микросхемы, в общем старый динозавр из СССР. Из всего функционала работало только нижний и верхний уровень определяемый манометром). Можно было бы вообще обойтись без микросхем, только при помощи реле.

Новый СУЗ стоит около 20k. Отдельно мозги вообще есть ли в продаже не понятно, ещё и ехать куда то надо.

За то механика пережила разряд. Манометр, Ампер метр, автомат на 40А, магнитный пускатель, детектор фаз, трансформатор питания.

Из манометра три провода, один замыкается с центральным при нижнем давлении, второй при верхнем, в центральном положении оба разомкнуты (два цифровых входа).

Детектор фаз состоит из трёх трансформаторов, диодных мостов, конденсаторов, 12В реле 70х годов и стабилитронов + три диодных лампочки  с сопротивлениями. Если присутствуют все три фазы, три реле замыкают последовательно одну цепь (ещё один цифровой вход).

Амперметр 50А, при работе насоса выдаёт 4.7 Вольт, стрелка показывает ~26 Ампер, при максимуме будет больше 9В (конденсатор + пару сопротивлений, один аналоговый вход).

Один цифровой выход для реле, которое будет с трансформатора подавать 12В на магнитный пускатель.

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

Возможно ещё один цифровой, для IR пульта, что б обойтись без кнопок если поуправлять захочется. Можно ж просто манометр покрутить или нужные контакты замкнут.

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

Можно сказать, халява. Но хочется больше. И тут хотелки начали появляться сами собой.

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

Надо отключать насос если перегрузка по амперам (все приехали на дачу, ЛЕП перегружена, напряжение просело, насос начинает лопать амперы. В конечном счёте выключит 40А автомат. Так же нужна задержка минут в 15, на повторное включение.

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

Возможно, спустя десяток циклов набора воды, ждать дополнительное время, что б вода не застаивалась в водонапорной башне (из за рельефа и при нижнем давлении воды в башне остаётся ещё много). 

А самое главное сигнализировать одной лампочкой о своём состоянии короткими или длинными миганиями.

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

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

И так, текстолит односторонний есть, хлорное железо то же есть, краска, кисточка, сверло 1мм., шуруповёрт.

В общем после сверлений, рисований, закрашивания и травления получилась жуткая самопалина, прям да же не фоткал, но свою функцию выполнила. Да и ничего особенного, просверлил настолько криво, что все пины как то совпали, только аналоговый не попал на нулевой, а попал на первый. А про цифровой для фаз вообще забыл (приколхозил пин без меди, намотав проволочку (EasyEDA мне в помощь). Притянул цифровые к земле 1мО  сопротивлением (других не было) и припаял сигнальные, + отдельная платка с делителем и конденсатором для амперметра.

Вот что получилось:

Картинка СУЗ-Дуины

uint32_t tmr1, tmr2, tmr3, tmr4; //Переменные для таймеров.
unsigned long LoopTMR = 0;
unsigned long LoopInterval = 60000; //Задержка при включении. Задержка каждое десятое включение.
int LoopCounter = 0; //Счётчик включений.
int tmr1T = 1000; //Дополнительная переменная для таймера опроса состояния сенсоров (задержка в опросе после включения).
int DCounter = 0;
int DDelay = 250;

int Relay1 = 10; //Цифровой контакт для Реле 1. Включакм магнитный пускатель.
int Relay2 = 11; //Цифровой контакт для Реле 2. Запасное работает синхронно, включакм магнитный пускатель.

int AmperMetr = A1; //Аналоговый контак для амперметра (5В = 50А Как то так).
int AStop = 500; //Переменная для амперметра.

int Phases = 4; //Цифровой контакт для определения наличия всех трёх фаз (замкнуто, все фазы есть). (Трансформатор 220 - 12, диодный мост, конденсатор, стабилитрон, реле) * на три, последовательно замыкают цепь (одно реле разомкнётся, запуск не произойдёт).
int Phase = 3; //Переменная для определителя фаз.

int LowWater = 6; //Цифровой контакт определения нижнего уровня давления.
int HighWater = 7; //Цифровой контакт для определения верхнего уровня давления.
int Flag = 5; //Переменная для реле (ноль старт, 10, 9, 8 стоп, 1, 5, 0 в ожидании).
int LoW = 1; //Переменная для нижнего уровня. Замкнуто = низкий уровень. В центральном положении разомкнуто.
int HiW = 1; //Переменная для верхнего уровня. Замкнуто = высокий уровень. В центральном положении разомкнуто.
int D12 = 12; //Цифровой контакт для доп. лампочки. Возможно, для определения наличия воды в скважине.
int D13 = 13; //Цифровой контакт для лампочки на плате.

void setup () {
pinMode(Relay1, OUTPUT);
digitalWrite(Relay1, HIGH); //Когда HIGH реле выключено.
pinMode(Relay2, OUTPUT);
digitalWrite(Relay2, HIGH); //Когда HIGH реле выключено.
pinMode(AmperMetr, INPUT); //Аналоговый вход с подтяжкой резистора.
pinMode(Phases, INPUT_PULLUP); //Цифровой вход с подтяжкой резистора.
pinMode(LowWater, INPUT_PULLUP); //Цифровой вход с подтяжкой резистора.
pinMode(HighWater, INPUT_PULLUP); //Цифровой вход с подтяжкой резистора.
pinMode(D12, OUTPUT); //Дополнительная лампочка.
digitalWrite(12, LOW); //Доп. лампочка выключить
pinMode(D13, OUTPUT); //Лампочка на плате.
digitalWrite(13, LOW); //Лампочка на плате выключить.

Serial.begin(115200);

delay(500);

Serial.println("Vodokachka v.1.1.1 0721");

}

void loop () {

if (millis() - tmr1 >= tmr1T) {tmr1 = millis(); tmr1T = 497; Phase = digitalRead(Phases); LoW = digitalRead(LowWater); HiW = digitalRead(HighWater); AStop = analogRead(AmperMetr); }; //Опрос состояния манометра, амперметра, детектора фаз 380В. Возврвт частоты опроса.

if (micros() - tmr2 >= 1000000*2) {tmr2 = micros(); Serial.print(" Flag - "); Serial.print(Flag, DEC); Serial.print(" | Amper - "); Serial.print(AStop, DEC); Serial.print(" | Phases - "); Serial.print(Phase, DEC); Serial.print(" | LoWater - "); Serial.print(LoW, DEC); Serial.print(" | HiWater - "); Serial.println(HiW ,DEC); }; //Данные в порт

if (AStop >= 290 && Flag == 2) {Flag = 7; tmr3 = millis(); digitalWrite(Relay1, HIGH); digitalWrite(Relay2, HIGH); Serial.println("_Amer Stop 15 min._");}; //Качаем, Амперы зашкаливают, отключить.

if (Flag == 7 && millis() - tmr3 >= 900000) {Flag = 5; }; //Задержка на 15 минут после перегрузки.

if (Phase == 1 && (Flag == 5 || Flag == 0)) {Flag = 8; tmr3 = millis(); }; //Было нормально, но пропала фаза, только для мигания лампочкой и задержка на пять минут.

if (Phase == 1 && Flag == 2) {Flag = 9; tmr3 = millis(); digitalWrite(Relay1, HIGH); digitalWrite(Relay2, HIGH); Serial.println("_Phases Stop 10 min._"); }; //Качаем, пропала фаза, отключить.

if (Flag == 8 && millis() - tmr3 >= 300000) {Flag = 5; }; //Задержка на 5 минут после пропадания фазы в режиме ожидания.

if (Flag == 9 && millis() - tmr3 >= 600000) {Flag = 5; }; //Задержка на 10 минут после пропадания фазы во время работы насоса.

if (Phase == 0 && LoW == 0 && HiW == 1 && Flag == 5) {Flag = 0; if (LoopCounter == 10) {LoopTMR = millis(); LoopInterval = 1800000; LoopCounter = 0;}; }; //Фаы присуствуют, показания манометра ПУСТО, (низкий уровень, можно включать). Каждое десятое включение ждём лишние 30 минут для большего расхода из башни (чтоб не застаивалась).

//Вкл.
if (Flag == 0 && millis() - LoopTMR >= LoopInterval) {Flag = 2; tmr1T = 7000; if (LoopCounter == 0) {LoopTMR = 0; LoopInterval = 0; }; LoopCounter = LoopCounter + 1; digitalWrite(Relay1, LOW); digitalWrite(Relay2, LOW); Serial.println("-Start-"); }; //Включение реле. Доп задержка на включение.

if (HiW == 0 && Flag == 2) {Flag = 10; }; //Наполнилась, отключить.

//Выкл.
if (Flag == 10) {Flag = 5; digitalWrite(Relay1, HIGH); digitalWrite(Relay2, HIGH); Serial.println("_Stop_"); }; //Выключение реле

//Мигаем лампочкой на плате.

if (millis() - tmr4 >= 5000 && Flag == 5) {tmr4 = millis(); if (digitalRead(D13) == LOW) digitalWrite(D13, HIGH); else {digitalWrite(D13, LOW); }; }; //Всё ОК 5сек. сетимся, 5сек. нет, в режиме ожидания.

if (millis() - tmr4 >= 1000 && (Flag == 2 || Flag == 0)) {tmr4 = millis(); if (digitalRead(D13) == LOW) digitalWrite(D13, HIGH); else {digitalWrite(D13, LOW); }; }; //Всё ОК 1сек. сетимся, 1сек. нет.

if (millis() - tmr4 >= DDelay && Flag == 7) {tmr4 = millis(); if (digitalRead(D13) == LOW) {DDelay = 150; digitalWrite(D13, HIGH);} else {DCounter = DCounter + 1; digitalWrite(D13, LOW); }; if (DCounter == 2) {DCounter = 0; DDelay = 1000;}; }; //Перегрузка по амперам, 2 быстрых мигания, секунда задержка.

if (millis() - tmr4 >= DDelay && Flag == 8) {tmr4 = millis(); if (digitalRead(D13) == LOW) {DDelay = 250; digitalWrite(D13, HIGH);} else {DCounter = DCounter + 1; digitalWrite(D13, LOW); }; if (DCounter == 3) {DCounter = 0; DDelay = 2000;}; }; //Пропала какя-то фаза в режиме ожидания, 3 мигания, две секунды задержка.

if (millis() - tmr4 >= DDelay && Flag == 9) {tmr4 = millis(); if (digitalRead(D13) == LOW) {DDelay = 500; digitalWrite(D13, HIGH);} else {DCounter = DCounter + 1; digitalWrite(D13, LOW); }; if (DCounter == 3) {DCounter = 0; DDelay = 5000;}; }; //Пропала какя-то фаза во время работы, 3  долгих мигания, 5 секунд задержка.

}