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

aleksey9791
Offline
Зарегистрирован: 23.12.2019

AlVirtu пишет:

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))

Но перестает работать защита аккумулятора.


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

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

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))


Ничего замыкать не надо. Достаточно подключить акк на out- , будет работать как тпшка без защиты ( за плдсказку спасибо Алексею , Forthomo )

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

aleksey9791 пишет:
AlVirtu пишет:

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))

Но перестает работать защита аккумулятора.


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

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

AlVirtu
Offline
Зарегистрирован: 15.11.2019

aleksey9791 пишет:
AlVirtu пишет:

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))

Но перестает работать защита аккумулятора.

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

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

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

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

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

aleksey9791
Offline
Зарегистрирован: 23.12.2019

AlVirtu пишет:

aleksey9791 пишет:
AlVirtu пишет:

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))

Но перестает работать защита аккумулятора.

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

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


Вывод один - надо думать.
Но на мой взгляд, мигающее предупреждение во весь дисплей срабатывающее при напряжении 3,2 намного эффективнее защиты при 2,5. Из опыта эксплуатации LiPo, даже однократный разряд до напряжения менее трёх вольт приводит к заметному уменьшению ёмкости.

aleksey9791
Offline
Зарегистрирован: 23.12.2019

AlVirtu пишет:

aleksey9791 пишет:
AlVirtu пишет:

aleksey9791 пишет:

Если на ТР4056 замкнуть минус аккумулятора и минус на выходе, не будет отключаться при кратковременной перегрузке. Тоже своего рода повышение стабильности)))

Но перестает работать защита аккумулятора.

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

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


Вывод один - надо думать.
Но на мой взгляд, мигающее предупреждение во весь дисплей срабатывающее при напряжении 3,2 намного эффективнее защиты при 2,5. Из опыта эксплуатации LiPo, даже однократный разряд до напряжения менее трёх вольт приводит к заметному уменьшению ёмкости.

AlVirtu
Offline
Зарегистрирован: 15.11.2019

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

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

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

aleksey9791
Offline
Зарегистрирован: 23.12.2019

AlVirtu пишет:

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

При соединении минуса ТР4056 и минуса аккумулятора перестает работать защита от перегрузки по току и от глубокого разряда. Заряжается корректно, примерно до 4,2.

AlVirtu
Offline
Зарегистрирован: 15.11.2019

aleksey9791 пишет:

AlVirtu пишет:

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

При соединении минуса ТР4056 и минуса аккумулятора перестает работать защита от перегрузки по току и от глубокого разряда. Заряжается корректно, примерно до 4,2.

Так достаточно поставить ТР4056 без BMS и на этом закрыть вопрос. )) И дешевле будет.

aleksey9791
Offline
Зарегистрирован: 23.12.2019

VICLER пишет:
А если поставить кнопку без фиксации, которая будет питать контроллер, который в свою очередь после инициализации откроет мосфет для питания всей системы. А когда аккумулятор подсядет, просто закрыть мосфет. Для выключения правда нужна отдельная кнопка ну или по таймеру.

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

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

aleksey9791 пишет:

AlVirtu пишет:

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

При соединении минуса ТР4056 и минуса аккумулятора перестает работать защита от перегрузки по току и от глубокого разряда. Заряжается корректно, примерно до 4,2.

повторюсь. Посмотрите схему тп4056 с защитой и без.

ничего соеденять не надо , достоточно подключить акк к минусу тпшки

AlVirtu
Offline
Зарегистрирован: 15.11.2019

stpavel пишет:

aleksey9791 пишет:

AlVirtu пишет:

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

При соединении минуса ТР4056 и минуса аккумулятора перестает работать защита от перегрузки по току и от глубокого разряда. Заряжается корректно, примерно до 4,2.

повторюсь. Посмотрите схему тп4056 с защитой и без.

ничего соеденять не надо , достоточно подключить акк к минусу тпшки

И я повторюсь.

Так достаточно поставить ТР4056 без BMS и на этом закрыть вопрос. )) И дешевле будет.

)))))))))))

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

AlVirtu пишет:

stpavel пишет:

aleksey9791 пишет:

AlVirtu пишет:

stpavel пишет:

Есть только одна проблема, у TP4056 c защитой - защита от разряда никакая. Отключение при 2.5 вольт на акке, думаю при таком напряжении он будет уже труп. 

 

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

При соединении минуса ТР4056 и минуса аккумулятора перестает работать защита от перегрузки по току и от глубокого разряда. Заряжается корректно, примерно до 4,2.

повторюсь. Посмотрите схему тп4056 с защитой и без.

ничего соеденять не надо , достоточно подключить акк к минусу тпшки

