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

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
В принципе для системы из 4 стаканов , так и победил ))
В настройке указал что у меня 5 рюмок
Домашню позицию указал как 5
И поставил для 5 пятой позиции парковки нужные мне градусы
Теперь все работает как нужно , всем не равнодушным ОГРОМНЕЙШИЙ РЕСПЕКТ И СПАСИБО , я у себя так и оставлю , максимум еще бы поменял нижний предел 5мл , так веселее мне, но если не покажут где поменять , то у себя так все окончательно и оставлю, мне эта прошивка понравилась больше всего из того что я здесь попробывал )))
для четырёх стаканов лучше оставить #define NUM_SHOTS 4
а в const byte shotPos[] прописать пятый угол для парковки и #define HOME_POS 4
во избежание глюков
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
такая же. попробуй поставить позицию рюмки 0 и парковку 0 и в автоматическом режиме налить её
сейчас к сожалению нет возможности проверить. Вы пробовали так с этой библиотекой? Это не оригинальная от Алекса. Я её изменил немного, когда была похожая проблема как у Вас:
2. В авто режиме, если рюмка прописана как 0, то при наливе серва в состоянии постоянного движения (по коду), и включение помпы не происходит.
так же и в ручном режиме если кран стоит над первой рюмкой, то если её одну налить, потом снова поставить туда следующюю рюмку - налива не будет, так как servo.tick() возвращал 0
 

Duran

✩✩✩✩✩✩✩
11 Ноя 2019
14
0
Подскажите пожалуйста, сколько потребляет вся система в режиме налива? Какой приспособить повербанк?

Сам только начинаю разбираться :) или подскажите как подключить аккумулятор и одновременно его заряжать и питать все это от адаптера

Т.е. Интересует и автономная система и от сети одновременно

Спасибо
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
@VICLER, я сделал проще, кода меньше
косяк в том, что если позиция сервы и то куда едем равна, то не срабатывает
C++:
    if (abs(_servoTargetPos - (int)_newPos) < SS_DEADZONE) {
        if (_autoDetach && _servoState) {
            if (_timeoutCounter > SS_TIMEOUT) {
                _newPos = _servoTargetPos;
                _servoCurrentPos = _servoTargetPos;
                _servoState = false;
                _servo.detach();
                return true;
            } else {
                _timeoutCounter++;
            }
        }
    }
поскольку что бы сработало условие if (_autoDetach && _servoState)
_servoState должно быть тру, а тру оно становится только тогда когда срабатывает
C++:
    else {
        if (_autoDetach && !_servoState) {
            _servoState = true;
            _servo.attach(_pin);
        }
        _timeoutCounter = 0;
    }
а оно не когда не срабатывает поскольку выполняется первая часть условия (abs(_servoTargetPos - (int)_newPos) < SS_DEADZONE),
_servoTargetPos =_newPos) и оно меньше SS_DEADZONE)
потому слепил так
C++:
    if (abs(_servoTargetPos - (int)_newPos) < SS_DEADZONE) {                //Разница между текущим положением сервы и целью меньше чем мертвая зона
        if (_servoTargetPos == (int)_newPos){
            _servoState = true;
        }
        if (_autoDetach && _servoState) {                                  
            if (_timeoutCounter > SS_TIMEOUT) {                                
                _newPos = _servoTargetPos;
                _servoCurrentPos = _servoTargetPos;
                _servoState = false;
                _servo.detach();
                return true;
            } else {
                _timeoutCounter++;
            }
        }      
    } else {
        if (_autoDetach && !_servoState) {
            _servoState = true;
            _servo.attach(_pin);
        }
т.е. добавил проверку на то, что текущая и таргет позиция равна
C++:
        if (_servoTargetPos == (int)_newPos){
            _servoState = true;
        }
и тогда возвращаем тру


второй косяк
C++:
boolean ServoSmooth::tick() {
    if (millis() - _prevServoTime >= SS_SERVO_PERIOD) {
        _prevServoTime = millis();
        if (ServoSmooth::tickManual()) return true;
        else return false;
    }
}
найдите тупую ошибку и упростите код)
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
@RomaT, ну да, я ведь так же сделал, только в функции setTargetDeg :)
а в методе tick() неопределённое поведение при невыполнении условия if. лучше наверное будет так:

