ARDUINO Наливатор. Обсуждение проекта

9k33

★✩✩✩✩✩✩
8 Янв 2020
51
15
SlavSSoft.ru
@RomaT, Ну или уровень жидкости должен быть выше уровня насоса (хотя бы на старте (как в бачке омывателя))
 

Андрей Билак

✩✩✩✩✩✩✩
2 Фев 2020
2
0
Доброй ночи! Я полный чайник, по этому прошу не ругать сильно. Собрал схему (без ящика), установил прошивку - все встало нормально. В сервисном режиме настройка угла поворота и объема жидкости - нормально. Но, ни в одном режиме ни как не реагирует на кнопки, светодиоды не горят. Подскажите в чем проблема?
Заранее большое спасибо
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
@Андрей Билак, микрики подключаются на нормально разомкнутые контакты, рабочее положение замкнуты на землю, проверьте. И куда подключили проверьте, к нужному ли пину
 

Yuriy909

✩✩✩✩✩✩✩
2 Фев 2020
9
2
Всем привет! А ни кто не рассматривал возможность применения вот такой штуки, там уже как бы все есть, понятно, что нужно доработать напильником и поворачивать всю конструкцию
 

Вложения

  • Лойс +1
Реакции: konoev

renby

★✩✩✩✩✩✩
5 Янв 2020
58
11
Как в прошивке от Алекса 1.3 сделать отображение текущего объёма во время налива
Присоединяюсь к вопросу. И еще, повторю свой вопрос, как сделать задержку между установкой стакана и движением краника в автоматическом режиме?
 
Изменено:
  • Лойс +1
Реакции: satic

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
Как в прошивке от Алекса 1.3 сделать отображение текущего объёма во время налива
c_func.ino
у меня другой дисплей, и вывод по другому, по идее должно работать
В файлы добавлять не всё, а только то что новое.
C++:
  } else if (systemState == PUMPING) {                    // если качаем
        disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume)));
        if (workMode) {
            disp.displayByte(0, _A);
          }else {
            disp.displayByte(0, _P);
            }
и в timer2Minim.h
C++:
  public:
    timerMinim(uint32_t interval);        // объявление таймера с указанием интервала
    void setInterval(uint32_t interval);  // установка интервала работы таймера
    bool isReady();                    // возвращает true, когда пришло время. Сбрасывается в false сам (AUTO) или вручную (MANUAL)
    void reset();                         // ручной сброс таймера на установленный интервал
  void stop();
    void start();
  float getHowMachTime();
и в конец
C++:
void timerMinim::reset() {
  _timer = millis();
}

float timerMinim::getHowMachTime(){
    return (float)(millis() - _timer)/_interval;
}



сделать задержку между установкой стакана и движением краника в автоматическом режиме?
c_func.ino
C++:
    if (workMode) {         // авто
      flowRoutnie(100);        // крутим отработку кнопок и поиск рюмок
    } else {                // ручной
      if (btn.clicked()) {  // клик!
        systemON = true;    // система активирована
        timeoutReset();     // таймаут сброшен
      }
      if (systemON) flowRoutnie(0);  // если активны - ищем рюмки и всё такое
    }
flowRoutnie(100); вместо 100 время задержки в миллисекундах (1000 миллисекунд в 1 секунде)