И я повторюсь.

Так достаточно поставить ТР4056 без BMS и на этом закрыть вопрос. )) И дешевле будет.

)))))))))))

Согласен. 

Но защита всетаки нужна )

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

aleksey9791 пишет:

VICLER пишет:
А если поставить кнопку без фиксации, которая будет питать контроллер, который в свою очередь после инициализации откроет мосфет для питания всей системы. А когда аккумулятор подсядет, просто закрыть мосфет. Для выключения правда нужна отдельная кнопка ну или по таймеру.

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

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

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

Для этого проекта BMS на плате ТР4056 только помеха, используйте внешние на 2,5-3А . Экспериментально было установлено что при снижении напряжения  на акуме до 3,4В при токе 1А бустер на МТ  срывается -  на выходе напряжение как на входе и схема уходит в циклическую перезагрузку, у  SX порог - 3,2В.Глубокого разряда не произойдет. А перезаряд ограничит ТР4056 без BMS.

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

Приветствую! попробовал так же отрисовать, смоделировать схему. в целом работает, только на концевики датчиков не реагирует почему-то... думаю что скетч где-то неверно отрабатывается... Может есть соображения какие-то?

P.S. при построении проекта в протеусе выдаются варнинги:

../main.ino: In function 'void loop()':

../main.ino:580:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

