Добрый день. В задании для самостоятельного решения, не получается сделать вывод информации на ПК один раз в 10 секунд. Через каждые 10 секунд информация отправляется по многу раз. Какое условие нужно, чтобы информация отправлялась только один раз? Код (Text): // Подключаем библиотеку для работы с жидкокристаллическим экраном (англ. Liquid Crystal Display или просто LCD) #include <LiquidCrystal.h> // на диоде, защищающем от неверной полярности, падает доля напряжения (англ. voltage drop). Необходимо это учитывать #define DIODE_DROP 0.43 // Объявляем объект, для управления дисплеем. Для его создания необходимо указать номера пинов, к которым он подключен в // порядке: RS E DB4 DB5 DB6 DB7 LiquidCrystal lcd (13, 12, 11, 10, 9, 8); void setup () { // начинаем работу с экраном. Сообщаем объекту количество строк и столбцов. Опять же, вызывать pinMode не требуется: // функция begin сделает всё за нас lcd.begin (16, 2); Serial.begin (9600); Serial.println ("Time \t Voltage \t ms"); // печатаем сообщение на первой строке // lcd.print ("Battery voltage:"); } void loop () { unsigned int seconds = millis() / 1000; unsigned int ms = millis() % 1000; lcd.setCursor (0,0); lcd.print (seconds); lcd.print ("."); lcd.print (ms); lcd.print (" Secs"); // высчитываем напряжение подключенной батарейки float voltage = analogRead (A0) / 1024.0 * 10.0; // если напряжение на делителе напряжения было зафиксировано, нужно прибавить напряжение на диоде, т.к. оно было съедено if (voltage > 0.1) voltage += DIODE_DROP; // устанавливаем курсор на колонку 0, строку 1. На деле — это левый квадрат 2-й строки, т.к. нумерация начинается с нуля lcd.setCursor (0, 1); // печатаем напряжение в батарейке с точностью до сотых долей lcd.print (voltage, 2); // следом печатаем единицы измерения lcd.print (" Volts"); if (millis() / 1000 % 10 == 1) { Serial.print (seconds); Serial.print ("\t"); Serial.print (voltage); Serial.print ("\t"); Serial.println (millis()); } } Вот что в итоге выводится: Код (Text): Time Voltage ms 0 4.02 1006 1 4.19 1014 1 3.96 1022 1 4.18 1032 1 3.98 1040 1 4.09 1048 1 4.05 1177 1 4.10 1190 1 3.89 1204 1 4.01 1217 1 4.10 1230 1 3.88 1245 1 3.97 1258 1 4.09 1271 1 3.88 1285 1 3.94 1298 1 4.08 1312 1 3.89 1326 1 3.90 1366 1 3.87 1380 1 4.06 1393 1 3.91 1406 1 3.85 1420 1 4.05 1433 1 3.92 1447 1 3.82 1461 1 3.97 1609 1 3.77 1623 1 3.92 1636 1 3.97 1650 1 3.75 1664 1 3.88 1677 1 3.97 1690 1 3.75 1703 1 3.85 1718 1 3.77 1785 1 3.78 1799 1 3.95 1812 1 3.78 1825 1 3.75 1840 1 3.95 1853 1 3.79 1866 1 3.72 1880 1 3.93 1893 1 3.80 1907 1 3.70 1921 1 3.92 1934 1 3.82 1947 1 3.68 1960 1 3.89 1975 1 3.83 1988 10 3.39 11002 11 3.30 11029 11 3.23 11038 11 3.37 11047 11 3.17 11057 11 3.41 11065 11 3.17 11074 11 3.40 11083 11 3.28 11099 11 3.17 11115 11 3.24 11130 11 3.41 11147 11 3.25 11318 11 3.19 11333 11 3.31 11350 11 3.43 11365 11 3.36 11380 11 3.43 11443 11 3.29 11458 11 3.20 11473 11 3.30 11490 11 3.44 11505 11 3.39 11521 11 3.22 11536 11 3.22 11552 11 3.38 11568 11 3.44 11583 11 3.32 11598 11 3.45 11645 11 3.37 11708 11 3.45 11723 11 3.34 11739 11 3.21 11755 11 3.27 11770 11 3.35 11848 11 3.46 11864 11 3.22 11973
может быть потому, что когда Вы пишите условие if (millis() / 1000 % 10 == 1), то 1 это и 1.1 и 1.001, и 1,9 поэтому оно срабатывает каждую милисекунду от 1.0000 сек до 1.999 сек возможно нужно единицу сделать переменной и дать ей тип нецелого числа например double A = 1; if (millis() / 1000 % 10 == A) ну или if (millis() / 1000 % 10 == 1.000)
Сначала неправильно написал. Сейчас ошибку исправил Код (Text): // переменная, определяющая, // отправлена ли информация boolean wasSent = false; void setup() { Serial.begin(9600); } void loop() { // если 10 секунд прошло и информация не // отправлена, то... if (millis() / 1000 % 10 == 1 && !wasSent){ // ...запоминаем, что отправили wasSent = true; // и выводим, что нужно Serial.println(); } // в другую (любую) секунду меняем состояние переменой else if(millis() / 1000 % 10 == 9 && wasSent){ wasSent = false; } }
Эксперимент показал, что оператор % возвращает только целые значения Код (Text): double a = millis() / 1000 % 10; double b = 1.000; if (a == b){ Serial.println(a); Serial.println(b); } Вывод: Код (Text): 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
Всем спасибо, разобрался сам. Переписал условие и все заработало: В самом начале где #include объявил переменную Код (Text): int last_secs = 0; Само условие: Код (Text): int current_secs = millis() / 1000; if (current_secs - last_secs == 10) { Serial.print (seconds); Serial.print ("\t"); Serial.print (voltage); Serial.print ("\t"); Serial.println (current_secs); last_secs = (10 + last_secs); } }