Корроче нашел на просторах интернета скетч для шкатулки с замком, но решил её усовершенствовать добавив в ней светодиодную ленту, ну короче не могу завершить цикл for с радугой когда шкатулка открыта. При нажатии на дотчик не происходит ничего!! ПОМ
02 | for ( int ib = 0 ; ib < 255; ib++ ) |
05 | for ( int i = 0 ; i < NUM_LEDS; i++ ) |
07 | leds[i] = CHSV(ihue, isat, ibright); |
11 | if (debug) Serial .println( "open cap" ); |
12 | digitalWrite(servoVCC, 1); |
13 | for ( int i = close_angle; i < open_angle; i++) { |
18 | digitalWrite(servoVCC, 0); |
19 | for ( int ila = 0; ila < 10000000000; ila++ ) { |
24 | Тут и как она разгорается и как открывается и светит радуга |
27 | for ( int i = 0; i < 29; i++ ) { |
28 | leds[i] = CHSV(counter + i * 2, 255, 255); |
38 | Когда открыта мне в конце надо что бы она перестала крутиться по кругу!! |
ОГИТЕ!!
ну короче не могу завершить цикл
А код нормально вставить можете? Попробуйте.
Кстати. есть ощущение, что Вы это цикл уже месяц завершаете, там поди уж и миллис переполнился, а Вы всё никак не можете выполнить то, что Вам умный человек посоветовал.
а где в этом коде датчик?
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>
023
Servo 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 // число светодиодов в кольце/ленте
034
CRGB leds[NUM_LEDS];
035
#define PIN 3
036
#define COLOR_ORDER RGB
037
038
int
ibright = 0;
039
int
i = 0;
040
int
thishue = 100;
041
int
thissat = 100;
042
int
thisdelay = 50;
043
int
thisstep = 10;
044
int
isat = 100;
045
float
tcount = 0.0;
046
int
ihue = 100;
047
int
idex = 0;
048
int
bouncedirection = 0;
049
int
BOTTOM_INDEX = 0;
050
int
TOP_INDEX =
int
(NUM_LEDS / 2);
051
int
EVENODD = NUM_LEDS % 2;
052
int
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> // библиотека сна
069
byte
fade_count, knock;
070
volatile
byte
mode;
071
boolean cap_flag, write_start;
072
volatile boolean debonce_flag, threshold_flag;
073
volatile unsigned
long
debounce_time;
074
unsigned
long
last_fade, last_try, last_knock, knock_time, button_time;
075
076
byte
count, try_count;
077
int
wait_time[max_knock], min_wait[max_knock], max_wait[max_knock];
078
079
byte
counter;
080
081
082
083
void
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
130
void
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
180
void
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) {
248
openCap:
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
268
void
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
277
void
buttonPress() {
278
if
(mode == 4) {
279
mode = 5;
280
}
281
}
282
283
void
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
292
void
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
318
void
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
329
void
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
342
void
lirickl() {
343
ihue -= 1;
344
fill_rainbow( leds, NUM_LEDS, ihue );
345
LEDS.show();
346
delay(thisdelay);
347
}
348
349
void
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"
358
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
359
360
361
void
ad() {
362
strip.setPixelColor(i, 0x000000);
// залить чёрным
363
strip.show();
// отправить на ленту
364
delay(10);
365
}
366
367
368
369
void
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
375
void
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
//}
Все дал
Все дал
А теперь прочитайте последнее предложение в #1 и идите, делайте, что Вам сказали ещё месяц назад. Сделали бы тогда, сейчас бы этого поста не было бы.
Да нет когда я ставлю break цикл даже не начинается
При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.
При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.
А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))
Так новички же не хотят долго кидать - им "всё и сразу".
тут не первый год на сайте, но на скетч в 400 строк еще не замахиваюсь даже, узнаёшь и, всё интереснее и интереснее )))
А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))
Если в наборе только буквы О, П, Ж и А, то ждать придется очень долго.