C++:
void flowRoutnie(int delayMove) {

  if (systemState == SEARCH) {                            // если поиск рюмки
    bool noGlass = true;
    for (byte i = 0; i < NUM_SHOTS; i++) {
      if (shotStates[i] == EMPTY && i != curPumping) {    // поиск
        TIMEOUTtimer.stop();
        noGlass = false;                                  // флаг что нашли хоть одну рюмку
        curPumping = i;                                   // запоминаем выбор
        systemState = MOVING;                             // режим - движение
        shotStates[curPumping] = IN_PROCESS;              // стакан в режиме заполнения
        delay(delayMove);
        servoON();                                        // вкл питание серво
        servo.attach();
        servo.setTargetDeg(shotPos[curPumping]);          // задаём цель
        DEBUG("find glass=");
        DEBUGln(curPumping);
        break;
      }
    }
В ручном режиме едем без задержки, а автоматическом с задержкой.
 
  • Лойс +1
Реакции: Yashcher и Konder885

DrinK

✩✩✩✩✩✩✩
9 Янв 2020
4
0
Насос не мембранный, он качает только когда в нем есть жидкость и следовательно нужна прокачка (подозреваю что опять таки старым автомобильным методом, ртом))) и за насосом должен стоять клапан обратный, что бы не сливал ось из заполненной системы через насос
Совершенно верно.
Перед использованием прокачка нужна + без обратного жидкость самотеком назад в бутылку очень быстро утекает. Даже если бутылку чуть приподнять.
 

sashabagler

✩✩✩✩✩✩✩
7 Янв 2020
4
0
Добрый день.Собрал свой вариант наливатора.Столкнулся с проблемой такого рода: помпы использовал на 5в и, соответственно время налива долгое, поэтому не знаю как откалрбровать объём, т.к. время налива в сервистном режиме 9900,а 50мл за это время ещё немналито.Как откаллибровать? Можно ли сделать каллибровку не на 50 мл,а предположим на 30 мл.И как?
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
Добрый день.Собрал свой вариант наливатора.Столкнулся с проблемой такого рода: помпы использовал на 5в и, соответственно время налива долгое, поэтому не знаю как откалрбровать объём, т.к. время налива в сервистном режиме 9900,а 50мл за это время ещё немналито.Как откаллибровать? Можно ли сделать каллибровку не на 50 мл,а предположим на 30 мл.И как?
Можете выводить объём в uart порт:
Добавьте
DEBUG(pumpTime);
в файл c_func.ino после строки
disp.displayInt(pumpTime);

И включите отладку
#define DEBUG_UART 1
 

sashabagler

✩✩✩✩✩✩✩
7 Янв 2020
4
0
@VICLER, Спасибо за совет. Я попробовал отладить по 20мл.Т.е.налил 20мл засек время,потом ещё 20мл-засек время,потом ещё 10мл-засек время,все просуммировал и вбил полученное значение в код.Все проводил мерным стаканом.Вроде переправе рила все точно получилось.Единственное,хотелось бы иметь более высокую точность наливания любых объёмов,т.е.чтобы была возможность использовать как дозатор за место серного стакана
 

EPMAKOB

✩✩✩✩✩✩✩
4 Фев 2020
3
0
Подскажите, пожалуйста: На схеме не совсем понятно какие разъемы энкодера должны быть подключены к портам D8 и D9 Arduino. "Ножек" на энкодере пять, а проводов к нему подключено четыре. Не могу понять: задействованы S1, S2 или KEY.
Заранее благодарен за ответ.
 

EPMAKOB

✩✩✩✩✩✩✩
4 Фев 2020
3
0
@SkyFOX, Ответ, конечно же, объемный, но я понятия не имею что там написано. Я ЮРИСТ))))) Можно просто написать что из этого задействовано?
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
Подскажите, пожалуйста: На схеме не совсем понятно какие разъемы энкодера должны быть подключены к портам D8 и D9 Arduino. "Ножек" на энкодере пять, а проводов к нему подключено четыре. Не могу понять: задействованы S1, S2 или KEY.
Заранее благодарен за ответ.
ENC_SW - KEY
ENC_DT - S1
ENC_CLK - S2
Чтобы инвертировать направление вращения поменяйте местами пины для DT и CLK.
Остальные два контакта на энкодере это GND и VCC (- и + питания 5В)
 

sashabagler

✩✩✩✩✩✩✩
7 Янв 2020
4
0
@EPMAKOB, проводов 5 подключено.+,- ,s1,s2.s1 и s2 можно менять местами р-на правление энкодера меняется
 

