Наливатор - автоматизированная машина, которая будет разливать алкоголь по стопкам.

Acket
Offline
Зарегистрирован: 23.07.2019

Детали для замера напряжения АКБ, если нет батареи, то и не надо. Строчку в начале скетча закомментируйте и не ставьте. Мосфет хорошо работает. У меня на нём.

onet
Offline
Зарегистрирован: 24.01.2020

Acket пишет:

Детали для замера напряжения АКБ, если нет батареи, то и не надо. Строчку в начале скетча закомментируйте и не ставьте. Мосфет хорошо работает. У меня на нём.

Так я и прошу кусочек схемы, как Вы мосфет подключили и дальше помпу.

onet
Offline
Зарегистрирован: 24.01.2020

Acket пишет:

Детали для замера напряжения АКБ, если нет батареи, то и не надо. Строчку в начале скетча закомментируйте и не ставьте. Мосфет хорошо работает. У меня на нём.

Так я и прошу кусочек схемы, как Вы мосфет подключили и дальше помпу.

onet
Offline
Зарегистрирован: 24.01.2020

Извиняюсь, несколько раз отправил.

Acket
Offline
Зарегистрирован: 23.07.2019

сигнальный мосфета на управляющий контроллера, входы на питание, выходы на помпу... там ничего военного

raven78
Offline
Зарегистрирован: 03.11.2019

Gridzilla пишет:

raven78 пишет:

Во вкладке c_func вставляем в этот блок

Подскажи, флаг такого типа?

bool myFlag = false;

if(!imyFlag) {
 // моя функция

myFlag = true;
}

 

 

 

Acket пишет:

Да с флагами... Тут бы уточнить как должно быть... Для тех, кто в танке :)) Для меня это просто фраза на другом языке...

Да именно так, объявляем флаг, в начале скетча, где объявлены все переменные

bool myFlag = false;

далее в указанном месте

if(!imyFlag) {
 // старт трека
myFlag = true;
}

после остановки трека приводим этот флаг в

myFlag = false;

чтобы при следующем цикле розлива, опять начал играть трек

raven78
Offline
Зарегистрирован: 03.11.2019

onet пишет:

Так я и прошу кусочек схемы, как Вы мосфет подключили и дальше помпу.

Вот так правильно помпу подключать. В мосфете вроде стрелочка не туды, но не суть, принцип понятен.

Acket
Offline
Зарегистрирован: 23.07.2019

Raven спасибо огромное! Нам бы только пальцем показать :))

про мосфет, я имел в виду тот, что модулем продают:

Acket
Offline
Зарегистрирован: 23.07.2019

Заметил, что при работающем плеере, не проигрывается звук отсутствующих рюмок.

raven78
Offline
Зарегистрирован: 03.11.2019

Да так. Все сторонние звуки кроме тостов, при активном плеере, не воспроизводятся, иначе будет каша из прыгающих-перескакивающих треков, так спецом задумывалось. Если бы плеер умел запоминать место воспроизведения предыдущего трека, то можно было чего ни будь придумать.

Acket
Offline
Зарегистрирован: 23.07.2019

Понятно! А то я вставил звуковое сопровождение наливания и решил включить плеер посмотреть, как согласуется, и да - плеер играет, звуки прочие гаснут, но я ещё не проверял с отсутствием рюмок и плеером. Думал что что-то накосячил - отключил то, что добавил, а звук так и не появился. Ок, значит всё как задумано!

Rolo1
Offline
Зарегистрирован: 13.09.2019


Господа помогите правильно вставить код работы mp3 модуля в скеч Алекса Гайвера, просто чтоб тост озвучивался после наполнения рюмок. У меня собран такой наливатор, хотел добавить туда такую фишку.

// ======== НАСТРОЙКИ ======== #define NUM_SHOTS 4 // количество рюмок (оно же кол-во светодиодов и кнопок!) #define TIMEOUT_OFF 5 // таймаут на выключение (перестаёт дёргать привод), минут #define SWITCH_LEVEL 0 // кнопки 1 - высокий сигнал при замыкании, 0 - низкий #define INVERSE_SERVO 0 // инвертировать направление вращения серво

