как сделать передачу данных с датчика в последовательный порт в строго определённое время? допустим отправлять показания с датчика в порт в 1, 5, 10, 20, 45 минут с начала запуска программы. пытался воспользоваться функцией Serial.setTimeout(time); но получается какая-то ахинея и ещё, как сделать так, чтобы при показании датчика 0, данные не передавались в порт
Нада проверять RTC и отправлять данные, когда минуты равны 1,5,10,20 и 45 А если показания даччика = 0, то не передавать, скока бы минут ни было.
так это установка таймаута. А надо сделать типа как в JS setInterval(). Нов ардруинах я не силен, поэтому сделал бы так, как это делают все - через аппаратный таймер.
сделал так, но дальше первого 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);// Отключаем реле - } }
как вы это определили? - у вас действия в обоих таймерах одинаковы, вы никак не отличите один от другого. Добавьте вывод в Сериал номера таймера при срабатывании и тогда смотрите можно
для отладки я бы работал с секундами, а не минутами. конечно можно. Наверное еще и А(j) должно быть. Попробуйте в первом ифе вывести timer_3, мне не нравится как у вас через зпт все объявлено, могу ошибаться. Пока не вижу причин для незахода во 2-й иф
Так судя по коду так и должно быть. Первый IF будет отрабатывать каждую минуту, второй каждые 5 минут. Если хотите чтобы сработал только в первую минуту, вводите флаг состояния. В условие проверяете флаг, если 0 - заходим. Внутри IF меняем флаг состояния на 1. В следующем IF проверяем, если флаг 1 - заходим. Внутри IF меняем на 2. Ну и где то (в условии не описано), сбрасываем флаг в 0, и в таймеры записываем millis(), чтобы начать сначала, если нужно.
сделал так, но реле включилось и дальше ничего не робит Код (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);// выключаем реле } } } }
А зачем 2 цикла? Каждому таймеру соответствует свой интервал, а у вас каждый таймер сравнивается с каждым интервалом. (Дополнил в 2 ночи.) Еще очепятка. У вас 4 таймера, а в цикле пробегаете по 5, выход за пределы массива - веселье только начинается.