Доработка скетча

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

Привет всем. В топике про наливатор писал http://arduino.ru/forum/proekty/nalivator-avtomatizirovannaya-mashina-kotoraya-budet-razlivat-alkogol-po-stopkam?page=64#comment-555856 но в ответ тишина. Может тут кто поможет.

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

Режим, так сказать, мультиналива: в каждый стаканчик свой объем сока. Почему не возьму готовый с той темы? Много лишнего. Внуки еще малые. Им сам процесс интересен. 

Видел тут запрос ранее от одного человека. Так его с грязью смешали. Просьба по существу. Спасибо.

С уважением, Сергей. 

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

ДедСергей пишет:
продутым в горах Афганистана
Где именно? Привет из 28-го реап (а после ешё и из штаба армии)!

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

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

ДедСергей пишет:
продутым в горах Афганистана
Где именно? Привет из 28-го реап (а после ешё и из штаба армии)!

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

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

не ты один не нашёл, нас теперь минимум двое )))

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

Троя.

perfomaster
Offline
Зарегистрирован: 07.09.2020

perfomaster@mail.ru пишите-обсудим

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

DetSimen пишет:

Троя.

Четвира

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

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

#include <LCD_1602_RUS.h>
#include <Servo.h>
#include "Adafruit_NeoPixel.h"
//#include "GyverEncoder.h"
#include <EEPROM.h>
#include "DFRobotDFPlayerMini.h"
#include "SoftwareSerial.h"
#define RX_MP3_PIN 10 // подключаем к TX плеера (третий пин)
#define TX_MP3_PIN 11 // подключаем к RX плеера (второй пин)
SoftwareSerial mySoftwareSerial(RX_MP3_PIN, TX_MP3_PIN);
DFRobotDFPlayerMini myDFPlayer;

LCD_1602_RUS lcd(0x27, 16, 2); //Подключение экрана А4-SDA, А5-SCL, 0x27 или 0x3F

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

int j = 1; 
int files = 0; 
int files_tost = 0; 

// Переменные для энкодера -----------
const int pin_A = 2;      
const int pin_B = 3;      
const int pin_SW = 4;       
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
unsigned char encoder_sw_prew = 1;

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;

//Позиция каждой рюмки
const byte Rumka_pos[] = {30, 60, 90, 120, 150};   

byte  Menu = 0;  // Главное меню
byte  Nastr = 0; // Меню режимов
byte  Rezim = 0; // Меню настроек
byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в  Главном меню. 1 Вошли в меню Режимы и т.д.
byte  Drink = 10; // По умолчанию в рюмку наливаем  10 мл.

const byte  min_Drink = 5; // Минимум в рюмку - 5 мл.
const byte  max_Drink = 50; // Максимум в рюмку - 50 мл.

const unsigned int min_Drink_delay = 300;
const unsigned int max_Drink_delay = 5000;

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);

int16_t address = 0;      // Переменная для хранения адреса памяти
int16_t bright = 0;       // Яркость led, считается из памяти
int16_t servo_speed = 0;  // Скорость серво
int16_t vol_tost = 0;     // Громкость общая
int16_t vol_muz = 0;      // Громкость музыки

// Функции

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

void oled_nastr(byte Nastr) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F(" СОКОНАЛИВАТОР+ "));
  lcd.setCursor(0, 1);
  lcd.print(F(">"));
  lcd.setCursor(15, 1);
  lcd.print(F("<"));
  switch (Nastr) {
    case 0:
      lcd.setCursor(4, 1);
      lcd.print(F("ПРОМЫВКА"));
      break;
    case 1:
      lcd.setCursor(2, 1);
      lcd.print(F("ЯРКОСТЬ LEDS"));
      break;
    case 2:
      lcd.setCursor(1, 1);
      lcd.print(F("СКОРОСТЬ СЕРВО"));
      break;
    case 3:
      lcd.setCursor(1, 1);
      lcd.print(F("ОБЩ. ГРОМКОСТЬ"));
      break;
    case 4:
      lcd.setCursor(2, 1);
      lcd.print(F("ГРОМК. АУДИО"));
      break;
  }
}

