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

ДедСергей
Offline
Зарегистрирован: 15.05.2020

Gridzilla пишет:
raven78, Можно еще маленькое предложение? Настройки мультиразлива внести в ту же директорию, где и сам мультиразлив? А то как-то получается, чтобы поменять количнство надо идти в настройки, а потом обратно. Это сильно трудоёмко?

Кстати да, было бы логичнее так сделать. 

 

Бармалей пишет:

Немного программу подкорректировать.

Учитывая, например, мои старческие знания, то это превратиться в многочасовое сидение перед кодом ))) Хотя и подозреваю, что все просто, ибо скетч похожий у внуков сейчас в их соконаливаторе. Там добавлял менюшки. Но тут лучше уж автор сделает, если ему не сложно. Может еще добавит реализацию настройки времени налива как у меня в скетче, чтобы вручную не прописывать миллисекунды. 

int32_t startTime ;       // время начала работы секундомера для калибровки помпы 
int32_t elapsedTime ;     // истекшее время для секундомера
bool calibrPump = false;  // калибровка помпы


// калибровка помпы
else if (Nastr == 6 && MenuFlag == 2 && pause_sw < 10) { //входим в настройку помпы
  MenuFlag = 14;
  oled_kalibr_pump();
} else if (MenuFlag == 14 && pause_sw > 20) { //Выход из меню помпы в главное
  SAVEtimer.reset();
  myDFPlayer.volume(vol_tost); //Громкость
  delay (100);
  myDFPlayer.playFolder (1, 104); // и так сойдет
  MenuFlag = 2;
  oled_nastr(6);
  address = 10;
  EEPROM.put(address, max_Drink_delay); // обновляем в памяти время налива
} else if (MenuFlag == 14) { //вошли в меню помпы. Один раз нажали - запустили таймер и помпу. Второе нажатие останавливает таймер и помпу

  if (pause_sw < 10 &&  calibrPump == false) {    
    byte drink_count = 0;
    for (int y = 0; y < max_DrinkCount; y++) {
      if (analogRead(Optics[y]) > Optics_porog[y] ) {
        strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
        strip.show();
        ServoNaliv(y);
        delay (300); // задержка перед наливом
        startTime = millis();
        calibrPump = true;
        delay(5);
        pump_enable(); // Включаем насос
        drink_count += 1;
      }
    }
    if (drink_count == 0) {
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print(F(" ПОСТАВЬТЕ ТАРУ "));
      myDFPlayer.volume(vol_tost); //Громкость
      delay (100);
      myDFPlayer.playFolder (1, 89);
      delay(3000);
      oled_kalibr_pump();
    }
  }

  else if (pause_sw < 10 && calibrPump == true) {
    elapsedTime =   millis() - startTime;
    calibrPump = false;
    pump_disable(); // pump OFF
    ServoParking();
    max_Drink_delay = (int)(elapsedTime);
    //Serial.println(max_Drink_delay);
    oled_kalibr_pump();
  }
}

Но это так, хотелки старика )))

VICLER
Offline
Зарегистрирован: 30.12.2019

Rolo1 пишет:

А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?

такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки). 

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

VICLER пишет:

Rolo1 пишет:

А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?

такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки). 

Благодарю, буду экспериментировать. 

raven78
Онлайн
Зарегистрирован: 03.11.2019

Gridzilla пишет:
raven78, Можно еще маленькое предложение? Настройки мультиразлива внести в ту же директорию, где и сам мультиразлив? А то как-то получается, чтобы поменять количнство надо идти в настройки, а потом обратно. Это сильно трудоёмко?

Пробуйте 48. Тройной клик в самом мультиразливе переводит в настройки мультиразлива . Делал в спешке)))

ДедСергей пишет:

raven78,

Попользовался твоей прошивкой еще до НГ. Что-то немного не понял с калибровкой помпы. Время работы вручную выставляем же? Как мне кажется так проще. Нажал, ждем пока льется, еще раз нажали и хо, вот тебе время работы помпы. Или я что-то не понял в твоем скетче? 

Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём.  Не знаю кому как, но это делается не часто

ДедСергей
Offline
Зарегистрирован: 15.05.2020

