Вывод в терминал только изменившихся значений

nikolozij
Offline
Зарегистрирован: 29.01.2014

Вопрос в том как дописать например скетч для DS18B20, что бы в терминале не отображалась повторяющаяся температура, а только изменившаяся?

Araris
Offline
Зарегистрирован: 09.11.2012

Не помешал бы собственно текст дописываемого скетча.

nikolozij
Offline
Зарегистрирован: 29.01.2014
#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;
  
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

В общем случае так:

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
}

то есть задать диапазон, при выходе за который выводится значение в сериал.

Looka
Offline
Зарегистрирован: 24.04.2012

Максим, а какие проблемы могут быть с float ? 

step962
Offline
Зарегистрирован: 23.05.2011

Ну, например, 3.0+4.0 не обязательно будет равно 7.0

Looka
Offline
Зарегистрирован: 24.04.2012

step962 пишет:

Ну, например, 3.0+4.0 не обязательно будет равно 7.0

 

В каких случаях?  По конкретнее можно.   
Речь о баге компилятора?   Или это особенность типа?

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Особенность типа

Looka
Offline
Зарегистрирован: 24.04.2012

kisoft пишет:

Особенность типа

 

Округление? 
Не примите за назойливость, но не хочется га шрабли где нить наступить. 
Пример можно с такой осоенностью?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Сравнение чисел с плавающей запятой производится с определенной точностью, т.е. плюс-минус лапоть (см. скетч maksim в сообщении #3, там этот лаполть равен 0.01). Это связано с представлением чисел с плавающей запятой.

Читать, например, здесь http://habrahabr.ru/post/112953/ п.4.5

 

Looka
Offline
Зарегистрирован: 24.04.2012

Понятно. 

 

Хотя к примеру в первом посте это не имеет отношения. 

Функция возвращает флоат, которое формируется из  int.  

То есть, из конкретного Int  получается конкретное значение флоат, и зависимость тут жесткая. 

 

Хотя с точки зрения логики программы, правильнее конечно-же отслеживать  выход за пределы интервала.

nikolozij
Offline
Зарегистрирован: 29.01.2014

Благодарю, за подробное разъяснение. Будем двигаться дальше ... прикрутим индикатор.