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

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

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

01oid open_cap() {
02    for (int ib = 0 ; ib < 255; ib++ )
03  {
04    ibright++;
05    for (int i = 0 ; i < NUM_LEDS; i++ )
06    {
07      leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright    ihue, isat, ibright
08    }
09    LEDS.show();
10     }
11  if (debug) Serial.println("open cap");
12  digitalWrite(servoVCC, 1);
13  for (int i = close_angle; i < open_angle; i++) {
14    servo.write(i);
15    Serial.println(i);
16  }
17  {
18  digitalWrite(servoVCC, 0);
19            for (int ila = 0; ila < 10000000000; ila++ ) {
20      loper();
21      }
22  }
23  }
24Тут и как она разгорается и как открывается и светит радуга
25 
26void loper() {
27 for (int i = 0; i < 29; i++ ) {
28   leds[i] = CHSV(counter + i * 2, 255, 255);
29  }
30  counter++;
31 FastLED.show();
32 delay(50);
33  }
34 
35Это эффект радуги.
36 
37 
38Когда открыта мне в конце надо что бы она перестала крутиться по кругу!!

ОГИТЕ!!

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

NaVAnO пишет:

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

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

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

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

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

NaVAnO
Offline
Зарегистрирован: 13.08.2018
001/*
002  Замок с сервоприводом и секретным стуком
003  При старте системы крышка открывается, ожидается ввод секретной комбинации
004  Если комбинация не вводится в течение 5 секунд, замок будет открываться по одному "стуку"
005  После ввода комбинации (таймаут 5 секунд), пищалка играет комбинацию и закрывает замок
006  Для открытия нужно просто простукать комбинацию
007  Для повторного закрытия "ткнуть" один раз, либо нажать внутреннюю кнопку
008 
009  Система использует аппаратные прерывания, что позволяет находиться в режиме сна,
010  а также очень чётко отрабатывать "стуки", практически без ошибок.
011  Хотел допилить запись в EEPROM, но не сегодня =)
012*/
013 
014//----- НАСТРОЙКИ -----
015#define difficulty 100  // миллисекунд на реакцию (плюс минус)
016#define max_knock 30    // число запоминаемых "стуков"
017#define close_angle 80  // угол закрытия
018#define open_angle 180  // угол открытия
019#define debug 1         // режим отладки - вывод в порт информации о процессе игры
020//----- НАСТРОЙКИ -----
021 
022#include <Servo.h>
023Servo servo;
024#define buzzPin 7       // пин пищалки
025#define buzzGND 6       // земля пищалки
026#define sensGND 5       // земля сенсора
027#define sensVCC 4  
028#define sensCOU 2      // питание сенсора
029#define servoVCC 8      // питание серво
030#define servoPin 13     // серво
031 
032#include "FastLED.h"          // библиотека для работы с лентой
033#define NUM_LEDS 29          // число светодиодов в кольце/ленте
034CRGB leds[NUM_LEDS];
035#define PIN 3 
036#define COLOR_ORDER RGB
037 
038int ibright = 0;
039int i = 0;
040int thishue = 100;
041int thissat = 100;
042int thisdelay = 50;
043int thisstep = 10;
044int isat = 100; 
045float tcount = 0.0;
046int ihue = 100;
047int idex = 0;  
048int bouncedirection = 0;
049int BOTTOM_INDEX = 0;
050int TOP_INDEX = int(NUM_LEDS / 2);
051int EVENODD = NUM_LEDS % 2;
052int horizontal_index(int i) {
053  //-ONLY WORKS WITH INDEX < TOPINDEX
054  if (i == BOTTOM_INDEX) {
055    return BOTTOM_INDEX;
056  }
057  if (i == TOP_INDEX && EVENODD == 1) {
058    return TOP_INDEX + 1;
059  }
060  if (i == TOP_INDEX && EVENODD == 0) {
061    return TOP_INDEX;
062  }
063  return NUM_LEDS - i;
064}
065 
066 
067#include <TimerOne.h>
068#include <LowPower.h>      // библиотека сна
069byte fade_count, knock;
070volatile byte mode;
071boolean cap_flag, write_start;
072volatile boolean debonce_flag, threshold_flag;
073volatile unsigned long debounce_time;
074unsigned long last_fade, last_try, last_knock, knock_time, button_time;
075 
076byte count, try_count;
077int wait_time[max_knock], min_wait[max_knock], max_wait[max_knock];
078 
079byte counter;
080 
081 
082 
083void setup() {
084 
085  Serial.begin(9600);
086  if (debug) Serial.println("system start");
087  delay(50);
088  pinMode(2, INPUT);              // пин датчика вибрации или кнопка
089  pinMode(3, INPUT_PULLUP);       // пин датчика вибрации или кнопка
090  servo.attach(servoPin);
091 
092    FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
093  FastLED.setBrightness(50);
094  pinMode(13, OUTPUT);
095  all_leds_off(0, 0, 0);
096  LEDS.show();
097  
098 
099 
100  // настраиваем пины питания как выходы
101  pinMode(buzzPin, OUTPUT);
102  pinMode(buzzGND, OUTPUT);
103  pinMode(sensGND, OUTPUT);
104  pinMode(sensVCC, OUTPUT);
105  pinMode(servoVCC, OUTPUT);
106  pinMode(13, OUTPUT);
107 
108  // подаём нужные сигналы
109  digitalWrite(buzzPin, 0);
110  digitalWrite(buzzGND, 0);
111  digitalWrite(sensGND, 0);
112  digitalWrite(sensVCC, 1);
113 
114  digitalWrite(servoVCC, 1);
115  servo.write(open_angle);
116  delay(1000);
117  digitalWrite(servoVCC, 0);
118   
119  attachInterrupt(0, threshold, RISING);     // прерывание датчика
120  attachInterrupt(1, buttonPress, FALLING);  // прерывание кнопки выключить
121  threshold_flag = 0;
122 
123  knockWrite();
124 
125  delay(50);
126  close_cap();
127  good_night();                  // сразу спать
128}
129 
130void knockWrite() {                                 // режим записи стука
131  if (debug) Serial.println("knock write mode");
132  last_knock = millis();
133  knock = 0;
134  while (1) {                                     // ждём первого удара
135    if (millis() - last_knock > 5000) {           // если 5 секунд не ударяли
136      write_start = 0;                            // всё сбросить, выйти из режима
137      break;
138    }
139    if (threshold_flag) {                         // если ударили
140      write_start = 1;                            // разрешить запись
141      tone(buzzPin, 400, 50);                 // пикнуть дрыгнуть
142      last_knock = millis();
143      threshold_flag = 0;
144      if (debug) Serial.println("knock");
145      break;
146    }
147  }
148 
149 
150 
151  if (write_start) {                                  // если запись пошла
152    while (1) {
153      if (threshold_flag) {
154        knock_time = millis() - last_knock;           // расчёт времени между стуками
155        wait_time[knock] = knock_time;                // записать
156        min_wait[knock] = knock_time - difficulty;    // определить время с учётом времени реакции
157        max_wait[knock] = knock_time + difficulty;    // определить время с учётом времени реакции
158        knock++;                                      // перейти к следующему
159        tone(buzzPin, 400, 50);                                  // пикнуть дрыгнуть
160        last_knock = millis();
161        threshold_flag = 0;
162        if (debug) Serial.println("knock");
163      }
164      if (millis() - last_knock > 3000) {
165        break;
166      }
167    }
168    // показать комбинацию "раунда"
169    tone(buzzPin, 400, 50);                         // пыхнуть светодиодом
170    for (byte i = 0; i < knock; i++) {
171      delay(wait_time[i]);                          // ждать время шага одного хода
172      tone(buzzPin, 400, 50);                       // пыхнуть светодиодом
173      if (debug) Serial.println(wait_time[i]);
174    }
175    mode = 0;                            // перейти в режим игры
176  }
177 
178}
179 
180void loop() {
181 
182  if (threshold_flag && mode == 0) {
183    threshold_flag = 0;
184    if (knock == 0) {
185      mode = 3;
186      goto openCap;
187    }
188    debounce_time = millis();
189    last_try = millis();      // обнулить таймер
190    tone(buzzPin, 400, 50);
191    try_count = 0;
192    threshold_flag = 0;
193    while (1) {
194 
195      // если не нажал в установленное время (проигрыш)
196      if (millis() - last_try > max_wait[try_count]) {
197        // мигнуть красным два раза
198        tone(buzzPin, 400, 50);
199        delay(1000);
200        mode = 0;             // перейти в начало! Это начало нового раунда
201        if (debug) Serial.println("too slow");
202        threshold_flag = 0;
203        break;
204      }
205      if (threshold_flag) {
206 
207        // если нажатие попало во временной диапазон (правильное нажатие)
208        if (millis() - last_try > min_wait[try_count] && millis() - last_try < max_wait[try_count]) {
209          tone(buzzPin, 400, 50);               // мигнуть
210          try_count++;               // увеличить счётчик правильных нажатий
211          last_try = millis();       // ВОТ ТУТ СЧЁТЧИК СБРАСЫВАЕТСЯ, ЧТОБЫ УБРАТЬ ВЛИЯНИЕ ЗАДЕРЖЕК!
212          threshold_flag = 0;        // сбросить флаг
213          if (debug) Serial.println("good");
214 
215          // если нажал слишком рано (проигрыш)
216        } else if (millis() - last_try < min_wait[try_count] && threshold_flag) {
217          tone(buzzPin, 400, 50);
218          delay(100);
219          tone(buzzPin, 400, 50);        // мигнуть красным дважды
220          delay(1000);
221          mode = 0;            // перейти в начало! Это начало нового раунда
222          if (debug) Serial.println("too fast");
223          threshold_flag = 0;
224          break;
225        }
226 
227        // если число правильных нажатий совпало с нужным для раунда (выигрыш)
228        if (try_count == knock) {
229          // мигнуть 3 раза
230          delay(200);
231          tone(buzzPin, 400, 50);
232          delay(200);
233          tone(buzzPin, 400, 50);
234          delay(200);
235          tone(buzzPin, 400, 50);
236          delay(200);
237          mode = 3;   // перейти к действию при выигрыше
238          if (debug) Serial.println("victory");
239          break;
240        }
241      }
242    }
243  }
244 
245 
246 
247  if (mode == 3) {
248openCap:
249    mode = 4;
250    delay(500);
251    open_cap();
252    good_night();
253  }
254 
255 
256  if ((threshold_flag && mode == 4) || mode == 5) {
257    mode = 0;
258    delay(500);
259    close_cap();
260    good_night();
261  }
262 
263  if (millis() - debounce_time > 10000 || mode == 4) {
264    good_night();
265  }
266}
267 
268void threshold() {
269  if (millis() - debounce_time > 50) debonce_flag = 1;
270  if (debonce_flag) {
271    debounce_time = millis();
272    threshold_flag = 1;
273    debonce_flag = 0;
274  }
275}
276 
277void buttonPress() {
278  if (mode == 4) {
279    mode = 5;
280  }
281}
282 
283void good_night() {
284  if (debug) {
285    Serial.println("good night");
286    delay(50);
287  }
288  delay(5);
289  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);    // спать. mode POWER_OFF, АЦП выкл
290}
291 
292void open_cap() {
293    for (int ib = 0 ; ib < 255; ib++ )
294  {
295    ibright++;
296    for (int i = 0 ; i < NUM_LEDS; i++ )
297    {
298      leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright    ihue, isat, ibright
299    }
300    LEDS.show();
301     }
302  if (debug) Serial.println("open cap");
303  digitalWrite(servoVCC, 1);
304  for (int i = close_angle; i < open_angle; i++) {
305    servo.write(i);
306    Serial.println(i);
307  }
308  {
309  digitalWrite(servoVCC, 0);
310            for (int ila = 0; ila < 10000000000; ila++ ) {
311      loper();
312      }
313  }
314  }
315 
316   
317 
318void close_cap() {
319  if (debug) Serial.println("close cap");
320  ad();
321  digitalWrite(servoVCC, 1);
322  for (int i = open_angle; i > close_angle; i--) {
323    servo.write(i);
324    Serial.println(i);
325    delay(0);
326  }
327}
328 
329void appa()
330{
331  for (int ib = 0 ; ib < 255; ib++ )
332  {
333    ibright++;
334    for (int i = 0 ; i < NUM_LEDS; i++ )
335    {
336      leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright    ihue, isat, ibright
337    }
338    LEDS.show();
339  }
340}
341 
342void lirickl() {
343  ihue -= 1;
344  fill_rainbow( leds, NUM_LEDS, ihue );
345  LEDS.show();
346  delay(thisdelay);
347}
348 
349void all_leds_off(int cred, int cgrn, int cblu)
350{
351  for(int i = 0 ; i < NUM_LEDS; i++ )
352  {
353    leds[i].setRGB( 0, 0, 0);
354  }
355
356 
357#include "Adafruit_NeoPixel.h"
358Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
359 
360 
361void ad() {
362    strip.setPixelColor(i, 0x000000);     // залить чёрным
363    strip.show();                         // отправить на ленту
364    delay(10);
365  }
366 
367  
368 
369void setPixel(int Pixel, byte red, byte green, byte blue) {
370  leds[Pixel].r = red;
371  leds[Pixel].g = green;
372  leds[Pixel].b = blue;
373}
374 
375void loper() {
376 for (int i = 0; i < 29; i++ ) {
377   leds[i] = CHSV(counter + i * 2, 255, 255);
378  }
379  counter++;
380 FastLED.show();
381 delay(50);
382  }
383 
384   
385 
386 
387 
388 
389 
390//void appa()
391//{
392  //for (int ib = 0 ; ib < 255; ib++ )
393  //{
394   // ibright++;
395   // for (int i = 0 ; i < NUM_LEDS; i++ )
396  //  {
397   //   leds[i] = CHSV(ihue, isat, ibright); //   thishue, thissat, ibright
398  //  }
399  //  LEDS.show();
400  //  delay(6);
401//  }
402//}

 

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 пишет:

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

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