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

sadman41
Offline
Зарегистрирован: 19.10.2016

Не буду читать всю ветку - может уже и было предложено... но для корпоративных вечеринок можно изготовить "бармена": несколько кнопок, связанных с незамысловатыми рецептами "200мл пива + 50 мл водки". Для экстремалов - рандомайз.

А так, в кои-то веки с Ложиком соглашусь: наливатор - штука на любителя. Накидаться и без него можно без особых проблем.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

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

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

stpavel
Offline
Зарегистрирован: 09.10.2018

Logik пишет:

Если Вас интерисуют вообще проекты, то поиском на форуме найдете,.

​Ничего себе , какой важный ардуинщик нас посетил ! А мы и не признали как-то ...

Logik пишет:

А наливатор я не делал, и не уверен что вообще буду делать. Пока не буду убежден в его полезности.

А что ты тогда тут делаешь ? ))) На этом форуме множество проектов, кажущихся бессмысленными и не нужными для меня, но востребованные и нужные для других. Я же не захожу в каждую тему , и не пишу им об этом. Думаешь надо ?

Logik пишет:

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

Конечно ! Предложенное тобой решение применения вместо концевиков лазерных дальномеров и установки перевернутой бутылки в воронку, в корне изменит наше представление о наливаторах ! Он сразу же станет востребованным для каждого, за ужином, обедом и самое главное за завтраком ! 

 

Logik пишет:

А пока готов только проговаривать решения.

Аккуратней с этим .

Logik пишет:

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

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

stpavel
Offline
Зарегистрирован: 09.10.2018

sadman41 пишет:

А так, в кои-то веки с Ложиком соглашусь: наливатор - штука на любителя. Накидаться и без него можно без особых проблем.

Вот именно,  любители наливаторов тут и собрались )  Очень странно слышать сомнения по поводу целесообразности устройства в теме , где занимаются разработкой и сборкой этих самых устройств . Таким макаром можно открыть раздел Проекты на этом форуме и пройтись по каждой теме. Например Дозиметр.. Че это за хрень , какая его практическая польза , да я не знаю не одного нормального человека, которому он нужен. Или скажем контроль влажности подвала ... Что за бредовая ерунда... Можно продолжать и продолжать.

Ну вобщем вы мою мысль уловили , да ?

И это... Поверьте , не интересная людям тема , не набрала бы за достаточно короткий срок более 1000 сообщений )

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

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

stpavel
Offline
Зарегистрирован: 09.10.2018

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

Для начала нужно понять , какой скетч вы используете )

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

сорян, не проснулся. nalivator_v5.1_lcd_dfp

stpavel
Offline
Зарегистрирован: 09.10.2018

Nikolaj666 пишет:
сорян, не проснулся. nalivator_v5.1_lcd_dfp

Если не устраивает работа энкодера , как тут уже предлагали пару страниц назад, переходите на библиотеку GyverEncoder.  Очень быстрая и функциональная. Переделать скетч не составит особого труда. 

 

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

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

Sentiurev
Offline
Зарегистрирован: 01.08.2019

Энкодер только у меня шаги пропускает?

sadman41
Offline
Зарегистрирован: 19.10.2016

Об отсутствии общей целесообразности я не писал. Для весёлых новогодних конкурсов штука полезная, наверняка.

Но хочу предупредить за гайверовские библиотеки: давеча тут была ссылка... Собрал юзер поливалку для цветов "по гайверу", ушел на работу, а она как дала жару - каждые 15 минут вкачивала в горшок дозу. Вечером хозяин был обескуражен итогом работы девайса.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

dima2ko пишет:

Подскажите в какой программе чертите?

dima2ko, прочитайте всю тему!

Визио!

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

stpavel
Offline
Зарегистрирован: 09.10.2018

sadman41 пишет:
Об отсутствии общей целесообразности я не писал. Для весёлых новогодних конкурсов штука полезная, наверняка.

Ну собственно для веселых застолий  он и нужен ) Явно не для ежедневного пользования.

sadman41 пишет:
Но хочу предупредить за гайверовские библиотеки: давеча тут была ссылка... Собрал юзер поливалку для цветов "по гайверу", ушел на работу, а она как дала жару - каждые 15 минут вкачивала в горшок дозу. Вечером хозяин был обескуражен итогом работы девайса.

​Не могу сказать про все библиотеки, но GyverEncoder работает точно без проблем. И вообще , нельзя слепо повторять проекты , нужно иногда и голову включать. А то может юзер сам там чето накосячил, а гайвер у него виноватым остался ))

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Alexamig пишет:

Дополнил скетч индикацией разряда из поста #642 . Почему то не загорается 6 светодиод т.е. никакой индикации нет. Светодиод проверен - рабочий 100% Первые 5 отлично отрабатывают. Где накосячил не могу разобраться. Пока не подключен DFPlayer и микрики, помпа.(пока едут) Из-за этого навряд не работает. Всю голову сломал, кто поможет больному... Если нужен скетч скину.

Кидай! Не забудь свернуть. Проверь подключение самого самого светодиода, он посдедний  от 5-го Dout к 6-му Din  и емкость на питание 470 мкФ.

dima2ko
Offline
Зарегистрирован: 08.11.2019

Forthomo пишет:

dima2ko пишет:

Подскажите в какой программе чертите?

dima2ko, прочитайте всю тему!

Визио!

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

У меня в визио я не нашел где можно так чертить с дугами и углами, везде какие-то планы домов и электрика
Хочу сам для себя начертить.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Библиотеки (фигуры): графические примитивы, размеры (техника),простые фигуры, крепежные элементы.

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

Nikolaj666 пишет:
вот мне то как раз и составит. с железом я что угодно сотворю, но вот скетчи править ......

Подправил скетч, как смог, энкодер работает с библиотекой GyverEncoder. Попробуйте, на макете вроде работает))).


#include <LCD_1602_RUS.h>
#include <Servo.h>
#include "Adafruit_NeoPixel.h"
//#include <SoftwareSerial.h>//добавляем библиотеки
#include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера

LCD_1602_RUS lcd(0x27, 16, 2); //Порт дисплея обычно 0x27 или 0x3F, подключение экрана А4-SDA-зеленый, А5-SCL-желтый

unsigned long currentTime;
//unsigned long loopTime;
unsigned long ledTime;

// Переменные для энкодера -----------
#include "GyverEncoder.h"
const byte CLK = 2;
const byte DT = 3;
const byte SW = 4;
Encoder enc(CLK, DT, SW);
//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;
boolean promivka = false;
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6
const byte  Optics[] = {0, 1, 2, 3, 6};
// Значения порога срабатывания датчика для каждой рюмки
const unsigned int Optics_porog[] = {100,200,200,200,100};
//Серво
const int PIN_SERVO = 9;
Servo servo;
//Позиция каждой рюмки 
const byte Rumka_pos[] = {3,50,98,145,179}; //12 - 48 - 90 - 135 - 174 
const byte servo_speed=20; // Скорость поворота серво,  10 - норм, 20 медленно, 30 очень медленно
byte  Menu = 0;
byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в  Главном меню. 1 Вошли в меню Авто, 2 вошли в  Ручное управление
byte  Drink = 20; // По умолчанию в рюмку наливаем  20 мл.
//----- Минимальные и максимальные значения наполняемой жидкости и задержки для наполнения. 
const byte  min_Drink = 2; // Минимум в рюмку - 2 мл.
const byte  max_Drink = 50; // Максимум в рюмку - 50 мл.
// Калибровка работы насосика. Значения для налива min_Drink и max_Drink соотвественно 
const unsigned int min_Drink_delay = 222; 
const unsigned int max_Drink_delay = 5500;
//--------
byte  DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка
const byte  max_DrinkCount = 3; //Максимальное кол-во рюмок - 5
// Насосик
const byte PIN_PUMP = 12;
// Светодиоды
const int PIN_LED = 5;// Сюда подключаются светодиоды
const int LED_COUNT = max_DrinkCount;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);
//-------

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(byte Menu) {
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print(F("НАЛИВАТОР+"));
  lcd.setCursor(0, 1);
  lcd.print(F(">"));
  lcd.setCursor(15, 1);
  lcd.print(F("<"));
  switch (Menu) {
    case 0:
      lcd.setCursor(6, 1);
      lcd.print(F("АВТО"));
      break;
    case 1:
      lcd.setCursor(2, 1);
      lcd.print(F("РУЧНОЙ РЕЖИМ"));
      break;
    case 2:
      lcd.setCursor(4, 1);
      lcd.print(F("ПРОМЫВКА"));
      break;
  }
}