if (analogRead(Optics[y]) > Optics_porog[y] ) {

^

../main.ino:589:12: warning: statement is a reference, not call, to function 'mp3_stop' [-Waddress]

mp3_stop;

^

../main.ino:589:12: warning: statement has no effect [-Wunused-value]

../main.ino:666:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

if (val > Optics_porog[i]) {

^

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

АСКЕТ, а скетч то какой? Здесь есть конечно пара экстрасенсов, но они еще спят.

ПС. Угадал, кекс от Павла, у него микрики землю коммутируют, а входа к +5 притянуты через10К.

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

А, сорри! nalivator_v5.1.5_lcd_dfp_bat_guv - этот из архива

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

а микрики поставил, как в схеме альтернативной. Может скетч от оптопар не подходит?

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

Acket пишет:

А, сорри! nalivator_v5.1.5_lcd_dfp_bat_guv - этот из архива

Используем библиотеку LCD_1602_RUS-master версии 1.0.5 из папки: D:\Arduino\libraries\LCD_1602_RUS-master 
Используем библиотеку LiquidCrystal_I2C версии 1.1.4 из папки: D:\Arduino\libraries\LiquidCrystal_I2C 
Используем библиотеку Wire версии 1.0 из папки: D:\Arduino\libraries\Wire 
Используем библиотеку Servo версии 1.1.2 из папки: D:\Arduino\libraries\Servo 
Используем библиотеку Adafruit_NeoPixel версии 1.2.4 из папки: D:\Arduino\libraries\Adafruit_NeoPixel 
Используем библиотеку DFPlayer_Mini_Mp3 в папке: D:\Arduino\libraries\DFPlayer_Mini_Mp3 (legacy)
Используем библиотеку SoftwareSerial версии 1.0 из папки: D:\Arduino\libraries\SoftwareSerial 
Используем библиотеку GyverEncoder в папке: D:\Arduino\libraries\GyverEncoder (legacy)

Скетч использует 20 412 байт (66%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 708 байт (34%) динамической памяти, оставляя 1 340 байт для локальных переменных.

 

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

Acket пишет:

а микрики поставил, как в схеме альтернативной. Может скетч от оптопар не подходит?

в 929 сообщении есть пример работы с кнопками, поставь в скетче в строке

const unsigned int Optics_porog[] = {50,50,100,100,100};

значения, ну допустим  - 600.

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

Павел, можно и мне прошивку на A.Sverdlov@bk.ru?

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

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

yac
Offline
Зарегистрирован: 10.12.2019

Мой вариант трубочки для наливатора. https://www.youtube.com/watch?v=JEBKvDju2iQ

Bornik
Offline
Зарегистрирован: 23.01.2020

Acket пишет:

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

Привет Всем!

Acket, а с OLED дисплеем не пробывали в Протеусе ?

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

Я не нашел библиотеки под OLED для proteus

Bornik
Offline
Зарегистрирован: 23.01.2020

Я пробывал на этом - Oled1306.

В протеусе библиотека - UG-2864HSWEG01. Пока не вышло.

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

он всё расписал https://simple-circuit.com/arduino-ssd1306-oled-i2c-spi-example/ там всё работает.. только дисплей не тот...

gfx125
Offline
Зарегистрирован: 27.05.2017

Bornik пишет:

Я пробывал на этом - Oled1306.

В протеусе библиотека - UG-2864HSWEG01. Пока не вышло.

Попробуй так

Bornik
Offline
Зарегистрирован: 23.01.2020

Хорошо, что получилось!

Bornik
Offline
Зарегистрирован: 23.01.2020

Заработало, хотя и не все! Хотелось большего.Переставил Протеус, 8.9 сейчас.

Я думаю на первое время кому то пригодится.

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

А в скетче что поменял?

Bornik
Offline
Зарегистрирован: 23.01.2020

Привет! Не чего не менял v4.2.4.

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

Попробую, но думаю не чего не выйдет! Темный лес!

 

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

странно... у меня не компилируется в протеусе под олед, если скомпилирую и цепляю хекс - не работает... хм

а, ну всё, запустился

Mairox
Mairox аватар
Offline
Зарегистрирован: 15.01.2020

Всем привет.

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

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

Лучше ткните носом-где не так.

/*Добавлены библиотека от гиви, индикация состояния батареи радугой 
(6-й светодиод), свистоперделки (бодренькая мелодия (в гудках) во время налива 574,587).
регулировка мелодии налива строчка 572, тостов - 254, приветствия - 506 -максимальная */

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Servo.h>
#include <Adafruit_NeoPixel.h>
//#include <SoftwareSerial.h>//добавляем библиотеки
#include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера
#include "GyverEncoder.h"
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
unsigned long currentTime;
unsigned long ledTime;

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

int BatPin = A7;    // пин контроля состояния батареи
float  Value_volt=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) {
  display.begin();
  display.clearDisplay();
  display.setCursor(10, 0);
  display.print(utf8rus("*НАЛИВАТОР*"));
  display.setCursor(0, 10);
  display.print(utf8rus("=============="));
  display.setCursor(79, 20);
  display.print(utf8rus(">"));
  display.setCursor(0, 20);
  display.print(utf8rus("<"));
  display.setCursor(0, 30);
  display.print(utf8rus("=============="));
  switch (Menu) {
    case 0:
      display.setCursor(13, 20);
      display.print(utf8rus("АВТО РЕЖИМ"));
      break;
    case 1:
      display.setCursor(6, 20);
      display.print(utf8rus("РУЧНОЙ РЕЖИМ"));
      break;
    case 2:
      display.setCursor(17, 20);
      display.print(utf8rus("ПРОМЫВКА"));
      break;
  }
}

//  выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение
void DrinkInfo(byte pos) {
  display.begin();
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print(utf8rus("=============="));
  display.setCursor(10, 2);
  Serial.println(utf8rus("НАЛИТЬ"));
  display.setCursor(0, 40);
  display.print(utf8rus("=============="));
  if (Drink < 15) {
    display.setCursor(16, 20);
    display.print(utf8rus("НИ О ЧЕМ"));
  } else if (Drink < 28) {
    display.setCursor(6, 20);
    display.print(utf8rus("ПО ЧУТЬ-ЧУТЬ"));
  } else if (Drink < 38) {
    display.setCursor(12, 20);
    display.print(utf8rus("В САМЫЙ РАЗ"));
  } else if (Drink < 48) {
    display.setCursor(16, 20);
    display.print(utf8rus("ПО ПОЛНОЙ"));
  } else {
    display.setCursor(16, 20);
    display.print(utf8rus("ДО КРАЕВ"));
  }
}
// Меню Авто режим
void oled_auto(int Drink) {
    display.begin();
    display.clearDisplay();
    display.setCursor(0, 2);
    Serial.println(utf8rus("АВТО РЕЖИМ"));
    display.setCursor(0, 0);
    display.print(utf8rus("=============="));
    display.setCursor(16, 10);
    display.print(utf8rus("HАЛИТЬ ПО"));
    display.setCursor(0, 40);
    display.print(utf8rus("=============="));
    display.setCursor(22, 24);
    display.print(Drink);
    Serial.println(Drink);
    display.setCursor(40, 24);
    display.print(utf8rus("мЛ?"));
    DrinkInfo(57);

}

// Меню Ручной режим
void oled_manual(int DrinkCount, int Drink) {
    display.begin();
    display.clearDisplay();
    Serial.println(utf8rus("РУЧНОЙ РЕЖИМ"));
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print(utf8rus("=============="));
    display.setCursor(5,10);
    display.print(utf8rus("HАЛИТЬ    ПО"));
    display.setCursor(5, 24);
    display.print(Drink);
    display.setCursor(19, 24);
    display.print(utf8rus("мЛ"));  
    Serial.println(Drink);  
    display.setCursor(36, 24);
    display.print(utf8rus("В РЮМ"));
    display.setCursor(50,10);
    display.print(DrinkCount);
    Serial.println(DrinkCount); 
    display.setCursor(0, 40);
    display.print(utf8rus("=============="));
  if (DrinkCount == 1) {
    display.setCursor(67, 24);
    display.print(utf8rus("КУ"));
  } else if (DrinkCount <= 4 ) {
    display.setCursor(67, 24);
    display.print(utf8rus("КИ"));
  } else {
    display.setCursor(67, 24);
    display.print(utf8rus("ОК"));
  }
  
}
// Меню налива
void oled_naliv(int MenuFlag, int Drink, int DrinkCount) {
  display.begin();
  display.clearDisplay();
  Serial.println(utf8rus("НАЛИВАЮ"));
    display.clearDisplay();
    display.setCursor(0, 2);
    display.print(utf8rus("НАЛИВАЮ ПО"));
    display.setCursor(11, 0);
    display.print(Drink);
  Serial.println(Drink);
    display.setCursor(14, 0);
    display.print(utf8rus("мЛ"));
    display.setCursor(0, 1);
    display.print(utf8rus("   В"));
    display.setCursor(5, 1);
    display.print(DrinkCount);
  Serial.println(DrinkCount); 
    display.setCursor(7, 1);
    display.print(utf8rus("РЮМ"));

  if (DrinkCount == 1) {
    display.setCursor(10, 1);
    display.print(utf8rus("КУ     "));
  } else if (DrinkCount <= 4 ) {
    display.setCursor(10, 1);
    display.print(utf8rus("КИ     "));
  } else {
    display.setCursor(10, 1);
    display.print(utf8rus("ОК     "));
  }
}
// Меню налито
void oled_nalito(int MenuFlag, int Nalito, int Drink) {
    Serial.println(utf8rus("HАЛИТО"));
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus("HАЛИТО ПО"));  
    display.setCursor(15, 0);
    display.print(Drink);
    Serial.println(Drink); 
    display.setCursor(15, 0);
    display.print(utf8rus("мЛ"));
    display.setCursor(15, 0);
    display.print(utf8rus("   В"));
    display.setCursor(15, 0);
    display.print(Nalito);
    display.setCursor(15, 0);
    display.print(utf8rus("РЮМ")); 
    Serial.println(Nalito);
  if (Nalito == 1) {
    display.setCursor(15, 0);
    display.print(utf8rus("КУ"));
  } else if (Nalito <= 4 ) {
    display.setCursor(15, 0);
    display.print(utf8rus("КИ"));
  } else {
    display.setCursor(15, 0);
    display.print(utf8rus("ОК"));
  }

}

 void Batery() { // процедура измерение напряжения
  Value_volt=(float)5/1024*analogRead(BatPin);
  
  if(Value_volt < 3.4) {
  strip.setPixelColor(5, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный
  }
  else if(Value_volt < 3.5) {
  //strip.setPixelColor(4, strip.Color(255, 165, 0)); //CRGB::Orange 0xFFA500 оранжевый
  strip.setPixelColor(5, strip.Color(255, 69, 0)); //CRGB::OrangeRed  0xFF4500
  }
  else if(Value_volt < 3.6) {
  strip.setPixelColor(5, strip.Color(255, 255, 0)); //CRGB::Yellow 0xFFFF00 желтый
  }
  else if(Value_volt < 3.7) {
  strip.setPixelColor(5, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
  }  
  else if(Value_volt < 3.8) {
  strip.setPixelColor(5, strip.Color(0, 255, 255)); //CRGB::Aqua 0x00FFFF голубой
  }
 else if(Value_volt < 3.9) {
  strip.setPixelColor(5, strip.Color(0, 0, 255)); //CRGB::Blue 0x0000FF синий
  } 
  else if(Value_volt < 4.0) {
  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
  } 
  else {// >100% заряда
  strip.setPixelColor(5, strip.Color(75, 0, 130)); //CRGB::Indigo  0x4B0082 
 
  } 
	strip.show();
} 

  void Tost() { //Рандом - 1 
    randomSeed(currentTime);
	byte num=random(22); // 0...21
  mp3_set_volume (25);// устанвливаем громкость 25 (если хотите установить
  delay (100);
    display.clearDisplay();
    switch (num){
  //switch (random(20)) { // 0...19
	case 0: //ЗА ВСТРЕЧУ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ВСТРЕЧУ"));
		mp3_play (2);  // Проигрываем "mp3/0002.mp3"
		delay(100);
	break; 
  case 1: //ЗА КРАСОТУ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 0);
    display.print(utf8rus(" НУ ЗА"));
    display.setCursor(15, 6);
    display.print(utf8rus("КРАСОТУ"));  
		mp3_play (3);  // Проигрываем "mp3/0003.mp3"
		delay(100);
	break; 		
	case 2: //"ЗА ДРУЖБУ!"
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ДРУЖБУ")); 
		mp3_play (4);  // Проигрываем "mp3/0004.mp3"
		delay(100);
	break;
	case 3: //"ЗА БРАТСТВО!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА БРАТСТВО"));    
		mp3_play (5);  // Проигрываем "mp3/0005.mp3"
		delay(100);
	break;	
	case 4: //ЗА СПРАВЕДЛИВОСТЬ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ ЗА"));
    display.setCursor(15, 6);
    display.print(utf8rus("СПРАВЕДЛИВОСТЬ")); 
		mp3_play (6);  // Проигрываем "mp3/0006.mp3"11
		delay(100);
	break;	
  case 5: //ЗА РЫБАЛКУ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА РЫБАЛКУ")); 
	break;	
	case 6: //ЗА ИСКУССТВО!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ИСКУССТВО")); 
	break;	
	case 7: //ЗА РАЗУМ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА РАЗУМ")); 		
		mp3_play (9);  // Проигрываем "mp3/0009.mp3"
		delay(100);
  break; 
	case 8: //ЗА ИСТИННЫХ ЖЕНЩИН!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ ЗА "));
    display.setCursor(15, 6);
    display.print(utf8rus("ИСТИННЫХ ЖЕНЩИН")); 	
		mp3_play (10);  // Проигрываем "mp3/0010.mp3"
		delay(100);
  break;
	case 9: //ЗА ПОНИМАНИЕ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ПОНИМАНИЕ")); 		
		mp3_play (11);  // Проигрываем "mp3/0011.mp3"
		delay(100);
  break;
	case 10: //ЗА ЕДИНЕНИЕ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ЕДИНЕНИЕ")); 
		mp3_play (13);  // Проигрываем "mp3/0013.mp3"
		delay(100);
  break;
	case 11: //ЗА ПОБЕДУ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА ПОБЕДУ")); 		
		mp3_play (16);  // Проигрываем "mp3/0016.mp3"
		delay(100);
  break;
	case 12: //ЗА РОДИНУ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ЗА РОДИНУ")); 		
		mp3_play (21);  // Проигрываем "mp3/0021.mp3"
		delay(100);
  break;
	case 13: //ЧТОБ ГОЛОВА НЕ ТРЕЩАЛА!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(utf8rus(" НУ ЧТОБ "));
    display.setCursor(15, 6);
    display.print(utf8rus("ГОЛОВА НЕ ТРЕЩАЛА")); 
		mp3_play (17);  // Проигрываем "mp3/0017.mp3"
		delay(100);
  break;
	case 14: //ЗА СОЛИДНОЕ МУЖСКОЕ МОЛЧАНИЕ
		display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("ЗА  СОЛИДНОЕ"));
    display.setCursor(0, 10);
    display.print(utf8rus("МУЖСКОЕ МОЛЧАНИЕ")); 
		mp3_play (12);  // Проигрываем "mp3/0012.mp3"
		delay(100);
  break;
	case 15: //ЧТОБ МОРЩИЛО НАС МЕНЬШЕ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("НУ, ЧТОБЫ МОРЩИЛО"));
    display.setCursor(0, 10);
    display.print(utf8rus("НАС МЕНЬШЕ ЧЕМ")); 		
		mp3_play (18);  // Проигрываем "mp3/0018.mp3"
		delay(100);
    break;
	case 16: //ЧТОБ В СТОРОНУ НЕ ВИЛЬНУЛО!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("НУ ЧТОБ В "));
    display.setCursor(0, 10);
    display.print(utf8rus("СТОРОНУ НЕ ВИЛЬНУЛО")); 
		mp3_play (19);  // Проигрываем "mp3/0019.mp3"
		delay(100);
  break; 
	case 17: //НУ ВЫ БЛИН ДАЁТЕ!
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK );
    display.setCursor(0, 2);
    display.print(utf8rus("НУ ВЫ БЛИН"));
    display.setCursor(0, 10);
    display.print(utf8rus("ДАЕТЕ")); 
		mp3_play (20);  // Проигрываем "mp3/0020.mp3"
		delay(100);	
  break; 		
	case 18: //ЗА МИР ВО ВСЕМ МИРЕ
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("ЗА МИР ВО"));
    display.setCursor(0,10);
    display.print(utf8rus("ВСЕМ МИРЕ")); 
    mp3_play (21);  // Проигрываем "mp3/0021.mp3"
    delay(100);  
  break;
	case 19: //ЗА НАС С ВАМИ
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("ЗА НАС С ВАМИ"));
    display.setCursor(0, 10);
    display.print(utf8rus("И ХРЕН С НИМИ")); 
    mp3_play (22);  // Проигрываем "mp3/0022.mp3"
    delay(100);  		
  break; 
	case 20: //ЖЕЛАЮ ЧТОБЫ ВСЕ 
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus(" ЖЕЛАЮ"));
    display.setCursor(0, 10);
    display.print(utf8rus("ЧТОБЫ ВСЕ!")); 
    mp3_play (23);  // Проигрываем "mp3/0023.mp3"
    delay(100);  
	break;
	case 21: //ХЛОПНУТЬ ПО РЮМАШКЕ
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(0, 2);
    display.print(utf8rus("А НЕ ХЛОПНУТЬ ЛИ"));
    display.setCursor(0, 10);
    display.print(utf8rus("НАМ ПО РЮМАШКЕ")); 
    mp3_play (24);  // Проигрываем "mp3/0024.mp3"
    delay(100);   		
	break;			
  }


}

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);
  
  display.begin();
  display.cp437(true);
  display.setContrast(30);
