как программировать таймер DIGISPARK

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

делаю муляж бомбы для страйкбольных игр на базе arduino

принцип роботи прост:

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

сигнал будет когда время выйдет или 2 кнопка будет отпускаетсa

но код не работает 

 
  /*  knopka podkljucena mezdu pin i GND 
   *   scoby ne ispolzovat podtahjuscyj rezystor
   */
  
  int p = 1;        //led+ speaker   
  int button=2 ;    //knopka vremeny
  int pp = 2;      // start
  long cas=0;      //peremennaja dlja vremeny
  int var = 0;      
  int i=5000;     // vrema kotoroje budet dodavatsa
void setup() {
    pinMode(button, INPUT_PULLUP);     // cas
    pinMode(p, OUTPUT);               // speaker
    pinMode(pp, INPUT_PULLUP);        // start

}
void ledon() {
    digitalWrite(1,HIGH);
  }
void ledoff() {
    digitalWrite(1,LOW);
  }

void blik(){
    digitalWrite(p, HIGH);
    delay(10000); 
    digitalWrite(p, LOW); 
    delay(1000);
}
void speaker() {
  while(var<200){
    tone (p, 500);
    delay(100);
    tone(p, 1000);
    delay(100);
    var++;
    }
}
void loop() {
if (digitalRead(button) == LOW) {  //vkljuci led dlja proverky nazatye
  ledon();
  }
  delay(250);
if (digitalRead(button) == HIGH) {  // dodaj vrema stolka ras 
  cas=cas+i;                        // skolka raz nazal na knopku 
  ledoff();                         //(1 ras =5minut)  
  }                                 // (3 raza=15minut)
  
if (digitalRead(2) == LOW) {        // vkljuci led dlja proverky nazatye
  ledon();
  delay(250);
  ledoff();
  delay(cas);
  blik();
  speaker();
 }
  delay(250);
if(digitalRead(2) == HIGH) {        
  blik();
  speaker();
 }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
У Вас первая и вторая кнопки подключены на один пин(контакт)
 
06  int button=2 ;    //knopka vremeny
07  int pp = 2;      // start
 
И слишком много "делай", нормально она работать не сможет.
 
10  int i=5000;     // vrema kotoroje budet dodavatsa
 
5000-это 5 секунд а не 5 минут
Xeornonn
Offline
Зарегистрирован: 22.10.2016

Вы действительно так думаете?

Xeornonn
Offline
Зарегистрирован: 22.10.2016

Очень интересно, спасибо большое)

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

5 sekund ja zdelal scob ne zdat  5 minut pry teste programy

daze pry ispravlenyy rozpynovky ne robotaet

kak posovetujete ispravyt delay ?

 

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

vot ispravlenyj kod + ubral speaker dlja testa a to uze usy est =(

 
  /*  knopka podkljucena mezdu pin i GND 
   *   scoby ne ispolzovat podtahjuscyj rezystor
   */
  
  int p = 1;        //led+ speaker   
  int button=2 ;    //knopka vremeny
  int pp = 0;      // start
  long cas=0;      //peremennaja dlja vremeny
  int var = 0;      
  int i=5000;     // vrema kotoroje budet dodavatsa
void setup() {
    pinMode(button, INPUT_PULLUP);     // cas
    pinMode(p, OUTPUT);               // speaker
    pinMode(pp, INPUT_PULLUP);        // start

}
void ledon() {
    digitalWrite(1,HIGH);
  }
void ledoff() {
    digitalWrite(1,LOW);
  }

void blik(){
  while(var<200){
    digitalWrite(p, HIGH);
    delay(1000); 
    digitalWrite(p, LOW); 
    delay(1000);
     var++;
    }
}
void speaker() {
  while(var<200){
    tone (p, 500);
    delay(100);
    tone(p, 1000);
    delay(100);
    var++;
    }
}
void loop() {
if (digitalRead(button) == LOW) {  //vkljuci led dlja proverky nazatye
  ledon();
  }
  delay(250);
if (digitalRead(button) == HIGH) {  // dodaj vrema stolka ras 
  cas=cas+i;                        // skolka raz nazal na knopku 
  ledoff();                         //(1 ras =5minut)  
  }                                 // (3 raza=15minut)
  
if (digitalRead(pp) == LOW) {        // vkljuci led dlja proverky nazatye
  ledon();
  delay(250);
  ledoff();
  delay(cas);
  blik();
 }

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хм...

vosara пишет:
5000-это 5 секунд а не 5 минут

Xeornonn пишет:
Вы действительно так думаете?

Блондинко?

Фото в студию!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Попробуйте такой код, speaker()установите сами так как в последнем коде я не понял куда. Не проверял но должен работать если я правильно понял замысел
#define p 1        //led+ speaker   
#define button 2    //knopka vremeny
#define pp  0      // start

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 0;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(p, OUTPUT);               // speaker
  pinMode(pp, INPUT_PULLUP);        // start
}

void speaker() {
  while (var < 200) {
    tone (p, 500);
    delay(100);
    tone(p, 1000);
    delay(100);
    var++;
  }
}

void loop() {
  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 4); // Отправляем в Функцию дребезга
  }
//Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    k_button = 0;
    shag = 1;
    b_var = 0;
    k_pp = 0;
  }
//Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    cas += i;
    k_button = 1;
  }
//Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
          break;
        }
    }
  }
}

 

 

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

Sudja po kodu vy kazetsa pravylno ponjaly

speaker() dolzen nachodytsa vmeste z blik() oni budut podavat signal o okoncanyy vremeny ili esly nepravylno rozdefuzyli

 Ksozelenyju vasa versyja koda toze nerobotaet, pocemu nemogu skazat tak kak ja novycok v etom dele 

( vo izbezanye drebezha star i dodavanye vremeny proischodylo posle odkljuzenye ot pin s intervalom 250ms scoby sokratyt kod budet li takoe robotat? )

 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

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

//Обратите внимание!!! Меняем подключение кнопок
#define p 4        //led+ speaker   
#define button 2    //knopka vremeny
#define pp  3      // start

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 1;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(p, OUTPUT);               // speaker
  pinMode(pp, INPUT_PULLUP);        // start
}

void speaker() {
  while (var < 200) {
    tone (p, 500);
    delay(100);
    tone(p, 1000);
    delay(100);
    var++;
  }
}

void loop() {
  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 4); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 4); // Отправляем в Функцию дребезга
  }
//Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    k_button = 0;
    shag = 1;
    b_var = 0;
    k_pp = 0;
  }
//Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    cas += i;
    k_button = 1;
  }
//Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
          break;
        }
    }
  }
}

- Проверил в протеусе -все работает. 

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

nakonec to zarobotalo, bolsoe spasiba

tak ze chotel sprosyt, posle okoncanye vremeny, funkcyja kotoraja otvecaet za blikanye led 

      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }

mozna li za nejo dadat speaker? i kak lutse eto zdelat scob bylo bez delay() s tem sco speaker budet na druhom pin

#define s 0        // speaker

void speaker() {
  while (var < 200) {
    tone (s, 500);
    delay(100);
    tone(s, 1000);
    delay(100);
    var++;
  }
}

scoby polucylos kak to 

   case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            speaker();
            b_var++;
          }
        }

esli ja pravylno ponejal etot kod

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Нет! speaker(); Нужно подключить НЕ на 0 или1 пин (они нужны для отладки) алюбой другой, к примеру 5. Вставлять вызов нужно в блоке else перед break (После 110 сторочки) 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Прошу прощения, я немного подправил код и вставил Вашу функцию. Пожалуйста замените код у себя!!!

//Обратите внимание!!! Меняем подключение кнопок
#define p 4        //led+ speaker   
#define button 2    //knopka vremeny
#define pp  3      // start

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 0;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(p, OUTPUT);               // speaker
  pinMode(pp, INPUT_PULLUP);        // start
}

void speaker() {
  while (var < 200) {
    tone (p, 500);
    delay(100);
    tone(p, 1000);
    delay(100);
    var++;
  }
}