//  выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение
void DrinkInfo(byte pos) {
  Serial.println(F("INFO_DRINK"));

	lcd.setCursor(0, 1);
  if (Drink < 15) {
//    lcd.setCursor(0, 1);
    lcd.print(F("    НИ О ЧЕМ    "));
  } else if (Drink < 28) {
//    lcd.setCursor(0, 1);
    lcd.print(F(" ПО ЧУТЬ - ЧУТЬ "));
  } else if (Drink < 38) {
//    lcd.setCursor(0, 1);
    lcd.print(F("  В САМЫЙ  РАЗ  "));
  } else if (Drink < 48) {
//    lcd.setCursor(0, 1);
    lcd.print(F("   ПО  ПОЛНОЙ  "));
  } else {
//    lcd.setCursor(0, 1);
    lcd.print(F("    ДО КРАЕВ    "));
  }
}
// Меню Авто режим
void oled_auto(int Drink) {
    Serial.println(F("MENU_AUTO"));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("HАЛИТЬ ПО"));
    lcd.setCursor(10, 0);
    lcd.print(Drink);
  Serial.println(Drink);
    lcd.setCursor(13, 0);
    lcd.print(F("мЛ?"));
    DrinkInfo(57);

}

// Меню Ручной режим
void oled_manual(int DrinkCount, int Drink) {
    Serial.println(F("MENU_RUCHN"));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("HАЛИТЬ ПО"));
    lcd.setCursor(10, 0);
    lcd.print(Drink);
    lcd.setCursor(13, 0);
    lcd.print(F("мЛ?"));  
  Serial.println(Drink);  
  lcd.setCursor(0, 1);
    lcd.print(F("   В   РЮМ"));
    lcd.setCursor(5, 1);
    lcd.print(DrinkCount);
    Serial.println(DrinkCount); 
  if (DrinkCount == 1) {
    lcd.setCursor(10, 1);
    lcd.print(F("КУ     "));
  } else if (DrinkCount <= 4 ) {
    lcd.setCursor(10, 1);
    lcd.print(F("КИ     "));
  } else {
    lcd.setCursor(10, 1);
    lcd.print(F("ОК     "));
  }
  
}
// Меню налива
void oled_naliv(int MenuFlag, int Drink, int DrinkCount) {
  Serial.println(F("NALIVAIU"));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("НАЛИВАЮ ПО"));
    lcd.setCursor(11, 0);
    lcd.print(Drink);
  Serial.println(Drink);
    lcd.setCursor(14, 0);
    lcd.print(F("мЛ"));
    lcd.setCursor(0, 1);
    lcd.print(F("   В"));
    lcd.setCursor(5, 1);
    lcd.print(DrinkCount);
  Serial.println(DrinkCount); 
    lcd.setCursor(7, 1);
    lcd.print(F("РЮМ"));

  if (DrinkCount == 1) {
    lcd.setCursor(10, 1);
    lcd.print(F("КУ     "));
  } else if (DrinkCount <= 4 ) {
    lcd.setCursor(10, 1);
    lcd.print(F("КИ     "));
  } else {
    lcd.setCursor(10, 1);
    lcd.print(F("ОК     "));
  }
}
// Меню налито
void oled_nalito(int MenuFlag, int Nalito, int Drink) {
    Serial.println(F("NALITO"));
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("HАЛИТО ПО"));
    lcd.setCursor(11, 0);
    lcd.print(Drink);
    Serial.println(Drink); 
    lcd.setCursor(14, 0);
    lcd.print(F("мЛ"));
    lcd.setCursor(0, 1);
    lcd.print(F("   В"));
    lcd.setCursor(5, 1);
    lcd.print(Nalito);
    lcd.setCursor(7, 1);
    lcd.print(F("РЮМ")); 
  Serial.println(Nalito);
  if (Nalito == 1) {
    lcd.setCursor(10, 1);
    lcd.print(F("КУ     "));
  } else if (Nalito <= 4 ) {
    lcd.setCursor(10, 1);
    lcd.print(F("КИ     "));
  } else {
    lcd.setCursor(10, 1);
    lcd.print(F("ОК     "));
  }

}
  
  void Tost() { //Рандом - 1
  Serial.println(F("Tost"));  
    randomSeed(currentTime);
	byte num=random(20); // 0...19
 Serial.println(num);
   mp3_set_volume (20);// устанвливаем громкость 20 (если хотите установить
//   кнопки для регулировки громкости вручную, закоментируйте эту и с
//ледующую строчку)
   delay (100);
   lcd.clear();
    switch (num){
  //switch (random(20)) { // 0...19
	case 0: //ЗА ВСТРЕЧУ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА ВСТРЕЧУ!"));
		mp3_play (2);  // Проигрываем "mp3/0002.mp3"
		delay(100);
	break; 
  case 1: //ЗА КРАСОТУ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА КРАСОТУ!"));   
		mp3_play (3);  // Проигрываем "mp3/0003.mp3"
		delay(100);
	break; 		
	case 2: //"ЗА ДРУЖБУ!"
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));//
		lcd.setCursor(3, 1);
		lcd.print(F("ЗА ДРУЖБУ!"));  
		mp3_play (4);  // Проигрываем "mp3/0004.mp3"
		delay(100);
	break;
	case 3: //"ЗА БРАТСТВО!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА БРАТСТВО!"));   
		mp3_play (5);  // Проигрываем "mp3/0005.mp3"
		delay(100);
	break;	
	case 4: //ЗА СПРАВЕДЛИВОСТЬ!
		lcd.setCursor(5, 0);
		lcd.print(F("НУ, ЗА"));
		lcd.setCursor(1, 1);
		lcd.print(F("СПРАВЕДЛИВОСТЬ!"));
		mp3_play (6);  // Проигрываем "mp3/0006.mp3"11
		delay(100);
	break;	
  case 5: //ЗА РЫБАЛКУ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(3, 1);
		lcd.print(F("ЗА РЫБАЛКУ!"));
		mp3_play (7);  // Проигрываем "mp3/0007.mp3"
		delay(100);
	break;	
	case 6: //ЗА ИСКУССТВО!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА ИСКУССТВО!"));
		mp3_play (8);  // Проигрываем "mp3/0008.mp3"
		delay(100);
	break;	
	case 7: //ЗА РАЗУМ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(3, 1);
		lcd.print(F("ЗА РАЗУМ!"));
		mp3_play (9);  // Проигрываем "mp3/0009.mp3"
		delay(100);
  break; 
	case 8: //ЗА ИСТИННЫХ ЖЕНЩИН!
		lcd.setCursor(5, 0);
		lcd.print(F("НУ, ЗА"));
		lcd.setCursor(0, 1);
		lcd.print(F("ИСТИННЫХ ЖЕНЩИН!!"));
		mp3_play (10);  // Проигрываем "mp3/0010.mp3"
		delay(100);
  break;
	case 9: //ЗА ПОНИМАНИЕ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА ПОНИМАНИЕ!"));
		mp3_play (11);  // Проигрываем "mp3/0011.mp3"
		delay(100);
  break;
	case 10: //ЗА ЕДИНЕНИЕ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(2, 1);
		lcd.print(F("ЗА ЕДИНЕНИЕ!"));
		mp3_play (13);  // Проигрываем "mp3/0013.mp3"
		delay(100);
  break;
	case 11: //ЗА ПОБЕДУ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(3, 1);
		lcd.print(F("ЗА ПОБЕДУ!"));
		mp3_play (16);  // Проигрываем "mp3/0016.mp3"
		delay(100);
  break;
	case 12: //ЗА РОДИНУ!
		lcd.setCursor(7, 0);
		lcd.print(F("НУ,"));
		lcd.setCursor(3, 1);
		lcd.print(F("ЗА РОДИНУ!"));
		mp3_play (21);  // Проигрываем "mp3/0021.mp3"
		delay(100);
  break;
	case 13: //ЧТОБ ГОЛОВА НЕ ТРЕЩАЛА!
		lcd.setCursor(0, 0);
		lcd.print(F("НУ, ЧТОБ ГОЛОВА"));
		lcd.setCursor(2, 1);
		lcd.print(F("НЕ ТРЕЩАЛА!"));
		mp3_play (17);  // Проигрываем "mp3/0017.mp3"
		delay(100);
  break;
	case 14: //ЗА СОЛИДНОЕ МУЖСКОЕ МОЛЧАНИЕ
		lcd.setCursor(0, 0);
		lcd.print(F("НУ, ЗА  СОЛИДНОЕ"));//НУ,
		lcd.setCursor(0, 1);
		lcd.print(F("МУЖСКОЕ МОЛЧАНИЕ!"));
		mp3_play (12);  // Проигрываем "mp3/0012.mp3"
		delay(100);
  break;
	case 15: //ЧТОБ МОРЩИЛО НАС МЕНЬШЕ!
		lcd.setCursor(0, 0);
		lcd.print(F("НУ,ЧТОБЫ МОРЩИЛО"));
		lcd.setCursor(2, 1);
		lcd.print(F("НАС МЕНЬШЕ ЧЕМ"));
		mp3_play (18);  // Проигрываем "mp3/0018.mp3"
		delay(100);
    break;
	case 16: //ЧТОБ В СТОРОНУ НЕ ВИЛЬНУЛО!
		lcd.setCursor(0, 0);
		lcd.print(F("НУ,ЧТОБ В СТОРО-"));
		lcd.setCursor(0, 1);
		lcd.print(F("НУ НЕ  ВИЛЬНУЛО!"));
		mp3_play (19);  // Проигрываем "mp3/0019.mp3"
		delay(100);
  break; 
	case 17: //НУ ВЫ БЛИН ДАЁТЕ!
		lcd.setCursor(2, 0);
		lcd.print(F("НУ ВЫ БЛИН"));
		lcd.setCursor(5, 1);
		lcd.print(F("ДАЁТЕ!"));
		mp3_play (20);  // Проигрываем "mp3/0020.mp3"
		delay(100);	
  break; 		
	case 18: //ЗА МИР ВО ВСЕМ МИРЕ
		lcd.setCursor(5, 0);
		lcd.print(F("ЗА МИР"));
		lcd.setCursor(2, 1);
		lcd.print(F("ВО ВСЕМ МИРЕ"));  
		delay(2000);
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print(F("И БОЛЬШИЕ СИСЬКИ"));
		lcd.setCursor(5, 1);
		lcd.print("!!!!");  
  break;
	case 19: //ЗА НАС С ВАМИ
		lcd.setCursor(1, 0);
		lcd.print(F("ЗА НАС С ВАМИ"));
		lcd.setCursor(1, 1);
		lcd.print(F("И ХРЕН С НИМИ"));
		delay(100);	
    break; 	
		
  }

  delay(2000);

}


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(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);//
  enc.setType(TYPE2); 
  //устанавливаем Serial порт МП3 плейера если вывод в монитор TX(D0) и RX(D1)не нужен 
  mp3_set_serial (Serial);//инициализируем Serial порт МП3 плейера
  /*  
  при необходимости создаем програмный порт для управдения МП3 плейером, если вывод в монитор TX(D0) RX(D1) необходим
  SoftwareSerial mySoftwareSerial(10, 11); // RX, TX  обозначаем програмный порт как mySoftwareSerial
  //плейер подключаем D10 D11
  mySoftwareSerial.begin(9600);//инициализируем програмный Serial порт 
  mp3_set_serial (mySoftwareSerial);// указываем програмный порт для МП3 плейера
  //инициализируем Serial с скоростью 115200, если вывод в монитор  TX(D0) RX(D1) необходим 
  Serial.begin(115200);
  */  
  delay (100);//Между двумя командами необходимо делать задержку 100 миллисекунд, в противном случае некоторые команды могут работать не стабильно.
  mp3_set_volume (30);// устанвливаем громкость 30
  delay (100);
  mp3_play (1); // Проигрываем "mp3/0001.mp3"(0001_get started!.mp3)
  delay (100);
  lcd.init();// Инициализация дисплея
  lcd.backlight();
  lcd.setCursor(7, 0);
	lcd.print(F("НУ,"));
	lcd.setCursor(1, 1);
	lcd.print(F("НАА-ЧАА-ЛИИИИ!"));
	delay (3500);
