Не могу разобраться

NaVAnO
Offline
Зарегистрирован: 13.08.2018

У меня есть цикл и мне надо прекратить его по нажатию на сенсорный датчик, и перейти к следующему действию.

bwn
Offline
Зарегистрирован: 25.08.2014

А кто посмел запретить? Никого не бойтесь, переходите.

NaVAnO
Offline
Зарегистрирован: 13.08.2018

В смысле я просто вообще новичок и не знаю как это сделать?

mixail844
Offline
Зарегистрирован: 30.04.2012

NaVAnO пишет:
У меня есть цикл и мне надо прекратить его по нажатию на сенсорный датчик, и перейти к следующему действию.

Покажите код ,как пытаетесь остановить ? по какмим признакам определили что он не прекращаеться ? 

bwn
Offline
Зарегистрирован: 25.08.2014

От новичка, я в "Песочницу" перебазирую, пускай начало приколоченной темы почитает.

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Весь или часть? Я просто скачал скетч и пытаюсь дороботать.

NaVAnO
Offline
Зарегистрирован: 13.08.2018
void open_cap() {
  if (debug) Serial.println("open cap");
  digitalWrite(servoVCC, 1);
  for (int i = close_angle; i < open_angle; i++) {
    servo.write(i);
    Serial.println(i);
  }
  digitalWrite(servoVCC, 0);

   for (int i = 0; i < close_cap; i++ ) {
    loper();
  }
  }

void close_cap() {
  if (debug) Serial.println("close cap");
  oppo();
  digitalWrite(servoVCC, 1);
  for (int i = open_angle; i > close_angle; i--) {
    servo.write(i);
    Serial.println(i);
    delay(0);
  }
}

void loper() {
 for (int i = 0; i < 29; i++ ) {
   leds[i] = CHSV(counter + i * 2, 255, 255);
  }
  counter++;
 FastLED.show();
  delay(20); 
  }

 

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Мне надо что бы в void openCap loper прекратился и начался closeCap

 

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Что мне надо вписать в 10 строке что бы прекратить цикл?

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Вместо closeCap

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Я написал его обновите страницу

bwn
Offline
Зарегистрирован: 25.08.2014

NaVAnO пишет:

Что мне надо вписать в 10 строке что бы прекратить цикл?

break;
Только это вам не поможет. Кроме него много чего надо написать, а лучше, переписать все.

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Не нада мне надо только сделать что бы цикл прекратился.

sadman41
Offline
Зарегистрирован: 19.10.2016

А где кнопка в коде?

NaVAnO
Offline
Зарегистрирован: 13.08.2018
#define difficulty 100  // миллисекунд на реакцию (плюс минус)
#define max_knock 30    // число запоминаемых "стуков"
#define close_angle 80  // угол закрытия
#define open_angle 180  // угол открытия
#define debug 1         // режим отладки - вывод в порт информации о процессе игры
//----- НАСТРОЙКИ -----

#include <Servo.h>
Servo servo;
#define buzzPin 7       // пин пищалки
#define buzzGND 6       // земля пищалки
#define sensGND 5       // земля сенсора
#define sensVCC 4       // питание сенсора
#define servoVCC 8      // питание серво
#define servoPin 13     // серво 

#include "FastLED.h"          // библиотека для работы с лентой
#define NUM_LEDS 29          // число светодиодов в кольце/ленте
CRGB leds[NUM_LEDS];
#define PIN 3  
#define COLOR_ORDER RGB

int ibright = 0;
int i = 0;
int thishue = 100;
int thissat = 100;
int thisdelay = 50;
int thisstep = 10; 
int isat = 100;  
float tcount = 0.0; 
int ihue = 100; 
int idex = 0;   
int bouncedirection = 0; 
int BOTTOM_INDEX = 0; 
int TOP_INDEX = int(NUM_LEDS / 2);
int EVENODD = NUM_LEDS % 2;
int horizontal_index(int i) {
  //-ONLY WORKS WITH INDEX < TOPINDEX
  if (i == BOTTOM_INDEX) {
    return BOTTOM_INDEX;
  }
  if (i == TOP_INDEX && EVENODD == 1) {
    return TOP_INDEX + 1;
  }
  if (i == TOP_INDEX && EVENODD == 0) {
    return TOP_INDEX;
  }
  return NUM_LEDS - i;
}


