Случайное продолжение события

karl2233
Offline
Зарегистрирован: 05.07.2015

Делаю часы.

кроме всех прочих, столкнулся с проблемой - не совсем, вернее совсем, не понимаю как сделать так:

1. событие = сработал будильник.

2. для его отключения хочу применить датчик положения.

3. отключение будильника должно происходить по следующим сценариям:

    3.1. потрясти будильник раз 5 медленно.

    3.2. потрясти будильник раз 10 быстро.

    3.3. вариант 3.1.+3.2.

    3.4. вариант 3.2.+3.1.

так вот, не понимаю как сделать случайное отключение по одному из сценариев(3.1...3.4).

подскажите плз :)

 

Araris
Offline
Зарегистрирован: 09.11.2012

Пусть будильник перед срабатыванием "бросает кубик", например, с помощью http://arduino.ru/Reference/Random

karl2233
Offline
Зарегистрирован: 05.07.2015

класс! спасибо!

вопросы:

в значениях можно указать case(в котором прописать условия), я правильно понимаю?

таким образом, если указать 4 условия то будет мне щастье?

:)

fogary
Offline
Зарегистрирован: 05.03.2016

karl2233 пишет:

в значениях можно указать case(в котором прописать условия), я правильно понимаю?

Поясните Вашу мысль.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Сделайте будильник на колесиках с датчиком расстояния до препятствия и пусть он "время от времени" от вашей руки убегает в сторону. :)

karl2233
Offline
Зарегистрирован: 05.07.2015

(давайте на "ты"?)

fogary,

я так думаю - создать некий case с условиями(кол-во маханий, их частота), потом на них в коде ссылаться.

что б каждый раз не повторять условия.

как-то так.

...или туплю нещадно?

Arhat109-2, не, мысль! не спорю. )))))))))))))