//  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;
  //---------------
  oled_menu(0);
  strip.begin();
  for (int i = 0; i < 5; i++) {
    pinMode(Optics[i], INPUT);
  }
  ServoParking();

}

void loop()  {
  enc.tick();
  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 (enc.isLeft()) {
        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 (enc.isRight()) {
        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(); // Включаем насос
     // lcd.clear();   
		 // lcd.setCursor(0, 0);
         // lcd.print(F("П Р О М Ы В К А"));
         // lcd.setCursor(2, 1);
         // lcd.print(">>>>>>>>>>>>");
       // }
      //}

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

      //} else {
        //Обработка всех нажатий кнопки
        if (enc.isClick()){// Нажата и отпущена кнопка
        if (Menu == 0 && MenuFlag == 0) { //Нажатие кнопки меню авто
          MenuFlag = 1;
          oled_auto(Drink);
        //} else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное
          //MenuFlag = 0;
          //oled_menu(0);
        } else if (MenuFlag == 1 ) { //Начинается автоматический разлив
          Serial.println("AUTO"); //Начало автоматического разлива
          oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ...
          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, Drink );
            ServoParking();
            delay(1000);
            Tost();
            CvetoMuzik();
            oled_auto(Drink);
          } else {
            lcd.setCursor(7, 1);
            lcd.print(F("НЕТ РЮМОК!"));
            delay(2000);
            oled_auto(Drink);

          }
        } else if (Menu == 1 && MenuFlag == 0) { // Нажатие меню ручное
          MenuFlag = 2;
          oled_manual(DrinkCount, Drink);
       // } else if (MenuFlag == 2 && pause_sw > 20) { //Выход из меню ручное в главное
          //MenuFlag = 0;
          //oled_menu(1);
        } else if (MenuFlag == 2 ) { //Начинается ручной разлив
            Serial.println("RUCHNOY" + String(DrinkCount));
          oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ...
          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, Drink ); // Выводим на экран налито ...
          ServoParking();
          Tost();
          CvetoMuzik();
          oled_manual(DrinkCount, Drink);
        }
      }
    //}
   // }
              if (enc.isHolded()){
                if (Menu == 2 && !promivka){
                 promivka = true;
                 pump_enable(); // Включаем насос
                 lcd.clear();   
                 lcd.setCursor(0, 0);
                 lcd.print(F("П Р О М Ы В К А"));
                 lcd.setCursor(2, 1);
                 lcd.print(">>>>>>>>>>>>");
               } else if (MenuFlag == 1 ) { //Выход из меню авто в главное
                 MenuFlag = 0;
                 oled_menu(0);
              }else if (MenuFlag == 2 ) { //Выход из меню ручное в главное
                 MenuFlag = 0;
                 oled_menu(1);
              }
            }
            if (!enc.isHold() && promivka){
               promivka = false;
               pump_disable() ; //Выключаем насос
               oled_menu(2);
              }

    if (currentTime >= (ledTime + 300)) {
      //Опрашиваем оптопары ... Если рюмка поставлена , светодиод светится синим, нет ничего - не светится
      for (int i = 0; i < max_DrinkCount; i++) {
        
        int val = analogRead(Optics[i]);     // считываем значение
//        Serial.println(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;

  //}
}

Библиотеку брать здесь https://github.com/AlexGyver/GyverLibs

dima2ko
Offline
Зарегистрирован: 08.11.2019

Forthomo пишет:

Библиотеки (фигуры): графические примитивы, размеры (техника),простые фигуры, крепежные элементы.

Спасибо огромное, там этих библиотек куча, не там искал

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

спасибо. вечерком гляну

stpavel
Offline
Зарегистрирован: 09.10.2018

alkotester пишет:

stpavel, так что насчет вашего варианта скетча?

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

stpavel
Offline
Зарегистрирован: 09.10.2018

alkotester пишет:

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

...

Как-то не вяжется с этим

Слышь , чувак. Может тебе еще дать трусы мои поносить ?  

Мне не жалко свой код отдать любому здесь , кто активно участвует в разработке. От тебя я пока никакой пользы не увидел. Два сообщения и в обеих ДАЙ ! Жди AlexMIKа, подписывайся на его канал, скоро он выложит свое видение наливатора со своим кодом. 

 

stpavel
Offline
Зарегистрирован: 09.10.2018

alkotester пишет:

Ты б хлебальник свой прикрыл

Обиделся что ли ? ) Ну ниче, дыши глубже, пройдет. 