#include <TimerOne.h>
#include <LowPower.h>      // библиотека сна
byte fade_count, knock;
volatile byte mode;
boolean cap_flag, write_start;
volatile boolean debonce_flag, threshold_flag;
volatile unsigned long debounce_time;
unsigned long last_fade, last_try, last_knock, knock_time, button_time;

byte count, try_count;
int wait_time[max_knock], min_wait[max_knock], max_wait[max_knock];

byte counter;

 

NaVAnO
Offline
Зарегистрирован: 13.08.2018
/*
  Замок с сервоприводом и секретным стуком
  При старте системы крышка открывается, ожидается ввод секретной комбинации
  Если комбинация не вводится в течение 5 секунд, замок будет открываться по одному "стуку"
  После ввода комбинации (таймаут 5 секунд), пищалка играет комбинацию и закрывает замок
  Для открытия нужно просто простукать комбинацию
  Для повторного закрытия "ткнуть" один раз, либо нажать внутреннюю кнопку

  Система использует аппаратные прерывания, что позволяет находиться в режиме сна,
  а также очень чётко отрабатывать "стуки", практически без ошибок.
  Хотел допилить запись в EEPROM, но не сегодня =)
*/

//----- НАСТРОЙКИ -----
#define difficulty 100  // миллисекунд на реакцию (плюс минус)
#define max_knock 30    // число запоминаемых "стуков"
#define close_angle 80  // угол закрытия
#define open_angle 180  // угол открытия
#define debug 1         // режим отладки - вывод в порт информации о процессе игры
//----- НАСТРОЙКИ -----

#include <Servo.h>
Servo servo;
#define buzzPin 7       // пин пищалки
#define buzzGND 6       // земля пищалки
#define sensGND 5       // земля сенсора
#define sensVCC 4       // питание сенсора
#define servoVCC 8      // питание серво
#define servoPin 13     // серво 

#include "FastLED.h"          // библиотека для работы с лентой
#define NUM_LEDS 29          // число светодиодов в кольце/ленте
CRGB leds[NUM_LEDS];
#define PIN 3  
#define COLOR_ORDER RGB

int ibright = 0;
int i = 0;
int thishue = 100;
int thissat = 100;
int thisdelay = 50;
int thisstep = 10; 
int isat = 100;  
float tcount = 0.0; 
int ihue = 100; 
int idex = 0;   
int bouncedirection = 0; 
int BOTTOM_INDEX = 0; 
int TOP_INDEX = int(NUM_LEDS / 2);
int EVENODD = NUM_LEDS % 2;
int horizontal_index(int i) {
  //-ONLY WORKS WITH INDEX < TOPINDEX
  if (i == BOTTOM_INDEX) {
    return BOTTOM_INDEX;
  }
  if (i == TOP_INDEX && EVENODD == 1) {
    return TOP_INDEX + 1;
  }
  if (i == TOP_INDEX && EVENODD == 0) {
    return TOP_INDEX;
  }
  return NUM_LEDS - i;
}


#include <TimerOne.h>
#include <LowPower.h>      // библиотека сна
byte fade_count, knock;
volatile byte mode;
boolean cap_flag, write_start;
volatile boolean debonce_flag, threshold_flag;
volatile unsigned long debounce_time;
unsigned long last_fade, last_try, last_knock, knock_time, button_time;

byte count, try_count;
int wait_time[max_knock], min_wait[max_knock], max_wait[max_knock];

byte counter;



void setup() {

  Serial.begin(9600);
  if (debug) Serial.println("system start");
  delay(50);
  pinMode(2, INPUT);              // пин датчика вибрации или кнопка
  pinMode(3, INPUT_PULLUP);       // пин датчика вибрации или кнопка
  servo.attach(servoPin);

    FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(13, OUTPUT);
  all_leds_off(0, 0, 0);
  oppo();
  LEDS.show();
 


  // настраиваем пины питания как выходы
  pinMode(buzzPin, OUTPUT);
  pinMode(buzzGND, OUTPUT);
  pinMode(sensGND, OUTPUT);
  pinMode(sensVCC, OUTPUT);
  pinMode(servoVCC, OUTPUT);
  pinMode(13, OUTPUT);

  // подаём нужные сигналы
  digitalWrite(buzzPin, 0);
  digitalWrite(buzzGND, 0);
  digitalWrite(sensGND, 0);
  digitalWrite(sensVCC, 1); 

  digitalWrite(servoVCC, 1);
  servo.write(open_angle);
  delay(1000);
  digitalWrite(servoVCC, 0);
  
  attachInterrupt(0, threshold, RISING);     // прерывание датчика
  attachInterrupt(1, buttonPress, FALLING);  // прерывание кнопки выключить
  threshold_flag = 0;

  knockWrite();

  delay(50);
  close_cap();
  good_night();                  // сразу спать
}

