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

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

Без релюшек вот, на мосфете... Заказать бы плату с распайкой деталей, конечно, а не как драйвер-борд для модулей...

Поди вышло бы и дешевле и компактнее... Но я не разобрался ещё как такой заказ правильно оформить...

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

SoftwareSerial ежели я правильно понимаю интернет, может работать строго на цифровых выходах ардуино нано, у Вас на аналоговых

 

PS.

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

Носмас
Offline
Зарегистрирован: 13.06.2020

Acket пишет:

Без релюшек вот, на мосфете... Заказать бы плату с распайкой деталей, конечно, а не как драйвер-борд для модулей...

Поди вышло бы и дешевле и компактнее... Но я не разобрался ещё как такой заказ правильно оформить...

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

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

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

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

Всё на этих выводах проверено - работает.

Да, размер можно ещё оптимизировать. тут модули смещены и крутить в принципе удобно. 

P.S. Модули ставлю на штырьки от разъёмов XH (male)

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

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

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

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

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

P.S. Еще раз огромное спасибо ребятам с форума, Павлу, Роману и Алексею))!

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

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

Это как рыбалка (не путать со спортивной рыбалкой или рыбалкой ради промысла). Тут важен сам процесс :)) ИМХО, конечно. Первый танк, так там плату вообще сделал любимым (вот уже с десяток лет) ЛУТом :)) Подарил.. Потом заказал у китайцев пяток, так все разошлись по друзьям. Пайка ради самого процесса пайки. Дома все уснут, а ты под 9-й район или Сектор газа что-нибудь паяешь. Хоть разъем от телефона, хоть жука ребенку в качестве игрушки... 

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

Просто так... Авось кому на тосты надо. Что-то вспомнилось... https://www.youtube.com/watch?v=T-b3fqxg1Fw и https://www.youtube.com/watch?v=keTWzU57dQ4 Эх... и это https://www.youtube.com/watch?v=qr5fK_nENoo а так же еще одна классика https://www.youtube.com/watch?v=kNs8VOO8Qpw

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

Gridzilla пишет:

Просто так... Авось кому на тосты надо. Что-то вспомнилось... https://www.youtube.com/watch?v=T-b3fqxg1Fw и https://www.youtube.com/watch?v=keTWzU57dQ4 Эх... и это https://www.youtube.com/watch?v=qr5fK_nENoo а так же еще одна классика https://www.youtube.com/watch?v=kNs8VOO8Qpw


За Леонова отдельное спасибо!))

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

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

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

Ну просто для меня это очень странная трата времени. Красиво и аккуратно можно и без платы. Просто знаю, как много времени может занять создание печатной платы, но если его много, то да, почему бы и нет. Во всяком случае всё уже сделано и все довольны)
А насчёт создания платы без модулей (точнее с распаянными компонентами модулей) и заказа у JLC со сборкой, если вдруг решитесь, то сначала посмотрите, есть ли у них все необходимые компоненты, так как припаяют они только то, что у них есть.

Носмас
Offline
Зарегистрирован: 13.06.2020

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

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

Gridzilla пишет:

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

Это как рыбалка (не путать со спортивной рыбалкой или рыбалкой ради промысла). Тут важен сам процесс :)) ИМХО, конечно. Первый танк, так там плату вообще сделал любимым (вот уже с десяток лет) ЛУТом :)) Подарил.. Потом заказал у китайцев пяток, так все разошлись по друзьям. Пайка ради самого процесса пайки. Дома все уснут, а ты под 9-й район или Сектор газа что-нибудь паяешь. Хоть разъем от телефона, хоть жука ребенку в качестве игрушки... 

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

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

Носмас
Offline
Зарегистрирован: 13.06.2020

[/quote]

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

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

[/quote]

тут наливаторы.

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

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

Acket пишет:

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

Согласен на все 100%, эстетика должна быть не только с наружи но и внутри. 

 

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

Носмас пишет:

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

уверяю  , jlcpcb.com (lcsc.com) , уважаемые конторы, и подобной ху.ней  заниматься не будут. А разъемы нужны что бы облегчить сборку компонентов наливатора в единой целое . Смутно представляю тянущие сопли проводов запаяные намертво. Это в первую очередь самому неудобно. 

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

raven78, посмотрел ваши скетчи, хотел глянуть какие библиотеки используете. Я думал Вы как-то делали скетч для шагового двигателя или я ошибаюсь? А эти скетчи с гитхаба на прошивке Гайвера основанны или Гайвер упростил Вашу прошивку? Просто очень много одинакового кода у вас. 

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

Не это я на основе Гайвера, утяжелил так сказать его прошивку))). Для шаговика не делал

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

Может ещё в плеер рандом добавить?

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

удалил

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

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