void loop() {
  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 1); // Отправляем в Функцию дребезга
  }
//Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    k_button = 0;
    shag = 1;
    b_var = 0;
    k_pp = 0;
  }
//Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    cas += i;
    k_button = 1;
  }
//Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
	  speaker();
          break;
        }
    }
  }
}

 

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

ja daze neznaju kak tebe blahadarit, ty mne ocen pomoh spasiba

 mozes isce proveryt etot kod 

kde speaker na 5 pine + 4 pin eta falsyboe obezvrezovanyae

//Обратите внимание!!! Меняем подключение кнопок
#define p 1        //led out
#define button 2    //knopka vremeny
#define pp 3      // start
#define fb 4      // fail button
#define sp 5     // speaker

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 0;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(p, OUTPUT);               // speaker
  pinMode(pp, INPUT_PULLUP);        // start
}

void speaker() {
  while (var < 200) {
    tone (sp, 500);
    delay(100);
    tone(sp, 1000);
    delay(100);
    var++;
  }
}

void loop() {
  if (digitalRead(fb) == HIGH) {  
  speaker();
  }

  
  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 1); // Отправляем в Функцию дребезга
  }
//Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    k_button = 0;
    shag = 1;
    b_var = 0;
    k_pp = 0;
  }
//Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    cas += i;
    k_button = 1;
  }
//Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
    speaker();
          break;
        }
    }
  }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
1) В место #define p 1  - #define p 6 (Я писал что 0й и 1й пин лучше не трогать)
2) "fb" и "sp" нужно сконфигурировань в void setup() на выход
3) Я не знаю что у Вас стоит на "fb" но ему надо обеспечить антидребезг (хотя в "speaker()" есть цыкл "while" так что может работать и так) 
MikadoTerri
Offline
Зарегистрирован: 21.10.2016

v digispark  ne mnoha pinov od 0 do 5  

na 1 pin podkljucen vstrojenyj LED kotoryj i budet ispolzovatsa kak sygnal o nazatyy

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Понял! Тогда выполните 2й - #14 пункт идолжно работать/

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

kod robotaet no speaker nacinaet podavat signal tolka posle svetovoho signala LED, mozna eto kak to ispravit? esli mozna to kak?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

А как Вам надо - спикер перед Лед  или одновременно!

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Вот код в котором speaker и led работают одновременно а как надо не знаю!!!
Также с кнопкой fb 4 // fail button не понятно, Как долго должна звучать при этом лед должен мигать или нет, при отпущеной кнопке - что должно быть?

//Обратите внимание!!! Меняем подключение кнопок
#define p 1        //led out
#define button 2    //knopka vremeny
#define pp 3      // start
#define fb 4      // fail button
#define sp 5     // speaker

bool f_speaker;

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 0;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(pp, INPUT_PULLUP);        // start
  pinMode(fb, INPUT_PULLUP);
  pinMode(p, OUTPUT);               // led
  pinMode(sp, OUTPUT);               // speaker
  Serial.begin(9600);
}

void speaker() {
  static int var_sp = 1;
  switch (var_sp) {
    case 1:
      tone (sp, 500);
      if (my_pausa(100, 3))var_sp = 2;
      break;
    case 2:
      tone(sp, 1000);
      if (my_pausa(100, 3))var_sp = 1, var++;
      break;
  }
}

void loop() {
  if (digitalRead(fb) == LOW) {
    speaker();
  }

  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  //Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    noTone(sp);
    fl_pause[2] = 0;
    k_button = 0;
    shag = 1;
    b_var = 0;
    var = 0;
  }
  //Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    if (k_pp)k_pp = 0;
    else cas += i;
    k_button = 1;
  }

  //Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3, var =  0;;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
        }

        if (var < 200) {
          speaker();
          f_speaker = 1;
        }
        else if (f_speaker) noTone(sp), f_speaker = 0;
        break;
    }
  }
}

 

MikadoTerri
Offline
Зарегистрирован: 21.10.2016

zabej na fb ato slyskom nespravedlyvo budet, no kod robotaet tak sco led robotaet pravylno no speaker srazu posle zapuska timera ne dozydaes okoncanyy vremeny

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

