"Про картинку, давите на линку "Форум" в верху. Справа под ником увидите "Мой Профиль". Заходите туда. Там есть File Browser. Там разберётесь как выложить картинку на сервер. Потом в сообщении давите "Вставить картинку" и "Выбрать на сервере"."
DetSimen, здесьбез коментов не разберешь, многа незнакомых букаф,
и потом коллеги явно водичкой тестировали, уверяю всех после 5-й пофиг в каком порядке идут тосты, повторяются они или нет, если повторяется просто доливай.
Не могу переделать под дисплей sh1106 i2c 1.3дюйма. Не умею
Перестаньте "плакаться в жилетку", ибо вариантов решения вашей проблемы много:
-купить и использовать дисплеи проверенные в этой теме;
-погуглить, скачать нужную библиотеку, установить, сравнить как формируется вывод информации и переписать скетч под свой дисплей.
-заказать кому нибудь за вознаграждение, для этого здесь есть подфорум http://arduino.ru/forumy/ishchu-ispolnitelya
-дальше не перечисляю, ибо...
Тут не только тосты нужны. Нужен какой-то массив , что бы с тостом еще было имя файла , который будет проигрываться через MP3 модуль. И желательно конечно все это в progmem.
При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7.
Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше. Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.
Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.
Перелопатил ветку не раз)
Но на всякий случай уточнил по-поводу разрезания ленты. Никогда не резал.
408 сообщение сбило с толку круглыми отверстиями под ИК-приемник.
В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него?
Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))
Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.
Перелопатил ветку не раз) Но на всякий случай уточнил по-поводу разрезания ленты. Никогда не резал. 408 сообщение сбило с толку круглыми отверстиями под ИК-приемник. В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него? Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))
Ленту резать, там все размечено уже где резать. Главное соблюдать входы и выходы.
Ну а как датчик будет работать без отверстий ? Он же должен как то видить рюмки
Может кто нибудь помочь внести в скеч изменения ( в программировании не силен), тк что бы загоралось не 5 светодиодов , а 5 пар светодиодов ( по одному планирую под рюмки и по одному на позицию в маяк)
408 сообщение сбило с толку круглыми отверстиями под ИК-приемник. В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него? Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))
Точно так, я использовал отечественные компоненты для оптопары, поэтому датчик получился миниатюрным, светодиод и транзистор проходят в отверстия 5мм.
TCRT5000 - 3,8мм по центрам , 2,5 мм диаметр элементов и получается отверстие 6,3 мм.
При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7.
Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше. Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.
Акумы на какой ток? Сколько насос кушает? Попробуй последовательно соединить 18650 и бустеры 5,4 и 12в паралельно.
Подскажите пожалуйста новичку, в чем может быть дело? При попытке компиляции скетча ArduinoIDE1.8.9 выдает: ошибка для данной платы???? Я пробовал и для UNO,NANO,PROMINI,......пофигу???
OLED 0.96 I2C - 0x3C
LCD 1602 I2C - обычно 0x27 или 0x3F
OLED 1.3 I2C - 0x3D (с библиотекой OLED_I2C.h не работает, думаю пока)
Сфоткай платку конвертера.
А как сюда выложить фотку
Выложить скетч тут http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
"Про картинку, давите на линку "Форум" в верху. Справа под ником увидите "Мой Профиль". Заходите туда. Там есть File Browser. Там разберётесь как выложить картинку на сервер. Потом в сообщении давите "Вставить картинку" и "Выбрать на сервере"."
<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; } }У меня похожая черная 0x3F (перемычки на плате не впаяны), смотри пайку и правильность подключения.
Что непонятно?
Коллеги! Сворачивайте код!
Может перемычку впаять
Может перемычку впаять
Какую перемычку? Куда впаять?
в скетче меняешь 0х27 на 0x3F
А это просто почитать: http://robotchip.ru/obzor-interfeysnogo-modulya-i2c/
Не могу переделать под дисплей sh1106 i2c 1.3дюйма. Не умею
Я тоже могу поучаствовать дедокодом в наливаторе. Вот эта хрень перебирает случайным образом все тосты, не повторяясь, потом начинает сначала
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 скласть, да не наливает никто чота.
DetSimen, здесь без коментов не разберешь, многа незнакомых букаф,
и потом коллеги явно водичкой тестировали, уверяю всех после 5-й пофиг в каком порядке идут тосты, повторяются они или нет, если повторяется просто доливай.
Перестаньте "плакаться в жилетку", ибо вариантов решения вашей проблемы много:
-купить и использовать дисплеи проверенные в этой теме;
-погуглить, скачать нужную библиотеку, установить, сравнить как формируется вывод информации и переписать скетч под свой дисплей.
-заказать кому нибудь за вознаграждение, для этого здесь есть подфорум http://arduino.ru/forumy/ishchu-ispolnitelya
-дальше не перечисляю, ибо...
DetSimen, здесь без коментов не разберешь, многа незнакомых букаф,
После пятой как раз и придёт понимание.
Какие слова непонятны? Я пока трезвый, могу пресечь бизабразия.
Тут же даже думать не надо, когда пришло время следущего тоста, вызывай Tost.getNext() да пей.
Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли чистый С++ ардуина?
Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли чистый С++ ардуина?
1. Вставить в начало скечча. Вызывать Tost.getNext() там, где требуеца очередной тост.
2. Проглотит
Я ваш скечч не смотрел, мне надо ссылку на его окончательный вариант. Мы с котом, пока шары не залили, можем глянуть чотамкак
Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли чистый С++ ардуина?
1. Вставить в начало скечча. Вызывать Tost.getNext() там, где требуеца очередной тост.
2. Проглотит
Я ваш скечч не смотрел, мне надо ссылку на его окончательный вариант. Мы с котом, пока шары не залили, можем глянуть чотамкак
Красивое решение. Спасибо.
Мы с котом, пока шары не залили, можем глянуть чотамкак
Животину жалко.. Сопьется же .
можно даже всё это в PROGMEM скласть, да не наливает никто чота.
Не можно а нужно ) Ради такого налить не жалко.
сложнее будет тосты набивать
Мы с котом, пока шары не залили, можем глянуть чотамкак
Животину жалко.. Сопьется же .
Мы с ним давно синяки оба.
сложнее будет тосты набивать
Тут не только тосты нужны. Нужен какой-то массив , что бы с тостом еще было имя файла , который будет проигрываться через MP3 модуль. И желательно конечно все это в progmem.
Как зту конструкцию и куда в готовый рабочий скетч вставить? И проглотит ли чистый С++ ардуина?
1. Вставить в начало скечча. Вызывать Tost.getNext() там, где требуеца очередной тост.
2. Проглотит
Я ваш скечч не смотрел, мне надо ссылку на его окончательный вариант. Мы с котом, пока шары не залили, можем глянуть чотамкак
Скетч не мой, Павел писал, я так, ЛСД1602 прикрутил и МП3. скетч за 2 дня уже 4-е раза выложили в этой теме сообщение 456 сегодня.
Посмотрелъ. Это не для вечерних мозгов, это завтра.
Посмотрелъ. Это не для вечерних мозгов, это завтра.
Затра Пъятница, до понедельника :)
Пятница только вечером, а с утра нам с котом делать нечего будет, посмотрим.
Я на пособии, у меня каждый день - и пятница и воскресенье. :-)
ПыСы. Вернее, каждый день утром суббота, днем воскресенье, ну а вечером - ПЯТНИЦЦА!!!
Доброго дня!
Прошу не пинать ) Подскажите пожалуйста по поводу расположения светодиодов и приемников.
Т.е. надо расположить разрезанные диоды ленты и приемники?
Как располагать, что учесть и т.д.?
Заранее огромное спасибо!
Доброго дня!
Прошу не пинать ) Подскажите пожалуйста по поводу расположения светодиодов и приемников.
Т.е. надо расположить разрезанные диоды ленты и приемники?
Как располагать, что учесть и т.д.?
Заранее огромное спасибо!
Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.
При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7.
Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше. Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.
Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.
Перелопатил ветку не раз)
Но на всякий случай уточнил по-поводу разрезания ленты. Никогда не резал.
408 сообщение сбило с толку круглыми отверстиями под ИК-приемник.
В нем на платке двойной элемент (TRACKER SENSOR TCRT5000). Соответственно высверливать под него?
Зы: понимаю, что вопросы для тех кто "в теме" глупые. Наберитесь терпения пожалуйста.))
Читайте не только последнюю страницу!!! см. сообщения 371 и 408 (3-е фото). Все уже описано и обсуждено.
Ленту резать, там все размечено уже где резать. Главное соблюдать входы и выходы.
Ну а как датчик будет работать без отверстий ? Он же должен как то видить рюмки
тока либ у меня нет, я не проверял.
проверяю этот скетч,пока не работает. при включении говорит и пишет *ну начали* после разлива тишина и пустой дисплей.
заработало! скетч выложу позже после полного исправления
Вот такой корпус получился у меня.
Вот такой корпус получился у меня.
Можно файлы печати посмотреть? Стол очень интересный получился,
Сам медленно пытаюсь сделать это
Исходник
Хочу прийти по цвету к тому , что каждый день вижу
Может кто нибудь помочь внести в скеч изменения ( в программировании не силен), тк что бы загоралось не 5 светодиодов , а 5 пар светодиодов ( по одному планирую под рюмки и по одному на позицию в маяк)
не плоди сущностей, просто запараллель 2 светодиода.
Понял, спасибо.
Тоже ещё не всё сделал
https://drive.google.com/file/d/1YTMirVwh29D50IDTWxhuDXndCJ-GZjPX/view?usp=sharing
Спасибо , посмотрел..стол понравился попробую в свои 210х210 разместить с уменьшением..
Точно так, я использовал отечественные компоненты для оптопары, поэтому датчик получился миниатюрным, светодиод и транзистор проходят в отверстия 5мм.
TCRT5000 - 3,8мм по центрам , 2,5 мм диаметр элементов и получается отверстие 6,3 мм.
Этот сосуд снизу будет подствечивать светодиод, меняющий яркость в зависимости от заряда аккумуляторов.
Это интересно, тоже собираюсь переделать, девайс с ЛСД, на выходные попробую емкость просверлить и вклеить патрубок. Трубки внешние напрягают.
собираюсь переделать, девайс с ЛСД
и я хочу девайс с ЛСД, зима быстрее прайдёть.
При включении насоса экранчик LCD 1602 на секунду немного тускнеет. Померил - просадка напряжения , где то с 5.4 падает до 4.7.
Питаю от двух аккумуляторов, 18650 соединенных параллельно, бустером ( с зарядкой ) поднимаю напругу до 5.4 вольт , еще один бустер с 5.4 поднимает до 12 вольт на моторчик. Насос перистальтический, если давать меньше 12 , производительность будет ощутимо меньше. Понатыкал электролитов на экранчик, на моторчик, чето разницы особой не увидел. Может емкость нужна побольше.. Ставил 1000 мкф.
Акумы на какой ток? Сколько насос кушает? Попробуй последовательно соединить 18650 и бустеры 5,4 и 12в паралельно.
Спасибо , посмотрел..стол понравился попробую в свои 210х210 разместить с уменьшением..
Три небольшие ,что спереди ,отверстия заглушу другими цветами, там стоять будут три сенсорные модульки вместо энкодера.
Понятно, мне они то же не нужны, уберу. Энкодер втискиваю на самый верх, цвет стола подбираю под море.
Добавил в папку файл lay6,может кому пригодиться.
https://yadi.sk/d/iSC-hQ6K3KCJCg
Подскажите пожалуйста новичку, в чем может быть дело? При попытке компиляции скетча ArduinoIDE1.8.9 выдает: ошибка для данной платы???? Я пробовал и для UNO,NANO,PROMINI,......пофигу???
Спасибо!