void oled_rezim(byte Rezim) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F(" СОКОНАЛИВАТОР+ "));
  lcd.setCursor(0, 1);
  lcd.print(F(">"));
  lcd.setCursor(15, 1);
  lcd.print(F("<"));
  switch (Rezim) {
    case 0:
      lcd.setCursor(6, 1);
      lcd.print(F("АВТО"));
      break;
    case 1:
      lcd.setCursor(2, 1);
      lcd.print(F("РУЧНОЙ РЕЖИМ"));
      break;
    case 2:
      lcd.setCursor(0, 1);
      lcd.print(F("   МИНУС ОДИН   "));
      break;
    case 3:
      lcd.setCursor(5, 1);
      lcd.print(F("ГОРКИ"));
      break;
    case 4:
      lcd.setCursor(2, 1);
      lcd.print(F("  ОДИН ИЗ ПЯТИ  "));
      break;
  }
}

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

  lcd.setCursor(0, 1);
  if (Drink < 15) {
    lcd.print(F("    НЕ МАЛО?    "));
  } else if (Drink < 28) {
    lcd.print(F(" ПО ЧУТЬ - ЧУТЬ "));
  } else if (Drink < 38) {
    lcd.print(F("  В САМЫЙ  РАЗ  "));
  } else if (Drink < 48) {
    lcd.print(F("   ПО  ПОЛНОЙ  "));
  } else {
    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(9, 0);
  lcd.print(Drink);
  Serial.println(Drink);
  lcd.setCursor(12, 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(9, 0);
  lcd.print(Drink);
  lcd.setCursor(12, 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 podsvetka () {
  if (DrinkCount == 1) {
    strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку
  }  else if (DrinkCount == 2 ) {
    strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку
    strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку
  }  else if (DrinkCount == 3 ) {
    strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку
    strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку
    strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку
  }  else if (DrinkCount == 4 ) {
    strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку
    strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку
    strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку
    strip.setPixelColor(3, strip.Color(0, 0, 255)); // Подствечиваем синим 4-ю рюмку
  } else  {
    strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку
    strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку
    strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку
    strip.setPixelColor(3, strip.Color(0, 0, 255)); // Подствечиваем синим 4-ю рюмку
    strip.setPixelColor(4, strip.Color(0, 0, 255)); // Подствечиваем синим 5-ю рюмку
  }
  strip.show();
  delay(500);
} */

// Меню яркость
void oled_led(int bright) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ВЫБЕРИ ЯРКОСТЬ"));
  lcd.setCursor(0, 1);
  lcd.print(F("ЗНАЧЕНИЕ:"));
  lcd.setCursor(11, 1);
  lcd.print(bright);
}

// Меню серво
void oled_servo(int servo_speed) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ВЫБЕРИ СКОРОСТЬ"));
  lcd.setCursor(0, 1);
  lcd.print(F("ЗНАЧЕНИЕ:"));
  lcd.setCursor(11, 1);
  lcd.print(servo_speed);
}

// Меню громкости
void oled_voltost(int vol_tost) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ВЫБЕРИ ГРОМКОСТЬ"));
  lcd.setCursor(0, 1);
  lcd.print(F("ЗНАЧЕНИЕ:"));
  lcd.setCursor(11, 1);
  lcd.print(vol_tost);
}

// Меню громкости музыки
void oled_volmuz(int vol_muz) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ВЫБЕРИ ГРОМКОСТЬ"));
  lcd.setCursor(0, 1);
  lcd.print(F("ЗНАЧЕНИЕ:"));
  lcd.setCursor(11, 1);
  lcd.print(vol_muz);
}

// Меню Казино
void oled_cazino(int DrinkCount, int Drink) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("СТАВЬ СТАКАНЧИКИ"));
  lcd.setCursor(0, 1);
  lcd.print(F("  И НАЖМИ  <ОК> "));
}

// Меню Музыка
void oled_muzon(int DrinkCount, int Drink) {
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print(F("СЛУШАЕМ"));
  lcd.setCursor(4, 1);
  lcd.print(F("МУЗЫКУ!"));
}

// Меню налива
void oled_naliv(int MenuFlag, int Drink, int DrinkCount) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("  НАЛИВАЮ"));
  lcd.setCursor(10, 0);
  lcd.print(Drink);
  lcd.setCursor(13, 0);
  lcd.print(F("МЛ"));
  DrinkInfo(57);
}

// Меню налито
void oled_nalito2(int MenuFlag, int Nalito, int Drink) {
  Serial.println(F("NALITO"));
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("  HАЛИТО"));
  lcd.setCursor(9, 0);
  lcd.print(Drink);
  Serial.println(Drink);
  lcd.setCursor(12    , 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() {
  randomSeed(analogRead(7));
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print(F("ЗАБЕРИ СТАКАНЧИК"));
  delay (2000);
  myDFPlayer.volume(vol_tost); //Громкость
  delay (100);
  myDFPlayer.playFolder (2, random (files_tost + 1));  //воспроизводить определенный mp3 в папке 02
}


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 (long firstPixelHue = 0; firstPixelHue < 5 * 65536; firstPixelHue += 768) {
    for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip...
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show();
    delay(10);
  }
}


