Проблемы с millis()
- Войдите на сайт для отправки комментариев
Пнд, 28/09/2015 - 12:33
Здравствуйте, Специалисты
Прошу помочь с millis(). Алгоритм таймера 5сек(в будущем 0,5час) на две нагрузки по переменно, командой запуска таймера является соответствующая кнопка, их тоже два. Программа работает, но как только включаю функцию PrintTimeBar() индикацию времени в виде "Заполняющиеся пикселей", время начинается путаться. Например вторая нагрузка включаеться аж 15сек после замыкания кнопки X1. Подскажите как исправить!
#include <LiquidCrystal.h> byte p20[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000, }; byte p40[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000, }; byte p60[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100, }; byte p80[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110, }; byte p100[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, }; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); const int X0 = 2; const int X1 = 3; const int Y0 = 11; const int Y1 = 12; extern unsigned int logStat = 0; unsigned long TMR1 = 0; unsigned long TMR2 = 0; unsigned long currentTime = 0; //==================================================== void setup() { lcd.begin(16, 2); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" Inkubator v0.2 "); // Basic input pins pinMode(X0, INPUT); pinMode(X1, INPUT); // Basic output pins pinMode(Y0, OUTPUT); pinMode(Y1, OUTPUT); // Default output port values digitalWrite(Y0, LOW); digitalWrite(Y1, LOW); lcd.createChar(0, p20); lcd.createChar(1, p40); lcd.createChar(2, p60); lcd.createChar(3, p80); lcd.createChar(4, p100); } //==================================================== void loop() { StartTimer5(); timer5(TMR1, 5000); checkIn(Y0, X1); Out(Y0); StartTimer5(); timer5(TMR1, 5000); checkIn(Y1, X0); timer5(TMR2, 100); Out(Y1); PrintTimeBar(62.5); } //Функция "Запуска таймера5"========================= unsigned int StartTimer5(){ if (digitalRead(Y0) == 0 && digitalRead(Y1)==0) logStat = 1; else logStat = 0; return(logStat); } //Функция "Проверки"================================= unsigned int checkIn(int output, int input){ if(logStat==1 || digitalRead(output)==1){ if(digitalRead(input)==0) logStat = 1; else logStat = 0; } else logStat = 0; return(logStat); } //Функция "Выход"===================================== unsigned int Out(int output){ if (logStat == 1) digitalWrite(output, HIGH); else digitalWrite(output, LOW); return(logStat); } //Функция "Таймера"=================================== unsigned int timer5(unsigned long &timerState, unsigned long timerPeriod){ if (logStat == 0) timerState = 0; else{ if (timerState == 0){ timerState = millis(); logStat = 0; } else{ if (millis() > (timerState + timerPeriod)) logStat = 1; else logStat = 0; } } return(logStat); } //Функция "Паузы"====================================== int Pause(unsigned long y){ boolean x = 0; if(digitalRead(Y0)==0&&digitalRead(Y1)==0){ if (millis() > (currentTime + y)){ currentTime = millis(); x = 1; } else x = 0; } return(x); } //Функция вывода на экран============================== unsigned long PrintTimeBar(long time){ boolean c = 0; if(digitalRead(Y1)==0 && digitalRead(Y0)==0){ lcd.setCursor(0, 0); lcd.print(" "); for (int i = 0; i<16; i++){ for (int j=0; j<5; ){ c = Pause(time); if(c == 1){ lcd.setCursor(i, 0); lcd.write(j); j=j+1; c=0; logStat = 1; } } } } return(logStat); }
Исправьте сравнения с millis() на так:
if( millis() - /*начальное_значение*/ >= /*интервал*/ ) { /*ваши действия*/}
Так правильно.
Исправил в функций Таймера, не помогло.