Рулетка наливатора
- Войдите на сайт для отправки комментариев
Привет. Опять я из топика по наливатору http://arduino.ru/forum/proekty/nalivator-avtomatizirovannaya-mashina-kotoraya-budet-razlivat-alkogol-po-stopkam :))
Скетч, допустим, этот http://arduino.ru/forum/proekty/nalivator-avtomatizirovannaya-mashina-kotoraya-budet-razlivat-alkogol-po-stopkam?page=8#comment-481135 просто вставлено еще пара меню и прочее. Суть вопроса вот в чем
Рулетка есть такая
// Рулетка else if (Rezim == 2 && MenuFlag == 1 && pause_sw < 10) { //вход в рулетку MenuFlag = 6; oled_rul(DrinkCount, Drink); } else if (MenuFlag == 6 && pause_sw > 20) { //Выход из меню рулетки в режимы MenuFlag = 1; oled_rezim(2); } else if (MenuFlag == 6 ) { // запуск рулетки myDFPlayer.volume(vol_tost); delay (100); myDFPlayer.playFolder (1, 105); delay (1000); CvetoMuzik(); delay (2000); for (int y = 0; y <= 4; y++) { strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом все рюмки strip.show(); } servo.attach(PIN_SERVO);// серва туды сюды for (int pos = servo.read(); pos <= 180; pos += 1) { servo.write(pos); delay(servo_speed); } for (int pos = servo.read(); pos >= 0; pos -= 1) { servo.write(pos); delay(servo_speed); } int r = random(0, 5); //рюмка в которую не нальёт for (int y = 0; y < 5; y++) { if (y != r) { ServoNaliv(y); // Перемещяемся к рюмке delay (300); //Задержка перед наливом после поворота к рюмке pump_timer(Drink, Optics[y]); // Налив. delay(1000); strip.setPixelColor(y, strip.Color(0, 255, 0)); // Налито. strip.show(); delay(500); } else { (y=r); } } servo.detach(); ServoParking(); myDFPlayer.volume(vol_tost); delay (100); myDFPlayer.playFolder (1, 102); delay (3000); Tost(); CvetoMuzik(); oled_rul(DrinkCount, Drink); }
Подмогите кто в теме, чтобы была зависимость от поставленных рюмок. То есть не все пять, а меньше и выбирал из того количества, которое поставлено.
Если делать так, по аналогии с авто разливом, то да, льет в только поставленные, но не выбирает из них, а думает что их пять. Где я туплю? При изменении max в int r = random(0, 5); начинает просто пропускать первую рюмку... Постоянно...
byte drink_count = 0; int r = random(0, 5); //рюмка в которую не нальёт for (int y = 0; y < 5; y++) { if (analogRead(Optics[y]) < Optics_porog[y] ) { if (y != r) { ServoNaliv(y); // Перемещяемся к рюмке delay (300); //Задержка перед наливом после поворота к рюмке pump_timer(Drink, Optics[y]); // Налив. delay(1000); strip.setPixelColor(y, strip.Color(0, 255, 0)); // Налито. strip.show(); drink_count++; delay(500); } else { (y=r); } } }
Подтолкнете на умную мыслю?
З.Ы. В том топике спросил. Молчат :)) После того как многие встали на коммерческие рельсы, так помощи почти нет :(( А разобраться в работе хочется для, так сказать, увеличения кругозора.
А Вы попытайтесь вывести r на серийный порт. Там скорее всего 1. Рандом не очень рандомный.
Этот рандом, на сколь уже понял, сам по себе не очень. Тут просто хочется понять как сделать... В целом, так сказать, даже с этим рандомом.
А в сериал попробую. С командировки вернусь только.
Чтобы сделать рандом порандомней, надо использовать RTC, думаю, в половине здешних праэктиков часы точно есть. В сетапе считываешь часы, минуты, секунды с модуля RTC и их произведение используешь, чтоб посеять последовательность. Тогда она хотя бы повторяться будет не так нагло при включении.
В топике про "наливатор" , адекватных разработчиков нет в принципе.
Ибо проект сам по себе слишком элементарный.
И при правильном подходе весь текущий вопрос сведётся к функции типа:
void randomnii_naliv(){
doza=random(min,max);
Naliv(doza);
}
Писал давненько на заказ, но не дописал ,заказчик слился,что не помешало ему оплатить всю сумму заказа. Проект изначально был коммерческий, но учитывая его незаконченность выложу. Дабы адепты темы наливатора утерлись.
Понял, попробую. Спасибо! Осталось по знакомым пошукать, модуль отжать...
Один фиг мне интересно, меняя значения max в random (0, max), почему ж он не выбирает из меньшего количества? Или выбирает, но?.... Но льет всегда в первую...
Ибо проект сам по себе слишком элементарный.
И при правильном подходе весь текущий вопрос сведётся к функции типа:
void randomnii_naliv(){
doza=random(min,max);
Naliv(doza);
}
Мне, как новичку в этом деле, интересно. Не с проф точки зрения, ибо чтобы этим заниматься надо больше знаний, а на уровне любителя, собрать и чуть для себя подпилить. За наводку спасибо, но можно чуть поподробнее? Если не сложно. И пойду курить мануалы дальше.
Если вот тут
менять int r = random(0, 5); 5 на 4, 3 и т.д. и ставить такое же количество рюмок, то он льет именно так как надо, выбирает из нужного. То что писал ранее в первом сообщении, что пропускает - более не актуально.
Как мне привязать этот max в рандоме к количеству поставленных рюмок? Не могу сообразить.
Если вот тут
менять int r = random(0, 5); 5 на 4, 3 и т.д. и ставить такое же количество рюмок, то он льет именно так как надо, выбирает из нужного. То что писал ранее в первом сообщении, что пропускает - более не актуально.
Как мне привязать этот max в рандоме к количеству поставленных рюмок? Не могу сообразить.
Да нету там нормального рандома. Берите с шумящего стабилитрона на аналоговый вход.
Так как бы пока фиг с ним, этот рандом меня устраивает. Сначала хочу победить подстановку значения, завязанного на поставленных рюмках. А рандом попробую потом сделать, как ДедСемен предложил :))