void knockWrite() {                                 // режим записи стука
  if (debug) Serial.println("knock write mode");
  last_knock = millis();
  knock = 0;
  while (1) {                                     // ждём первого удара
    if (millis() - last_knock > 5000) {           // если 5 секунд не ударяли
      write_start = 0;                            // всё сбросить, выйти из режима
      break;
    }
    if (threshold_flag) {                         // если ударили
      write_start = 1;                            // разрешить запись
      tone(buzzPin, 400, 50);                 // пикнуть дрыгнуть
      last_knock = millis();
      threshold_flag = 0;
      if (debug) Serial.println("knock");
      break;
    }
  }



  if (write_start) {                                  // если запись пошла
    while (1) {
      if (threshold_flag) {
        knock_time = millis() - last_knock;           // расчёт времени между стуками
        wait_time[knock] = knock_time;                // записать
        min_wait[knock] = knock_time - difficulty;    // определить время с учётом времени реакции
        max_wait[knock] = knock_time + difficulty;    // определить время с учётом времени реакции
        knock++;                                      // перейти к следующему
        tone(buzzPin, 400, 50);                                  // пикнуть дрыгнуть
        last_knock = millis();
        threshold_flag = 0;
        if (debug) Serial.println("knock");
      }
      if (millis() - last_knock > 3000) {
        break;
      }
    }
    // показать комбинацию "раунда"
    tone(buzzPin, 400, 50);                         // пыхнуть светодиодом
    for (byte i = 0; i < knock; i++) {
      delay(wait_time[i]);                          // ждать время шага одного хода
      tone(buzzPin, 400, 50);                       // пыхнуть светодиодом
      if (debug) Serial.println(wait_time[i]);
    }
    mode = 0;                            // перейти в режим игры
  }

}

void loop() {

  if (threshold_flag && mode == 0) {
    threshold_flag = 0;
    if (knock == 0) {
      mode = 3;
      goto openCap;
    }
    debounce_time = millis();
    last_try = millis();      // обнулить таймер
    tone(buzzPin, 400, 50);
    try_count = 0;
    threshold_flag = 0;
    while (1) {

      // если не нажал в установленное время (проигрыш)
      if (millis() - last_try > max_wait[try_count]) {
        // мигнуть красным два раза
        tone(buzzPin, 400, 50);
        delay(1000);
        mode = 0;             // перейти в начало! Это начало нового раунда
        if (debug) Serial.println("too slow");
        threshold_flag = 0;
        break;
      }
      if (threshold_flag) {

        // если нажатие попало во временной диапазон (правильное нажатие)
        if (millis() - last_try > min_wait[try_count] && millis() - last_try < max_wait[try_count]) {
          tone(buzzPin, 400, 50);               // мигнуть
          try_count++;               // увеличить счётчик правильных нажатий
          last_try = millis();       // ВОТ ТУТ СЧЁТЧИК СБРАСЫВАЕТСЯ, ЧТОБЫ УБРАТЬ ВЛИЯНИЕ ЗАДЕРЖЕК!
          threshold_flag = 0;        // сбросить флаг
          if (debug) Serial.println("good");

          // если нажал слишком рано (проигрыш)
        } else if (millis() - last_try < min_wait[try_count] && threshold_flag) {
          tone(buzzPin, 400, 50);
          delay(100);
          tone(buzzPin, 400, 50);        // мигнуть красным дважды
          delay(1000);
          mode = 0;            // перейти в начало! Это начало нового раунда
          if (debug) Serial.println("too fast");
          threshold_flag = 0;
          break;
        }

        // если число правильных нажатий совпало с нужным для раунда (выигрыш)
        if (try_count == knock) {
          // мигнуть 3 раза
          delay(200);
          tone(buzzPin, 400, 50);
          delay(200);
          tone(buzzPin, 400, 50);
          delay(200);
          tone(buzzPin, 400, 50);
          delay(200);
          mode = 3;   // перейти к действию при выигрыше
          if (debug) Serial.println("victory");
          break;
        }
      }
    }
  }



  if (mode == 3) {
openCap:
    mode = 4;
    delay(500);
    open_cap();
    good_night();
  }


  if ((threshold_flag && mode == 4) || mode == 5) {
    mode = 0;
    delay(500);
    close_cap();
    good_night();
  }

  if (millis() - debounce_time > 10000 || mode == 4) {
    good_night();
  }
}