raven78 пишет:

Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём.  Не знаю кому как, но это делается не часто

Так-то да. Косвенно можно во время промывки подсмотреть время нужное. Кому как в общем. В любом случае спасибо! 

VICLER
Offline
Зарегистрирован: 30.12.2019

raven78, почему в скетче написано, что коммерческое использование запрещено? Разрешено как бы. По хорошему Вам нужно добавить лицензию автора, иначе у Вас нет прав выкладывать эту прошивку в сети вообще.

prons
Offline
Зарегистрирован: 29.01.2021

добрый день рабочим скетчем  поделитесь? prons@ya.ru

prons
Offline
Зарегистрирован: 29.01.2021

Nikolaj666 пишет:

ну вот и я закончил свой аппарат. версия от Павла

будет тепло - покрашу по нормальному на даче

добрый день файлом поделитесь? prons@ya.ru

Gridzilla
Offline
Зарегистрирован: 25.10.2019

raven78,
Тройной клик для входа в настройки мультиразлива работает. Спасибо.

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

Forthomo пишет:

Rolo1 пишет:

Я так понимаю, что в код добавить работу драйвера это очень сложно для знающего человека. Что ж, нет так нет.

Несложно, предлагаю Вам  скачать скетч GyverDrink_v1.0 и самостоятельно разобраться как работать с драйвером мотора.

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

    servoON();
    servo.attach(SERVO_PIN);
    servo.write(random(0, 4));
    delay(200);
    servo.detach();
    servoOFF();

 

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

krot7
Offline
Зарегистрирован: 28.11.2019

Привет не подскажете в чем проблема на прошивке 46 при наливе на дисплее пишет промывка и после этого не говорит тосты

krot7
Offline
Зарегистрирован: 28.11.2019

Привет не подскажете в чем проблема на прошивке 46 при наливе на дисплее пишет промывка и после этого не говорит тосты

raven78
Онлайн
Зарегистрирован: 03.11.2019

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

ДедСергей
Offline
Зарегистрирован: 15.05.2020

raven78,

А можно добавить тройной клик на возвращение из меню настроек мультиразлива в сам мультиразлив?

raven78
Онлайн
Зарегистрирован: 03.11.2019

Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик  для выхода не работает?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

ДедСергей пишет:

raven78,

А можно добавить тройной клик на возвращение из меню настроек мультиразлива в сам мультиразлив?

Да, добавляйте.

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

Вопрос по схеме по питанию от АКБ.

У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?

ДедСергей
Offline
Зарегистрирован: 15.05.2020

raven78 пишет:

Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик  для выхода не работает?

Как сейчас: когда мы находимся в самом мультиразливе - тройной клик переводит в настройки мультиразлива. Все ОК. 

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

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

А если еще логичнее, то мультиразлив поместить в отдельный кейс, приблизительно так:

- Мультиразлив

--- Объем

--- Налив

чтобы все было в одном месте. Это так, хотелки мелкие. 

yct9
Offline
Зарегистрирован: 27.11.2015

Rolo1 пишет:

Вопрос по схеме по питанию от АКБ.

У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?

Какая мощность у вашего зарядного? 

LoDbIPb
Offline
Зарегистрирован: 24.06.2020

Willi пишет:

Заказал 5штк

Спасибо

Если можно, мне одну. salovat@yandex.ru

raven78
Онлайн
Зарегистрирован: 03.11.2019

ДедСергей пишет:

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

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

 

Rolo1 пишет:

Вопрос по схеме по питанию от АКБ.

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

Вроде риторический вопрос, приобрести по мощнее зарядку. Я вообще взял бп на 5 вольт 3 ампера, китайский)))

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

yct9 пишет:

Rolo1 пишет:

Вопрос по схеме по питанию от АКБ.

У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?

Какая мощность у вашего зарядного? 

5v 2A

yct9
Offline
Зарегистрирован: 27.11.2015

Rolo1 пишет:

5v 2A

Мне кажется не совпадает с действительностью 

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

Вообще убрал АКБ, напрямую с блока питания включил и помпа перестала качать. Что за хрень кто подскажет ибо голову сломал уже всю?

ОТ АКБ если включаю то все работает нормально.

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

