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

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

Zeerz85 пишет:
Дисплей 1602а

OLED 0.96 I2C - 0x3C
LCD 1602 I2C - обычно 0x27 или 0x3F

OLED 1.3  I2C - 0x3D (с библиотекой OLED_I2C.h не работает, думаю пока)

Сфоткай платку конвертера.

Zeerz85
Offline
Зарегистрирован: 24.09.2019

А как сюда выложить фотку

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

Выложить скетч тут http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

"Про картинку, давите на линку "Форум" в верху. Справа под ником увидите "Мой Профиль". Заходите туда. Там есть File Browser. Там разберётесь как выложить картинку на сервер. Потом в сообщении давите "Вставить картинку" и "Выбрать на сервере"."

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Zeerz85
Offline
Зарегистрирован: 24.09.2019
<strong></strong>
#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;

// Переменные для энкодера -----------
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;

  }
}

 

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

У меня похожая черная 0x3F (перемычки на плате не  впаяны), смотри пайку и правильность подключения.

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

Что непонятно?

Коллеги! Сворачивайте код!

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Может перемычку впаять

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

Zeerz85 пишет:

Может перемычку впаять

 Какую перемычку? Куда впаять?

 в скетче меняешь 0х27 на 0x3F

А это просто почитать: http://robotchip.ru/obzor-interfeysnogo-modulya-i2c/

Rigikov
Offline
Зарегистрирован: 29.10.2018

Не могу переделать под дисплей sh1106 i2c 1.3дюйма. Не умею

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

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

static const char *TostList[] = {
	"Tost 1",
	"Tost 2",
	"Tost 3",
	"Tost 4",
	"Tost 5",
	"Tost 6",
	"Tost 7",
	"Tost 8",
	"Tost 9",
	"Tost 10",
	"Tost 11",
	"Tost 12",
	"Tost 13",
	"Tost 14",
	"Tost 15",
	"Tost 16",
	"Tost 17",
	"Tost 18",
	"Tost 19",
	"Tost 20"
};

static const uint8_t TostListSize = sizeof(TostList) / sizeof(TostList[0]);


class TTost {
protected:
	uint8_t count;
	uint8_t UsedTosts[TostListSize];

	void Clear(void) {
		count = TostListSize;
		for (uint8_t i = 0; i < count; i++)  UsedTosts[i] = i;
	}

	void HideTost(const uint8_t ATostNum) {
		for (int8_t i = ATostNum; i < count - 1; i++) UsedTosts[i] = UsedTosts[i + 1];
		count--;
	}

public:


	TTost() {
		Clear();
	};


	const char *getNext() {
		if (count == 0) Clear();
		uint8_t idx = random(count);
		const char *result = TostList[UsedTosts[idx]];
		HideTost(idx);
		return result;
	}

};


TTost Tost;

использование:  например, Serial.println(Tost.getNext());

ну или вывести еще куда, выкранчик, например.

только надо вверху массив реальными тостами заполнить, хоть 50 штук можно. 

можно даже всё это в PROGMEM скласть, да не наливает никто чота. 

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

DetSimen, здесь без коментов не разберешь, многа незнакомых букаф,

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

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

Rigikov пишет:
Не могу переделать под дисплей sh1106 i2c 1.3дюйма. Не умею

Перестаньте "плакаться в жилетку", ибо вариантов решения вашей проблемы много:
-купить  и использовать  дисплеи проверенные в этой теме;
-погуглить, скачать нужную библиотеку, установить, сравнить как формируется вывод информации и переписать скетч под свой дисплей.
-заказать кому нибудь за вознаграждение, для этого здесь есть подфорум http://arduino.ru/forumy/ishchu-ispolnitelya
-дальше не перечисляю, ибо...

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

Forthomo пишет:

DetSimen, здесь без коментов не разберешь, многа незнакомых букаф,

После пятой как раз и придёт понимание. 

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

Тут же даже думать не надо, когда пришло время следущего тоста, вызывай Tost.getNext() да пей. 

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

Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли  чистый С++ ардуина?

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

Forthomo пишет:

Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли  чистый С++ ардуина?

1. Вставить в начало скечча.  Вызывать Tost.getNext() там, где требуеца очередной тост.  

2. Проглотит

 

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

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

DetSimen пишет:

Forthomo пишет:

Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли  чистый С++ ардуина?

1. Вставить в начало скечча.  Вызывать Tost.getNext() там, где требуеца очередной тост.  

2. Проглотит

 

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

Красивое решение. Спасибо.
 

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

DetSimen пишет:

 Мы с котом, пока шары не залили, можем глянуть чотамкак

Животину жалко.. Сопьется же .

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

DetSimen пишет:

можно даже всё это в PROGMEM скласть, да не наливает никто чота. 

Не можно а нужно ) Ради такого налить не жалко.

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

сложнее будет тосты набивать

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

stpavel пишет:

DetSimen пишет:

 Мы с котом, пока шары не залили, можем глянуть чотамкак

Животину жалко.. Сопьется же .

Мы с ним давно синяки оба. 

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

DetSimen пишет:

сложнее будет тосты набивать