//  display.clearDispay();
  display.display();
  enc.setType(TYPE2); 
  //устанавливаем Serial порт МП3 плейера если вывод в монитор TX(D0) и RX(D1)не нужен 
  mp3_set_serial (Serial);//инициализируем Serial порт МП3 плейера
  /*  
  при необходимости создаем програмный порт для управдения МП3 плейером, если вывод в монитор TX(D0) RX(D1) необходим
  SoftwareSerial mySoftwareSerial(10, 11); // RX, TX  обозначаем програмный порт как mySoftwareSerial
  //плейер подключаем D10 D11
  mySoftwareSerial.begin(9600);//инициализируем програмный Serial порт 
  mp3_set_serial (mySoftwareSerial);// указываем програмный порт для МП3 плейера
  //инициализируем Serial с скоростью 115200, если вывод в монитор  TX(D0) RX(D1) необходим 
  Serial.begin(115200);
  */  
  delay (100);//Между двумя командами необходимо делать задержку 100 миллисекунд, в противном случае некоторые команды могут работать не стабильно.
  mp3_set_volume (30);// устанвливаем громкость 30
  mp3_play (1); // Проигрываем "mp3/0101.mp3"(0101_get started!.mp3)
  display.begin();
  display.setTextSize(1);
  display.clearDisplay();
  display.setTextColor(BLACK, WHITE);
  display.setCursor(0, 0);
  display.print(utf8rus("=============="));
  display.setCursor(22,10);
  display.print(utf8rus("НУ ЧТО?"));
  display.setCursor(22, 26);
  display.print(utf8rus("НАЧАЛИ!"));
  display.setCursor(0, 38);
  display.print(utf8rus("=============="));
  pinMode(BatPin, INPUT);
  pinMode(PIN_PUMP, OUTPUT);
  digitalWrite(PIN_PUMP, 0);
  currentTime = millis();
  //---------------
  oled_menu(0);
  strip.begin();
  for (int i = 0; i < 5; i++) {
    pinMode(Optics[i], INPUT);
  }
  ServoParking();
}

