Необходима помощь с кодом

goldpistol
Offline
Зарегистрирован: 01.10.2014

Ребят,есть вот такой код;

#include <pt6961.h>
#include <EEPROM.h>
#include <SPI.h>
int pausable=1;
int tr=0;
int td=0;
int valu=0;

////пин 10 SSpin spi,3 пин пищалки,13 CLK,11 strobe.
int val=0;
int timer=30;
int buttonState=0;



PtDriver comm; //имя класса

void setup() {
  
 pinMode (A0, INPUT);
 pinMode (9, INPUT);
 pinMode (7, OUTPUT);
 pinMode (6, OUTPUT);
 pinMode (8, OUTPUT);
 //аналоговый вход на вход)
 
}

void loop() {
 
 comm.init(10); //ss pin spi,и инициализация комманд для начала работы драйвера
 
 
 
 digitalWrite(9, HIGH);
 digitalWrite(8, LOW);
 
 buttonState = digitalRead(9);

  if (buttonState == LOW) {
    
 
delay(10);  


           start();  
           
  } 
 

   }
   
   
   
void start(){ 
  
switch (pausable) {
    case 1:

  for(int i = timer; i > 0; i--){
    EEPROM.write(1, 0);
    EEPROM.write(1, i);
   //// 
  comm.digit(i, 1);//параметр 1 цифра,параметр 2 от 0 до 2. 0 ничего,1 горит значек плей,2 горит значек паузы.
  ////
  tone(3, 2000, 200);
  delay(1000);
  
if(i==1){
  EEPROM.write(1, 0);
  comm.digit(0, 2); //1 play 2 pause
  tone(3, 2000, 1500);
  delay(6000);
  
   
  
delay(1000);
digitalWrite(7, HIGH);
 digitalWrite(6, LOW);
delay(4000);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);
delay(3000);
  break;
  }
  
 }
 break; 
 
 case 2:
 valu=EEPROM.read(1);
 comm.digit(valu, 2);
 delay(100000);
 break; 
}
 
  
}
  

 

В общем я не могу никак сделать одну вещь.В общем по нажатию кнопки запускается функция start().Мне необходимо чтоб по второму нажатию кнопки функция start немедленно прекратила свою работу и переменная pausable добавилась на 1.А потом она должна возпроизвестись снова но так как pausable будет 2 то должен воспроизвестись уже case 2.У меня не выходит немедленно завершить работу цикла...По нажатию кнопки ничего не происходит и таймер всеравно считает вместо того чтоб стать на паузу...Помогите...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
 digitalWrite(9, HIGH);

Это с какой целью в loop ?

И еще, чтобы программу можно было без вопросов понять, пины лучше определить через #define, чтобы имена были читабельные и ошибок меньше будет. Например, так:

#define ZAPUSK_SCHETA 9
...

digitalWrite( ZAPUSK_SCHETA, HIGH );
...

А по существу, в функции start есть куча delay(...), потому прервать в таком виде не получится. Если переписать, например, на конечные автоматы, тогда вполне возможно. Читайте признанного в этом деле автора, цикл статей Татарчевского http://www.kit-e.ru/articles/circuit/2006_11_164.php

 

Maverik
Offline
Зарегистрирован: 12.09.2012

делайте обработку нажатия кнопки прерываниями.

http://arduino.ru/Tutorial/Arduino_Interrupts

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Maverik пишет:

делайте обработку нажатия кнопки прерываниями.

http://arduino.ru/Tutorial/Arduino_Interrupts

Интересно, как это поможет ТС вот в этом "Мне необходимо чтоб по второму нажатию кнопки функция start немедленно прекратила свою работу"?

 

goldpistol
Offline
Зарегистрирован: 01.10.2014

ребят,а если использовать goto?типа если равно тому то то немедленно перебросить к case 2?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А посреди delay(6000); тоже goto поставить? Это не прервешь.