#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(0x3F, 16, 2); //Порт дисплея обычно 0x27 или 0x3F, подключение экрана А4-SDA-зеленый, А5-SCL-желтый

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[] = {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 = 5; //Максимальное кол-во рюмок - 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);//
  //устанавливаем 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()  {
  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(); // Включаем насос
      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 (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("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 &&  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("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 (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;

  }
}

Пробовал тут 

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;
Вставлять, но получается что когда поставишь, то постоянно играет. Чую что как-то с флагами (или нет?) но разобраться не могу. 
Пробовал вставлять 
var naStol = false;
 
if(naStol) {
mp3_play_file_in_folder(2, random (10)+1);
 
naStol = true;
Но, как и ожидал, блямкнет один раз и больше не делает ничего. 

 

Yakim
Offline
Зарегистрирован: 08.05.2020

Приветствую всех! Огромное спасибо ребятам создающим такие интересные и увлекательные вещи! Решил тоже повторить. Но так как в схемах не очень разбираюсь, подскажите мне что это за детали - На входе К1, перед повышайкой S1 и К2 возле диода D2. Заранее спасибо!

Yakim
Offline
Зарегистрирован: 08.05.2020

del

 

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

Yakim пишет:

 подскажите мне что это за детали - На входе К1, перед повышайкой S1 и К2 возле диода D2. Заранее спасибо!

Всё что К1 и К2 это два  реле на 5 вольт, с одной группой контактов каждое

S1 обычный выключатель, любой на вкус

Yakim
Offline
Зарегистрирован: 08.05.2020

Благодарю и еще раз спасибо за работу!

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

Acket пишет:

Может ещё в плеер рандом добавить?

Рандом в плеере, ограничение 100 песенок в папке. При переходе в меню плеера двойным нажатием выбираем пустое место в верхней строке дтисплея, указано галочкой(блин не придумал чего можно там вставить кромя R), крутим энкодером, выбираем R(рандом, параметр пишется в память), клик начинает воспроизведение рандомно треков

41 тест

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

Спасибо! попробую! 

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

Побурчу... Как-то раньше на форумах в начале нулевых шустрее и больше было помощи :) Сейчас же только за денежку. Эх. 

 

raven78 пишет:

(блин не придумал чего можно там вставить кромя R)

А так и напиши Random Play (RndPlay, Рандомайзер, Пьяный ДиДжей)

progrik
Offline
Зарегистрирован: 30.12.2018

ДедСергей пишет:
Побурчу... Как-то раньше на форумах в начале нулевых шустрее и больше было помощи :) Сейчас же только за денежку. Эх.
если чудо var (что за var?) naStol = false, то условие if(naStol) не выполнится никогда. и только после входа в "никогда" происходит бессмысленное, никогда не выполняющееся naStol = true, которое зациклило бы проигрывание, ибо "если правда -> сделать правду правдой"... подумать над двумя строчками не судьба...

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

короче, вот это запилить вверху скетча, где-то после объявления max_DrinkCount 

bool playOnTable[max_DrinkCount];       //progrik: запрет/разрешение проигрывания мелодии, когда ставим рюмку
memset(playOnTable, 0, max_DrinkCount); //progrik: ставим false для всех слотов

а это там, где и было, снизу

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));
      if(playOnTable[i]) //progrik: если разрешено проигрывание
      {
        mp3_play_file_in_folder(2, random (10)+1); //progrik: играем музло
        playOnTable[i] = false;                    //progrik: и сразу запрещаем играть повторно
      }
    }
    else
    {
      strip.setPixelColor(i, strip.Color(0, 0, 0));
      playOnTable[i] = true; //progrik: сняли рюмку - разрешаем играть музло
    }
    // delay(20);
  }
      strip.show();
      ledTime = currentTime;
}

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

можно каждому слоту сделать свою мелодию - вместо mp3_play_file_in_folder(2, random (10)+1); заюзать mp3_play_file_in_folder(2, i+1); i - номер слота (рюмки)... можно запретить проигрывание, пока не доскрипит играющее музло, или остановить проигрывание текущего и воспроизвести свежий трек... но тогда надо или опрашивать плеер или слать команды (без понятия, не работал с мп3плеерами...), или как-то по времени...

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

Носмас
Offline
Зарегистрирован: 13.06.2020

aleksey9791 пишет:

Я в прошлом году делал плату. На ней реализована программная модуляция ик диодов и нет мр3.
Если интересно, могу скинуть в личку. 


Если можно soroginoleg@rambler.ru

MaxPadonak
Offline
Зарегистрирован: 20.06.2020

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

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

Наконец-то появилось время (и здоровье :)) снова вернуться к любимой игрушке. Была залита прошивка 38, методом компарации адаптировался к 41, залил и начал проверять. В режиме мушкетёров, почему-то в момент, когда должен крутить туда-сюда краном со звуком рулетки, включает звук, мигает диодами, дёргает сервой, потом всё замолкает, тухнет и он сразу двигается к произвольной рюмке, наливает и произносит тост... Что такое, не пойму... Рандом плеера работает нормально

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

Я обновлял скетч с 41 версией, попробуйте по новой скачать.

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

