консультация по ардуино

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

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Вечер всем добрый. Прошу посказки. Учебная работа сигнализация. есть 3 режима работы . Ожидание, слежение за коридором, слежение за комнатой. Все по отдельности работает. Но вот переключения режимов мне не даются пока. Суть такая. Дуня включется, датчики калибруются. и включается режим ожидания. затем с помощью кнопки! but_1 включается режим слежения за коридором, или кнопкой 2 режим слежения за комнатой (его еще не дописал) так вот видно еще опыта маловато. Где ошибаюсь не пойму, весь вечер бьюсь с этими case. люди опытные подскажите куда копать, а то уже замылился искать причину почему не переключаются режимы.

    Код (C++):
    [code]
    #define PirKoridor 2  // датчик в коридоре
    #define PirKomnata 3 // датчик в комнате
    #define but_1 4      // кнопка 1 включение режима слежения за коридором
    #define but_2 5      // кнопка 2 включение режима слежения за комнатой
    #define Led1 6       // дежурный светодиод мигает когда не выбран не одни режим
    #define Led2 7       // светодиод включер режим слежения за коридором
    #define Led3 8       // светодиод включер режим слежения за комнатой
    #define Rele 9       // включение сирены
    int ButtonDown1 = 0;
    int mode_selector = 0; // выбор режимов работы
    int PIR_KORIDOR = 1; // режим слежения за коридором
    int PIR_KOMNATA = 2; // режим слежения за комнатой
    int Waiting = 10;     // ожидание выбора режима



    int brightness1 = 0;     // для дежурного лед1(синий)  яркость светодиода
    int fadeAmount1 = 3;     // шаг изменения яркости
    unsigned long currentTime1;
    unsigned long loopTime1;

    unsigned long currentTime2; // для мигания вторым светодиодом
    unsigned long loopTime2;

    void setup() {
       delay (4000);
        pinMode(PirKoridor, INPUT);
        pinMode (PirKomnata, INPUT);
        pinMode (but_1, INPUT);
        pinMode (but_2, INPUT);
        pinMode (Rele, OUTPUT);
        pinMode (Led1, OUTPUT);
        pinMode (Led2, OUTPUT);
        pinMode (Led3, OUTPUT);
    digitalWrite(Rele, 1);
    digitalWrite(Led1, 0); // гасим светодиоды
    digitalWrite(Led2, 0);
    digitalWrite(Led3, 0);

      currentTime1 = millis(); // для дежурного светодиода
      loopTime1 = currentTime1;

      currentTime2 = millis();       //для тревоги коридорного светодиода
      loopTime2 = currentTime2;
      mode_selector = 3;

    }

    void loop(){
    int ButtonDown1 = digitalRead(but_1);

    if (ButtonDown1 == 1) {
    mode_selector = 1 ;
    }


    switch (mode_selector) {
        case 10:
             currentTime1 = millis();
      if(currentTime1 >= (loopTime1 + 20)){
        analogWrite (Led1, brightness1);    // устанавливаем значение на 9 ножке
        brightness1 = brightness1 + fadeAmount1;   // прибавляем шаг изменения яркости, которая установится в следующем цикле
        // если достигли мин. или макс. значения, то идем в обратную сторону (реверс):
        if (brightness1 == 0 || brightness1 == 255) {
          fadeAmount1 = -fadeAmount1 ;
        }  
        loopTime1 = currentTime1;
      }
            break;


       case 1:

        if (PirKoridor == 1) {  
        digitalWrite (Rele, LOW);
       
        currentTime2 = millis();                           // считываем время, прошедшее с момента запуска программы
        if(currentTime2 >= (loopTime2 + 50)){              // сравниваем текущий таймер с переменной loopTime + 0.25 секунда
        digitalWrite(Led2, !digitalRead(Led2));     // включаем/выключаем LED
        loopTime2 = currentTime2; }
          }
      if (PirKoridor == 0) {
            digitalWrite (Rele, HIGH);
             currentTime1 = millis();
      if(currentTime1 >= (loopTime1 + 20)){
        analogWrite (Led2, brightness1);
        brightness1 = brightness1 + fadeAmount1;
        if (brightness1 == 0 || brightness1 == 255) {
          fadeAmount1 = -fadeAmount1 ;
        }  
        loopTime1 = currentTime1;
       }
       }

            break;
         
        case 2:
       
            break;
    }
    }

     
    [/code]
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Переформулируйте свое описание проблемы так, чтобы она стала понятна не только вам.
     
    CYITEP_BAC9I нравится это.
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    сорри отчаянье виной той сумбурности. нужно сделать так чтобы после загрузки включался режим ожидания "case10:" потом при нажатии кнопки 1, перевести режим "в case1:" так вот он не переводится((( остается в режиме "case10:".
    при нажатии кнопки2 перевести в режим "case2:", ну и в финале одновременное нажатие кнопок 1 и 2 и удержание их в течении 2 сек, отключает сигнализацию. Могу конечно на if ах все написать, но хочется по взрослому на switch/case перейти.


    понятно что неправильно что то написал но вот что и где не пойму. (сечас выкинул все переменные и действия пытаюсь с голым кодом понять что натворил, может сам дойду, но здесь суперпрофи обитают много чего хорошего советуют:))
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if (PirKoridor == 1)
    PirKoridor никогда не будет ни 1, ни 0, ибо это константа, заданная в #define и всегда равная 2
     
    CYITEP_BAC9I нравится это.
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасиба большое большое!!!!))))) это я сглупил конкретно) спасибо за свежий взгляд!
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #define PIR_KORIDOR     2 // датчик в коридоре
    #define PIR_KOMNATA     3 // датчик в комнате
    #define BUTTON_KORIDOR  4 // кнопка 1 включение режима слежения за коридором
    #define BUTTON_KOMNATA  5 // кнопка 2 включение режима слежения за комнатой
    #define LED_WAIT        6 // дежурный светодиод мигает когда не выбран не одни режим
    #define LED_KORIDOR     7 // светодиод включер режим слежения за коридором
    #define LED_KOMNATA     8 // светодиод включер режим слежения за комнатой
    #define RELAY           9 // включение сирены
    #define EVENT(pin)      (digitalRead(pin))  //  макрос для удобства восприятия кода
    enum {WAIT, KORIDOR, KOMNATA, END}; // возможные режимы работы, в конце обязательно END
    byte mode; // текущий режим работы
    int brightness1 = 0;     // для дежурного лед1(синий)  яркость светодиода
    int fadeAmount1 = 3;     // шаг изменения яркости
    unsigned long currentTime1;
    unsigned long loopTime1;
    unsigned long currentTime2; // для мигания вторым светодиодом
    unsigned long loopTime2;

    void setup()
    {
      delay (4000);
      pinMode(PIR_KORIDOR, INPUT);
      pinMode (PIR_KOMNATA, INPUT);
      pinMode (BUTTON_KORIDOR, INPUT);
      pinMode (BUTTON_KOMNATA, INPUT);
      pinMode (RELAY, OUTPUT);
      pinMode (LED_WAIT, OUTPUT);
      pinMode (LED_KORIDOR, OUTPUT);
      pinMode (LED_KOMNATA, OUTPUT);
      digitalWrite(RELAY, 1);
      digitalWrite(LED_WAIT, 0); // гасим светодиоды
      digitalWrite(LED_KORIDOR, 0);
      digitalWrite(LED_KOMNATA, 0);

      currentTime1 = millis(); // для дежурного светодиода
      loopTime1 = currentTime1;

      currentTime2 = millis();       //для тревоги коридорного светодиода
      loopTime2 = currentTime2;
      //mode_selector = 3;
      mode = WAIT;    // исходный режим работы (при включении питания)
    }

    void loop()
    {
      /////////////////// опрос кнопок //////////////////
      if (EVENT(BUTTON_KORIDOR))  // сигнал с кнопки BUTTON_KORIDOR
      {
        delay(100);
        mode = KORIDOR;
      }

      if (EVENT(BUTTON_KOMNATA))  // сигнал с кнопки BUTTON_KOMNATA
      {
        delay(100);
        mode = KOMNATA;
      }

      if (EVENT(BUTTON_KORIDOR) && (EVENT(BUTTON_KOMNATA)))  // одновременное нажатие кнопок
      {
        delay(100);
        mode = WAIT;
      }

      /////////////////// управление режимами //////////////////
      switch (mode)
      {
        case WAIT: // действия в режиме ожидания
          currentTime1 = millis();
          if (currentTime1 >= (loopTime1 + 20))
          {
            analogWrite (LED_WAIT, brightness1);    // устанавливаем значение на 9 ножке
            brightness1 = brightness1 + fadeAmount1;   // прибавляем шаг изменения яркости, которая установится в следующем цикле
            // если достигли мин. или макс. значения, то идем в обратную сторону (реверс):
            if (brightness1 == 0 || brightness1 == 255)
            {
              fadeAmount1 = -fadeAmount1 ;
            }
            loopTime1 = currentTime1;
          }
          break;

        case KORIDOR: // действия в режиме слежения за коридором
          if (EVENT(PIR_KORIDOR))  // сработал ДД в коридоре
          {
            digitalWrite (RELAY, LOW);
            currentTime2 = millis();                           // считываем время, прошедшее с момента запуска программы
            if (currentTime2 >= (loopTime2 + 50))
            { // сравниваем текущий таймер с переменной loopTime + 0.25 секунда
              digitalWrite(LED_KORIDOR, !digitalRead(LED_KORIDOR));     // включаем/выключаем LED
              loopTime2 = currentTime2;
            }
          }
          if (EVENT(PIR_KOMNATA))  // сработал ДД в комнате
          {
            digitalWrite (RELAY, HIGH);
            currentTime1 = millis();
            if (currentTime1 >= (loopTime1 + 20))
            {
              analogWrite (LED_KORIDOR, brightness1);
              brightness1 = brightness1 + fadeAmount1;
              if (brightness1 == 0 || brightness1 == 255) fadeAmount1 = -fadeAmount1 ;
              loopTime1 = currentTime1;
            }
          }
          break;

        case KOMNATA: // действия в режиме слежения в комнате
          break;
      }
    }
     
    CYITEP_BAC9I нравится это.
  7. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо огромное! вы почти всю домашнюю работу сделали!), (не почти а всю работу сделали, сейчас только вник!, как вам спасибо выразить?) enum это для профи, но и его постораюсь освоить. Как отлажу программу выложу сюда, может кому то пригодится. (программа готовая!)
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    enum - это просто и красиво. :p
    По сути, это просто список, в котором каждый элемент имеет видимое имя и внутренний порядковый номер.
    Поэтому в коде чаще удобнее использовать case STOP или case READY, чем case 10 или case 1 - сразу видно какое условия проверяется.

    P.S.
    Код (C++):
    if (EVENT(BUTTON_KORIDOR) && (EVENT(BUTTON_KOMNATA)))  // одновременное нажатие кнопок
      {
        delay(100);
        static unsigned long timestamp;
        if (mode != WAIT) timestamp = millis();
        if ( millis() > timestamp + 2000)       // удержание кнопок дольше 2 сек
        {
          mode = WAIT;
        }
      }
     
    CYITEP_BAC9I нравится это.
  9. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Вечер бобрый! еща раз выражаю благодарность
    Tomasina за помошь. чтоб освоить switch case, все же сам дошел до истины. ( это для свого развития). енумом конечно несравненно проще и элегантнее получилось) Даже if фами в данном случае было бы удобнее пользоваться. Но как и писал это только для освоения переключателя.
    Код (C++):
    [code]
    #define but_1      4     // кнопка 1 включение режима слежения за коридором
    #define but_2      5     // кнопка 2 включение режима слежения за комнатой
    #define Led1 6       // дежурный  6 пин светодиод мигает когда не выбран не одни режим
    #define Led2 7       // светодиод 7 пин  включен режим слежения за коридором
    #define Led3 8       // светодиод 8 пин включен режим слежения за комнатой

    // выбор режимов работы
    #define PIR_KORIDOR  50  // режим слежения за коридором
    #define PIR_KOMNATA  70 // режим слежения за комнатой
    #define Waiting   40  // режим ожидания
    int Mode;
    int Knop = 0;
    int c; // переменная для хранения вариантов нажатий кнопок

    unsigned long button_press_delay = 0;   // переменная для отсчета вермени задержки


    void setup() {
       delay (4000);   // задержака что бы устаканились датчики в рабочем варианте не меньше 40000
     
        pinMode (but_1, INPUT);
        pinMode (but_2, INPUT);  
        pinMode (Led1, OUTPUT);
        pinMode (Led2, OUTPUT);
        pinMode (Led3, OUTPUT);
    Serial.begin(9600);
    }

    void loop(){
     
      Serial.println ("Mode_1");
      Serial.println (Mode);
     
      if (digitalRead(but_1) == 1) {
           delay (10);
            c = 1;}
       Serial.println("C");  // что творится с кнопками
       Serial.println (c);
     
      if (digitalRead(but_2) == 1) {
           delay (10);
            c = 2;}
     
      if (c == 0) Mode = Waiting;    // выбор режимов для  switch
    else if (c == 1) Mode = PIR_KORIDOR;
    else if (c == 2) Mode = PIR_KOMNATA;
     
      Serial.println (Mode);
      delay (2000);
     
      // задержка что бы успеть прочитать на мониторе данные
       
    switch (Mode) {

         case Waiting:
       digitalWrite (Led1, HIGH) ;   // код пока выброшен лампочки оставлены что бы не было скучно)))
       digitalWrite (Led2, LOW);
       digitalWrite (Led3, LOW);
       
         break;
       
         case PIR_KORIDOR:
       digitalWrite (Led2, HIGH);
       digitalWrite (Led1, LOW);
       digitalWrite (Led3, LOW);
     
        break;
           
         case PIR_KOMNATA:
       digitalWrite (Led3, HIGH);
       digitalWrite (Led2, LOW);
       digitalWrite (Led1, LOW);

         break;
        }
       
    }
     
    [/code]
     
    Последнее редактирование: 23 мар 2017
  10. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    теперь меня интересует обработка длинного нажатия кнопки. В интернете есть несколько вариантов, так же отличный вариант постами выше. Но хочется чего то своего) Написал свой вариант видения этой темы. Но!( работает нестабильно. в чем причина не пойму. То десяток нажтий длинных и коротких без сбоев отработает, то начинает фигню выдавать. На мой взгляд, ни какой системы в сбоях нет.
    интерсует взгляд профи на данное решение. Естественно в своих проектах буду использовать вариант предложенный профи, 2 постами выше.
    . Но почему такая история то все норм то погоду на марсе деленную на понедельник показывает)

    Код (C++):
    [code]
    #define Knopka 4
    #define Led  5
    unsigned long currentTime;
    unsigned long loopTime;
    byte schetchikNajzatiy = 0;



    void setup() {
      pinMode(Led, OUTPUT);
      pinMode (Knopka, INPUT);
      currentTime = millis();       // считываем время, прошедшее с момента запуска программы
      loopTime = currentTime; //// считываем время, прошедшее с момента запуска программы

    }

    void loop() {

      if (digitalRead (Knopka) == 1 )     schetchikNajzatiy = 1; // если кнопка была нажата счетчику присваивается 1


      currentTime = millis(); // запускается отсчет
    if ( schetchikNajzatiy == 1 && digitalRead (Knopka) == 0 && currentTime >= (loopTime + 20) &&  currentTime <= (loopTime + 1000 ))
    {   digitalWrite(Led ,1);  // если в момент отпускания кнопку держали не более 1 сек то зажигаем светодиод
    loopTime = currentTime;  // обнуляем время
    }

       if  ( schetchikNajzatiy == 1 && digitalRead (Knopka) == 0 && currentTime >= (loopTime + 1000) ) // если перед отпусканием кнопку держали более 1 сек то мигаем и тушим светодиод
       {
        digitalWrite(Led ,1);
        delay (200);
         digitalWrite(Led ,0);
         delay (200);
         digitalWrite(Led ,1);
        delay (200);
         digitalWrite(Led ,0);
         delay (200);

        loopTime = currentTime;
        schetchikNajzatiy = 0;
       

    }
    // currentTime = millis();
    }
     
    [/code]
     
    Последнее редактирование: 23 мар 2017
  11. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    люди добрые. бьюсь над кодом считывания нажатия кнопки. вроде все идеологически верно. но в разности (StopTime - StartTime) получаются дикие числа. моск уже кипеть. Все по монитору отследил и StopTime, и StartTime, все правильно выдают значения. Начинаю разность считать получается та самая переменная как я ее назвал. инетересно где ошибка. я уже и миллис выучил вроде. Но что то ускользает от понимания
    Код (C++):
    [code]
    #define KNOPKA 4
    #define Led  6
    byte prevButtonState = 0;
    int h = 0;
    unsigned long StartTime = 0;
    unsigned long StopTime = 0;

    void setup() {
      pinMode(Led, OUTPUT);
      pinMode (KNOPKA, INPUT);
      Serial.begin(9600);
    }

    void loop(){
      byte buttonState = digitalRead(KNOPKA); // состояние кнопки,
     
     
      if(!prevButtonState && buttonState){ // событие перехода из ненажато в нажато
       StartTime = millis(); //предаем в переменную значение момента начала нажатия
      };
      Serial.println ("StartTime");
      Serial.println (StartTime);
      if(prevButtonState && !buttonState){ // событие нажато - ненажато
       StopTime  = millis (); //предаем в переменную значение момента конца нажатия
      h = 1;
      }
        Serial.println ("StopTime");
      Serial.println (StopTime);
      prevButtonState = buttonState; //сброс состояния кнопки
    //delay (2000);
    unsigned long hernja = (StopTime - StartTime);
    Serial.println ("hernja");
      Serial.println (StartTime-StopTime  );
    if ( StopTime - StartTime   > 20 && StopTime - StartTime < 2000 && h == 1)
    {
      digitalWrite(Led ,1);
    StartTime = 0;
    StopTime = 0;

    }


    if ( StopTime - StartTime   > 2000 && h == 1) {
     
       digitalWrite(Led ,1);
        delay (200);
         digitalWrite(Led ,0);
         delay (200);
         digitalWrite(Led ,1);
        delay (200);
         digitalWrite(Led ,0);
        StartTime = 0;
    StopTime = 0;
    }

    }
     
    [/code]
     
  12. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    блин что за напасть ставлю переменную для миллис unsigned long получаются дикие цифры.
    long - получаются отрицательные значения, ставлю Int все работает правильно. но int измерять милиис это по моему нехорошо. Или я чего то не усвоил еще или мой компилятор гонит.
    Всех с выходными поздравляю кстати!)

    (похоже компилятор глючит. а кот написал правильный на Int работает четко без сбоев, можно отслеживать и вычислять любую длину нажатия кнопки или промежутков между событиями,)
     
    Последнее редактирование: 24 мар 2017
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    unsigned long hernja = (StopTime - StartTime);
    Serial.println ("hernja");
    Serial.println (StartTime - StopTime);
    диссонанса не находите? ;)
     
    CYITEP_BAC9I нравится это.
  14. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Вечер добрый. В моем IDE как я сегодня понял от перемены мест слагаемых сумма не меняется), надо завтра переустановить будет. А так да конечно есть маленько), но это было после многочисленных попыток отыскать" ошипку". но почему на int все работе четко так и не понял. Всем хороших выходных, а я пошел баиньки, уже второй час ночи
     
  15. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Всем доброго вечера. Продолжая свое самообразование стараюсь найти решение следующего вопроса. Имеем кучу датчиков вибрации, в данном случае для примера 4. Причем датчик 1 и 2 расположены на 2х створках одного окна. Но не все так просто. попытался найти алгоритм отсева ложных срабатываний. Допустим если сработали все датчики одновременно (прошел трамвай, взорвали машину депутата, салют в честь дня города и т.д.) в пределах 35 мс ( за это время звуковая волна пройдет 12 метров, расстояние между крайними датчиками) то на это не обращаем внимания. если одиночное срабатывание датчика, то это сигнал что это подозрительно и лучше включить серену. если сработали два рядом стоящих датчика, то это тоже не хорошо и тоже включаем сирену. А вот если сработали все одновременно то это фигня и не стоит обращать внимания.

    Пока что решил эту задачу средствами новичка. Код получился огромный и громоздкий, и это еще только для 4 датчиков, а если их будет 7-8 :confused: (ниже приведенный код работает, в симуляторе по крайней мере).

    Что я хотел от уважаемых профи. Подскажите каким способом лучше решать подобные задачи? просьба только направить советом, в каком направлении двигаться, код я сам хочу написать!)
    Код (C++):
    [code]

    //датчики вибрации для примера 3 шт, вообще 7 шт
    #define Led_Signal 8
    #define DK_1  4    // датчики 2 и 5 находятся на одном окне на разных створках
    #define DK_2  5
    #define DK_3  6
    #define DK_4  7


      unsigned long StartTime_DK_1 = 0;  // время срабатывания датчика 1
      unsigned long StartTime_DK_2 = 0;  // время срабатывания датчика 2
      unsigned long StartTime_DK_3 = 0;  // время срабатывания датчика 3
      unsigned long StartTime_DK_4 = 0;  // время срабатывания датчика 4

    byte DKprevState_1 = 0; // переменная для сравнения состояния датчика
    byte DKprevState_2 = 0;
    byte DKprevState_3 = 0;
    byte DKprevState_4 = 0;

    byte change_dk_1 = 0;  //фиксация события изменения состояния датчика
    byte change_dk_2 = 0;
    byte change_dk_3 = 0;
    byte change_dk_4 = 0;

    bool DK_ALARM_1 = false; //потверждение  сигнала тревоги от датчиков
    bool DK_ALARM_2 = false;
    bool DK_ALARM_3 = false;
    bool DK_ALARM_4 = false;

    void setup() {
      pinMode (DK_1,INPUT);
      pinMode (DK_2,INPUT);
      pinMode (DK_3,INPUT);
      pinMode (DK_4,INPUT);
      pinMode(Led_Signal, OUTPUT);

      Serial.begin(9600);
    }

    void loop() {
    byte DK_State_1 = digitalRead(DK_1); // считываем состояние Датчика
    byte DK_State_2 = digitalRead(DK_2); // считываем состояние Датчика
    byte DK_State_3 = digitalRead(DK_3); // считываем состояние Датчика
    byte DK_State_4 = digitalRead(DK_4); // считываем состояние Датчика


    // проверяем изменение состояния датчиков и засекаем время срабатывания
    if(!DKprevState_1 && DK_State_1)
    {
       StartTime_DK_1 = millis();
       change_dk_1 = 1;
      }

    if(!DKprevState_2 && DK_State_2)
    {
       StartTime_DK_2 = millis();
       change_dk_2 = 1;
    }

    if(!DKprevState_3 && DK_State_3)
    {
       StartTime_DK_3 = millis();
       change_dk_3 = 1;
      }

    if(!DKprevState_4 && DK_State_4)
    {
       StartTime_DK_4 = millis();
       change_dk_4 = 1;
      }

    // начинаем выяснять ложное срабатывание или реальное


    if (change_dk_1 == 1 && StartTime_DK_2 - StartTime_DK_1 <=7 &&  StartTime_DK_3 - StartTime_DK_1  <= 35
    && StartTime_DK_4 - StartTime_DK_1 <=35) DK_ALARM_1 = false;//  если сработали остальные датчики в пределах 35 мс или больше то это ложное срабатывание
    else if (change_dk_1 == 1 && StartTime_DK_2 - StartTime_DK_1 <=7) DK_ALARM_1 = true; // проверяем если время сработки 2х датчков на одном окне укладывается в 7 мс
    else if (change_dk_1 == 1)
    {
      DK_ALARM_1 = true;
                       
      digitalWrite (Led_Signal ,1);     // значит сработал датчик 1 и зажигаем светодиод 1 раз
      delay (500);
      digitalWrite  (Led_Signal ,0);
    }

    if (change_dk_2 == 1 && StartTime_DK_1 - StartTime_DK_2 <=7 &&  StartTime_DK_3 - StartTime_DK_2  <= 35
    && StartTime_DK_4 - StartTime_DK_2 <=35) DK_ALARM_1 = false;//  если сработали остальные датчики в пределах 35 мс или больше то это ложное срабатывание
    else if (change_dk_2 == 1 && StartTime_DK_1 - StartTime_DK_2 <=7) DK_ALARM_1 = true; // проверяем если время сработки 2х датчков на одном окне укладывается в 7 мс
    else if (change_dk_2 == 1)
    {
      DK_ALARM_2 = true;
                       
       digitalWrite (Led_Signal ,1);     // значит сработал датчик 2 и зажигаем светодиод 2 разф
      delay (500);
       digitalWrite (Led_Signal ,0);
       delay (500);
       digitalWrite (Led_Signal ,1);
      delay (500);
       digitalWrite (Led_Signal ,0);
    }

    if (change_dk_3 == 1 && StartTime_DK_1 - StartTime_DK_3 <=35 &&  StartTime_DK_2 - StartTime_DK_3  <= 35
    && StartTime_DK_4 - StartTime_DK_3 <=35) DK_ALARM_1 = false;//  если сработали остальные датчики в пределах 35 мс или больше то это ложное срабатывание

    else if (change_dk_3 == 1)
    {
      DK_ALARM_3 = true;
                       
      digitalWrite (Led_Signal ,1);     // значит сработал датчик 3 и зажигаем светодиод 3 разa
      delay (500);
      digitalWrite  (Led_Signal ,0);
       delay (500);
      digitalWrite  (Led_Signal ,1);  
      delay (500);
      digitalWrite (Led_Signal ,0);
       delay (500);
      digitalWrite  (Led_Signal ,1);  
      delay (500);
       digitalWrite (Led_Signal ,0);
    }

    if (change_dk_4 == 1 && StartTime_DK_1 - StartTime_DK_4 <=35 &&  StartTime_DK_2 - StartTime_DK_4  <= 35
    && StartTime_DK_1 - StartTime_DK_4 <=35) DK_ALARM_1 = false;//  если сработали остальные датчики в пределах 35 мс или больше то это ложное срабатывание
    else if (change_dk_4 == 1)
    {
      DK_ALARM_4 = true;
                       
      digitalWrite (Led_Signal ,1);     // значит сработал датчик 4 и зажигаем светодиод 4 разa
      delay (500);
      digitalWrite  (Led_Signal ,0);
       delay (500);
       digitalWrite (Led_Signal ,1);  
      delay (500);
      digitalWrite (Led_Signal ,0);
       delay (500);
      digitalWrite  (Led_Signal ,1);  
      delay (500);
      digitalWrite  (Led_Signal ,0);
        delay (500);
    digitalWrite   (Led_Signal ,1);  
      delay (500);
      digitalWrite  (Led_Signal ,0);
    }

    }
     
    [/code]
     
    Последнее редактирование: 29 мар 2017
  16. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    а да совсем забыл у этих датчиков дурацкая особенность. в состоянии покоя они могут находится как в 0 так и в 1, как повезет. и надо отслеживать изменение для каждого датчика, но это уже отдельная песня.
     
  17. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый всем. Видно вышеназванная задачка сильно сложная оказалась). неужили "ифать" каждый вариант, это единственное решение. Уже приступил к освоению записи в память, а эта задачка пока не дает покоя, как ее решить). Кст сегодня у наших китайских друзей, нашел реле для Ардуино на 30 ампер. давно подобное искал для проекта мультиварки. Всех кстати с наступающим апрелем!
     
  18. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    всем добрый вечер. Подскажите пожалуйста. можно ли на ардуине сделать такую штуку, как сигнализацию по пересечению луча от ИФ светодиода. но чтоб приемник, не тупо срабатывал кода возникло какое ни будь затенение. а чтоб работал по следующему принципу:
    излучающий ИФ диод работает на определенной частоте ( это легко на дуне можно реализовать тем же шимом хотя бы)
    А приемник выдает сигнал срабатывания, не по изменею яркости, а по пропаданию частоты принимаемого сигнала. по моему это даст гарантию от ложных срабатываний. Но вот как считать частоту сигнала на приемнике, пока опыта не хватает. Подскажите плиз как можно считывать частоту сигнала на ардуине?
     
  19. ostrov

    ostrov Гуру

    Что такое ИФ?
     
  20. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    сорри Инфракрасный светодиод, тут не суть важно для примера можно и обыкновенный. главное считать и проверить частоту на приемнике, что бы была равна частоте излучающего светодиода. И если оная пропадет то это и есть сигнал что что то находится между передающим светодиодом и приемником.