void threshold() {
  if (millis() - debounce_time > 50) debonce_flag = 1;
  if (debonce_flag) {
    debounce_time = millis();
    threshold_flag = 1;
    debonce_flag = 0;
  }
}

void buttonPress() {
  if (mode == 4) {
    mode = 5;
  }
}

void good_night() {
  if (debug) {
    Serial.println("good night");
    delay(50);
  }
  delay(5);
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);    // спать. mode POWER_OFF, АЦП выкл
}

void open_cap() {
  if (debug) Serial.println("open cap");
  digitalWrite(servoVCC, 1);
  for (int i = close_angle; i < open_angle; i++) {
    servo.write(i);
    Serial.println(i);
  }
  digitalWrite(servoVCC, 0);

   for (int i = 0; i < close_cap; i++ ) {
    loper();
  }
  }

void close_cap() {
  if (debug) Serial.println("close cap");
  oppo();
  digitalWrite(servoVCC, 1);
  for (int i = open_angle; i > close_angle; i--) {
    servo.write(i);
    Serial.println(i);
    delay(0);
  }
}


void appa()
{
  for (int ib = 0 ; ib < 255; ib++ )
  {
    ibright++;
    for (int i = 0 ; i < NUM_LEDS; i++ )
    {
      leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright    ihue, isat, ibright
    }
    LEDS.show();
  }
}

void oppo() {
 int r = 10;
  thisdelay = 20; thisstep = 10; thishue = 0; thissat = 255;
  one_color_all(0, 0, 0); LEDS.show(); delay(1200);
  for (int i = 0; i < r * 25; i++);
}

void one_color_all(int cred, int cgrn, int cblu) {       //-SET ALL LEDS TO ONE COLOR
  for (int i = 0 ; i < NUM_LEDS; i++ ) {
    leds[i].setRGB( cred, cgrn, cblu);
  }
}

void lirickl() {
  ihue -= 1;
  fill_rainbow( leds, NUM_LEDS, ihue );
  LEDS.show();
  delay(thisdelay);
}

void all_leds_off(int cred, int cgrn, int cblu)
{
  for(int i = 0 ; i < NUM_LEDS; i++ )
  {
    leds[i].setRGB( 0, 0, 0);
  }
}  

 

void setPixel(int Pixel, byte red, byte green, byte blue) {
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
}

void loper() {
 for (int i = 0; i < 29; i++ ) {
   leds[i] = CHSV(counter + i * 2, 255, 255);
  }
  counter++;
 FastLED.show();
  delay(20); 
  }





//void appa()
//{
  //for (int ib = 0 ; ib < 255; ib++ )
  //{
   // ibright++;
   // for (int i = 0 ; i < NUM_LEDS; i++ )
  //  {
   //   leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright
  //  }
  //  LEDS.show();
  //  delay(6);
//  }
//}








  

 

bwn
Offline
Зарегистрирован: 25.08.2014

NaVAnO пишет:

Не нада мне надо только сделать что бы цикл прекратился.

Ну так вставьте мой оператор, он и прекратиться, а можете просто закомментировать весь цикл, результат тот же будет.

NaVAnO
Offline
Зарегистрирован: 13.08.2018

Тут много лишнего не обращайте внимания

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый ТС, изучайте си! Вы (ну, не Вы, асоздатель программы) в строках 203, 224, 239 используете этот секретный оператор, но Вы даже не удосужились подумать, а зачем он нужен.

Помигайте светодиодами, а потом замахивайтесь такие серьезные программы менять.