Тут не только тосты нужны. Нужен какой-то массив , что бы с тостом еще было имя файла , который будет проигрываться через MP3 модуль. И желательно конечно все это в progmem.

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

DetSimen пишет:

Forthomo пишет:

Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли  чистый С++ ардуина?

1. Вставить в начало скечча.  Вызывать Tost.getNext() там, где требуеца очередной тост.  

2. Проглотит

 

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

Скетч не мой, Павел писал, я так, ЛСД1602 прикрутил и МП3. скетч за 2 дня уже 4-е раза выложили в этой теме сообщение 456 сегодня.

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

Посмотрелъ. Это не для вечерних мозгов, это завтра.

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

DetSimen пишет:

Посмотрелъ. Это не для вечерних мозгов, это завтра.

Затра Пъятница, до понедельника :)

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

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

Я на пособии, у меня каждый день - и пятница и воскресенье. :-)

ПыСы. Вернее, каждый день утром суббота, днем воскресенье, ну а вечером - ПЯТНИЦЦА!!!

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

Доброго дня!

Прошу не пинать ) Подскажите пожалуйста по поводу расположения светодиодов и приемников.

Т.е. надо расположить разрезанные диоды ленты и приемники?

Как располагать, что учесть и т.д.?

Заранее огромное спасибо!

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

AlexMik пишет:

Доброго дня!

Прошу не пинать ) Подскажите пожалуйста по поводу расположения светодиодов и приемников.

Т.е. надо расположить разрезанные диоды ленты и приемники?

Как располагать, что учесть и т.д.?

Заранее огромное спасибо!

Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.

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

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

При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7. 

Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше.  Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.

 

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

Forthomo пишет:

Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.

Перелопатил ветку не раз)
Но на всякий случай уточнил по-поводу разрезания ленты. Никогда не резал.
408 сообщение сбило с толку круглыми отверстиями под ИК-приемник.
В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него?

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

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

AlexMik пишет:
Forthomo пишет:

Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.

Перелопатил ветку не раз) Но на всякий случай уточнил по-поводу разрезания ленты. Никогда не резал. 408 сообщение сбило с толку круглыми отверстиями под ИК-приемник. В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него? Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))

Ленту резать, там все размечено уже где резать. Главное соблюдать входы и выходы. 

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

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

xDriver пишет:


тока либ у меня нет, я не проверял.

проверяю этот скетч,пока не работает. при включении говорит и пишет *ну начали* после разлива тишина и пустой дисплей.

 

заработало! скетч выложу позже после полного исправления

koka7777745
Offline
Зарегистрирован: 29.05.2017

Вот такой корпус получился у меня.

Фишер64
Offline
Зарегистрирован: 12.08.2019

koka7777745 пишет:

Вот такой корпус получился у меня.

Можно файлы печати посмотреть? Стол очень интересный получился, 

Сам медленно пытаюсь сделать это

Фишер64
Offline
Зарегистрирован: 12.08.2019

Исходник

Фишер64
Offline
Зарегистрирован: 12.08.2019

Хочу прийти по цвету к тому , что каждый день вижу 

Фишер64
Offline
Зарегистрирован: 12.08.2019

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

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

не плоди сущностей, просто запараллель 2 светодиода. 

Фишер64
Offline
Зарегистрирован: 12.08.2019

Понял, спасибо.

koka7777745
Offline
Зарегистрирован: 29.05.2017
Фишер64
Offline
Зарегистрирован: 12.08.2019

Спасибо , посмотрел..стол понравился попробую в свои 210х210 разместить с уменьшением..

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

AlexMik пишет:
408 сообщение сбило с толку круглыми отверстиями под ИК-приемник. В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него? Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))

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

TCRT5000 - 3,8мм по центрам , 2,5 мм диаметр элементов  и получается отверстие 6,3 мм.

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

stpavel пишет:

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

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

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

Forthomo пишет:

собираюсь переделать, девайс с ЛСД

и я хочу девайс с ЛСД, зима быстрее прайдёть. 

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

stpavel пишет:

При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7. 

Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше.  Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.

 

Акумы на какой ток? Сколько насос кушает? Попробуй последовательно соединить 18650 и  бустеры 5,4 и 12в паралельно.

koka7777745
Offline
Зарегистрирован: 29.05.2017

Фишер64 пишет:

Спасибо , посмотрел..стол понравился попробую в свои 210х210 разместить с уменьшением..

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

Фишер64
Offline
Зарегистрирован: 12.08.2019

Понятно, мне они то же не нужны, уберу. Энкодер втискиваю на самый верх, цвет стола подбираю под море.

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

Добавил в папку файл lay6,может кому пригодиться.

https://yadi.sk/d/iSC-hQ6K3KCJCg

filon543
Offline
Зарегистрирован: 17.06.2019

Подскажите пожалуйста новичку, в чем может быть дело? При попытке компиляции скетча ArduinoIDE1.8.9 выдает: ошибка для данной платы???? Я пробовал и для UNO,NANO,PROMINI,......пофигу???

Спасибо!

filon543
Offline
Зарегистрирован: 17.06.2019