Че-то последнее время в этой теме психически неуравновешенные активизировались.. Осень что ли так действует ?

 

Logik
Offline
Зарегистрирован: 05.08.2014

Та stpavel весь на нервах. После того как я с ним идеями пподелился ;)

Но он же сам просил!

stpavel пишет:

 Самое ценное это идеи. Нужно делиться своим идеями , даже если они бредовые ) В спорах и обсуждениях рождается истина.  

Правда закостенелось мозга, надеюсь не от тестирования наливатора ;) не позволяет ему воспринимать.

stpavel пишет:

Конечно ! Предложенное тобой решение применения вместо концевиков лазерных дальномеров

Нет, наш хамоватый товарищ!

Я писал не о замене концевиков! Там было так

"лазерный дальномер+серва сканирует окружающее пространство вокруг корпуса в некотором сегменте, если на  разумной дистанции 5-15см обнаружено препятствии по габаритам соответствующее рюмке, то на него наводим излив. "

Т.е. рюмки ставятся на стол, чем и снимается проблема залива.

Замечание по поводу засветки солнцем - зачет, как первая попытка конструктивной критики. Действительно солнце сильно сокращает дальность корректной работы дальномера. С нескольких метров до десятков сантиметров, это вроде должно устраивать.

Про назначение девайса - я не массовик затейник и не клоун по вызову, на корпоративах я как правило не выступаю. Потому такое применение мне не актуально. Мне для дома, для семьи, друзей и знакомых. Потому я не хочу чтоб устройство мне усложняло жизнь, хочу чтоб наоборот. Как следствие - перепайка концевиков, даже очень просто, даже не после первой рюмки - неприемлема. То же касается и перелива из бутылки в бутылку. Ну что такое 0,5 на четверых? Три тоста! И каждые три тоста лейка-перелейка. Та нафиг! Потому я если (подчеркиваю если!!!) и займусь устройством то только без таких проблем. И еще некоторых, требующих решения.

 

 

