передача данных в последовательный порт

Тема в разделе "Arduino & Shields", создана пользователем Dfktynby, 12 ноя 2019.

  1. Dfktynby

    Dfktynby Нуб

    как сделать передачу данных с датчика в последовательный порт в строго определённое время?
    допустим отправлять показания с датчика в порт в 1, 5, 10, 20, 45 минут с начала запуска программы.
    пытался воспользоваться функцией Serial.setTimeout(time);
    но получается какая-то ахинея
    и ещё, как сделать так, чтобы при показании датчика 0, данные не передавались в порт
     
  2. DetSimen

    DetSimen Guest

    Нада проверять RTC и отправлять данные, когда минуты равны 1,5,10,20 и 45
    А если показания даччика = 0, то не передавать, скока бы минут ни было.
     
  3. parovoZZ

    parovoZZ Гуру

    так это установка таймаута. А надо сделать типа как в JS setInterval(). Нов ардруинах я не силен, поэтому сделал бы так, как это делают все - через аппаратный таймер.
     
    Dfktynby нравится это.
  4. Daniil

    Daniil Гуру

    Можно через миллис, но время будет уплывать со временем
     
    Dfktynby нравится это.
  5. Dfktynby

    Dfktynby Нуб

    сделал так, но дальше первого if код не идет и передаёт данные через минуту. чтоб код не был таким большим, ибо временных интервалов будет много, можно таймеры в массив? в массив period_time и timer, чтобы вычисление времени было как-то так {if (millis()- D[j] >= A)
    ?
    Код (C++):
    int row_excel = 0; // количество строк
    int test = 123; // тестовая переменная, которая будет передана excel
    int test_2 = 456; // вторая тестовая переменная, которая будет передана excel
    unsigned long period_time2 = (long)60*1000;//1 минута
    unsigned long period_time3 = (long)5*60*1000;//5 минут
    unsigned long period_time4 = (long)10*60*1000;//10
    unsigned long period_time5 = (long)30*60*1000;//30

    uint32_t timer_2 =0, timer_3=0, timer_4=0, timer_5=0;
    #define PIN_RELAY11 7// реле

    void setup()
    {
      Serial.begin(9600);
      Serial.println("CLEARDATA"); // очистка листа excel
      Serial.println("LABEL,Time,Test 1, Test 2, Num Rows"); // заголовки столбцов
        pinMode(PIN_RELAY11, OUTPUT);
        digitalWrite(PIN_RELAY11, 1);// Выключаем реле
        }

    void loop()
    {if(millis() - timer_2 >= period_time2)//1min
       {timer_2 = millis();//сброс
       digitalWrite(PIN_RELAY11, 0);// Включаем реле
         row_excel++; // номер строки + 1
         Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
         Serial.print(test);
         Serial.print(",");
         Serial.print(test_2);
         Serial.print(",");
         Serial.println(row_excel);
            delay(500);
       digitalWrite(PIN_RELAY11, 1);// Отключаем реле - посылаем низкий уровень сигнала
      }
    if(millis() - timer_3 >= period_time3)//2min
      {timer_3 = millis();//сброс
      digitalWrite(PIN_RELAY11, 0);// Включаем реле - посылаем  высокий уровень сигнала
        row_excel++; // номер строки + 1
        Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
        Serial.print(test);
        Serial.print(",");
        Serial.print(test_2);
        Serial.print(",");
        Serial.println(row_excel);
          delay(500);
       digitalWrite(PIN_RELAY11, 1);// Отключаем реле -
       }
    }
     
    Последнее редактирование: 21 ноя 2019
  6. b707

    b707 Гуру

    как вы это определили? - у вас действия в обоих таймерах одинаковы, вы никак не отличите один от другого. Добавьте вывод в Сериал номера таймера при срабатывании и тогда смотрите
    можно
     
    Dfktynby, SergeiL и Daniil нравится это.
  7. Daniil

    Daniil Гуру

    для отладки я бы работал с секундами, а не минутами.
    конечно можно. Наверное еще и А(j) должно быть.
    Попробуйте в первом ифе вывести timer_3, мне не нравится как у вас через зпт все объявлено, могу ошибаться.
    Пока не вижу причин для незахода во 2-й иф
     
    Dfktynby, SergeiL и b707 нравится это.
  8. SergeiL

    SergeiL Оракул Модератор

    Так судя по коду так и должно быть.
    Первый IF будет отрабатывать каждую минуту, второй каждые 5 минут.
    Если хотите чтобы сработал только в первую минуту, вводите флаг состояния.
    В условие проверяете флаг, если 0 - заходим. Внутри IF меняем флаг состояния на 1.
    В следующем IF проверяем, если флаг 1 - заходим. Внутри IF меняем на 2.
    Ну и где то (в условии не описано), сбрасываем флаг в 0, и в таймеры записываем millis(), чтобы начать сначала, если нужно.
     
    Dfktynby нравится это.
  9. Dfktynby

    Dfktynby Нуб

    сделал так, но реле включилось и дальше ничего не робит
    Код (C++):
    int row_excel = 0; // количество строк
    int test = 123; // тестовая переменная, которая будет передана excel
    int test_2 = 456; // вторая тестовая переменная, которая будет передана excel
    unsigned long period_time2 = (long)60*1000;//1 минута
    unsigned long period_time3 = (long)2*60*1000;//2 минуты
    unsigned long period_time4 = (long)4*60*1000;//4
    unsigned long period_time5 = (long)7*60*1000;//7
    uint32_t timer_2 , timer_3, timer_4, timer_5;
    int A[4]= {period_time2,period_time3, period_time4, period_time5};
    int D[4]= {timer_2, timer_3, timer_4, timer_5};

    #define PIN_RELAY11 7// пин реле

    void setup() {
      Serial.begin(9600);
      Serial.println("CLEARDATA"); // очистка листа excel
      Serial.println("LABEL,Time,Test 1, Test 2, Num Rows"); // заголовки столбцов
        pinMode(PIN_RELAY11, OUTPUT);// Объявляем пин реле как выход
        digitalWrite(PIN_RELAY11, 1);// Выключаем реле
       }

    void loop()
    {for(int i=0; i <= 4; i++)
        {for(int j=0; j <= 4; j++)
          {if (millis()- D[j] >= A[i])// вычисление времени
            {D[j] = millis();//сброс
             digitalWrite(PIN_RELAY11, 0);// Включаем реле
             row_excel++; // номер строки + 1
             Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
             Serial.print(test);
             Serial.print(",");
             Serial.print(test_2);
             Serial.print(",");
             Serial.println(row_excel);
              delay(500);
             digitalWrite(PIN_RELAY11, 1);// выключаем реле
            }
          }
        }
      }
     
  10. b707

    b707 Гуру

    посмотрите внимательно на тип данных своих массивов
     
    DetSimen и Daniil нравится это.
  11. Daniil

    Daniil Гуру

    А зачем 2 цикла? Каждому таймеру соответствует свой интервал, а у вас каждый таймер сравнивается с каждым интервалом.
    (Дополнил в 2 ночи.)
    Еще очепятка.
    У вас 4 таймера, а в цикле пробегаете по 5, выход за пределы массива - веселье только начинается.
     
    Последнее редактирование: 23 ноя 2019
    DetSimen нравится это.