Помогите найти ошибку в скетче дозатора воды

Тема в разделе "Arduino & Shields", создана пользователем sus256, 8 ноя 2021.

  1. sus256

    sus256 Нуб

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

    Ссылку на источник прилагаю https://drive.google.com/drive/folders/1sK9kES0o6y7wQvnmaP719tACYUZ3j0wu



    Код (C++):
    #include <EEPROM.h>
    #include "LCD_1602_RUS.h"
    #include "GyverButton.h"
    LCD_1602_RUS lcd(0x27, 16, 2);

    boolean Pusk = 0;
    boolean Meny = 0;
    float obyem;               //переменная прошедшего ОБЪЕМА
    float zad_obyem = 0;
    float rashod;             //расход воды в минуту
    volatile unsigned long lastflash, flash;
    volatile unsigned long impuls = 0; //число импульсов расходомера
    unsigned long Taimer1;
    unsigned long Taimer2;
    float ves_impulsa = 2.40;  //вес одного импульса

    //Настройка кнопок
    #define BTN1 4  //Кнопка БОЛЬШЕ
    #define BTN2 5  //Кнопка МЕНЬШЕ
    #define BTN3 6  //Кнопка СТАРТ
    #define BTN4 7  //Кнопка СТОП
    GButton bol(BTN1);
    GButton men(BTN2);
    GButton Start(BTN3);
    GButton Stop(BTN4);

    #define ADDR 10  //ячейка с ключем первого запуска
    #define KEY 15  //ключь первого запуска
    void setup() {
      Serial.begin(9600);
      if (EEPROM.read(ADDR) != KEY) { //если во время первого запуска в ячейке 10 ключь не совподает то записывает в 10 ячейку ключь
        EEPROM.write(ADDR, KEY);
        EEPROM.put(0, ves_impulsa);
      }   //также записываем стандартный весс импульса. 2,40
      EEPROM.get(0, ves_impulsa);

      pinMode (3, OUTPUT);    // Настраиваем 3 цифровой порт на выход
      digitalWrite (3, LOW);  // подать на 3 порт 0 Вольт.
      attachInterrupt(0, sens, RISING);    // подключить прерывание на 2 пин при повышении сигнала
      lcd.init();                 // инициализация дисплея
      lcd.backlight();            // включить подсветку
      bol.setTickMode(AUTO);    //Функция опроса кнопки БОЛЬШЕ
      men.setTickMode(AUTO);    //Функция опроса кнопки МЕНЬШЕ
      Start.setTickMode(AUTO);    //Функция опроса кнопки СТАРТ
      Stop.setTickMode(AUTO);    //Функция опроса кнопки СТОП
    }
    void sens() {
      flash = micros() - lastflash;   // вычислить время между двумя импульсами
      lastflash = micros();           // запомнить время последнего импульса
      impuls++;
    }

    void loop() {
      if (micros() - lastflash > 1000000) {                   // если сигнала нет больше секунды
        rashod = 0;                                           // считаем, что всё стоит и не крутится
      } else {
        obyem = impuls * ves_impulsa / 1000.0;
        rashod = 60.0 / (flash / 1000000.0 * 450.0);  // время одного оборота в секундах, с учётом числа лопастей
      }

      if (Pusk == 1 && obyem < zad_obyem - 0.01) {       //Если прошло 30 секунд и объем меньше заданного то подаем на 3 пин 5 вольт.
        digitalWrite (3, HIGH);
      }                               // Подаем на 3 пин 5 вольт
      else if (Pusk == 1 && obyem >= zad_obyem - 0.01) {
        digitalWrite (3, LOW);                                //если условие не выполняется по подаем на 3 пин 0 вольт.
        Pusk = 0;
      }
      else if (Pusk == 0) {
        digitalWrite (3, LOW);                                //если условие не выполняется по подаем на 3 пин 0 вольт.
      }
      if (millis() - Taimer1 > 300) {  // кадждые 300 миллисекунд
        if (Meny == 0) {
          lcd.setCursor(0, 0);        // курсор слева 1 строчка
          lcd.print(L"Задано");
          lcd.setCursor(0, 1);        // курсор слева 2 строчка
          lcd.print(L"Подано");
          lcd.setCursor(7, 0);  // курсор 9 слева 1 строчка
          lcd.print(zad_obyem, 1);       // выводим RPM
          lcd.setCursor(7, 1); // курсор 10 слева 2 строчка
          lcd.print(obyem, 1);  // выводим скорость
          lcd.setCursor(12, 0);  // курсор 9 слева 1 строчка
          lcd.print(rashod, 1);      // выводим RPM
        }
        else  {
            lcd.setCursor(2, 0);  // курсор 9 слева 1 строчка
            lcd.print(L"Вес импульса");      // выводим RPM
            lcd.setCursor(6, 1);  // курсор 9 слева 1 строчка
            lcd.print(ves_impulsa);      // выводим RPM
          }
          Taimer1 = millis();  // сброс таймера
        }

        //Работа с кнопками
        if (bol.isClick() && Meny == 0) {
          zad_obyem = zad_obyem + 0.1;
        }

        if (men.isClick() && Meny == 0) {
          zad_obyem = zad_obyem - 0.1;
        }

        if (bol.isStep() && Meny == 0) {
          zad_obyem = zad_obyem + 0.5;
        }

        if (men.isStep() && Meny == 0) {
          zad_obyem = zad_obyem - 0.5;
        }

        if (Start.isClick() && Meny == 0) {
          Pusk = 1;
        }

        if (Start.isStep()) {
          Meny = !Meny;
          lcd.setCursor(0, 0);
          lcd.print("                ");       // Очищаем дисплей
          lcd.setCursor(0, 1); //
          lcd.print("                ");  // Очищаем дисплей
        }

        if (Stop.isClick() && Meny == 0) {
          Pusk = 0;
        }

        if (Stop.isHold() && Meny == 0) {
          impuls = 0;
          obyem = 0;
        }
        if (bol.isClick() && Meny == 1) {
          ves_impulsa = ves_impulsa + 0.01;
          EEPROM.put(0, ves_impulsa);
        }

        if (men.isClick() && Meny == 1) {
          ves_impulsa = ves_impulsa - 0.01;
          EEPROM.put(0, ves_impulsa);
        }

        if (bol.isStep() && Meny == 1) {
          ves_impulsa = ves_impulsa + 0.1;
          EEPROM.put(0, ves_impulsa);
        }

        if (men.isStep() && Meny == 1) {
          ves_impulsa = ves_impulsa - 0.1;
          EEPROM.put(0, ves_impulsa);
        }
      }
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Как стоит? Где стоит? Рисуйте схему, не ленитесь.

    Могу предположить, что Вы слишком тупо поставили его "вместо транзистора" и тогда, оно по LOW и срабатывает, транзистор-то землёй управляет.
     
    sus256 нравится это.
  3. sus256

    sus256 Нуб

    Щяс установим фотошоп и все отрисую, но по поводу транзистора он там pnp то есть транзистор открывается путем подачи на затвор высокого уровня если я не ошибаюсь , разве нельзя просто напрямую подключить реле?
     
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Судя по схеме, транзистор N-канальный, что аналогично NPN. Включен по схеме с общим истоком (эмиттером). В таком включении он - инвертор. То есть, если вы решили включить нагрузку без транзистора - то обязательно в программе инвертируйте выходной сигнал.
    ПС. Категорически не рекомендую включать нагрузку высоким уровнем (то есть когда другой конец нагрузки соединен на GND) - верхний транзистор выхода всегда слабее нижнего.
    ППС. Не забывайте подключить диод-подавитель, иначе импульс самоиндукции обмотки вышибет выход.
     
    Последнее редактирование: 8 ноя 2021
  5. sus256

    sus256 Нуб

    [​IMG]
    Нарисовал, не судите строго как то так получилось
     
    Последнее редактирование модератором: 9 ноя 2021
  6. sus256

    sus256 Нуб

    Я поставил за место транзистора реле (https://ibb.co/dPDyn3n) ардуинка ведет себя так, первое включение , реле открывается сходу, как тока я устанавливаю значения и жму кнопки старт стоп, то у меня все начинает исправно работать, задано в :
    void setup

    pinMode (3, OUTPUT); // Настраиваем 3 цифровой порт на выход
    digitalWrite (3, LOW); // подать на 3 порт 0 Вольт.

    неужели из за этого у меня открывается реле?
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    У меня нет таких релейных модулей. Что в нем за транзистор и каково его включение - не знаю.
    ПС. После digitalWrite (3, LOW); надо бы поставить паузу типа delay(100). Чтобы реле успело сработать до перехода программы в главный цикл.
     
    sus256 нравится это.
  8. sus256

    sus256 Нуб


    Получается что после объявление 3 пина как выход я сделал ему низкий уровень low тем самым подал сигнал на реле ?
     
  9. Рокки1945

    Рокки1945 Гуру

    что это за реле у которого ток 40 мА - какое у катушки сопротивление
     
  10. sus256

    sus256 Нуб

    Релейный модуль TZT для arduino в наличии, 5 В куплено на алиэкспресс, сопротивление замерить сегодня не смогу,
    Просто из постов выше я понял что реле может открыться при подачи как и высокого так и низкого уровня , или у меня подозрительно неисправное реле?
     
  11. Рокки1945

    Рокки1945 Гуру

    надо посмотреть типовую схему подключения реле к выходу микроконтроллера и тогда сразу станет ясно - чего не хватает
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Надо четко обозначать - реле (то бишь железяка с катушкой), или релейный модуль (железяка с катушкой и еще что-то полупроводниковое). А это получается совсем разные по свойствам предметы. И реле не открывается - оно или срабатывает или нет. Как работает релейный модуль зависит от его схемы, а не от реле.
    ПС. Посмотрите при каком уровне на пине срабатывает реле в модуле, отпишитесь. Тогда будет более понятно.
    ППС. Реле само по себе (не модуль) работает в зависимости от того куда вы кинули второй конец обмотки. На плюс - значит при низком сигнале на пине, и наоборот.
     
    Последнее редактирование: 9 ноя 2021
  13. Airbus

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

    У меня есть. Типа вот оно. Там низкий уровень (LOW)включает а высокий выключает
     
    sus256 нравится это.
  14. Рокки1945

    Рокки1945 Гуру

    кароче исправь на HIGH
     
    sus256 нравится это.
  15. sus256

    sus256 Нуб

    Спасибо огромное, еще вопросик уважаемые мастера, какой провод использовать для подключения счетчика воды? примерно будет стоять метров 10 от ардуино
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Тута
     

    Вложения:

  17. Asper Daffy

    Asper Daffy Иксперд

    Да, запросто. Таких модулей (которые включаются по LOW) ничуть не меньше, чем тех, что включаются по HIGH. Вы должны знать, что у Вас за модуль. Если информации нет, это легко проверить на сборке из треёх деталей прежде, чем пихать модуль в большую схему.
     
  18. parovoZZ

    parovoZZ Гуру

    медный.
     
  19. Airbus

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

    Полевка, витая пара, телефонный провод (можно ТРП)