stpavel
Offline
Зарегистрирован: 09.10.2018

Logik пишет:

Т.е. рюмки ставятся на стол, чем и снимается проблема залива.

Замечание по поводу засветки солнцем - зачет, как первая попытка конструктивной критики. Действительно солнце сильно сокращает дальность корректной работы дальномера. С нескольких метров до десятков сантиметров, это вроде должно устраивать.

Про назначение девайса - я не массовик затейник и не клоун по вызову, на корпоративах я как правило не выступаю. Потому такое применение мне не актуально. Мне для дома, для семьи, друзей и знакомых. Потому я не хочу чтоб устройство мне усложняло жизнь, хочу чтоб наоборот. Как следствие - перепайка концевиков, даже очень просто, даже не после первой рюмки - неприемлема. То же касается и перелива из бутылки в бутылку. Ну что такое 0,5 на четверых? Три тоста! И каждые три тоста лейка-перелейка. Та нафиг! Потому я если (подчеркиваю если!!!) и займусь устройством то только без таких проблем. И еще некоторых, требующих решения.

Вот ты неугомонный. Что ты хочешь ? Что бы за тебя кто то эту идею в жизнь воплотил или что ?

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

 

Logik пишет:

Нет, наш хамоватый товарищ!

 

​Ну на счет этого я могу поспорить . Хамить первый тут ты начал. 