// положение серво над центрами рюмок const byte shotPos[] = {25, 60, 95, 145, 60, 60};

// время заполнения 50 мл const long time50ml = 5500;

#define KEEP_POWER 1 // 1 - система поддержания питания ПБ, чтобы он не спал

// отладка #define DEBUG_UART 1

// =========== ПИНЫ =========== #define PUMP_POWER 3 #define SERVO_POWER 4 #define SERVO_PIN 5 #define LED_PIN 6 #define BTN_PIN 7 #define ENC_SW 8 #define ENC_DT 9 #define ENC_CLK 10 #define DISP_DIO 11 #define DISP_CLK 12 const byte SW_pins[] = {A0, A1, A2, A3, A4, A5};

// =========== ЛИБЫ =========== #include #include #include #include #include "encUniversalMinim.h" #include "buttonMinim.h" #include "timer2Minim.h"

// =========== ДАТА =========== #define COLOR_DEBTH 2 // цветовая глубина: 1, 2, 3 (в байтах) LEDdata leds[NUM_SHOTS]; // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH) microLED strip(leds, NUM_SHOTS, LED_PIN); // объект лента

GyverTM1637 disp(DISP_CLK, DISP_DIO);

// пин clk, пин dt, пин sw, направление (0/1), тип (0/1) encMinim enc(ENC_CLK, ENC_DT, ENC_SW, 1, 1);

ServoSmooth servo;

buttonMinim btn(BTN_PIN); buttonMinim encBtn(ENC_SW); timerMinim LEDtimer(100); timerMinim FLOWdebounce(20); timerMinim FLOWtimer(2000); timerMinim WAITtimer(400); timerMinim TIMEOUTtimer(15000); // таймаут дёргания приводом timerMinim POWEROFFtimer(TIMEOUT_OFF * 60000L);

bool LEDchanged = false; bool pumping = false; int8_t curPumping = -1;

enum {NO_GLASS, EMPTY, IN_PROCESS, READY} shotStates[NUM_SHOTS]; enum {SEARCH, MOVING, WAIT, PUMPING} systemState; bool workMode = false; // 0 manual, 1 auto int thisVolume = 50; bool systemON = false; bool timeoutState = false; bool volumeChanged = false; bool parking = false;

// =========== МАКРО =========== #define servoON() digitalWrite(SERVO_POWER, 1) #define servoOFF() digitalWrite(SERVO_POWER, 0) #define pumpON() digitalWrite(PUMP_POWER, 1) #define pumpOFF() digitalWrite(PUMP_POWER, 0)

#if (DEBUG_UART == 1) #define DEBUG(x) Serial.println(x) #else #define DEBUG(x) #endif

__________________________________________________________

//вкладка void setup//