void setup()  {
  randomSeed(analogRead(7));//инициализация функции рандом по пину А7 для исключения повторения последовательности значений при включении

  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("Unable to begin:");
    Serial.println("1.Please recheck the connection!");
    Serial.println("2.Please insert the SD card!");
    while (true);
  }
  myDFPlayer.setTimeOut(300);
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  files = myDFPlayer.readFileCountsInFolder(3); // Считаем сколько треков в папке с музыкой 03
  files_tost = myDFPlayer.readFileCountsInFolder(2); // Считаем сколько треков в папке с тостами 02

  address = 30;
  EEPROM.get(address, bright);
  if ( bright < 0 || bright > 255) {
    bright = 100;
  }

  address = 20;  //ячейка памяти
  EEPROM.get(address, servo_speed); // считываем из памяти скорость серво
  if ( servo_speed < 5 || servo_speed > 30) {
    servo_speed = 10;
  }

  address = 40;  //ячейка памяти
  EEPROM.get(address, vol_tost); // считываем из памяти громкость
  if ( vol_tost < 2 || vol_tost > 30) {
    vol_tost = 10;
  }

  address = 50;  //ячейка памяти
  EEPROM.get(address, vol_muz); // считываем из памяти громкость музыки
  if ( vol_muz < 2 || vol_muz > 30) {
    vol_muz = 10;
  }

  myDFPlayer.volume(vol_tost); //Громкость
  delay (100);
  myDFPlayer.playFolder(1, 1); //Воспроизведение первого mp3

  lcd.init();// инициализация дисплея
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("     НУ ЧТО     "));
  lcd.setCursor(0, 1);
  lcd.print(F("НА-ЧАА-ЛИИ-ИИИИИ"));
  delay (2000);

  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;



  strip.begin();
  strip.setBrightness(bright);
  CvetoMuzik();

  oled_menu(0);
  for (int i = 0; i < 5; i++) {
    pinMode(Optics[i], INPUT);
  }
  ServoParking();
}

