Проблемы с 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() - /*начальное_значение*/ >= /*интервал*/ ) { /*ваши действия*/}
Так правильно.
Исправил в функций Таймера, не помогло.