void setup() { #if (DEBUG_UART == 1) Serial.begin(9600); DEBUG("start"); #endif // епром if (EEPROM.read(1000) != 10) { EEPROM.write(1000, 10); EEPROM.put(0, thisVolume); } EEPROM.get(0, thisVolume);

// тыкаем ленту strip.setBrightness(130); strip.clear(); strip.show(); DEBUG("strip init");

// настройка пинов pinMode(PUMP_POWER, 1); pinMode(SERVO_POWER, 1); for (byte i = 0; i < NUM_SHOTS; i++) { if (SWITCH_LEVEL == 0) pinMode(SW_pins[i], INPUT_PULLUP); }

// старт дисплея disp.clear(); disp.brightness(7); DEBUG("disp init");

// настройка серво servoON(); servo.attach(SERVO_PIN, 600, 2400); if (INVERSE_SERVO) servo.setDirection(REVERSE); servo.write(0); delay(800); servo.setTargetDeg(0); servo.setSpeed(60); servo.setAccel(0.3); servoOFF();

serviceMode(); // калибровка dispMode(); // выводим на дисплей стандартные значения timeoutReset(); // сброс таймаута TIMEOUTtimer.start(); }

____________________________________________________

вкладка // луп

// луп

void loop() { encTick(); btnTick(); flowTick(); LEDtick(); timeoutTick(); }

_________________________________________________________ вкладка buttonMinim.h

// мини-класс для работы с кнопкой, версия 1.0

#pragma pack(push,1) typedef struct { bool holdedFlag: 1; bool btnFlag: 1; bool pressF: 1; bool clickF: 1; bool holdF: 1; } buttonMinimFlags; #pragma pack(pop)

class buttonMinim { public: buttonMinim(uint8_t pin); boolean pressed(); boolean clicked(); boolean holding(); boolean holded(); private: buttonMinimFlags flags; void tick(); uint32_t _btnTimer; byte _pin; };

buttonMinim::buttonMinim(uint8_t pin) { pinMode(pin, INPUT_PULLUP); _pin = pin; }

void buttonMinim::tick() { boolean btnState = digitalRead(_pin); if (!btnState && !flags.btnFlag && ((uint32_t)millis() - _btnTimer > 90)) { flags.btnFlag = true; _btnTimer = millis(); flags.pressF = true; flags.holdedFlag = true; } if (btnState && flags.btnFlag && ((uint32_t)millis() - _btnTimer < 350)) { flags.btnFlag = false; _btnTimer = millis(); flags.clickF = true; flags.holdF = false; } if (flags.btnFlag && ((uint32_t)millis() - _btnTimer > 900)) { if (!btnState) { flags.holdF = true; } else { flags.btnFlag = false; flags.holdF = false; _btnTimer = millis(); } } }

boolean buttonMinim::pressed() { buttonMinim::tick(); if (flags.pressF) { flags.pressF = false; return true; } else return false; }

boolean buttonMinim::clicked() { buttonMinim::tick(); if (flags.clickF) { flags.clickF = false; return true; } else return false; }

boolean buttonMinim::holding() { buttonMinim::tick(); if (flags.holdF) { return true; } else return false; }

boolean buttonMinim::holded() { buttonMinim::tick(); if (flags.holdF && flags.holdedFlag) { flags.holdedFlag = false; return true; } else return false; }

____________________________________________________________

вкладка c_func

// различные функции

void serviceMode() { if (!digitalRead(BTN_PIN)) { byte serviceText[] = {_S, _E, _r, _U, _i, _C, _E}; disp.runningString(serviceText, sizeof(serviceText), 150); while (!digitalRead(BTN_PIN)); // ждём отпускания delay(200); servoON(); int servoPos = 0; long pumpTime = 0; timerMinim timer100(100); disp.displayInt(0); bool flag; for (;;) { servo.tick(); enc.tick();

if (timer100.isReady()) { // период 100 мс // работа помпы со счётчиком if (!digitalRead(ENC_SW)) { if (flag) pumpTime += 100; else pumpTime = 0; disp.displayInt(pumpTime); pumpON(); flag = true; } else { pumpOFF(); flag = false; }

// зажигаем светодиоды от кнопок for (byte i = 0; i < NUM_SHOTS; i++) { if (!digitalRead(SW_pins[i])) { strip.setLED(i, mCOLOR(GREEN)); } else { strip.setLED(i, mCOLOR(BLACK)); } strip.show(); } }

if (enc.isTurn()) { // крутим серво от энкодера pumpTime = 0; if (enc.isLeft()) { servoPos += 5; } if (enc.isRight()) { servoPos -= 5; } servoPos = constrain(servoPos, 0, 180); disp.displayInt(servoPos); servo.setTargetDeg(servoPos); }

if (btn.holded()) { servo.setTargetDeg(0); break; } } } disp.clear(); while (!servo.tick()); servoOFF(); }

// выводим объём и режим void dispMode() { disp.displayInt(thisVolume); if (workMode) disp.displayByte(0, _A); else { disp.displayByte(0, _P); pumpOFF(); } }

// наливайка, опрос кнопок void flowTick() { if (FLOWdebounce.isReady()) { for (byte i = 0; i < NUM_SHOTS; i++) { bool swState = !digitalRead(SW_pins[i]) ^ SWITCH_LEVEL; if (swState && shotStates[i] == NO_GLASS) { // поставили пустую рюмку timeoutReset(); // сброс таймаута shotStates[i] = EMPTY; // флаг на заправку strip.setLED(i, mCOLOR(RED)); // подсветили LEDchanged = true; DEBUG("set glass"); DEBUG(i); } if (!swState && shotStates[i] != NO_GLASS) { // убрали пустую/полную рюмку shotStates[i] = NO_GLASS; // статус - нет рюмки strip.setLED(i, mCOLOR(BLACK)); // нигра LEDchanged = true; timeoutReset(); // сброс таймаута if (i == curPumping) { curPumping = -1; // снимаем выбор рюмки systemState = WAIT; // режим работы - ждать WAITtimer.reset(); pumpOFF(); // помпу выкл } DEBUG("take glass"); DEBUG(i); } }

if (workMode) { // авто flowRoutnie(); // крутим отработку кнопок и поиск рюмок } else { // ручной if (btn.clicked()) { // клик! systemON = true; // система активирована timeoutReset(); // таймаут сброшен } if (systemON) flowRoutnie(); // если активны - ищем рюмки и всё такое } } }

// поиск и заливка void flowRoutnie() { if (systemState == SEARCH) { // если поиск рюмки bool noGlass = true; for (byte i = 0; i < NUM_SHOTS; i++) { if (shotStates[i] == EMPTY && i != curPumping) { // поиск noGlass = false; // флаг что нашли хоть одну рюмку parking = false; curPumping = i; // запоминаем выбор systemState = MOVING; // режим - движение shotStates[curPumping] = IN_PROCESS; // стакан в режиме заполнения servoON(); // вкл питание серво servo.attach(); servo.setTargetDeg(shotPos[curPumping]); // задаём цель DEBUG("find glass"); DEBUG(curPumping); break; } } if (noGlass && !parking) { // если не нашли ни одной рюмки servoON(); servo.setTargetDeg(0); // цель серво - 0 if (servo.tick()) { // едем до упора servoOFF(); // выключили серво systemON = false; // выключили систему parking = true; DEBUG("no glass"); } } } else if (systemState == MOVING) { // движение к рюмке if (servo.tick()) { // если приехали systemState = PUMPING; // режим - наливание FLOWtimer.setInterval((long)thisVolume * time50ml / 50); // перенастроили таймер FLOWtimer.reset(); // сброс таймера pumpON(); // НАЛИВАЙ! strip.setLED(curPumping, mCOLOR(YELLOW)); // зажгли цвет strip.show(); DEBUG("fill glass"); DEBUG(curPumping); }

} else if (systemState == PUMPING) { // если качаем if (FLOWtimer.isReady()) { // если налили (таймер) pumpOFF(); // помпа выкл shotStates[curPumping] = READY; // налитая рюмка, статус: готов strip.setLED(curPumping, mCOLOR(LIME)); // подсветили strip.show(); curPumping = -1; // снимаем выбор рюмки systemState = WAIT; // режим работы - ждать WAITtimer.reset(); DEBUG("wait"); } } else if (systemState == WAIT) { if (WAITtimer.isReady()) { // подождали после наливания systemState = SEARCH; timeoutReset(); DEBUG("search"); } } }

// отрисовка светодиодов по флагу (100мс) void LEDtick() { if (LEDchanged && LEDtimer.isReady()) { LEDchanged = false; strip.show(); } }

// сброс таймаута void timeoutReset() { if (!timeoutState) disp.brightness(7); timeoutState = true; TIMEOUTtimer.reset(); TIMEOUTtimer.start(); DEBUG("timeout reset"); }

// сам таймаут void timeoutTick() { if (systemState == SEARCH && timeoutState && TIMEOUTtimer.isReady()) { DEBUG("timeout"); timeoutState = false; disp.brightness(1); POWEROFFtimer.reset(); jerkServo(); if (volumeChanged) { volumeChanged = false; EEPROM.put(0, thisVolume); } }

// дёргаем питание серво, это приводит к скачку тока и powerbank не отключает систему if (!timeoutState && TIMEOUTtimer.isReady()) { if (!POWEROFFtimer.isReady()) { // пока не сработал таймер полного отключения jerkServo(); } else { disp.clear(); } } }

void jerkServo() { if (KEEP_POWER) { disp.brightness(7); servoON(); servo.attach(); servo.write(random(0, 4)); delay(200); servo.detach(); servoOFF(); disp.brightness(1); } }

_____________________________________________________________________

вкладка d_control

// кнопки-крутилки

void encTick() { enc.tick(); if (enc.isTurn()) { volumeChanged = true; timeoutReset(); if (enc.isLeft()) { thisVolume += 5; thisVolume = constrain(thisVolume, 5, 1000); } if (enc.isRight()) { thisVolume -= 5; thisVolume = constrain(thisVolume, 5, 1000); } dispMode(); } }

void btnTick() { if (btn.holded()) { timeoutReset(); workMode = !workMode; dispMode(); } if (encBtn.holded()) { pumpON(); while (!digitalRead(ENC_SW)); timeoutReset(); pumpOFF(); } }

____________________________________________________________________

вкладка encUniversalMinin.h

// мини-класс для работы с энкодером, версия 1.0

class encMinim { public: encMinim(uint8_t clk, uint8_t dt, uint8_t sw, boolean dir, boolean type); void tick(); boolean isClick(); boolean isTurn(); boolean isRight(); boolean isLeft(); boolean isRightH(); boolean isLeftH();

private: byte _clk, _dt, _sw; boolean _type = false; boolean _state, _lastState, _turnFlag, _swState, _swFlag, _turnState; byte _encState; uint32_t _debTimer; // 0 - ничего, 1 - лево, 2 - право, 3 - правоНажат, 4 - левоНажат };

encMinim::encMinim(uint8_t clk, uint8_t dt, uint8_t sw, boolean dir, boolean type) { if (dir) { _clk = clk; _dt = dt; } else { _clk = dt; _dt = clk; } _sw = sw; _type = type; pinMode (_clk, INPUT); pinMode (_dt, INPUT); pinMode (_sw, INPUT_PULLUP); _lastState = digitalRead(_clk); }

void encMinim::tick() { _encState = 0; _state = digitalRead(_clk); _swState = digitalRead(_sw);

if (_state != _lastState) { _turnState = true; _turnFlag = !_turnFlag; if (_turnFlag || !_type) { if (digitalRead(_dt) != _lastState) { if (_swState) _encState = 1; else _encState = 3; } else { if (_swState) _encState = 2; else _encState = 4; } } _lastState = _state; }

if (!_swState && !_swFlag && millis() - _debTimer > 80) { _debTimer = millis(); _swFlag = true; _turnState = false; } if (_swState && _swFlag && millis() - _debTimer > 80) { _debTimer = millis(); _swFlag = false; if (!_turnState) _encState = 5; } } boolean encMinim::isTurn() { if (_encState > 0 && _encState < 5) { return true; } else return false; } boolean encMinim::isRight() { if (_encState == 1) { _encState = 0; return true; } else return false; } boolean encMinim::isLeft() { if (_encState == 2) { _encState = 0; return true; } else return false; } boolean encMinim::isRightH() { if (_encState == 3) { _encState = 0; return true; } else return false; } boolean encMinim::isLeftH() { if (_encState == 4) { _encState = 0; return true; } else return false; } boolean encMinim::isClick() { if (_encState == 5) { _encState = 0; return true; } else return false; }

___________________________________________

вкладка timer2Minim.h

// мини-класс таймера, версия 2.0 // использован улучшенный алгоритм таймера на millis // алгоритм чуть медленнее, но обеспечивает кратные интервалы и защиту от пропусков и переполнений

class timerMinim { public: timerMinim(uint32_t interval); // объявление таймера с указанием интервала void setInterval(uint32_t interval); // установка интервала работы таймера boolean isReady(); // возвращает true, когда пришло время. Сбрасывается в false сам (AUTO) или вручную (MANUAL) void reset(); // ручной сброс таймера на установленный интервал void stop(); void start();

private: uint32_t _timer = 0; uint32_t _interval = 0; bool _status = true; };

timerMinim::timerMinim(uint32_t interval) { _interval = interval; _timer = millis(); }

void timerMinim::setInterval(uint32_t interval) { _interval = (interval == 0) ? 10 : interval; }

void timerMinim::start() { _status = true; _timer = millis(); }

void timerMinim::stop() { _status = false; }

// алгоритм таймера v2.0 boolean timerMinim::isReady() { uint32_t thisMls = millis(); if (_status && thisMls - _timer >= _interval) { do { _timer += _interval; if (_timer < _interval) break; // переполнение uint32_t } while (_timer < thisMls - _interval); // защита от пропуска шага return true; } else { return false; } }

void timerMinim::reset() { _timer = millis(); }

 

alania_07
Offline
Зарегистрирован: 04.10.2019

Подскажите где скачать 32 версию скетча?

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

предыдущая страница. 2614 сообщение

 

Acket
Offline
Зарегистрирован: 23.07.2019

Блин, после включения опции проигрывания звука во время налива, при проверке обнаружилось, что этот звук так же включается в режиме промывки, причём играет только первый раз, но играет без остановки в момент отпускания кнопки - перешибается другим действием (установка стопки, нажатие кнопки). В последующие разы при запуске промывки звук больше не проигрывается.

raven78
Offline
Зарегистрирован: 03.11.2019

Значит надо так

if(!imyFlag && !promivka) {
// старт трека
myFlag = true;
}

флаг промывки уже есть в скетче.

Acket
Offline
Зарегистрирован: 23.07.2019

Нужно чтобы при промывке не проигрывался совсем, не нужен он там... Тогда написать в этом месте false?

1 if(!imyFlag && !promivka) {
2  
3 myFlag = false;
4 }

 

raven78
Offline
Зарегистрирован: 03.11.2019

Всё так и будет, надо делать, как в сообщении 2666 и ничего более.

Acket
Offline
Зарегистрирован: 23.07.2019

Спасибо! Попробую! Это же там же, где звук трека прописывал изначально?

P.S. Замечательно!!!

raven78
Offline
Зарегистрирован: 03.11.2019

Добавил воспроизведение трека при розливе. 18 трек добавлен в папку mp3, спасибо Acket. Надо тестить.

Сделал отключение, на этапе компиляции, в скетче всего, что связанно с батареей, некоторые делают без АКБ.

Изменил пункт настроек бармен, теперь бармен-долив. Добавил сохраняемую опцию долив. Если в момент розлива, пока разливной кран не уехал в нулевую позицию, убирать и снова устанавливать стопки на места, то разлив может длиться бесконечно))). Опция долив как раз отключает это и розлив будет идти только в установленные стопки не зависимо от того были ли добавлены стопки в процессе, т.е. максимум 6 стопок.

33 скетч

Acket
Offline
Зарегистрирован: 23.07.2019

Как хорошо жить!!! А хорошо жить ещё лучче!! Спасибо!!

Acket
Offline
Зарегистрирован: 23.07.2019

Прошил. Очень сильно всё перелопачено внутри кода - большая работа!

На первый взгляд:

 Режим калибровка сервы во время калибровки выводит координаты только после вращения энкодера, иначе предыдущее значение показывает.

С новым барменом идея понятна, но, мне кажется, что долив, что включен, что выключен - одинаково...

А запись громкости плеера в епром было бы тоже полезно!

 

raven78
Offline
Зарегистрирован: 03.11.2019

Косяк с калибровкой серво исправил, перезалил 33 скетч.

Про запись громкости надо подумать, да и в какой момент её записывать, если после каждого изменения в меню плеера, то дыру протрём в eeprom))). Скорее всего сделаю запись после выхода из меню плеера.

