Не работает Delay на millis()
- Войдите на сайт для отправки комментариев
Сб, 30/04/2022 - 02:24
Привет друзья.
У меня код любительский, ничего особенного, костыли, как и положено новичку. Но все работает кроме одного - Delay на millis в обозначенный в строках 52-59. Загружаю код, монитор порта пишет ХХХХХХХХХХХХХХ (ну и выполняет остальное что там есть в if) без задержки, но хотелось бы чтобы была задержка в 1 сек. Где подвох?
#include <EEPROM.h> #include <LiquidCrystal.h> const int rs = 12, en = 11, d4 = 4, d5 = 5, d6 = 6, d7 = 7; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); const byte interruptPin = 2; volatile double Micros; volatile double Last_Micros; volatile double T; float Wheel_Speed = 0; volatile double Flag; volatile double LastFlag; float ODO; byte Array [10]; volatile float k = 0.0000580952380952381; void blink(); byte Time_NoSpeed = 0; double timing; volatile bool Flag2; double timing2; float V; //Battery Voltage double timer; void setup() { pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); pinMode (3,OUTPUT); lcd.begin(16, 2); //TCCR2B = TCCR2B & B11111000 | B00000010; analogWrite(3,127); Serial.begin(9600); EEPROM.get(4, Flag); lcd.clear(); } void loop() { /*for (int i = 0; i < 20; i++) { Array [i] = 209142.9/(T); Wheel_Speed+= Array [i]; } Wheel_Speed/=21; */ if (millis()-timer>1000); { Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); lcd.setCursor(9,0); lcd.print(" V="); lcd.print(V,1); timer = millis(); } Wheel_Speed = 209142.9/(T); ODO = Flag *k; int Vo = analogRead(0); int D; D = map(Vo,0,1018,0,585); V=D/static_cast<float>(10); lcd.setCursor(0, 0); //lcd.print("SPEED "); lcd.print(Wheel_Speed,0); lcd.print(" km/h "); lcd.setCursor(0,1); //lcd.print("ODO "); lcd.print(ODO,1); lcd.print(" km"); if (Flag == LastFlag) { if (((millis()-timing)>50000)&& Flag2==LOW){ //Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); Flag2=HIGH; EEPROM.put(4, Flag); timing = millis(); } } LastFlag=Flag; T=4000000000; //Serial.print("Millis "); //Serial.println(millis()); Serial.print ("Voltage "); Serial.println(V); //Serial.print("Timing "); //Serial.println (timing); /* Serial.print ("Wheel_Speed"); Serial.print ("\t"); Serial.print ("\t"); Serial.print ("T"); Serial.print("\t"); Serial.print ("\t"); Serial.print ("ODO"); Serial.print ("\t"); Serial.print ("\t"); Serial.println ("Flag"); Serial.print ("\t"); Serial.print (Wheel_Speed); Serial.print("\t"); Serial.print ("\t"); Serial.print (T); Serial.print("\t"); Serial.print ("\t"); Serial.print(ODO); Serial.print("\t"); Serial.print ("\t"); Serial.println(Flag); */} void blink() { Micros = micros(); T = Micros - Last_Micros; Last_Micros = Micros; Flag++; Flag2=LOW; }
во-первых, поменяй типы переменных, хранящих миллисекунды с double на uint32_t
а во-вторых, ошибка здесь:
if
(millis()-timer>1000);
сам найдёшь?
Гыггг, классика ))))
Если починить 52 строку, то все равно будет что то странное ... если только на if на while поменять ...
Дык типы ещё в порядок привести. Что ещё?
Если починить 52 строку, то все равно будет что то странное ... если только на if на while поменять ...
А ты без если - почини и проверь. Но, сдается мне, ты ошибку не понял
v258 всё я проверил. Видимо у меня с ТС разной понимание функции delay...
Не работает Delay на millis()
Не кормите!
«Если кто не хочет трудиться, то и не ешь» (Второе послание к Фессалоникийцам святого апостола Павла 3:10)
v258 всё я проверил. Видимо у меня с ТС разной понимание функции delay...
Упс, с телефона не разглядел, думал, что это ТС ))
А я не понял, чего там не так в логе от komandir? Раз в секунду выводится «ХХХХХ», вроде это и хотел ТС, не?
А я не понял, чего там не так в логе от komandir? Раз в секунду выводится «ХХХХХ»,
Скверное ощущение, так то....
А я не понял, чего там не так в логе от komandir? Раз в секунду выводится «ХХХХХ»,
это да, вот я тут с одним готовым скетчем экспериментирую так у него loop() аж 60000 миллисекунд )))
это да, вот я тут с одним готовым скетчем экспериментирую так у него loop() аж 60000 миллисекунд )))
Такое себе...
Тут, было ,и на сутки делеили , особо одаренные...
Я вот тут давеча кормушку своей альтернативнолохматой кошечке мастерил. Её ,в виду усиленного метаболизма кормить нужно несколько раз в сутки, а сжирает она своим экскаваторным хлебальником, насыпанное все и сразу. От этого потом страдает недержанием желудка, тк сухари в объеме увеличиваются неимоверно. Отвлекся... Написал там дисплеи, меню, RTC, прочие плюшки. Все нормально работало пол-года. Но решил, что нужно энергию беречь и решил все это дело включать , посредством умной интернет-розетки(500р/шт у китайцев), на 10минут (+/-5 мин кормления), мало ли куда часы ускачут. Так вот теперь думаю, нафига я изголялся. Можно было просто к той же самой розетке прикрутить и шагать двигателем при включении , нужное количество шагов. Вот и получается, что хорошая мысля, она приходит опосля ..
это да, вот я тут с одним готовым скетчем экспериментирую так у него loop() аж 60000 миллисекунд )))
дело не в скетче, сторонний сервер может считать задачу неопределённое время ответ выдает по защищённому протоколу и, подтверждения принятия пакетов нету, так что девайс, если не получает ответ проще прорезетить, чем разруливать ситуацию...
Спасибо друзья, что не обошли стороной и всяк в силу своего разумения внес так сказать лепту. Косяк нашел, как сказал BOOM, классика. Тем кто читает это в поисках ответа на свой похожий вопрос - не ставьте ; после условия if ()!
Да прибудет сила с этим форумом и снизойдет благодать вселенская на всех тут.
Как вот объяснить, что delay на millis не нужно делать ? За такое сразу по рукам надо давать )