Корпус очень красивый, расскажите про негоЛепотааа... спасибо VICLER!!!
Присоединяюсь к вопросу. И еще, повторю свой вопрос, как сделать задержку между установкой стакана и движением краника в автоматическом режиме?Как в прошивке от Алекса 1.3 сделать отображение текущего объёма во время налива
c_func.inoКак в прошивке от Алекса 1.3 сделать отображение текущего объёма во время налива
} else if (systemState == PUMPING) { // если качаем
disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume)));
if (workMode) {
disp.displayByte(0, _A);
}else {
disp.displayByte(0, _P);
}
public:
timerMinim(uint32_t interval); // объявление таймера с указанием интервала
void setInterval(uint32_t interval); // установка интервала работы таймера
bool isReady(); // возвращает true, когда пришло время. Сбрасывается в false сам (AUTO) или вручную (MANUAL)
void reset(); // ручной сброс таймера на установленный интервал
void stop();
void start();
float getHowMachTime();
void timerMinim::reset() {
_timer = millis();
}
float timerMinim::getHowMachTime(){
return (float)(millis() - _timer)/_interval;
}
c_func.inoсделать задержку между установкой стакана и движением краника в автоматическом режиме?
if (workMode) { // авто
flowRoutnie(100); // крутим отработку кнопок и поиск рюмок
} 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=");
DEBUGln(curPumping);
break;
}
}
Спасибо, работает, только в 1 бите индикатора проскакивают показания 2, как-то не красиво смотрится.у меня другой дисплей, и вывод по другому, по идее должно работать
Совершенно верно.Насос не мембранный, он качает только когда в нем есть жидкость и следовательно нужна прокачка (подозреваю что опять таки старым автомобильным методом, ртом))) и за насосом должен стоять клапан обратный, что бы не сливал ось из заполненной системы через насос
Можете выводить объём в uart порт:Добрый день.Собрал свой вариант наливатора.Столкнулся с проблемой такого рода: помпы использовал на 5в и, соответственно время налива долгое, поэтому не знаю как откалрбровать объём, т.к. время налива в сервистном режиме 9900,а 50мл за это время ещё немналито.Как откаллибровать? Можно ли сделать каллибровку не на 50 мл,а предположим на 30 мл.И как?
ENC_SW - KEYПодскажите, пожалуйста: На схеме не совсем понятно какие разъемы энкодера должны быть подключены к портам D8 и D9 Arduino. "Ножек" на энкодере пять, а проводов к нему подключено четыре. Не могу понять: задействованы S1, S2 или KEY.
Заранее благодарен за ответ.
c_func.ino
у меня другой дисплей, и вывод по другому, по идее должно работать
В файлы добавлять не всё, а только то что новое.
и в timer2Minim.hC++:} else if (systemState == PUMPING) { // если качаем disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume))); if (workMode) { disp.displayByte(0, _A); }else { disp.displayByte(0, _P); }
и в конец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
flowRoutnie(100); вместо 100 время задержки в миллисекундах (1000 миллисекунд в 1 секунде)C++:if (workMode) { // авто flowRoutnie(100); // крутим отработку кнопок и поиск рюмок } else { // ручной if (btn.clicked()) { // клик! systemON = true; // система активирована timeoutReset(); // таймаут сброшен } if (systemON) flowRoutnie(0); // если активны - ищем рюмки и всё такое }
В ручном режиме едем без задержки, а автоматическом с задержкой.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
у меня другой дисплей, и вывод по другому, по идее должно работать
В файлы добавлять не всё, а только то что новое.
и в timer2Minim.hC++:} else if (systemState == PUMPING) { // если качаем disp.displayInt(int(round(FLOWtimer.getHowMachTime()*thisVolume))); if (workMode) { disp.displayByte(0, _A); }else { disp.displayByte(0, _P); }
и в конец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
flowRoutnie(100); вместо 100 время задержки в миллисекундах (1000 миллисекунд в 1 секунде)C++:if (workMode) { // авто flowRoutnie(100); // крутим отработку кнопок и поиск рюмок } else { // ручной if (btn.clicked()) { // клик! systemON = true; // система активирована timeoutReset(); // таймаут сброшен } if (systemON) flowRoutnie(0); // если активны - ищем рюмки и всё такое }
В ручном режиме едем без задержки, а автоматическом с задержкой.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; } }
Поменять микрики скажем на DF9-40, сделать площадки, и переписать скетч. Возможно прийдется и усилители ставить, но не факт.Единственное,хотелось бы иметь более высокую точность наливания любых объёмов,т.е.чтобы была возможность использовать как дозатор за место серного стакана
у меня: flowRoutnie(); // крутим отработку кнопок и поиск рюмокflowRoutnie(100); // крутим отработку кнопок и поиск рюмок
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;
}
}