Долив можно проверить так, ставим стопку в центре одну, нажимаем налив, кран пошёл к этой стопке, идёт налив, ставим в это время другую стопку на первую позицию, если кран стал наливать и её после, то долив включен, если нет то выключен

 

Acket
Offline
Зарегистрирован: 23.07.2019

Запись же можно сделать только тогда, когда значение громкости изменено и осуществлён выход из меню? Или нет?

sarsab
Offline
Зарегистрирован: 23.01.2020

Роман,(raven78) а можно вашу почту,хотелось бы с вами связаться, есть несколько вопросов

raven78
Offline
Зарегистрирован: 03.11.2019

Acket пишет:
Запись же можно сделать только тогда, когда значение громкости изменено и осуществлён выход из меню? Или нет?

Да так и будет.

sarsab пишет:

Роман,(raven78) а можно вашу почту,хотелось бы с вами связаться, есть несколько вопросов

ravenrv78@mail.ru

 

aleksandr1612
aleksandr1612 аватар
Offline
Зарегистрирован: 18.12.2017

Forthomo пишет:

Куда поделиться?

Добрый день, Уважаемый! могли бы вы поделиться своим проектом? Как понимаю Вы закрыли ссылки на яндексе. Вот мой email: bereznyak1612@gmail.com , спасибо!

