Вопрос по таймеру

Sonchyk
Offline
Зарегистрирован: 18.12.2019
#include <DHT.h>
#include <LiquidCrystal_I2C.h>

boolean temp_flag;
boolean styleLCD = 1;

LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(2, DHT11);

void setup() {
  dht.begin();
  lcd.init();
  lcd.backlight();
  lcd.print("IHOR 1-V");
  lcd.setCursor(0, 1);
  lcd.print("AKIT");
}

void loop() {
  if (millis() - 0 >= 10000 && temp_flag == 0) temp_flag = 1; 
  if (millis() % 15000 == 0 && temp_flag == 1) styleLCD = !styleLCD; 
  if (millis() % 1000 == 0 && temp_flag == 1) { 
    int temp_graph = map(dht.readTemperature(), 14, 30, 0, 16);
    if (styleLCD == 1) styleLCD1(); 
    else styleLCD2(0, 1, 16, temp_graph); 
  }
}

void styleLCD1() {
  lcd.clear();
  lcd.print(millis() / 1000); 
  lcd.setCursor(0, 1);
  lcd.print(dht.readTemperature());
  lcd.print(" C\xDF");
}

void styleLCD2(byte start_pos, byte row, byte bar_length, byte fill_percent) {
  lcd.clear();
  lcd.print("15-30 C\xDF"); 
  byte infill = round((float)bar_length * fill_percent / 16); 
  lcd.setCursor(start_pos, row);
  if (infill == 0) lcd.write(16);
  else lcd.write(255);
  for (int n = 1; n < bar_length - 1; n++) {
    if (n < infill) lcd.write(255); if (n >= infill) lcd.write(16);
  }
  if (infill == bar_length) lcd.write(255);
  else lcd.write(16);
}

Проблема в том, что плата раз через раз пропускает проверку millis()%15000==0(строка подсвечена) и не меняет значение переменной.Почему?Ардуино китайская

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sonchyk пишет:

Проблема в том, что плата раз через раз пропускает проверку millis()%15000==0(строка подсвечена) и не меняет значение переменной.Почему?

Потому что код выполняется некоторое время, и между вызовами loop некоторые значения millis() - уже тю-тю, в смысле - пропускаются. Лучше интервалы измерять интервалами, а не остатком от деления ;)