void loop()  {
  enc.tick();
  currentTime = millis();

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

   
        //Обработка всех нажатий кнопки
        if (enc.isClick()){// Нажата и отпущена кнопка
        if (Menu == 0 && MenuFlag == 0) { //Нажатие кнопки меню авто
          MenuFlag = 1;
          oled_auto(Drink);
        //} else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное
          //MenuFlag = 0;
          //oled_menu(0);
        } else if (MenuFlag == 1 ) { //Начинается автоматический разлив
          //Serial.println("AUTO"); //Начало автоматического разлива
		 mp3_set_volume (15);// устанвливаем громкость 25 (если хотите установить
         delay (100);
		 mp3_play (99);  // Проигрываем бодренькую мелодию
          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++;
            }
			mp3_stop;
          }
          if (drink_count > 0) {
            oled_nalito(MenuFlag, drink_count, Drink );
            ServoParking();
            delay(1000);
            Tost();
            CvetoMuzik();
            oled_auto(Drink);
          } else {
            display.begin();
            display.clearDisplay();
            display.setTextColor(BLACK, WHITE);
            display.setCursor(2, 2);
            display.print(utf8rus(" НЕТ РЮМОК "));
            display.setCursor(0, 10);
            display.print(utf8rus("ПОСТАВТЕ РЮМКИ"));
            mp3_play (51);  // Проигрываем ГУДОК паровоза низкий.		
            delay(5000);
            oled_auto(Drink);

          }
        } else if (Menu == 1 && MenuFlag == 0) { // Нажатие меню ручное
          MenuFlag = 2;
          oled_manual(DrinkCount, Drink);

        } else if (MenuFlag == 2 ) { //Начинается ручной разлив
          display.begin();
          display.clearDisplay();
          display.setTextColor(BLACK, WHITE);
          display.setCursor(0, 0);
          display.print(utf8rus("=============="));
          display.setCursor(4,10);
          display.print(utf8rus("А РЮМКИ ТОЧНО"));
          display.setCursor(16,20);
          display.print(utf8rus("НА СВОИХ"));
          display.setCursor(20, 30);
          display.print(utf8rus("МЕСТАХ?"));
          display.setCursor(0, 40);
          display.print(utf8rus("=============="));
          mp3_play (52);  // Проигрываем СИРЕНА.		
		      delay(5000);
          oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ...
          for (int y = 0; y < DrinkCount; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
            strip.show();
            ServoNaliv(y); // Перемещяемся к рюмке
            pump_timer(Drink); // Налив.
            strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
            strip.show();
          }
          oled_nalito(MenuFlag, DrinkCount, Drink ); // Выводим на экран налито ...
          ServoParking();
          Tost();
          CvetoMuzik();
          oled_manual(DrinkCount, Drink);
        }
      }

              if (enc.isHolded()){
                if (Menu == 2 && !promivka){
                 promivka = true;
                 pump_enable(); // Включаем насос
          display.setTextSize(1);
          display.clearDisplay();
          display.setTextColor(BLACK, WHITE);
          display.setCursor(14, 2);
          display.print(utf8rus("ПРОМЫВКА"));
          display.setCursor(0, 10);
          display.print(utf8rus("=============="));
          display.setCursor(4, 26);
          display.print(utf8rus(">>>>>>>>>>>>"));
               } else if (MenuFlag == 1 ) { //Выход из меню авто в главное
                 MenuFlag = 0;
                 oled_menu(0);
              }else if (MenuFlag == 2 ) { //Выход из меню ручное в главное
                 MenuFlag = 0;
                 oled_menu(1);
              }
            }
            if (!enc.isHold() && promivka){
               promivka = false;
               pump_disable() ; //Выключаем насос
               oled_menu(2);
              }

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

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

  //}
}
/*Скетч использует 20 314 байт (66%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 708 байт (34%) динамической памяти, оставляя 1 340 байт для локальных переменных.*/

 

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