ИЛИ это такая схема в которой тока от АКБ может работать?

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

ТЕПЕРЬ и от АКБ чего то перестала помпа крутить

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

Все заработало видимо контакт гдето отошол

Lobanchick
Offline
Зарегистрирован: 07.02.2021

Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru

заранее спасибо) 

Lobanchick
Offline
Зарегистрирован: 07.02.2021

Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru

заранее спасибо) 

andrei1979
Offline
Зарегистрирован: 07.02.2021




#include <OLED_I2C.h>
#include <Servo.h>
#include "Adafruit_NeoPixel.h"
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

OLED  myOLED(SDA, SCL, 8); //Подключение экрана А4, А5
extern uint8_t MegaNumbers[];
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
unsigned long currentTime;
unsigned long loopTime;
unsigned long ledTime;
// Переменные для энкодера -----------
const int pin_A = 2;       // Подключение вывода A (CLK) энкодера
const int pin_B = 3;       // Подключение вывода B (DT) энкодера
const int pin_SW = 4;       // Подключение вывода кнопки (SW) энкодера
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
unsigned char encoder_sw_prew = 1;
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6
const byte  Optics[] = {0, 1, 2, 3, 6};
// Значения порога срабатывания датчика для каждой рюмки
const unsigned int Optics_porog[] = {1000,1000,1000,1000,1000};
//Серво
const int PIN_SERVO = 9;
Servo servo;
//Позиция каждой рюмки ( mg995 max 250)
const byte Rumka_pos[] = {0,50,80,120,175};
const byte servo_speed=10; // Скорость поворота серво,  10 - норм, 20 медленно, 30 очень медленно
//-------------------------
byte  Menu = 0;
byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в  Главном меню. 1 Вошли в меню Авто, 2 вошли в  Ручное управление
byte  Drink = 25; // По умолчанию в рюмку наливаем  20 мл.
//----- Минимальные и максимальные значения наполняемой жидкости и задержки для наполнения. 
const byte  min_Drink = 2; // Минимум в рюмку - 2 мл.
const byte  max_Drink = 50; // Максимум в рюмку - 50 мл.
// Калибровка работы насосика. Значения для налива min_Drink и max_Drink соотвественно 
const unsigned int min_Drink_delay = 300; 
const unsigned int max_Drink_delay = 4000;
//--------
byte  DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка
const byte  max_DrinkCount = 5; //Максимальное кол-во рюмок - 5
// Насосик
const byte PIN_PUMP = 13;
// Светодиоды
const int PIN_LED = 5;// Сюда подключаются светодиоды
const int LED_COUNT = max_DrinkCount;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);
//mp3
byte mp3_count=32; //Количество голосовых файлов на SD карте



void pump_enable() {
  digitalWrite(PIN_PUMP, 1);
}

void pump_disable() {
  digitalWrite(PIN_PUMP, 0);
}

void pump_timer(byte Drink) {
  digitalWrite(PIN_PUMP, 1);
  delay(map(Drink, min_Drink,  max_Drink, min_Drink_delay, max_Drink_delay));
  digitalWrite(PIN_PUMP, 0);
}

void oled_menu(int Menu) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("Y F K B D F N J H"), CENTER, 0);
  myOLED.print(F("F D N J"), CENTER, 15);
  myOLED.print(F("H E X Y J Q "), CENTER, 30);
  myOLED.print(F("G H J V S D R F"), CENTER, 45);
  myOLED.setFont(SmallFont);
  myOLED.print(F(">"), LEFT, (Menu * 15) + 15);
  myOLED.print(F("<"), RIGHT, (Menu * 15) + 15);
  myOLED.update();

}
//  выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение
void DrinkInfo(byte pos) {
  if (Drink < 15) {
    myOLED.print(F("YB J XTV"), CENTER, pos);
  } else if (Drink < 28) {
    myOLED.print(F("GJ XENM - XENM"), CENTER, pos);
  } else if (Drink < 38) {
    myOLED.print(F("D CFVSQ HFP"), CENTER, pos);
  } else if (Drink < 48) {
    myOLED.print(F("GJ GJKYJQ"), CENTER, pos);
  } else {
    myOLED.print(F("LJ RHFTD"), CENTER, pos);
  }

}

