Помогите завершить цикл for не могу разобраться!

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

Корроче нашел на просторах интернета скетч для шкатулки с замком, но решил её усовершенствовать добавив в ней светодиодную ленту, ну короче не могу завершить цикл for с радугой когда шкатулка открыта. При нажатии на дотчик не происходит ничего!! ПОМ

oid open_cap() {
    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();
     }
  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 ila = 0; ila < 10000000000; ila++ ) {
      loper();
      }
  }
  }
Тут и как она разгорается и как открывается и светит радуга

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

Это эффект радуги.


Когда открыта мне в конце надо что бы она перестала крутиться по кругу!!

ОГИТЕ!!

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

NaVAnO пишет:

ну короче не могу завершить цикл

А код нормально вставить можете? Попробуйте.

Кстати. есть ощущение, что Вы это цикл уже месяц завершаете, там поди уж и миллис переполнился, а Вы всё никак не можете выполнить то, что Вам умный человек посоветовал.

b707
Offline
Зарегистрирован: 26.05.2017

а где в этом коде датчик?

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 sensCOU 2      // питание сенсора
#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);
  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() {
    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();
     }
  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 ila = 0; ila < 10000000000; ila++ ) {
      loper();
      }
  }
  }

  

void close_cap() {
  if (debug) Serial.println("close cap");
  ad();
  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 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);
  }
}  

#include "Adafruit_NeoPixel.h"
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);


void ad() {
    strip.setPixelColor(i, 0x000000);     // залить чёрным
    strip.show();                         // отправить на ленту
    delay(10);
  }

 

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(50);
  }

  





//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);
//  }
//}








  

 

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

Все дал

 

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

NaVAnO пишет:

Все дал

А теперь прочитайте последнее предложение в #1 и идите, делайте, что Вам сказали ещё месяц назад. Сделали бы тогда, сейчас бы этого поста не было бы.

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

Да нет когда я ставлю break цикл даже не начинается 

 

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

При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.

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

ЕвгенийП пишет:

При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.

А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))

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

Так новички же не хотят долго кидать - им "всё и сразу".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

тут не первый год на сайте, но на скетч в 400 строк еще не замахиваюсь даже, узнаёшь и, всё интереснее и интереснее )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bwn пишет:

А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))

Если в наборе только буквы О, П, Ж и А, то ждать придется очень долго.