Попробуй эту библиотеку

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

Вот закончил второй подарок :)

Видео

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

Таки, щикарный вид! шоб я так жил! :) достойный подарок! тёмное дерево, бронза - очень гармонично!

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

Acket пишет:

Таки, щикарный вид! шоб я так жил! :) достойный подарок! тёмное дерево, бронза - очень гармонично!

Спасибо! Тесть оценил :)

Mairox
Mairox аватар
Offline
Зарегистрирован: 15.01.2020

Forthomo пишет:

Попробуй эту библиотеку

Так у меня почти все работает, только не включается АВТО режим и промывка.

Не выводит меню налива и налито.

В остальных меню навигация есть, все выводится на экран.

Нажимаю авто режим, моргает и переходит в ручной.

 

Bornik
Offline
Зарегистрирован: 23.01.2020

VICLER здравствуйте! Можно подробней как башня устроена, никак не могу определиться с конструкцией башни.

Спасибо!

Bornik
Offline
Зарегистрирован: 23.01.2020

А, понял. Извините, не то нажал.

yac
Offline
Зарегистрирован: 10.12.2019

VICLER пишет:

Вот закончил второй подарок :)

Класс! Что за материал? Ламинат? Плёнка? Выглядит отлично!

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

Acket пишет:

Далее, после загрузки, дергает сервой, играет звук, меню загружено. Затем вхожу в ручной, запускаю и происходит, по всем признакам, моментальный рестарт, снова играет стартовый звук и система готова. В случае, когда включен через стандартный сериал порт - всё проходит штатно.

