Нужна помощь, не могу разобраться со скетчем

Тема в разделе "Arduino & Shields", создана пользователем Jktu, 2 июн 2022.

  1. Jktu

    Jktu Нуб

    Помогите, плиз
    Код (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);
    }




    }
    [​IMG]
     

    Вложения:

    • скетч.png
      скетч.png
      Размер файла:
      5,2 КБ
      Просмотров:
      277
  2. DetSimen

    DetSimen Гуру

    Вопрос задать забыл
     
    Feofan и Airbus нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    Не знаю что и как ОНО делает но при беглом взгляде возникли вопросы
    Зачем обьявлять analogread как вход? И тем более делать это неправильно? Аналоговые пины А0—А5 других нет
    Зачем обьявлять Serial?
     
    Последнее редактирование: 2 июн 2022
  4. b707

    b707 Гуру

    Jktu, вы совсем запутались в аналоговых и цифровых пинах. Вам бы для начала почитать пару дней какую-нибудь книжку из серии "Ардуино для чайников". Если вы читаете пин как аналоговый, то на выходе будет не 0 и 1, а от 0 до 1023. Соответственно ваш код в том виде, как вы его выложили - работать не может в принципе.

    Определитесь. как вы работаете с пинами - как с аналогом или как с цифрой. Если с аналогом - меняйте пределы значений. Если с цифрой - меняйте функции

    Уточните, какие пины реально использованы - D1 D4 или A1 A4 ?
     
  5. Jktu

    Jktu Нуб

    А1 и А4 управление реле с пина 12
     
  6. Jktu

    Jktu Нуб

    Если не затруднить рабочий скейтч )))
     
  7. b707

    b707 Гуру

    В таком случае лучше использовать имена пинов с буквой "А", чтоб не путаться.
    Что изменить в коде - я написал выше. Для аналогового пина значения 0 и 1 - это практически одно и тоже, так вы никакого срабатывания датчика не уловите.
    нет, готовый код я вам не дам.
    Если вам дать рабочий скетч - вы ничему не научитесь. Попытайтесь написать сами по тем подсказкам. что я дал.
     
  8. Jktu

    Jktu Нуб

    Код (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
     
  9. Jktu

    Jktu Нуб

    Если вода в емкости есть и сигнал на пине А1 больше нуля то насос выключен
     
  10. b707

    b707 Гуру

    читайте все ответы ВНИМАТЕЛЬНО. И делайте то. что вам говорят. иначе решайте свои проблемы сами.
    - пины обозначьте с буквой А
    - INPUT режим для аналоговых пинов не применяется
    - значения аналогового сигнала с пина изменяются от 0 до 1023, причем там всегда присутсвует шум. Поэтому нижнее значение сигнала может колебаться от 0 до 20-30, а иногда и выще... А верхнее - от 1023 и на несколько единиц или даже десятков меньше
    Таким образом видим. что ваше условие Verx > 0 - это глупость. Нужно ставить не "больше нуля", а "примерно 1023"

    А лучше проведите опыт.,какое значение примет переменная Verx при сработавшем верхнем датчике. Может там и не 1023 вовсе. а например 500 или 800
     
    Последнее редактирование: 2 июн 2022
  11. Jktu

    Jktu Нуб

    поправил так, все равно не работает
    при отключении пин А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);
      }

    }
     
  12. Рокки1945

    Рокки1945 Гуру

    А чо вы не выводите ничо по сериал? Нахер он нужен тогда? Может хотя-бы то что считываете с аналоговых входов там выводить?
     
  13. b707

    b707 Гуру

    Jktu, все равно в коде путаница какая-то
    Определитесь. при каких значениях насос отключаем - если больше 800 или если больше 200?
     
  14. Jktu

    Jktu Нуб

    В том то и дело что 10 винда у меня монитор порта не открывает, выдает ошибки Java. При каком значении отключать не имеет значения главное что больше нуля. Переставлять винду времени нет, посевная
     
  15. b707

    b707 Гуру

    вы с логикой совсем не дружите?
    Я вам вроде уже обьяснил, почему на аналоговом датчике логика "больше нуля" не работает, а вы опять?
    Когда думать начнете?
     
  16. Рокки1945

    Рокки1945 Гуру

    Псевдокод - когда уровень в таре меньше нижнего порога то включаем насос - тара заполняется до верха и насос выключается - и так по кругу.
    Показатели с аналогового датчика только по средне-арифметическому - выборка минимум 20, но я бы сделал на дискретном датчике по концевику.
     
  17. parovoZZ

    parovoZZ Гуру

    реле поставь
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Здесь вообще можно использовать пины как цифровые. Есть вода==HIGH нет воды==LOW. Отсюда и плясать. Три строчки кода в Loop. Три в Setup
    Можно вообще без единого Ардуино из говна и палок

     
  19. Рокки1945

    Рокки1945 Гуру

    upload_2022-6-3_6-47-14.png
     
    Airbus нравится это.
  20. Рокки1945

    Рокки1945 Гуру

    upload_2022-6-3_6-48-10.png
     
    Airbus нравится это.