У меня на симуляторе работает все правильно. Отключите кнопку "fb" и задокументируйте код с ней, что бы настроить работу без неё. Вот так  


//Обратите внимание!!! Меняем подключение кнопок
#define p 1        //led out
#define button 2    //knopka vremeny
#define pp 3      // start
#define fb 4      // fail button
#define sp 5     // speaker

bool f_speaker;

bool status_button;
bool f_button;
bool k_button;

bool status_pp;
bool f_pp;
bool k_pp;

int shag = 1;
long cas = 0;    //peremennaja dlja vremeny
int var = 0;
int b_var = 0;
int i = 5000;   // vrema kotoroje budet dodavatsa

//Переменные функци паузы или дребезга, с разным временем опроса
unsigned long currentPause[4];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[4];//массив данных. Количество элементов - количеству таймеров

//Функция дребезга или паузы time-время задержки, nomer-номер таймера
boolean my_pausa(unsigned long time, byte nomer) {
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

void setup() {
  pinMode(button, INPUT_PULLUP);     // cas
  pinMode(pp, INPUT_PULLUP);        // start
  pinMode(fb, INPUT_PULLUP);
  pinMode(p, OUTPUT);               // led
  pinMode(sp, OUTPUT);               // speaker
  }

void speaker() {
  static int var_sp = 1;
  switch (var_sp) {
    case 1:
      tone (sp, 500);
      if (my_pausa(100, 3))var_sp = 2;
      break;
    case 2:
      tone(sp, 1000);
      if (my_pausa(100, 3))var_sp = 1, var++;
      break;
  }
}

void loop() {
  //if (digitalRead(fb) == LOW) {
    //speaker();
  //}

  //Обрабатуем кнопку button на дребезг
  if (digitalRead(button) == 0) {
    if (f_button == 0) fl_pause[0] = 0, f_button = 1;
    if (!status_button) status_button = my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  if (digitalRead(button) == 1) {
    if (f_button == 1) fl_pause[0] = 0, f_button = 0;
    if (status_button)status_button = !my_pausa (5, 0); // Отправляем в Функцию дребезга
  }

  //Обрабатуем кнопку pp на дребезг
  if (digitalRead(pp) == 0) {
    if (f_pp == 0) fl_pause[1] = 0, f_pp = 1;
    if (!status_pp) status_pp = my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  if (digitalRead(pp) == 1) {
    if (f_pp == 1) fl_pause[1] = 0, f_pp = 0;
    if (status_pp)status_pp = !my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  //Кнопка button нажата
  if (status_button) {
    digitalWrite(p, HIGH);
    noTone(sp);
    fl_pause[2] = 0;
    k_button = 0;
    shag = 1;
    b_var = 0;
    var = 0;
  }
  //Кнопка button отпущена
  if (!status_button && !k_button) {
    digitalWrite(p, LOW);
    if (k_pp)k_pp = 0;
    else cas += i;
    k_button = 1;
  }

  //Клик нопки pp или "старт" (Если во время випонения старта нажать кн.button - старт сбросится и cas добавится на i. Это без speaker())
  if (status_pp)k_pp = 1;
  if (k_pp) {
    switch (shag) {
      case 1:
        digitalWrite(p, HIGH);
        if (my_pausa(250, 2)) {
          digitalWrite(p, LOW);
          shag = 2;
        }
        break;
      case 2:
        if (my_pausa(cas, 2))shag = 3, var =  0;;
        break;
      case 3:
        if (b_var < 200)
        {
          if (my_pausa(1000, 2)) {
            digitalWrite(p, !digitalRead(p));
            b_var++;
          }
        }
        else {
          digitalWrite(p, LOW);
          shag = 1;
          b_var = 0;
          k_pp = 0;
        }
	
	if (b_var>1){
        if (var < 200) {
          speaker();
          f_speaker = 1;
        }
        else if (f_speaker) noTone(sp), f_speaker = 0;
        }
	break;
    }
  }
}