void Tost() {
 randomSeed(currentTime);
 mp3_play(random(mp3_count)+1);
 delay (5000);
}

// Меню Авто режим
void oled_auto(int Drink) {

  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("F D N J"), CENTER, 0);
  myOLED.print(F("VK   "), RIGHT, 27);
  DrinkInfo(57);
  //  myOLED.print(DrinkInfo[map(Drink, 2, max_Drink, 0, 4)], CENTER, 57);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(Drink), CENTER, 13);
  myOLED.update();
}

// Меню Ручной режим
void oled_manual(int DrinkCount, int Drink) {

  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("H E X Y J Q"), CENTER, 0);
  DrinkInfo(57);
  // myOLED.print(DrinkInfo[map(Drink, 2, max_Drink, 0, 4)], CENTER, 57);
  myOLED.print(F("H>V"), 24, 27);
  myOLED.print(F("VK "), RIGHT, 27);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(DrinkCount), LEFT, 13);
  myOLED.print(String(Drink), (Drink < 10) ? 80 : 57, 13);
  myOLED.update();
}


void oled_naliv(int MenuFlag) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print((MenuFlag == 1) ? F("F D N J") : F("H E X Y J Q") , CENTER, 0);

  myOLED.print(F("Y F K B D F > "), CENTER, 27);
  DrinkInfo(47);
  myOLED.update();
}

void oled_nalito(int MenuFlag, int Nalito) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print((MenuFlag == 1) ? F("F D N J") : F("H E X Y J Q") , CENTER, 0);
  myOLED.print(F("Y F K B N J"), CENTER, 20);
  if (Nalito == 1) {
    myOLED.print(F("H > V R F"), CENTER, 55);
  } else if (Nalito <= 4 ) {
    myOLED.print(F("H > V R B"), CENTER, 55);
  } else {
    myOLED.print(F("H > V J R"), CENTER, 55);
  }

  myOLED.setFont(SmallFont);
  myOLED.print(String(Nalito), CENTER, 36);
  myOLED.update();
}

void ServoNaliv(byte rumka) {
  servo.attach(PIN_SERVO);
  for (int pos = servo.read(); pos <= Rumka_pos[rumka]; pos += 1) { 
    // с шагом в 1 градус
    servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
    delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
  }
  servo.detach();


}

void ServoParking () {
  //Serial.println(servo.read());
  servo.attach(PIN_SERVO);
  for (int pos = servo.read();  pos >= 0; pos -= 1) {
    // с шагом в 1 градус
    servo.write(pos);// даем серве команду повернуться в положение, которое задается в переменной 'pos'
   // delay(500);
    delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
  }
  servo.detach();
}

void CvetoMuzik() {
  for (int i = 0; i <= 7; i++) {
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(255, 0, 0));
      strip.show();
      delay(30);
    }
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(0, 255, 0));
      strip.show();
      delay(30);
    }
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(0, 0, 255));
      strip.show();
      delay(30);
    }
  }
}

void setup()  {
  Serial.begin(9600);
  mp3_set_serial (Serial); 
  delay(1000);
  ////////////////////////////////////////////////////////
   mp3_set_volume (30);// устанвливаем громкость 25
   delay (100);
   mp3_play (1); // Проигрываем "mp3/0001.mp3"(0000_get started!.mp3)
  ///////////////////////////////////////////////////////
 // mp3_set_volume (25);
  delay(100);
  pinMode(pin_SW, INPUT); // устанавливаем pin pin_SW как вход
  digitalWrite(pin_SW, HIGH); // Поддяжка вывода к 1
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(PIN_PUMP, OUTPUT);
  digitalWrite(PIN_PUMP, 0);
  currentTime = millis();
  loopTime = currentTime;
  //   Volume=EEPROM.read(0);
  myOLED.begin();
  oled_menu(0);
  strip.begin();
  for (int i = 0; i < 5; i++) {
    pinMode(Optics[i], INPUT);
  }
  
  ServoParking();



}