EPMAKOB

✩✩✩✩✩✩✩
4 Фев 2020
3
0
Всем спасибо! @SkyFOX - отдельное. Благодаря ему я понял, что я олень и не смог увидеть, что на схеме более чем все понятно и задействованы все пять "ног" энкодера... Заработался я)))
 

renby

★✩✩✩✩✩✩
5 Янв 2020
58
11
c_func.ino
у меня другой дисплей, и вывод по другому, по идее должно работать
В файлы добавлять не всё, а только то что новое.
C++:
  } else if (systemState == PUMPING) {                    // если качаем
        disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume)));
        if (workMode) {
            disp.displayByte(0, _A);
          }else {
            disp.displayByte(0, _P);
            }
и в timer2Minim.h
C++:
  public:
    timerMinim(uint32_t interval);        // объявление таймера с указанием интервала
    void setInterval(uint32_t interval);  // установка интервала работы таймера
    bool isReady();                    // возвращает true, когда пришло время. Сбрасывается в false сам (AUTO) или вручную (MANUAL)
    void reset();                         // ручной сброс таймера на установленный интервал
  void stop();
    void start();
  float getHowMachTime();
и в конец
C++:
void timerMinim::reset() {
  _timer = millis();
}

float timerMinim::getHowMachTime(){
    return (float)(millis() - _timer)/_interval;
}




c_func.ino
C++:
    if (workMode) {         // авто
      flowRoutnie(100);        // крутим отработку кнопок и поиск рюмок
    } else {                // ручной
      if (btn.clicked()) {  // клик!
        systemON = true;    // система активирована
        timeoutReset();     // таймаут сброшен
      }
      if (systemON) flowRoutnie(0);  // если активны - ищем рюмки и всё такое
    }
flowRoutnie(100); вместо 100 время задержки в миллисекундах (1000 миллисекунд в 1 секунде)


C++:
void flowRoutnie(int delayMove) {

  if (systemState == SEARCH) {                            // если поиск рюмки
    bool noGlass = true;
    for (byte i = 0; i < NUM_SHOTS; i++) {
      if (shotStates[i] == EMPTY && i != curPumping) {    // поиск
        TIMEOUTtimer.stop();
        noGlass = false;                                  // флаг что нашли хоть одну рюмку
        curPumping = i;                                   // запоминаем выбор
        systemState = MOVING;                             // режим - движение
        shotStates[curPumping] = IN_PROCESS;              // стакан в режиме заполнения
        delay(delayMove);
        servoON();                                        // вкл питание серво
        servo.attach();
        servo.setTargetDeg(shotPos[curPumping]);          // задаём цель
        DEBUG("find glass=");
        DEBUGln(curPumping);
        break;
      }
    }
В ручном режиме едем без задержки, а автоматическом с задержкой.
c_func.ino
у меня другой дисплей, и вывод по другому, по идее должно работать
В файлы добавлять не всё, а только то что новое.
C++:
  } else if (systemState == PUMPING) {                    // если качаем
        disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume)));
        if (workMode) {
            disp.displayByte(0, _A);
          }else {
            disp.displayByte(0, _P);
            }
и в timer2Minim.h
C++:
  public:
    timerMinim(uint32_t interval);        // объявление таймера с указанием интервала
    void setInterval(uint32_t interval);  // установка интервала работы таймера
    bool isReady();                    // возвращает true, когда пришло время. Сбрасывается в false сам (AUTO) или вручную (MANUAL)
    void reset();                         // ручной сброс таймера на установленный интервал
  void stop();
    void start();
  float getHowMachTime();
и в конец
C++:
void timerMinim::reset() {
  _timer = millis();
}

float timerMinim::getHowMachTime(){
    return (float)(millis() - _timer)/_interval;
}