тока не для меня - я простого не могу освоить :(

Araris
Offline
Зарегистрирован: 09.11.2012

Где-то перед запуском будильника определяем, как на этот раз его остановить :

СПОСОБ_ОТКЛЮЧЕНИЯ = random(1,4);

Дальше ждем действий подопытного и реагируем соответственно

if (СПОСОБ_ОТКЛЮЧЕНИЯ == 1)

 { ждём "потрясти будильник раз 5 медленно" и отключаем будильник }

else if (СПОСОБ_ОТКЛЮЧЕНИЯ == 2

 { ждём "потрясти будильник раз 10 быстро" и отключаем будильник }

else if (СПОСОБ_ОТКЛЮЧЕНИЯ == 3

 { ждём "потрясти будильник раз 5 медленно, потрясти будильник раз 10 быстро" и отключаем будильник }

else if (СПОСОБ_ОТКЛЮЧЕНИЯ == 4
 
 { ждём "потрясти будильник раз 10 быстро , потрясти будильник раз 5 медленно" и отключаем будильник }
 
P.S. и ведь фигня редкостная получится, если вообще получится...
 

 

karl2233
Offline
Зарегистрирован: 05.07.2015

А Ф И Г Е Т Ь Н Е В С Т А Т Ь !

 Araris, этожжжжж почти код готовый!

спасибо ОГРОМЕННОЕ!

Araris
Offline
Зарегистрирован: 09.11.2012

Вы излишне восторженны, там до готового кода ещё охо-хо как далеко.

fogary
Offline
Зарегистрирован: 05.03.2016

Araris пишет:

Где-то перед запуском будильника определяем, как на этот раз его остановить :

СПОСОБ_ОТКЛЮЧЕНИЯ = random(1,4);

Если верить документации, то правильно будет так:

СПОСОБ_ОТКЛЮЧЕНИЯ = random(1,5);

иначе функция будет возвращать значения в диапазоне от 1 до 3.

karl2233 пишет:

Не забудьте добавить в setup() добавить вызов функции randomSeed(), как описано в статье (по ссылке выше).

Araris
Offline
Зарегистрирован: 09.11.2012

fogary пишет:

Если верить документации, то правильно будет так:

СПОСОБ_ОТКЛЮЧЕНИЯ = random(1,5);

иначе функция будет возвращать значения в диапазоне от 1 до 3.

Да, каюсь, там действительно написано

Параметры

  • min: нижняя граница случайных значений, включительно. (опционально)
  • max: верхняя граница случайных значений, не включительно.
Возвращаемое значение

Случайное число между min и max-1. (long)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И зачем рандом там. Чел может

1-потрясти будильник раз 10 быстро

2 - потрясти будильник раз 5 медленно.

3-потрясти будильник раз 10 быстро

4 - спокойно лечь спать дальше.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Убегающие будильники где-то в сети уже готовые видел, ежели вчё .. пошукайте. :)

karl2233
Offline
Зарегистрирован: 05.07.2015

 fogary, Araris

 спасибо вам!

karl2233
Offline
Зарегистрирован: 05.07.2015

Araris пишет:
P.S. и ведь фигня редкостная получится, если вообще получится...

почему фигня? 

"редкостная" и "если", вопросов не вызывают =)

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


#define Buzz A2; порт с буззером
#define Trema 2; // порт с датчиком положения
int count = 0; // переменная счетчика замыканий Trema 
 
void setup() {
randomSeed(analogRead(A6)); // источник "случайного" числа шум на этом порту
pinMode(Trema, INPUT_PULLUP); // порт с датчиком положения подтянут к +5В
pinMode(Buzz, OUTPUT); // выход буззера
}
void loop() {
  
/*тут код часов и момент, 
когда наступает время срабатывания будильника
*/
tone(Buzz, 1000);//включение звука
randNumber = random(4);// кол-во вариантов отключения
AlarmOFF = random(1,5); //ждем действий подопытного и реагируем соответственно
if (AlarmOFF == 1) //ждём "потрясти будильник раз 5 медленно" и отключаем будильник
  { 
  int Trema_read();// считываем состояние датчика
  byte count = 0; // переменная, в которую записываются нажатия кнопки
  long Trema_delay; // переменная для проверки длительности замыкания
     if(digitalRead(Trema)== LOW) // если замыкание Trema обнаружено, то...
        {
          delay(50);// против дребезга
          Trema_delay = millis; //  начинаем отсчет времени
         if(Trema_delay - millis > 1000 && byte count = 5);  //длительность и количество замыканий Trema
           {
             delay(50);// против дребезга
             noTone(Buzz);// выключение звука
           }
       }
  }
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

long Trema_delay; -> unsigned long Trema_delay;

millis -> millis()

karl2233
Offline
Зарегистрирован: 05.07.2015

добавил.

но ругается на ";" и скобки, начиная с 30 строки. видать синтаксис нарушен.

fogary
Offline
Зарегистрирован: 05.03.2016

Уберите ";" в строке 27.

У Вас в программе три переменных с названием "count" (строки: 3, 21, 27), причем две из них в приделах одной функции. Вы присваиваете им значения, но нигде, в приведенной программе, не используете. Зачем Вы используете присвоение этой переменной в условии проверки (строка 27), то же не понятно. Если Вам действительно нужны три переменные, то лучше их назвать по разному, хотя бы "count", "count1", "count2", но лучше дать более осмысленные имена.

karl2233
Offline
Зарегистрирован: 05.07.2015

спасибо, убрал ";" из 27 и ещё несколько ошибок.

но увы :(

про переменные - нужна одна (счётчик срабатываний датчика положения Trema).

так понимаю, что по своей сути датчик та же кнопка, смотрю примеры работы с кнопкой(обработка кол-ва нажатий) но что-то не получается...

вот, решил пока упростить - только датчик, и только  выключение звука.

#define Buzz A2  // порт с буззером
#define Trema 1 // порт с датчиком положения
int TremaState = 0; //текущее состояние 
int TremaLastState = 0; //предыдущее состояние
//int count = 0; // переменная счетчика замыканий Trema 
 
void setup() {
    pinMode(Trema, INPUT_PULLUP); // порт с датчиком положения подтянут к +5В
    pinMode(A2, OUTPUT); // выход буззера
    }
void loop() {
   tone(A2, 1000); //включение звука
  TremaState = digitalRead(Trema);
         if(TremaState == LOW) // если срабатывание Trema обнаружено, то...
         {
             noTone(A2); //отключение звука  
          }
}

всё хорошо, только звук не отключается :(

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Очень даже отключается, в строке 16.

А потом тут же включается, в строке 12. При каждом проходе loop().

karl2233
Offline
Зарегистрирован: 05.07.2015

а как сделать что б он после отключения не включался?

или это будет происходить сигналом на включение будильника?

как-то так:

1. датчик разомкнут, будильник НЕ сработал.

2. датчик разомкнут, будильник сработал. тут уж надо трясти =)

3. т.к время срабатывания будильника прошло, то при выключении звук не включится при следующем проходе loop.

я правильно понимаю?

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

А где бомба будильник?)

Буду надеяться на вас)))

karl2233
Offline
Зарегистрирован: 05.07.2015

так вот, делаю ж =) 

Araris
Offline
Зарегистрирован: 09.11.2012

karl2233 пишет:

а как сделать что б он после отключения не включался?

или это будет происходить сигналом на включение будильника?

как-то так:

1. датчик разомкнут, будильник НЕ сработал.

2. датчик разомкнут, будильник сработал. тут уж надо трясти =)

3. т.к время срабатывания будильника прошло, то при выключении звук не включится при следующем проходе loop.

я правильно понимаю?

В приведённом выше скетче нет даже следов какого-либо будильника, поэтому конкретно говорить пока не о чем.

Позвольте дать совет : сделайте для начала просто будильник с пищалкой и кнопкой (благо их много в Интернетах описано), а потом уже оснащайте его бантами, рюшами и проч.

karl2233
Offline
Зарегистрирован: 05.07.2015

да, логично.

получается мои рассуждения верны?

сейчас изучаю как заменить в одном полезном скетче Ds3231 на DS1302.