void loop()  {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) {  // проверяем каждые 5мс
    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) {
          (Rezim <= 0 ) ? Rezim = 4 : Rezim--;
          oled_rezim(Rezim);
        } else if (MenuFlag == 2) {
          (Nastr <= 0 ) ? Nastr = 4 : Nastr--;
          oled_nastr(Nastr);
        } else if (MenuFlag == 4) {
          (Drink <= min_Drink ) ? Drink = max_Drink : Drink -= 5;
          oled_auto(Drink);
        } else if (MenuFlag == 5) {
          (DrinkCount >= max_DrinkCount ) ? DrinkCount = 1 : DrinkCount++;
          oled_manual(DrinkCount, Drink);
          //podsvetka();
        } else if (MenuFlag == 9) {
          bright -= 5;
          bright = constrain(bright, 0, 254);
          oled_led(bright);
          strip.setBrightness(bright);
          strip.show();
          delay (100);
        } else if (MenuFlag == 10) {
          servo_speed -= 5;
          servo_speed = constrain(servo_speed, 5, 30);
          oled_servo(servo_speed);
          delay (100);

        } else if (MenuFlag == 11) {
          vol_tost -= 2;
          vol_tost = constrain(vol_tost, 2, 30);
          oled_voltost(vol_tost);
          delay (100);
        } else if (MenuFlag == 12) {
          vol_muz -= 2;
          vol_muz = constrain(vol_muz, 2, 30);
          oled_volmuz(vol_muz);
          delay (100);

        } else if (MenuFlag == 3) {
          j++;
          if (j > files)
            j = 1;
          myDFPlayer.playFolder (3, j);
          oled_muzon(DrinkCount, Drink);
        }

        //Вращение вправо
      } else {
        if (MenuFlag == 0) {
          (Menu >= 2 ) ? Menu = 0 : Menu++;
          oled_menu(Menu);
        } else if (MenuFlag == 1) {
          (Rezim >= 4 ) ? Rezim = 0 : Rezim++; //
          oled_rezim(Rezim);
        } else if (MenuFlag == 2) {
          (Nastr >= 4 ) ? Nastr = 0 : Nastr++; //
          oled_nastr(Nastr);
        } else if (MenuFlag == 4) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink += 5;// Увеличиваем кол-во милилитров в рюмку
          oled_auto(Drink);
        } else if (MenuFlag == 5) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink += 5;
          oled_manual(DrinkCount, Drink);
        } else if (MenuFlag == 9) {
          bright += 5;
          bright = constrain(bright, 0, 254);
          oled_led(bright);
          strip.setBrightness(bright);
          strip.show();
          delay (100);
        } else if (MenuFlag == 10) {
          servo_speed += 5;
          servo_speed = constrain(servo_speed, 5, 30);
          oled_servo(servo_speed);
          delay (100);

        } else if (MenuFlag == 11) {
          vol_tost += 2;
          vol_tost = constrain(vol_tost, 2, 30);
          oled_voltost(vol_tost);
          delay (100);
        } else if (MenuFlag == 12) {
          vol_muz += 2;
          vol_muz = constrain(vol_muz, 2, 30);
          oled_volmuz(vol_muz);
          delay (100);

        } else if (MenuFlag == 3) {
          j++;
          if (j > files)
            j = 1;
          myDFPlayer.playFolder (3, j);
          oled_muzon(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 && Nastr != 0 ) break;
        if (pause_sw > 20 && MenuFlag == 2 && Nastr == 0 && promivka == false) {
          promivka = true;
          pump_enable(); // Включаем насос
          delay (100);
          myDFPlayer.volume(vol_tost);
          delay (100);
          myDFPlayer.playFolder (1, 100);
          delay (100);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(F("П Р О М Ы В К А"));
          lcd.setCursor(2, 1);
          lcd.print("<><><><><><>");
        }
      }
      //После отпускания кнопки, обрабатываем
      if (promivka == true) { //Отпустили кнопку.
        promivka = false;
        pump_disable() ; //Выключаем насос
        oled_nastr(0);
      } else {

        //Обработка всех нажатий кнопки
        if (Menu == 0 && MenuFlag == 0 &&  pause_sw < 10) {
          MenuFlag = 1;
          oled_rezim(Rezim);
        } else if (Rezim == 0 && MenuFlag == 1 && pause_sw < 10) {
          MenuFlag = 4;
          oled_auto(Drink);
        } else if (MenuFlag == 4 && pause_sw > 20) {
          MenuFlag = 1;
          oled_rezim(0);
        } else if (MenuFlag == 1 && pause_sw > 20) {
          MenuFlag = 0;
          oled_menu(0);
        }

        //Начинается автоматический разлив
        else if (MenuFlag == 4 ) {
          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);
              delay (300);
              pump_timer(Drink); // Налив.
              delay(1000);
              strip.setPixelColor(y, strip.Color(0, 255, 0));
              strip.show();
              drink_count++;
              delay(1000);
            }
          }
          if (drink_count > 0) {
            oled_nalito(MenuFlag, drink_count, Drink );
            delay(2000);
            ServoParking();
            Tost();
            CvetoMuzik();
            oled_auto(Drink);
          } else {
            lcd.clear();
            lcd.setCursor(0, 1);
            lcd.print(F("НЕТ СТАКАНЧИКОВ!"));
            myDFPlayer.volume(vol_tost);
            delay (100);
            myDFPlayer.playFolder (1, 88);
            delay(2000);
            oled_auto(Drink);
          }
          // Нажатие меню ручное
        } else if (Rezim == 1 && MenuFlag == 1 && pause_sw < 10) {
          MenuFlag = 5;
          oled_manual(DrinkCount, Drink);
        } else if (MenuFlag == 5 && pause_sw > 20) {
          MenuFlag = 1;
          oled_rezim(1);
        }

        //Начинается ручной разлив
        else if (MenuFlag == 5 ) {
          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);
            delay (300);
            pump_timer(Drink); // Налив.
            delay(1000);
            strip.setPixelColor(y, strip.Color(0, 255, 0));
            strip.show();
            delay(1000);
          }
          oled_nalito(MenuFlag, DrinkCount, Drink );
          delay(2000);
          ServoParking();
          Tost();
          CvetoMuzik();
          oled_manual(DrinkCount, Drink);
        }

        //нажатие меню яркости
        else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) {
          MenuFlag = 2;
          oled_nastr(Nastr);
        } else if (Nastr == 1 && MenuFlag == 2 && pause_sw < 10) {
          MenuFlag = 9;
          oled_led(bright);
        } else if (MenuFlag == 9 && pause_sw > 20) {
          MenuFlag = 2;
          oled_nastr(1);
          address = 30;
          EEPROM.put(address, bright);
        } else if (MenuFlag == 2 && pause_sw > 20) {
          MenuFlag = 0;
          oled_menu(1);

        } else if (MenuFlag == 9 ) {
          CvetoMuzik();
        }

        // нажатие меню скорости серво
        else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) {
          MenuFlag = 2;
          oled_nastr(Nastr);
        } else if (Nastr == 2 && MenuFlag == 2 && pause_sw < 10) {
          MenuFlag = 10;
          oled_servo(servo_speed);
        } else if (MenuFlag == 10 && pause_sw > 20) {
          MenuFlag = 2;
          oled_nastr(2);
          address = 20;
          EEPROM.put(address, servo_speed);
        } else if (MenuFlag == 10) {

          // после нажатия энкодера запускаем серву для проверки скорости
          servo.attach(PIN_SERVO);
          for (int pos = servo.read(); pos <= 180; pos += 1) {
            servo.write(pos);
            delay(servo_speed);
          }
          for (int pos = servo.read();  pos >= 0; pos -= 1) {

            servo.write(pos);
            delay(servo_speed);
          }
        }

        // нажатие меню громкости
        else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) { 
          MenuFlag = 2;
          oled_nastr(Nastr);
        } else if (Nastr == 3 && MenuFlag == 2 && pause_sw < 10) { 
          MenuFlag = 11;
          oled_voltost(vol_tost); 
        } else if (MenuFlag == 11 && pause_sw > 20) { 
          MenuFlag = 2;
          oled_nastr(3);
          address = 40;
          EEPROM.put(address, vol_tost); 
        } else if (MenuFlag == 11) {
          
          myDFPlayer.volume(vol_tost); 
          delay (100);
          myDFPlayer.playFolder(1, 1); 
        }


        // нажатие меню громкости музыки
        else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) { 
          MenuFlag = 2;
          oled_nastr(Nastr);
        } else if (Nastr == 4 && MenuFlag == 2 && pause_sw < 10) { 
          MenuFlag = 12;
          oled_volmuz(vol_muz); 
        } else if (MenuFlag == 12 && pause_sw > 20) { 
          MenuFlag = 2;
          oled_nastr(4);
          address = 50;
          EEPROM.put(address, vol_muz); 
        } else if (MenuFlag == 12) { 

          // после нажатия энкодера запускаем музыку
          myDFPlayer.volume(vol_muz); 
          delay (100);
          myDFPlayer.playFolder(1, 1); 
        }

        // Нажатие меню СИНИЙ БАРМЕН наливатет в рюмки случайный объем
        else if (Rezim == 3 && MenuFlag == 1 && pause_sw < 10) { 
          MenuFlag = 7;
          oled_cazino(DrinkCount, Drink);
        } else if (MenuFlag == 7 && pause_sw > 20) { 
          MenuFlag = 1;
          oled_rezim(3);
        } else if (MenuFlag == 7 ) { //Начинается рулетка
          myDFPlayer.volume(vol_tost); //Громкость
          delay (100);
          myDFPlayer.playFolder (1, 105); // Мелоди рулетки
          delay (1000);
          CvetoMuzik();
          delay (2000);
          for (int y = 0; y <= 4; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
            strip.show();
            ServoNaliv(y); 
            delay (300); 
            pump_timer(random(min_Drink, max_Drink)); // Налив
            delay(1000);
            strip.setPixelColor(y, strip.Color(0, 255, 0)); 
            strip.show();
          }
          ServoParking();
          myDFPlayer.playFolder (1, 102);
          delay (400);
          CvetoMuzik();
          Tost();
          oled_cazino(DrinkCount, Drink);
        }


        // Нажатие меню музыка
        else if (Menu == 2 && MenuFlag == 0 &&  pause_sw < 10) { // Вошли в музыку
          MenuFlag = 3;
          myDFPlayer.volume(vol_muz); 
          delay (100);
          myDFPlayer.loopFolder(3); 
          oled_muzon(DrinkCount, Drink);
        } else if (MenuFlag == 3 && pause_sw > 20) { 
          MenuFlag = 0;
          oled_menu(2);
        } else if (MenuFlag == 3 && pause_sw < 10) { 
          myDFPlayer.pause(); 
          MenuFlag = 0;
          oled_menu(2);
        }


        // Нажатие меню КАЗИНО наливает только в одну рюмку случайно
        else if (Rezim == 4 && MenuFlag == 1 && pause_sw < 10) { 
          MenuFlag = 8;
          oled_cazino(DrinkCount, Drink);
        } else if (MenuFlag == 8 && pause_sw > 20) { 
          MenuFlag = 1;
          oled_rezim(4);
        } else if (MenuFlag == 8 ) { 

          randomSeed(analogRead(7));
          myDFPlayer.volume(vol_tost); 
          delay (100);
          myDFPlayer.playFolder (1, 105); 
          delay (1000);
          CvetoMuzik();
          delay (2000);
          for (int y = 0; y <= 4; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); 
            strip.show();
          }
          servo.attach(PIN_SERVO);// имитация рулетки сервой
          for (int pos = servo.read(); pos <= 180; pos += 1) {
            // с шагом в 1 градус
            servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
            delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
          }
          for (int pos = servo.read();  pos >= 0; pos -= 1) {
            // с шагом в 1 градус
            servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
            delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
          }
          int r = random(0, 5);//выбор одной рюмки в которую нальёт
          ServoNaliv(r); // Перемещяемся к рюмке
          strip.setPixelColor(r, strip.Color(0, 255, 0)); // Подствечиваем зеленым, налито, остальные красные
          delay(1000);
          strip.show();
          pump_timer(Drink); // Налив
          servo.detach();
          ServoParking();
          myDFPlayer.volume(vol_tost); //Громкость
          delay (100);
          myDFPlayer.playFolder (1, 102); // Фанфары
          delay (400);
          CvetoMuzik();
          Tost();
          oled_cazino(DrinkCount, Drink);
        }

        // Нажатие меню НАША РУЛЕТКА, не наливаем в одну рюмку случайно
        else if (Rezim == 2 && MenuFlag == 1 && pause_sw < 10) { 
          MenuFlag = 6;
          oled_cazino(DrinkCount, Drink);
        } else if (MenuFlag == 6 && pause_sw > 20) { 
          MenuFlag = 1;
          oled_rezim(2);
        } else if (MenuFlag == 6 ) {  

          randomSeed(analogRead(7));
          myDFPlayer.volume(vol_tost); //Громкость
          delay (100);
          myDFPlayer.playFolder (1, 105); //Мелодия рулетки
          delay (1000);
          CvetoMuzik();
          delay (2000);
          for (int y = 0; y <= 4; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); 
            strip.show();
          }
          servo.attach(PIN_SERVO);// имитация рулетки сервой
          for (int pos = servo.read(); pos <= 180; pos += 1) {
            // с шагом в 1 градус
            servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
            delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
          }
          for (int pos = servo.read();  pos >= 0; pos -= 1) {
            // с шагом в 1 градус
            servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
            delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
          }
          int r = random(0, 5);//выбор одной рюмки в которую НЕ нальёт
          for (int y = 0; y < 5; y++) {
            if (y != r) {
              strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
              strip.show();
              ServoNaliv(y); // Перемещяемся к рюмке
              delay (300); //Задержка перед налитием после поворота к рюмке
              pump_timer(Drink); // Налив.
              delay(1000);
              strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
              strip.show();
              delay(500);
            }
            else {
              (y = r);
            }
          }
          servo.detach();
          ServoParking();
          myDFPlayer.volume(vol_tost); //Громкость
          delay (100);
          myDFPlayer.playFolder (1, 102); //Фанфары
          delay (400);
          CvetoMuzik();
          Tost();
          oled_cazino(DrinkCount, Drink);
        }
      }
    }

    // Работа оптодатчиков
    if (currentTime >= (ledTime + 300)) {
            for (int i = 0; i < max_DrinkCount; i++) {
        int val = analogRead(Optics[i]);            
        if (val > Optics_porog[i]) {
          strip.setPixelColor(i, strip.Color(0, 0, 255));
        } else {
          strip.setPixelColor(i, strip.Color(0, 0, 0));
        }
      }
      strip.show();
      ledTime = currentTime;
    }
    encoder_sw_prew = encoder_sw;
    loopTime = currentTime;
  }
}

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

Ворота 103-я гвардейская ВДД. Ушел с ранением в две ноги. После в органах. Да и до сих пор числюсь на балансе организации :)))

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

Да, 103-я там от звонка до звонка чалилась, входили одними из первых (один Шигал сколько значил для всех остальных), а при выходе прикрывали выходящих и ушли последними - знаем мы такое соединение. 

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