sarsab
Offline
Зарегистрирован: 23.01.2020

парни а схемку с концевиками можно

Acket
Offline
Зарегистрирован: 23.07.2019

Докладываю...

С прискорбием...

Encoder пишет:

https://aliexpress.ru/item/32962993969.html?spm=a2g0s.9042311.0.0.365333...

норм работает около часа стоял без перебоев

Получил сегодня с этой ссылки... те же яйца, только в профиль... 8-10сек и отрубается.

Эти тоже пришли, перепаял, 30сек примерно держит, потом моргать начинает...

raven78
Offline
Зарегистрирован: 03.11.2019

sarsab пишет:

парни а схемку с концевиками можно

Да тут и без схемы понятно, при установке рюмок на место, концевик замыкает на массу-минус вывод ардуино, к которому подключен.
 

Acket
Offline
Зарегистрирован: 23.07.2019

A0-----[10k]-----\ sw1

GND--------------/ sw2

в скетче низкий уровень концевиков (т.е. в 0)...

Acket
Offline
Зарегистрирован: 23.07.2019

придётся тоже механические втыкать... досадно, блин...

sarsab
Offline
Зарегистрирован: 23.01.2020

все таки надо подтягивать 10 ком резистором ко входам ардуинки

парни а на питание сервы ставите доп кондер?