Logik пишет:

я не массовик затейник и не клоун по вызову

​Хз.. Я тебя лично не знаю

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

stpavel
Offline
Зарегистрирован: 09.10.2018

xDriver пишет:

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

Да , проще наверное вообще его игнорировать. 

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

парни, хорош. не ведитесь Вы на срач этот. игнорьте и они сами отвалятся в сторону.

Alexamig
Offline
Зарегистрирован: 30.05.2017

Forthomo пишет:

Alexamig пишет:

Дополнил скетч индикацией разряда из поста #642 . Почему то не загорается 6 светодиод т.е. никакой индикации нет. Светодиод проверен - рабочий 100% Первые 5 отлично отрабатывают. Где накосячил не могу разобраться. Пока не подключен DFPlayer и микрики, помпа.(пока едут) Из-за этого навряд не работает. Всю голову сломал, кто поможет больному... Если нужен скетч скину.

Кидай! Не забудь свернуть. Проверь подключение самого самого светодиода, он посдедний  от 5-го Dout к 6-му Din  и емкость на питание 470 мкФ.


К сожалению на работе до вторника, скину, с собой не взял. По поводу светодиода- у меня линейка на 8 или 9. Она проверена, все светики работают. Где-то в коде накосячил, но в мониторе А7 видно, что-то прыгает.

AlexMik
Offline
Зарегистрирован: 15.09.2019

Доброго здоровья, коллеги!

А у вас тут, я смотрю, весело))
Поддержу прекращение ругни со всех сторон.
Отличная тема - не засоряйте пожалуйста.))
На неделе выложу следующую часть.
К сожалению быстрее не могу.
Потому как дела семейные никто не отменял, да и клею и каждому слою лака надо время для высыхания.))

Идея энергосбережения понравилась. Тоже добавлю.

Ну и вопрос к тем, кто пытался гнуть алюминиевую трубку. С замороженной водой нормально гнется?
По малому радиусу?

stpavel
Offline
Зарегистрирован: 09.10.2018

Вот такой получился аккуратненький индикатор аккумулятора на дисплее 1602:

stpavel
Offline
Зарегистрирован: 09.10.2018

AlexMik пишет:
На неделе выложу следующую часть.

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

 

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