Действительно, не хочет этот скетч с SoftwareSerial работать, возможно конфликт прерываний, тут программист нужен с знанием архитектуры проца.

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

корпус, вроде оргалит ламинированный...

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

yac пишет:

VICLER пишет:

Вот закончил второй подарок :)

Класс! Что за материал? Ламинат? Плёнка? Выглядит отлично!

Спасибо!
Коробка - это полка настенная. Изначально она матовая была, я её лаком покрыл, чтобы рюмками не царапать. Маленькие грани по бокам - дощечки из ДСП, верхняя плата из 3мм двп. Чем именно покрыто не могу определить. На шпон вроде не похоже. Башня обклеена плёнкой.

BackFire
Offline
Зарегистрирован: 21.01.2020

Добрый день, уважаемые обитатели форума!

Загорелся и я идеей собрать такую архинужную игрушку «для дома, для семьи». Попалась на глаза на Ютьюбе, а потом через поиск набрёл и на эту ветку. Конечно же пробежал глазами по последним страницам в надежде быстро увидеть достигнутые результаты, но сразу бросились в глаза частые отсылки молодому пополнению начинать читать ветку с первой страницы. Решил так и поступить, на что у меня ушло недели полторы (уж больно много сообщений вы написали). Но сейчас понимаю, что из-за такого обилия информации бОльшую часть её я уже не помню, придётся потом снова и снова рыскать в поисках.

