Некорректная работа функции if

Glinka0
Offline
Зарегистрирован: 13.03.2017

Использую экран TFT для вывода температуры с ds18b20

Иногда,когда температура с датчика изменяется,

Например температура опускается с  30 до 29.5 и данные на экране начинают очень быстро сменять друг-друга несколько раз,написал функцию millis с периодом опроса в 3 секунды,но почему-то моргания не пропали.

Где я накосячил?




void loop() {
  

    
     
  

   if(millis()-lastTime >= 3000 ) {
   
   lastTime=millis();
   ds.requestTemperatures(); // считываем температуру с датчиков
      
   float presentT1=ds.getTempC(sensor1); 

   if (presentT1 != oldT1) {   //если значение изменяется,то выводим на экран,если нет пропускаем
   
   char myStr[6]; 
   dtostrf(presentT1, 2, 1, myStr);   //переводим показания температуры датчика из float в строку
   
   Screen.stroke(255, 255, 0); //голубой цвет кисти
   Screen.fill(255, 255, 0); //цвет заливки голубой
   Screen.rect(75, 10, 46, 14); //прямоугольник перекрывающий температуру
   Screen.stroke(0,0,255); //красный цвет кисти
   Screen.text(myStr,75,10); // отправляем температуру на экран
   oldT1=presentT1 ; 
   }
   }
  

 

 

JasKo
Offline
Зарегистрирован: 21.11.2015

А тип переменной lastTime какой?

Glinka0
Offline
Зарегистрирован: 13.03.2017

unsigned int



   #include <TFT.h>
   #include <OneWire.h>
   #include <DallasTemperature.h>

   #define CS   10
   #define DC   9
   #define RESET  8
    TFT Screen = TFT(CS, DC, RESET);
 

   OneWire oneWire(7); // вход датчиков 18b20
   DallasTemperature ds(&oneWire);
   DeviceAddress sensor1 = {0x28, 0xFF, 0xEA, 0x6A, 0x63, 0x16, 0x4, 0xC2};   //28 FF EA 6A 63 16 4 C2  объявляем номера датчиков
   //DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};

   float oldT1=0;
   float presentT1=0;


   unsigned int lastTime=0;
 



void setup() {
   Serial.begin(9600);
   
    ds.begin();  // инициализируем датчики

   Screen.begin(); // инициализируем дисплей 
    Screen.setRotation(0); //переворачиваем экран
    Screen.background(255, 255, 0);   // фон голубой   
    Screen.setTextSize(2);   //  шрифт-2

    Screen.stroke(0,0,255);  //цвет кисти
    Screen.text("Temp=",0,10);
}


void loop() {
  

    
     
  

   if(millis()-lastTime >= 3000 ) {
   
   lastTime=millis();
   ds.requestTemperatures(); // считываем температуру с датчиков
      
   float presentT1=ds.getTempC(sensor1); 

   if (presentT1 != oldT1) {   //если значение изменяется,то выводим на экран,если нет пропускаем
   
   char myStr[6]; 
   dtostrf(presentT1, 2, 1, myStr);   //переводим показания температуры датчика из float в строку
   
   Screen.stroke(255, 255, 0); //голубой цвет кисти
   Screen.fill(255, 255, 0); //цвет заливки голубой
   Screen.rect(75, 10, 46, 14); //прямоугольник перекрывающий температуру
   Screen.stroke(0,0,255); //красный цвет кисти
   Screen.text(myStr,75,10); // отправляем температуру на экран
   oldT1=presentT1 ; 
   }
   }
  
     
    
/*Serial.print(ds.getTempC(sensor1)); // отправляем температуру
  Serial.println("C");
  Serial.println("========================================================="); 
  */





   
}

 

Glinka0
Offline
Зарегистрирован: 13.03.2017

Мда,ничего нового,просто посчитал через опу, казалось ,что переменная заполнится за 18 часов,а она заполняется за 65 секунд и начинаются перлы.Заменил на unsignet long ,всё в порядке.Спасибо)