raven78
Offline
Зарегистрирован: 03.11.2019

Если управление идёт низким уровнем(так делать правильней), то резисторы не нужны, сделана подтяжка к плюсу в самой ардуино. Высоким уровнем у меня управляется идёт через сенсоры, то резисторы тоже не нужны, если всё же делать так через концевики, то резистор подтягиваем к минусу уже.

Кондёр ставить нужно на всю схему питания по 5 вольтам, от которых запитываем и серву.

vuster
Offline
Зарегистрирован: 11.11.2019

raven, я собрал наливатор для 5-ти рюмок и на ик датчиках, так что пришлось по колдовать над твоей прошивкой (я не программист, я только учусь, хотя мне уже 45). Я добавил в меню настройки "настройка ик датчика" для каждой рюмки для изменения порога срабатывания, так как при подключении их на  на ноль или единицу нет возможности регулировки. Возле окна срабатывают :(, а после регулировки - нет :).  Пришлось использовать всё таки аналоговый пин А6, не знаю как это повлияет на работу плеера - не пробовал. А вообще  прошивка  супер!!!  СПАСИБО :)

raven78
Offline
Зарегистрирован: 03.11.2019

vuster пишет:

Пришлось использовать всё таки аналоговый пин А6, не знаю как это повлияет на работу плеера - не пробовал. А вообще  прошивка  супер!!!  СПАСИБО :)

