подскажите пожалуйста

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 5 окт 2017.

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    День всем добрый. ситуация такая. Делаю кодовый замок с ИК пультом в качестве ключа. в Дуню для обработки с пульта приходят 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++;
    }
    первый вариант в принципе меня устраивает, но может это возможно красивее сделать?
     
  2. AlexU

    AlexU Гуру

    Можно.
    Второй вариант лучше -- он не требует доработок в случае масштабирования.

    И самое главное для случая, если используются МК типа ATmega328P (Arduino UNO) или аналогичные -- числа типа 'FF6897' в переменную типа 'int' не поместятся. Нужен тип 'long'. Хотя, если есть уверенность, что старший байт всегда 'FF', то его можно не хранить (вообще ни как не обрабатывать) и тогда можно использовать переменные типа 'int', которые будут хранить младшие два байта.
     
    CYITEP_BAC9I нравится это.
  3. DetSimen

    DetSimen Гик

    Код (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
     
    CYITEP_BAC9I нравится это.
  4. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо БОЛЬШОЕ!
     
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо за помощь в предидущем вопросе. очень помогли. теперь новая загвоздка.
    некорректно отрабатывается время. ниже 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 вариант пока проверить (партия Дунь пока в дороге из китая) не получится
    Гляньте плиз на код у кого желание возникнет, может ошибка где. Заранее благодарен. Вася
     
  6. DIYMan

    DIYMan Гуру

    Хинт: статические переменные инициализируются один раз, при первом попадании в область видимости. Вы же - в некоторых местах оставляете их застывшими на одном значении, полученном при первой инициализации. Например, это касается переменных TIMEOUT_duration_2 и Signal_duration ;) После истечения интервала в них надо заносить значение millis(), как минимум ;)
     
    CYITEP_BAC9I нравится это.
  7. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо, исправил. Но дело все же в Дуне, я так думаю. сделал простенький скетч чтоб при нажатии на кнопу получать millis() в сериал мониторе и нажимал каждую минуту по секундомеру. так там такая фигня в мониторе была:eek:. в среднем более чем в полтора раза больше насчитывалось чем должно было быть. какая микросхема на МК не понять, вообще без маркировки. В общем у меня эксклюзивная "разогннанная" Дуня про мини))). ( плохо что нестабильная:))