День всем добрый. ситуация такая. Делаю кодовый замок с ИК пультом в качестве ключа. в Дуню для обработки с пульта приходят HEX значения. типа 0 FF6897 1 FF30CF 2 FF18E7 3 FF7A85 и т.д. а мне нужно что бы при обработке введенного кода они шли как 1,2,3,4. Допустим пришло FF30CF в массив куда собираются введенные данные пошла 1. пока что сделал так Код (C++): if (irrecv.decode(&results)) // получение данных с пульта { int res = results.value; // присвоение переменной данных с пульта Serial.println(res, HEX); if(res==FF30CF)// если пришло FF30CF { ENTERED_combination[i] =1; // то в 0 ячейку массива записываем 1 i++; // добавлем 1 к позиции ячейки, что бы следующее пришедшее число записалось в 1 ячейку } else if (res==FF18E7) // если пришло FF18E7 { ENTERED_combination[i] =2; //то в 0 ячейку массива записываем 2 i++; } //и так далее с вариантами для каждой комбинации delay(100); дико громозко и неудобно. можно ли сделать так, что пришло допустим FF30CF и далее в скетче это шло как 1. или можно записывать в массив данные прям в НЕХ, ENTERED_combination[] {FF6897, FF30CF, FF18E7, FF7A85} ? Наверное не сильно внятно написал, но старался как мог) и еще вопрос. как можно удобнее сравнивать значения массивов. пока что делаю так Код (C++): if ( CODE[0] == ENTERED_combination[0] || CODE[1] == ENTERED_combination[1] || CODE[2] == ENTERED_combination[2] ||CODE[3] == ENTERED_combination[3]); ну и как вариант с приращением типа Код (C++): yte i ==0; if ( CODE[i] == ENTERED_combination[i]) { i++; } первый вариант в принципе меня устраивает, но может это возможно красивее сделать?
Можно. Второй вариант лучше -- он не требует доработок в случае масштабирования. И самое главное для случая, если используются МК типа ATmega328P (Arduino UNO) или аналогичные -- числа типа 'FF6897' в переменную типа 'int' не поместятся. Нужен тип 'long'. Хотя, если есть уверенность, что старший байт всегда 'FF', то его можно не хранить (вообще ни как не обрабатывать) и тогда можно использовать переменные типа 'int', которые будут хранить младшие два байта.
Код (C++): const int CodeArray[] ={0x6897,0x30CF,0x18E7,0x7A85}; int GetCode(int code) { for (byte i=0; i<4; i++) if (code==CodeArray[i] return i; return -1; // если такого кода не нашли } это с отброшенным ведущим FF
спасибо за помощь в предидущем вопросе. очень помогли. теперь новая загвоздка. некорректно отрабатывается время. ниже 2 куска кода Код (C++): while (TIMEOUT ==1) // ЦИКЛ ЗАДЕРЖКИ НА 10 МИНУТ после 3 неверно введенных паролей { Serial.println("TIMEOUT"); static unsigned long TIMEOUT_duration_2 = millis(); if (millis() - TIMEOUT_duration_2 > 600000 )//после 10 минут задержки возврат в цикл ввода кода { Error_counter =0; // обнуляем счетчик ошибок ERROR_timeout =0; TIMEOUT=0; Signal_switch =0; CLOSING_waiting =0; OPENING_waiting =1;// после 10 минутной задержки возвращаемся в цикл ожидания ввода кода } } и Код (C++): void Incorrect_code_3() { Serial.println("Signal_duration3"); //3 ошибочно введенная комбинация Serial.println (millis()); static unsigned long Signal_duration = millis(); // засекаем начало отсчета static unsigned long pulse_generator_100 = millis(); // точка остчета для пьезоизлучателя(активного) if (millis() - pulse_generator_100 > 100 && Signal_switch ==0) { pulse_generator_100 = millis(); digitalWrite(Cheep, !digitalRead(Cheep)); // пикаем через каждые 100 мс } if (millis() - Signal_duration > 60000) // черз минут прекращаем пикать { digitalWrite(Cheep, 0); // останавливаем пищалку Signal_switch =1; CLOSING_waiting =0; OPENING_waiting =1;//возвращаемся в цикл ожидания ввода кода TIMEOUT =0; ERROR_timeout =0; } } в общем дело в следующем в первом случае задержка любых действий, при 4 ошибочных нажатиях. вместо написанных в коде 10 минут (600000 мск) отрабатывает 1-5 минут. во втором куске та же история, вместо минуты, отрабатывает 10-30 секунд. каждый раз интервал срабатывания непредсказуемый. так же звук пишалки силно плывет на слух. то ускоряется то замедляется. у меня есть 2 предположения 1. глючит кварц или сам чип (ардуино про мини) 2 или я налажал гдето то в коде. 1 вариант пока проверить (партия Дунь пока в дороге из китая) не получится Гляньте плиз на код у кого желание возникнет, может ошибка где. Заранее благодарен. Вася
Хинт: статические переменные инициализируются один раз, при первом попадании в область видимости. Вы же - в некоторых местах оставляете их застывшими на одном значении, полученном при первой инициализации. Например, это касается переменных TIMEOUT_duration_2 и Signal_duration После истечения интервала в них надо заносить значение millis(), как минимум
спасибо, исправил. Но дело все же в Дуне, я так думаю. сделал простенький скетч чтоб при нажатии на кнопу получать millis() в сериал мониторе и нажимал каждую минуту по секундомеру. так там такая фигня в мониторе была. в среднем более чем в полтора раза больше насчитывалось чем должно было быть. какая микросхема на МК не понять, вообще без маркировки. В общем у меня эксклюзивная "разогннанная" Дуня про мини))). ( плохо что нестабильная)