progrik пишет:

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

Спасибо, Друг. Буду пробовать как с дачи приеду в выходные. Внуки облепили, с ними теперь застрял к своему удовольствию на даче, а ноутбук бабка моя отобрала :)))  И очередная возможность изучить новое.. Я про memset О_о

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

Да, перекачал, заработало

В плеере, где переключатель R. можно второй сделать L чтобы не пустое поле было

Random/Line

Носмас
Offline
Зарегистрирован: 13.06.2020

А как можно очистить ардуинку от поедыдущего скетча?

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

Прошить следующий скетч, а если нужно очистить eeprom(только не понятно зачем?), то в примерах к штатной библиотеке eeprom есть eeprom_clear, заливаете его и ждёте немного, пока не загорится светодиод на плате нано, который подключен к 13 пину.

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

progrik пишет:

короче, вот это запилить вверху скетча, где-то после объявления max_DrinkCount

Приветствую. Хоть и не мне, но попробовал скомпилировать. Ругается на строку 

memset(playOnTable, 0, max_DrinkCount); 
expected constructor, destructor, or type conversion before '(' token
 
Acket
Offline
Зарегистрирован: 23.07.2019

Не появлялось ли обновлённого варианта схемы? Мне кажется, что когда я без релюшек собирал, работало от УСБ стабильно, а на релюхах, как то проседает то там то тут... Может дело не в этом, а в чём-то ещё, но мне кажется, что это они виноваты... Так то вроде нарисовал на мосфете, как раньше собирал, но пока на плате сделал на релюхах - от шнурка по USB прям проседает питание...

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

Acket пишет:

Не появлялось ли обновлённого варианта схемы? Мне кажется, что когда я без релюшек собирал, работало от УСБ стабильно, а на релюхах, как то проседает то там то тут... Может дело не в этом, а в чём-то ещё, но мне кажется, что это они виноваты... Так то вроде нарисовал на мосфете, как раньше собирал, но пока на плате сделал на релюхах - от шнурка по USB прям проседает питание...

на USB тока маловато

progrik
Offline
Зарегистрирован: 30.12.2018

Gridzilla пишет:
Ругается на строку 

memset(playOnTable, 0, max_DrinkCount); 
expected constructor, destructor, or type conversion before '(' token
ай, ой, о, да)) строку с memset надо перенести куда нибудь в функцию setup - куда угодно...
возможно, это извращение и достаточно объявить bool playOnTable[max_DrinkCount] = {false}; и все элементы массива инициализируются в false, без memset, но мне лень проверять)

 

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

progrik пишет:

Gridzilla пишет:
Ругается на строку 

memset(playOnTable, 0, max_DrinkCount); 
expected constructor, destructor, or type conversion before '(' token
ай, ой, о, да)) строку с memset надо перенести куда нибудь в функцию setup - куда угодно...
возможно, это извращение и достаточно объявить bool playOnTable[max_DrinkCount] = {false}; и все элементы массива инициализируются в false, без memset, но мне лень проверять)

Если всю строку с memset закомментировать, то работает стабильно. Вроде бы...

 

progrik
Offline
Зарегистрирован: 30.12.2018

Gridzilla пишет:
Если всю строку с memset закомментировать, то работает стабильно. Вроде бы...

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

radionet
Offline
Зарегистрирован: 23.06.2020
 
Надеюсь автор не будет против. Выкладываю файлы корпуса наливатора для печати на 3D принтере. Файлы есть в свободном доступе в интернете (выкладывал сам автор). Я единственное, что сделал, разрезал большие детали, чтобы их можно было распечатать на большинстве принтеров, а потом склеить. И добавил еще одну трубку для наливания (трубка10_2.STL) Эта трубка рассчитана на 6x9 Китайский пищевой силиконовый шланг.
 
 
Носмас
Offline
Зарегистрирован: 13.06.2020

Сколько в рублях такой курпус?

radionet
Offline
Зарегистрирован: 23.06.2020

Дофига. Точно не скажу. Но автор пластик не экономил. Корпус слишком толстый. Ушло грамм 700 ( примерно). Почти катушка.

radionet
Offline
Зарегистрирован: 23.06.2020

PLA BestFilament катушка 1 кг. 1590 рублей + доставка 380 р.

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

Acket пишет:

Без релюшек вот, на мосфете... Заказать бы плату с распайкой деталей, конечно, а не как драйвер-борд для модулей...

Поди вышло бы и дешевле и компактнее... Но я не разобрался ещё как такой заказ правильно оформить...

Acket, файлом платы не поделишься? vuster75@mail.ru

vitali86899
Offline
Зарегистрирован: 23.05.2020

Может кому пригодится, уже стоят 15 минут и не вырубаются! Правда шли очень долго.
86,03 руб. | 10 шт. TTP223 кнопочный модуль конденсатора, одноканальный самоблокирующийся сенсорный выключатель, одноканальный переключатель трансформации
https://a.aliexpress.com/_eOiwHr