del

 

 

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

del

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

ура админам. почистили сразу по жалобе

stpavel
Offline
Зарегистрирован: 09.10.2018

ЕвгенийП пишет:

stpavel пишет:

Вот такой получился аккуратненький индикатор аккумулятора на дисплее 1602:

А почему яркость "дышит" в такт с анимацией батареи?


Потому что это разные снимки , объедененные в анимированный gif

stpavel
Offline
Зарегистрирован: 09.10.2018

ЕвгенийП пишет:

А я думал это зарядка анимированная показывается

Хорошая идея анимировать индикатор в процессе зарядки.. Только вот как определить что идет заряд батареи ? Измерять напряжение на батарее, и если оно растет, считать что идет заряд.  Другое пока в голову не приходит. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

как вы собираетесь заряжать батарейки(у)?

bms, xl4015 или еще как-то?

 

stpavel
Offline
Зарегистрирован: 09.10.2018

xDriver пишет:

как вы собираетесь заряжать батарейки(у)?

bms, xl4015 или еще как-то?

Я заказал пару вариантов и  еще не уверен на каком остановлюсь.

Первый вариант BMS 2s
https://ru.aliexpress.com/item/32997267433.html?spm=a2g0s.9042311.0.0.27... с питанием ардуины через Vin

Второй с повышающим модулем до 5 вольт  https://ru.aliexpress.com/item/32816254080.html?spm=a2g0s.9042311.0.0.99... и в дополнение платы защиты. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

себе я заказал такую, диодики там тоже есть.

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Не знаю , видели или нет, но может кому пригодится https://youtu.be/9J-PWWC9ZWI

AlexMik
Offline
Зарегистрирован: 15.09.2019

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

AlexMik
Offline
Зарегистрирован: 15.09.2019

stpavel пишет:
Вот такой получился аккуратненький индикатор аккумулятора на дисплее 1602:

Отличная идея!

Добавлю еще и индикатор работы от сети.

Ну и батарейку чуть по-другому нарисовал.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Не понял, ваши наливаторы - они что ахренин наливают?

С каких пор на приличном форуме гиверовские какашки рекламируются?

stpavel пишет:
GyverEncoder работает точно без проблем. 

При всём уважении, позволь усомниться в твоей квалификации тестировщика. Я смотрел более десятка гиверовских библиотек и беспроблемных среди них обнаружено не было. Ни одной. Часть результатов просмотра (вместе с "ответами" гивера) есть здесь на форуме.

Всё связанное с гивером - нах ... в смысле на специальный форум. Нехрен тут неокрепшим душам мозг выносить.

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

Привет всем! Я глядя на этот ажиотаж изготовления наливаторов, тоже не удержался и сконструировал сие чудо. В качестве перемещения фигуры использовал шаговый двигатель. https://www.youtube.com/watch?v=AXv9otG1ycM

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

ой как ик датчики тупяяяят....

stpavel
Offline
Зарегистрирован: 09.10.2018

Ворота пишет:

Не понял, ваши наливаторы - они что ахренин наливают?

С каких пор на приличном форуме гиверовские какашки рекламируются?

stpavel пишет:
GyverEncoder работает точно без проблем. 

При всём уважении, позволь усомниться в твоей квалификации тестировщика. Я смотрел более десятка гиверовских библиотек и беспроблемных среди них обнаружено не было. Ни одной. Часть результатов просмотра (вместе с "ответами" гивера) есть здесь на форуме.

Всё связанное с гивером - нах ... в смысле на специальный форум. Нехрен тут неокрепшим душам мозг выносить.

Еще один "великий", в стиле Logik'a   ...  Да что же вас сюда тянет как мух на ...

Вместо трепа предлагай свои варианты, квалифицированный ты наш. 

stpavel
Offline
Зарегистрирован: 09.10.2018

vuster пишет:

Привет всем! Я глядя на этот ажиотаж изготовления наливаторов, тоже не удержался и сконструировал сие чудо. В качестве перемещения фигуры использовал шаговый двигатель. https://www.youtube.com/watch?v=AXv9otG1ycM

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

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

Всем добрый вечер.А кто нибудь может переделать скетч с поста 1018 под олед дисплей ?

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

alania_07 пишет:

Всем добрый вечер.А кто нибудь может переделать скетч с поста 1018 под олед дисплей ?

Сами попробуйте, там в принципе ничего сложного нет. Возьмите скеч с ОЛЕД и по аналогии считывание энкодера замените.