В принципе ничего критичного, надо посмотреть как будет с рандомом тостов, вероятно стартовать будет всегда с одного и того же .

Обновил мальца скетч, добавил запись громкости плеера в память, как и договаривались))). Чего то мудрил с меню плеера  и другими меню, избавлялся от моргания дисплея )))

Во вкладку  a_setup добавил во вторую строку параметр для корректировки углов серво, нужно раскомментировать строку

setLightweightServoPulseMicrosFor0And180Degree(544, 2400);

и вбить свои параметры, если серва по какой то причине упирается в ноль или не доезжает до 180 градусов.

ТЫЦ

 

sarsab
Offline
Зарегистрирован: 23.01.2020

raven78,Роман ты ваще красавчик!Скетч постоянно доводишь,людям все разжевываешь досконально.Спасибо огромное друг.За твою работу и донат не жалко.Выложи реквизиты,думаю те люди кто пользуется твоей прошивкой отблагодарят тебя,ведь работа выполнена великолепно и постоянно обновляется. Если не тут то хотя бы в прошивке оставь данные. Так держать дружище!.

vuster
Offline
Зарегистрирован: 11.11.2019

raven78 пишет:

vuster пишет:

Пришлось использовать всё таки аналоговый пин А6, не знаю как это повлияет на работу плеера - не пробовал. А вообще  прошивка  супер!!!  СПАСИБО :)