void loop()  {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) { // проверяем каждые 5мс

    //     int  val = analogRead(0);     // считываем значение
    //  Serial.println(val);
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера
    if ((!encoder_A) && (encoder_A_prev)) {  // если состояние изменилось с положительного к нулю

      //Вращение влево
      if (encoder_B) {
        if (MenuFlag == 0) {
          (Menu <= 0 ) ? Menu = 2 : Menu--; // Перемещение курсора по главному меню назад
          oled_menu(Menu);
        } else if (MenuFlag == 1) {
          (Drink <= min_Drink ) ? Drink = max_Drink : Drink--; // Уменьшаем кол-во милилитров в рюмку
          oled_auto(Drink);
        } else if (MenuFlag == 2) {
          (DrinkCount >= max_DrinkCount ) ? DrinkCount = 1 : DrinkCount++; // Влево увечичиваем рюмки для ручного режима
          oled_manual(DrinkCount, Drink);
        }
        //Вращение вправо
      } else {
        if (MenuFlag == 0) {
          (Menu >= 2 ) ? Menu = 0 : Menu++; // Перемещение курсора по главному меню вперед.
          oled_menu(Menu);
        } else if (MenuFlag == 1) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink++;
          oled_auto(Drink);
        } else if (MenuFlag == 2) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink++;
          oled_manual(DrinkCount, Drink);
        }
      }

    }

    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла

    int encoder_sw = digitalRead(pin_SW);
    if  (encoder_sw == 0 && encoder_sw != encoder_sw_prew)  { // Нажата кнопка

      int pause_sw = 0;
      boolean promivka = false;
      while (digitalRead(pin_SW) == 0) { // Держим кнопку. Считаем сколько времени прошло...
        delay(100);
        pause_sw++;
        if (pause_sw > 20 && Menu != 2 ) break;

        if (pause_sw > 20 && Menu == 2 && promivka == false) { // Если пункт меню промывка и держим кнопку больше 2 секунд.
          promivka = true;
          pump_enable(); // Включаем насос
          myOLED.clrScr();
          myOLED.setFont(RusFont);
          myOLED.print(F("G H J V S D R F"), CENTER, 15);
          myOLED.print(F(". . ."), CENTER, 45);
          myOLED.update();
        }
      }

      //После отпускания кнопки , обрабатываем
      if (promivka == true) { //Отпустили кнопку. Если включена промывка, выключаем насос и возвращаемся в главное меню
        promivka = false;
        pump_disable() ; //Выключаем насос
        oled_menu(2);

      } else {
        //Обработка всех нажатий кнопки
        if (Menu == 0 && MenuFlag == 0 &&  pause_sw < 10) { //Нажатие кнопки меню авто
          MenuFlag = 1;
          oled_auto(Drink);
        } else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное
          MenuFlag = 0;
          oled_menu(0);
        } else if (MenuFlag == 1 ) { //Начинается автоматический разлив
         // Serial.println("Начало автоматического разлива");
          oled_naliv(MenuFlag); // Выводим на экран наливаем ...
          byte drink_count = 0;
          for (int y = 0; y < max_DrinkCount; y++) {
            if (analogRead(Optics[y]) > Optics_porog[y] ) {
              strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
              strip.show();
              ServoNaliv(y); // Перемещяемся к рюмке
              pump_timer(Drink); // Налив.
              strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
              strip.show();
              drink_count++;
            }
          }
          if (drink_count > 0) {
            oled_nalito(MenuFlag, drink_count );
            ServoParking();
            delay(1000);
            Tost();
            CvetoMuzik();
            oled_auto(Drink);
          } else {
            myOLED.clrScr();
            myOLED.setFont(RusFont);
            myOLED.print(F("YTN H>VJR !"), CENTER, 25);//нет рюмок
            myOLED.update();
            delay(2000);
            oled_auto(Drink);

          }
        } else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) { // Нажатие меню ручное
          MenuFlag = 2;
          oled_manual(DrinkCount, Drink);
        } else if (MenuFlag == 2 && pause_sw > 20) { //Выход из меню ручное в главное
          MenuFlag = 0;
          oled_menu(1);
        } else if (MenuFlag == 2 ) { //Начинается ручной разлив
          //  Serial.println("Начало ручного разлива " + String(DrinkCount));
          oled_naliv(MenuFlag); // Выводим на экран наливаем ...
          for (int y = 0; y < DrinkCount; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
            strip.show();
            ServoNaliv(y); // Перемещяемся к рюмке
            pump_timer(Drink); // Налив.
            strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
            strip.show();
          }
          oled_nalito(MenuFlag, DrinkCount );
          ServoParking();
          Tost();
          CvetoMuzik();
          oled_manual(DrinkCount, Drink);
        }
      }
    }

    if (currentTime >= (ledTime + 300)) {
      //Опрашиваем оптопары ... Если рюмка поставлена , светодиод светится синим, нет ничего - не светится
      for (int i = 0; i < max_DrinkCount; i++) {
        
        int val = analogRead(Optics[i]);     // считываем значение
     //   Serial.println("A"+String(Optics[i])+"="+val);
        if (val > Optics_porog[i]) {
          strip.setPixelColor(i, strip.Color(0, 0, 255));
        } else {
          strip.setPixelColor(i, strip.Color(0, 0, 0));
        }
    //    delay(20);

      }
      strip.show();
      ledTime = currentTime;
    }
    encoder_sw_prew = encoder_sw;
    loopTime = currentTime;

  }
}

 