Сам я мастерить умею, на руки свои не жалуюсь, занятия моделизмом в детстве не прошли даром. И с программированием надеюсь справиться (АйТи-шник всё ж таки, хоть ближе всего дело имею с Oracle PL/SQL). А вот с электроникой я на Вы, хоть и имею ещё со школы разряд монтажника радиоаппаратуры – элементы на схемах понимаю, а вот схемы «читать» не умею. Ну, да ладно, завершаю вступительную часть, а то как то уж больно «многа букаф» получается...

Что я заметил, читая ветку: у многих здешних обитателей одной из основных трудностей стало изготовление трубочки-носика для разлива жидкости, и вкупе с ней башни аппарата. А не возникало ли у кого мысли использовать для этой цели таких готовых агрегатов китайской промышленности (см. ссылки ниже)?

  1. https://aliexpress.ru/item/32820563815.html?spm=a2g0o.productlist.0.0.166c642337GNfC&algo_pvid=d1371ff3-c79c-4da6-aa5f-d7b5863682af&algo_expid=d1371ff3-c79c-4da6-aa5f-d7b5863682af-13&btsid=4fa7ddbe-7920-42ab-b7d7-d949e5a1b8cf&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53
  2. https://aliexpress.ru/item/4000030218635.html?spm=a2g0o.productlist.0.0.57de5067LiDc9X&algo_pvid=c6b6f0ad-6b91-4e69-9737-107dcf8f976c&algo_expid=c6b6f0ad-6b91-4e69-9737-107dcf8f976c-32&btsid=81dc82d1-08d6-4d28-b03a-5e874b9e154c&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53
  3. https://aliexpress.ru/item/32958763894.html?spm=a2g0o.productlist.0.0.57de5067LiDc9X&algo_pvid=c6b6f0ad-6b91-4e69-9737-107dcf8f976c&algo_expid=c6b6f0ad-6b91-4e69-9737-107dcf8f976c-9&btsid=81dc82d1-08d6-4d28-b03a-5e874b9e154c&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53
  4. https://aliexpress.ru/item/4000270452596.html?spm=a2g0o.productlist.0.0.7f725798iXS7o6&algo_pvid=13c568c7-3021-46b6-a76a-9be3d394bec5&algo_expid=13c568c7-3021-46b6-a76a-9be3d394bec5-5&btsid=edcd0caf-3e13-4249-b0d9-987e12480d98&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53
  5. https://aliexpress.ru/item/4000127718059.html?spm=a2g0o.productlist.0.0.7f725798iXS7o6&algo_pvid=13c568c7-3021-46b6-a76a-9be3d394bec5&algo_expid=13c568c7-3021-46b6-a76a-9be3d394bec5-0&btsid=edcd0caf-3e13-4249-b0d9-987e12480d98&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53

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

  • 1. Уже готовый «носик» для разлива
  • 2. Встроенный насос (отпадает необходимость покупать отдельно)
  • 3. Встроенные (не во всех моделях) аккумуляторы (отпадает необходимость покупать отдельно, возможно от них можно будет запитать и остальные модули наливатора, хотя не уверен)
  • 4. Встроенная схема заряда аккумуляторов (отпадает необходимость покупать отдельно)
  • 5. Уже готовая башня
  • 6. Наличие гибкой трубки для жидкости
  • 7. Все комплектующие рассчитаны на применение в контакте с пищей, т.е. не должны явно содержать опасных химических соединений.

Каковы ваши соображения по данному поводу?

Я хоть и хотел бы начать работу над своим наливатором как можно скорее, но ввиду отсутствия комплектующих придётся повременить. Надо их ещё заказать из Китая, а при теперешней ситуации с бущующим там вирусом... быстро это не осуществить, да и боязно как то. А покупать у себя дома в магазинах – разорительно при таких то негуманных ценах (например, Ардуино Нано у нас стоит 24 Евро). Так что ещё какое-то время я буду тут лишь наблюдателем/читателем.