В принципе ничего критичного, надо посмотреть как будет с рандомом тостов, вероятно стартовать будет всегда с одного и того же .

 

 

 

 

Да, протестировал и оказалось, что все тосты идут в определённой последовательности и после перезагрузки все с начало ;(

 

yrbasik
Offline
Зарегистрирован: 22.04.2020

Acket пишет:

Докладываю...

С прискорбием...

Encoder пишет:

https://aliexpress.ru/item/32962993969.html?spm=a2g0s.9042311.0.0.365333...

норм работает около часа стоял без перебоев

Получил сегодня с этой ссылки... те же яйца, только в профиль... 8-10сек и отрубается.

Эти тоже пришли, перепаял, 30сек примерно держит, потом моргать начинает...

У меня работает нормально,может у торгаша партия микрух другая

Acket
Offline
Зарегистрирован: 23.07.2019

при калибровке помпы все рюмки на местах, но говорит нет рюмок. и при промывке... Уровень датчиков стоит 0

в остальных местах стопки видит, и наливает...

хотя при повторном включении устройства промывка сработала, но потом перешёл на калибровку помпы, рюмку не убирал, соответственно обругалось на это, затем снял и обратно поставил - всё равно, говорит, нет рюмок. затем перевключил устройство, сразу пошёл в калибровку помпы, поставил пустую рюмку - пошла работать помпа.Переставил в другое место - работает. как только повторилась ситуация с отсутствием рюмки, дальше она повторяется независимо от снятия стопок...

sarsab
Offline
Зарегистрирован: 23.01.2020

перезалей скетч 3,4 все норма будет

Acket
Offline
Зарегистрирован: 23.07.2019

он и залит.

Всё обнулил. Перезалил бутлодер и прошивку.

sarsab
Offline
Зарегистрирован: 23.01.2020

просто заново скачай с гитхаба прошивку и перезалей,Роман уже все исправил.

Acket
Offline
Зарегистрирован: 23.07.2019

т.е алгоритм такой:

включение--->свободно--->наливает--->занято/отсутствует--->не наливает--->свободно/занято--->не наливает...|--->

попробуйте убрать стопки и включить промывку, затем поставить стопку и снова включить - работает?

                                                                                                                   

Acket
Offline
Зарегистрирован: 23.07.2019

Залил 33-й скетч. такая же история.

Acket
Offline
Зарегистрирован: 23.07.2019

Залил 32-й всё работает...

Acket
Offline
Зарегистрирован: 23.07.2019

Сорри. Залил 3.4 который 3 часа назад изменён. - всё поправлено.

Acket
Offline
Зарегистрирован: 23.07.2019

Доброго дня! Хочу спросить -  для таймера сна можно указать как-то, что активность с установкой стопок - это активность, во время которой засыпать не нужно? Сейчас можно поставить стопку и следом идёт переход в сон

raven78
Offline
Зарегистрирован: 03.11.2019

vuster пишет:

Да, протестировал и оказалось, что все тосты идут в определённой последовательности и после перезагрузки все с начало ;(

Нашел в нете какой то генератор случайных чисел, тем самым освобождаем аналоговый пин от  участия в рандоме. Рандом стал более случайным, он нужен для перемешивания тостов в случайном порядке и для мушкетёров. НУЖНО ПРОБОВАТЬ)))).

Acket пишет:

Доброго дня! Хочу спросить -  для таймера сна можно указать как-то, что активность с установкой стопок - это активность, во время которой засыпать не нужно? Сейчас можно поставить стопку и следом идёт переход в сон

Тоже сделал, так конечно правильней.

ГИТ

Sver4ok
Offline
Зарегистрирован: 09.10.2016

Приветствую всех, хочу еще раз поднять тему по оптодатчикам, чтобы светодиод излучал свет импульсами с частотой допустим 100 герц, и ардуино срабатывало только если с фотоприемника поступал такой же сигнал, соответственно от солнца не будет ошибочных сработок, но как это программно реализовать я не знаю, так как больше с паяльником дружу, и нигде про это сильно не описано