andrei1979
Offline
Зарегистрирован: 07.02.2021

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

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

Lobanchick пишет:

Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru

заранее спасибо) 

привет. от какого корпуса чертёж ?

andrei1979
Offline
Зарегистрирован: 07.02.2021

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

Павел 33333
Offline
Зарегистрирован: 08.11.2020

Спасибо

sooharik
Offline
Зарегистрирован: 06.11.2014

Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?

Petrmv
Offline
Зарегистрирован: 08.02.2021

Доброго всем, поделитесь пожалуйста скетчем и схемой если не сложно petr1374@mail.ru

andrei1979
Offline
Зарегистрирован: 07.02.2021

выше скетч

sooharik
Offline
Зарегистрирован: 06.11.2014

sooharik пишет:

Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?


скетч 46

raven78
Онлайн
Зарегистрирован: 03.11.2019

sooharik пишет:

Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?

L - linear - линейный, воспроизведение треков по порядку

R - random - случайный, воспроизведение треков в случайном порядке, так, что они не повторяются, не более 100 треков в папке.

LoDbIPb
Offline
Зарегистрирован: 24.06.2020

Может у кого есть лишняя плата для сборки наливатора ?

salovat@yandex.ru заранее Спасибо !

vlad3791
Offline
Зарегистрирован: 05.02.2020

Добрый день. А можно скинуть гербер файл на почту sakhprodsnab77@gmail.com

Lobanchick
Offline
Зарегистрирован: 07.02.2021

Lobanchick
Offline
Зарегистрирован: 07.02.2021

Nikolaj666 пишет:

Lobanchick пишет:

Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru

заранее спасибо) 

привет. от какого корпуса чертёж ?

Вот от этого корпуса.

http://arduino.ru/sites/default/files/u25815/img_20200321_175807.jpg

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

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

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

Lobanchick пишет:

http://disk.yandex.ru/d/lGgNB7ZgD-wKew надеюсь разберётесь

Lobanchick
Offline
Зарегистрирован: 07.02.2021

Nikolaj666 пишет:

Lobanchick пишет:

http://disk.yandex.ru/d/lGgNB7ZgD-wKew надеюсь разберётесь

 

Спасибо Николай)

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

 

 

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

Вот вношу свою лепту в разнообразие видов так сказать. От емкостных концевиков отказался, не удалось добиться нормальной работы.

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

чума ! модельку не скинете побаловаться ?

nikolajyashkin@ya.ru

VlaVik
Offline
Зарегистрирован: 06.01.2021

Добрый день, коллеги! Помогите решить проблемку. Прошивка GyverDrink_v1.3. После налива 5-й рюмки (всего 5), доставляю любую рюмку от 1 по 4-ю, то серво SG995 при наливе не доворачивает краник до центра рюмки на 3-4 градуса. Если запускаю разлив по порядку 1-5, то краник точно попадает в центры рюмок. Получается, что в одном направлении четкое попадание в рюмки, при обратном - недокручивает до центра рюмки 3-4градуса. Проблема в коде, или в серво?