Помогите, плиз Код (C++): int analogPinNiz = 1; int analogPinVerx = 4; int Niz = 0; int Verx = 0; int Rele = 12; void setup() { Serial.begin(9600); // установка связи по serial pinMode(Rele, OUTPUT); pinMode(analogPinNiz, INPUT); pinMode(analogPinVerx, INPUT); } Когда сигнал с нижних контактов равен "0" включаем насос и он должен работать пока на верхних контактах не появится сигнал, тогда насос отключаем и ждем пока на нижних контактах не установится "0" тогда все по нговой void loop() { Niz = analogRead(analogPinNiz); // считываем значение if (Niz == 0) { for (;;) { digitalWrite(Rele, HIGH ); Verx = analogRead(analogPinVerx); if (Verx < 1) break; // while (Verx < 100); } } if (Verx > 0) { digitalWrite(Rele, LOW); } }
Не знаю что и как ОНО делает но при беглом взгляде возникли вопросы Зачем обьявлять analogread как вход? И тем более делать это неправильно? Аналоговые пины А0—А5 других нет Зачем обьявлять Serial?
Jktu, вы совсем запутались в аналоговых и цифровых пинах. Вам бы для начала почитать пару дней какую-нибудь книжку из серии "Ардуино для чайников". Если вы читаете пин как аналоговый, то на выходе будет не 0 и 1, а от 0 до 1023. Соответственно ваш код в том виде, как вы его выложили - работать не может в принципе. Определитесь. как вы работаете с пинами - как с аналогом или как с цифрой. Если с аналогом - меняйте пределы значений. Если с цифрой - меняйте функции Уточните, какие пины реально использованы - D1 D4 или A1 A4 ?
В таком случае лучше использовать имена пинов с буквой "А", чтоб не путаться. Что изменить в коде - я написал выше. Для аналогового пина значения 0 и 1 - это практически одно и тоже, так вы никакого срабатывания датчика не уловите. нет, готовый код я вам не дам. Если вам дать рабочий скетч - вы ничему не научитесь. Попытайтесь написать сами по тем подсказкам. что я дал.
Код (C++): int analogPinNiz = 1; int analogPinVerx = 4; int Niz = 0; int Verx = 0; int Rele = 12; void setup() { Serial.begin(9600); // установка связи по serial pinMode(Rele, OUTPUT); pinMode(analogPinNiz, INPUT); pinMode(analogPinVerx, INPUT); } void loop() { Niz = analogRead(analogPinNiz); // считываем значение if (Niz == 0) { for (;;) { digitalWrite(Rele, HIGH ); Verx = analogRead(analogPinVerx); if (Verx > 0) break; } } if (Verx > 0) { digitalWrite(Rele, LOW); } } не работает. Нужно включать реле насоса когда вода не доходить до контактов низ, сигнал снимается с пин А1, а выключать когда уровень воды поднимется до верхних контактов , сигнал снимаем с пин А4
читайте все ответы ВНИМАТЕЛЬНО. И делайте то. что вам говорят. иначе решайте свои проблемы сами. - пины обозначьте с буквой А - INPUT режим для аналоговых пинов не применяется - значения аналогового сигнала с пина изменяются от 0 до 1023, причем там всегда присутсвует шум. Поэтому нижнее значение сигнала может колебаться от 0 до 20-30, а иногда и выще... А верхнее - от 1023 и на несколько единиц или даже десятков меньше Таким образом видим. что ваше условие Verx > 0 - это глупость. Нужно ставить не "больше нуля", а "примерно 1023" А лучше проведите опыт.,какое значение примет переменная Verx при сработавшем верхнем датчике. Может там и не 1023 вовсе. а например 500 или 800
поправил так, все равно не работает при отключении пин А1 от + насос включается, при включении А1 пин на плюс выключается Аварийное отключение срабатывает коряво светодиод светится в полнакала, а должен гаснуть Код (C++): int analogPinNiz = 1; int analogPinVerx = 4; int Niz; int Verx; int Rele = 12; void setup() { Serial.begin(9600); // установка связи по serial pinMode(Rele, OUTPUT); Verx = 800; } void loop() { Niz = analogRead(analogPinNiz); // считываем значение Verx = analogRead(analogPinVerx); // считываем значение if (Niz < 800 ) // если условие выполняется включается насос { for (;;) { // запускаем бесконечный цикл, digitalWrite(Rele, HIGH ); // насос продолжает работать Verx = analogRead(A4); // получаем значение с верхних электродов if (Verx > 800) break; // если вода дошла до контактов насос отключаем если не дошла повтряем цикл сначала } } if (Verx > 200) // аварийное отключение при наполненной бочке { digitalWrite(Rele, LOW); } }
А чо вы не выводите ничо по сериал? Нахер он нужен тогда? Может хотя-бы то что считываете с аналоговых входов там выводить?
Jktu, все равно в коде путаница какая-то Определитесь. при каких значениях насос отключаем - если больше 800 или если больше 200?
В том то и дело что 10 винда у меня монитор порта не открывает, выдает ошибки Java. При каком значении отключать не имеет значения главное что больше нуля. Переставлять винду времени нет, посевная
вы с логикой совсем не дружите? Я вам вроде уже обьяснил, почему на аналоговом датчике логика "больше нуля" не работает, а вы опять? Когда думать начнете?
Псевдокод - когда уровень в таре меньше нижнего порога то включаем насос - тара заполняется до верха и насос выключается - и так по кругу. Показатели с аналогового датчика только по средне-арифметическому - выборка минимум 20, но я бы сделал на дискретном датчике по концевику.
Здесь вообще можно использовать пины как цифровые. Есть вода==HIGH нет воды==LOW. Отсюда и плясать. Три строчки кода в Loop. Три в Setup Можно вообще без единого Ардуино из говна и палок