Вывод в терминал только изменившихся значений
- Войдите на сайт для отправки комментариев
Ср, 29/01/2014 - 09:40
Вопрос в том как дописать например скетч для DS18B20, что бы в терминале не отображалась повторяющаяся температура, а только изменившаяся?
Не помешал бы собственно текст дописываемого скетча.
#include <OneWire.h> int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 void setup(void) { Serial.begin(9600); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); delay(100); //just here to slow down the output so it is easier to read } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }В общем случае так:
void loop() { float temperature = getTemp(); static float ptev_temperature; if(temperature != ptev_temperature) Serial.println(temperature); ptev_temperature = temperature; delay(100); //just here to slow down the output so it is easier to read }но с float могут быть проблемы и прийдется делать так:
void loop() { float temperature = getTemp(); static float ptev_temperature; if(temperature < ptev_temperature - 0.01 || temperature > ptev_temperature + 0.01) { Serial.println(temperature); ptev_temperature = temperature; } delay(100); //just here to slow down the output so it is easier to read }то есть задать диапазон, при выходе за который выводится значение в сериал.
Максим, а какие проблемы могут быть с float ?
Ну, например, 3.0+4.0 не обязательно будет равно 7.0
Ну, например, 3.0+4.0 не обязательно будет равно 7.0
В каких случаях? По конкретнее можно.
Речь о баге компилятора? Или это особенность типа?
Особенность типа
Особенность типа
Округление?
Не примите за назойливость, но не хочется га шрабли где нить наступить.
Пример можно с такой осоенностью?
Сравнение чисел с плавающей запятой производится с определенной точностью, т.е. плюс-минус лапоть (см. скетч maksim в сообщении #3, там этот лаполть равен 0.01). Это связано с представлением чисел с плавающей запятой.
Читать, например, здесь http://habrahabr.ru/post/112953/ п.4.5
Понятно.
Хотя к примеру в первом посте это не имеет отношения.
Функция возвращает флоат, которое формируется из int.
То есть, из конкретного Int получается конкретное значение флоат, и зависимость тут жесткая.
Хотя с точки зрения логики программы, правильнее конечно-же отслеживать выход за пределы интервала.
Благодарю, за подробное разъяснение. Будем двигаться дальше ... прикрутим индикатор.