c_func.ino
C++:
    if (workMode) {         // авто
      flowRoutnie(100);        // крутим отработку кнопок и поиск рюмок
    } else {                // ручной
      if (btn.clicked()) {  // клик!
        systemON = true;    // система активирована
        timeoutReset();     // таймаут сброшен
      }
      if (systemON) flowRoutnie(0);  // если активны - ищем рюмки и всё такое
    }
flowRoutnie(100); вместо 100 время задержки в миллисекундах (1000 миллисекунд в 1 секунде)


C++:
void flowRoutnie(int delayMove) {

  if (systemState == SEARCH) {                            // если поиск рюмки
    bool noGlass = true;
    for (byte i = 0; i < NUM_SHOTS; i++) {
      if (shotStates[i] == EMPTY && i != curPumping) {    // поиск
        TIMEOUTtimer.stop();
        noGlass = false;                                  // флаг что нашли хоть одну рюмку
        curPumping = i;                                   // запоминаем выбор
        systemState = MOVING;                             // режим - движение
        shotStates[curPumping] = IN_PROCESS;              // стакан в режиме заполнения
        delay(delayMove);
        servoON();                                        // вкл питание серво
        servo.attach();
        servo.setTargetDeg(shotPos[curPumping]);          // задаём цель
        DEBUG("find glass=");
        DEBUGln(curPumping);
        break;
      }
    }
В ручном режиме едем без задержки, а автоматическом с задержкой.
насчет отображения объема, все норм. А задержка не работает что то, помпа включается в парковочном положении.
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
Единственное,хотелось бы иметь более высокую точность наливания любых объёмов,т.е.чтобы была возможность использовать как дозатор за место серного стакана
Поменять микрики скажем на DF9-40, сделать площадки, и переписать скетч. Возможно прийдется и усилители ставить, но не факт.

@renby, эти изменения на включение помпы не влияют. Задержка , если правильно прописали, не может не работать
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
@2908969, какая ошибка? там int принимается, до 32 767
а....
void flowRoutnie(int delayMove) {
внимательно смотрите когда переносите
 
Изменено:

renby

★✩✩✩✩✩✩
5 Янв 2020
58
11
@renby, эти изменения на включение помпы не влияют. Задержка , если правильно прописали, не может не работать[/QUOTE]
У меня сейчас так
C++:
 if (workMode) {         // авто
      flowRoutnie(0);        // крутим отработку кнопок и поиск рюмок
    } else {                // ручной
      if (btn.clicked()) {  // клик!
        systemON = true;    // система активирована
        timeoutReset();     // таймаут сброшен
      }
      if (systemON) flowRoutnie(0);  // если активны - ищем рюмки и всё такое
    }
  }
}

// поиск и заливка
void flowRoutnie(int delayMove) {

  if (systemState == SEARCH) {                            // если поиск рюмки
    bool noGlass = true;
    for (byte i = 0; i < NUM_SHOTS; i++) {
      if (shotStates[i] == EMPTY && i != curPumping) {    // поиск
        TIMEOUTtimer.stop();
        noGlass = false;                                  // флаг что нашли хоть одну рюмку
        curPumping = i;                                   // запоминаем выбор
        systemState = MOVING;                             // режим - движение
        shotStates[curPumping] = IN_PROCESS;              // стакан в режиме заполнения
        delay(delayMove);
        servoON();                                        // вкл питание серво
        servo.attach();
        servo.setTargetDeg(shotPos[curPumping]);          // задаём цель
        DEBUG("find glass=");
        DEBUG(curPumping);
        break;
      }
    }
если flowRoutnie(0) ставишь больше 100 краник просто не поворачивается. Помпа льет в парковочном положении. Я в коде ничего не понимаю, может что то не так сделал. Помогите пожалуйста. Мне на одной серве шестеренки уже сорвали. Руки не успевают убирать и трубочка в руку упирается. Я сейчас серву с металлическими шестернями поставил, но это не панацея...