Проблемы с millis()

Nurbol
Offline
Зарегистрирован: 15.07.2013

Здравствуйте, Специалисты

Прошу помочь с 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);
}

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Исправьте сравнения с millis() на так:

if( millis() - /*начальное_значение*/ >= /*интервал*/  ) { /*ваши действия*/}

Так правильно.

Nurbol
Offline
Зарегистрирован: 15.07.2013

Исправил в функций Таймера, не помогло.