Помогите завершить цикл for не могу разобраться!
- Войдите на сайт для отправки комментариев
Ср, 24/04/2019 - 18:32
Корроче нашел на просторах интернета скетч для шкатулки с замком, но решил её усовершенствовать добавив в ней светодиодную ленту, ну короче не могу завершить цикл 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);
}
Это эффект радуги.
Когда открыта мне в конце надо что бы она перестала крутиться по кругу!!
ОГИТЕ!!
ну короче не могу завершить цикл
А код нормально вставить можете? Попробуйте.
Кстати. есть ощущение, что Вы это цикл уже месяц завершаете, там поди уж и миллис переполнился, а Вы всё никак не можете выполнить то, что Вам умный человек посоветовал.
а где в этом коде датчик?
/* Замок с сервоприводом и секретным стуком При старте системы крышка открывается, ожидается ввод секретной комбинации Если комбинация не вводится в течение 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); // } //}Все дал
Все дал
А теперь прочитайте последнее предложение в #1 и идите, делайте, что Вам сказали ещё месяц назад. Сделали бы тогда, сейчас бы этого поста не было бы.
Да нет когда я ставлю break цикл даже не начинается
При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.
При чём "ставлю break"? Вам там посоветовали изучить язык, книжки почитать, а не пихать непонятные слова в непонятные, чужие коды. Вот и займитесь этим, наконец.
А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))
Так новички же не хотят долго кидать - им "всё и сразу".
тут не первый год на сайте, но на скетч в 400 строк еще не замахиваюсь даже, узнаёшь и, всё интереснее и интереснее )))
А некоторые оптимисты, утверждают, что если достаточно долго кидать на землю типографский шрифт, когда- нибудь выпадет "Война и Мир".))))))
Если в наборе только буквы О, П, Ж и А, то ждать придется очень долго.