Некорректная работа функции if
- Войдите на сайт для отправки комментариев
Пнд, 04/09/2017 - 00:48
Использую экран 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 ;
}
}
А тип переменной lastTime какой?
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("========================================================="); */ }Мда,ничего нового,просто посчитал через опу, казалось ,что переменная заполнится за 18 часов,а она заполняется за 65 секунд и начинаются перлы.Заменил на unsignet long ,всё в порядке.Спасибо)