C++:
boolean ServoSmooth::tick() {
    if (millis() - _prevServoTime >= SS_SERVO_PERIOD) {
        _prevServoTime = millis();
        ServoSmooth::tickManual();
    }
    return !_servoState;
}
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
@VICLER,
C++:
boolean ServoSmooth::tick() {
    if (millis() - _prevServoTime >= SS_SERVO_PERIOD) {
        _prevServoTime = millis();
        return ServoSmooth::tickManual();
    }
    return false;
}
 

SHTILL

✩✩✩✩✩✩✩
14 Янв 2020
15
1
здравствуйте друзья . собрал аппарат с последней прошивкой от Levonti c экраном 1602. все работает но у экрана не горит подсветка. Я сначала припаял как написали тут горела подсветка но на экране ни чего не было(на шине крутил потенциометр) , потом перепаял как написано тут экран заработал но без подсветки. в скетче ни чего не менял.
P.S. первый раз держу паяльник в руках. помогите пожалуйста
 
Изменено:

Plohish

★✩✩✩✩✩✩
18 Ноя 2019
35
12
@Duran, когда баловался на макетке , помпа без воды, мой лабораторный блок питания показывал около 300мА , в момент розлива
 
  • Лойс +1
Реакции: Duran

Praporatorr

★★★✩✩✩✩
8 Дек 2019
86
107
@VICLER, А как бы в Вашу прошивку вернуть буковки "А" и "Р"? Мне кажется так более информативно чем :
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
@Praporatorr, заменой функции void dispMode() в файле c_func на оригинальную от Алекса.
C-like:
// выводим объём и режим
void dispMode() {
  disp.displayInt(thisVolume);
  if (workMode) disp.displayByte(0, _A);
  else {
    disp.displayByte(0, _P);
    pumpOFF();
  }
}
и изменением функции dispMode(uint8_t num) для отображения актуального обьёма во время заправки там же:
C:
void dispMode(uint8_t num) {
  disp.displayInt(num);
  workMode ? disp.displayByte(0, _A) : disp.displayByte(0, _P);
}
мне просто не нравится, что расположение цифр не по центру o_O:)
А для выбора режима думаю, если хватит свободных пинов, сделаю отдельный механический переключатель. Но могу ещё передумать)
 
Изменено:

aaa

✩✩✩✩✩✩✩
4 Янв 2020
6
0
@VICLER, Добрый вечер! Поставил повышающий преобразователь на выход драйвера помпы, производительность немного увеличилась, но не сильно. При нагрузке вольтаж проседает до 5в (на выходе повышайки без нагрузки 12в) и начинает мигать дисплей. В чем может быть проблема?
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
@aaa, проблема либо в источнике питания, либо в преобразователе. Проверьте их отдельно, чтобы исключить виновника.
 

aaa

✩✩✩✩✩✩✩
4 Янв 2020
6
0
Объясните для чайников пошагово, как?

@VICLER, питание зарядка от телефона сяоми, пишут 2а.
 

VICLER

★★★★★★✩
9 Дек 2019
801
660
Hamburg
@aaa, 2А должно хватать с запасом, если там реально 2А. Тогда, наверное, преобразователь есть причина.
 

aaa

✩✩✩✩✩✩✩
4 Янв 2020
6
0
Понял, буду проверять путем научного тыка. Спасибо!
 

Praporatorr

★★★✩✩✩✩
8 Дек 2019
86
107
@aaa, При повышении напряжения до 12в. сильно возрастает ток потребления на входе повышайки. Лучше ставить перед драйвером, а лучше помпу подключить через мосфет, т.к. серво подкдючен к этому же драйверу, а он на такое напряжение не расчитан.
 
Изменено:

Praporatorr

★★★✩✩✩✩
8 Дек 2019
86
107
@Praporatorr, заменой функции void dispMode() в файле c_func на оригинальную от Алекса.
C-like:
// выводим объём и режим
void dispMode() {
  disp.displayInt(thisVolume);
  if (workMode) disp.displayByte(0, _A);
  else {
    disp.displayByte(0, _P);
    pumpOFF();
  }
}
и изменением функции dispMode(uint8_t num) для отображения актуального обьёма во время заправки там же:
C:
void dispMode(uint8_t num) {
  disp.displayInt(num);
  workMode ? disp.displayByte(0, _A) : disp.displayByte(0, _P);
}
мне просто не нравится, что расположение цифр не по центру o_O:)
А для выбора режима думаю, если хватит свободных пинов, сделаю отдельный механический переключатель. Но могу ещё передумать)
Спасибо!