Два бага с "зависаниями" реле

Благодарю, что обратили на это внимание, учту в дальнейшем.
Но в рамках диагностического кода можно пренебречь. Попробую задать условие в духе if (X>300 && X<700 && Y>300 && Y<700) { digitalWrite(relaypin, HIGH)}, где relaypin это соответствующее реле. И так по всем реле подать 4 команды.
Ну и ладно, если бы это ещё работало. А то подаю HIGH, и что при нужном срабатывании, что при двойной интерпретации else, на которую вы указали, реле не перещёлкивается обратно.

Или в начале check() поставить проверку, if (X>=300 && X<=700 && Y>=300 && Y<=700), если она выдаёт 1, то ничего не делаем, завершаем функцию. Если условие не выполняется, проверяем следующие.
Всё равно, реле не перещёлкивается обратно.(

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

Я бы все таки оставил в вашем изначальном коде всего одно условие и вывел переменную в монитор порта чтобы реально смотреть её значение и отработку…
Затем добавить следующие условия, и так далее…

Попробуйте так

void loop() 
{
  int n;
  n = analogRead(axX);
  X = analogRead(axX);
  n = analogRead(axY);
  Y = analogRead(axY);
  swpr = digitalRead(swi);
  check();

}

Переменная n для вывода X и Y в монитор порта?

Думаю для отладки так и сделаю. Потом перепаяю этот диод на выход 5В, по совету Плохиша. Меньше кода будет обрабатываться.

Нет, для пропуска значения, полученного сразу после переключения канала

И кнопка у Вас всегда активна. Сделайте так стр.103

if (!swpr) clck();

Как раз об этом

Работает в точности так, как написано.

Я вообще не вдавался в Вашу логику, а просто переписал то, что у Вас было.
Если у Вас было, что X<=300 - LOW, а X>300 - HIGH, то оно так и осталось. Если Вы написали не то, что Вам нужно, то это Ваша ошибка.

Благодарю. По кнопке учту, попробую. Но почему она всегда активна? При объявлении переменной swpr=false. Вроде если происходит нажатие, то возникает высокий уровень между землёй и пином 12. Тогда swpr=true, и обрабатываем нажатие. Или это не так работает?

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

swpr=false;

тогда после выполнения функции переменная нажатия кнопки будет сбрасываться в false и постоянное срабатывание кнопки уйдёт. Вашу мысль верно понял?

А на счёт пропуска значений, вчера ненадолго заезжал к себе в мастерскую, попробовал просто в лупе задать переключение реле через delay();

void loop()
{
   digitalWrite(sst, LOW);
   delay(5000);
   digitalWrite(sst, HIGH);
}

В итоге реле включается, но через 5 секунд не выключается обратно. Контроллер при этом не зависает, зависает сам модуль реле.
Реле отключается только после выключения питания. И так со всеми реле.

Попробовал так же на старте системы, вместо светодиода pon, подать высокий уровень на светодиод opr. Такая же проблема, при подключенной плате светодиодов, включаются все реле. При отключенной плате светодиодов, происходит то, что описал выше.

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

Вчера уже разобрали здесь в теме, что за операция.)

Вообще не поняли. Я же написал, что нужно сделать.(стр.103) Больше ничего не надо.
У Вас кнопка подтянута INPUT_PULLUP, на ней всегда высокий уровень. При нажатии низкий.

А по реле - смотрите схему модулей и составьте полную схему подключения , и всё станет ясно.

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

Включить модулю питание и ткнуть массой на контакт in вы имеете ввиду? Нет, ещё не делал. Проверю - отпишусь.

Проверил. При замыкании массы на плате питания реле или на пин gnd контроллера, с управляющим пином реле, всё работает как надо. То есть массу подал через проводок - включилось реле, убрал провод - выключилось. Со всеми 4-мя реле проверил, всё ок.

Подтяни этот контакт к плюсу через резистор 10к, это должно помочь при работе с ардуиной, хотя странно…
И попробуй свой скетч 5 секунд.

У тебя к выходу ардуины напрямую идёт контакт и более ничего к нему не подключено? Нарисовал бы схему подключения… Ты выше писал что сначала были светодиоды, потом реле… Не совсем понятно что и как подключено…

Тему можно закрывать. Вопрос решился коммутацией управляющих ног (IN) реле, с землёй (GND) через оптроны. Оптроны управляются ардуиной.
Модули реле, которые у меня, работают при замыкании управляющей ноги на землю, и никак иначе. Подробная схема и скетч будут в теме проектов, как закончу устройство.

И почему их нельзя подключить напрямую к ардуине при этом???

Похоже вы так ни в чем и не разобрались толком.

Потому что писать в ардуине LOW не позволяет религия (пастафарианство), а оптроны инвертируют HIGH и все начинает работать.

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

3 лайка

ээээ, обождите ребят, вспоминается мне тема с этими реле в котором стоит P-канал транзистор, не все там гладко, не помню в чем заморочка, на старом форуме помнится я щеки надувал, а потом голову пеплом посыпал.
лень искать, пятница!

1 лайк

Там включать инпутом нужно было.