Как убрать нули после запятой в ds18b20

romiras
Offline
Зарегистрирован: 12.07.2015

Здравствуйте, подскажите, как убрать нули после запятой в показаниях датчика температуры. Показывает 26.00, а нужно просто 26

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <OneWire.h>

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(7, 8); // CE, CSN
OneWire  ds(9);

void setup() {

  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)

  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);

  radio.openWritingPipe(pipe); // открываем трубу на передачу.

}


void loop() {

  ////////////// 18b20 //////////////
  byte addr[8];
  byte data[12];
  if (!ds.search(addr)) { // если 18b20 не найден
    float temperature = -128;
    radio.write(&temperature, sizeof(temperature));
    delay(5000);
  }
  ds.reset_search();

  ds.reset();
  ds.select(addr);
  ds.write(0x44);
  delay(1000);

  ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  for (int i = 0; i < 9; i++) data[i] = ds.read();

  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
  float temperature = raw / 16.0;
  ///////////////////////////////

  // отправляем данные и указываем сколько байт пакет
  radio.write(&temperature, sizeof(temperature));

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Я вам уже  писал про это совсем недавно. 46-50 строку вырезаете, вставляете это:

int8_t Temp =  ds.read()>>4 | (ds.read()<<4); // взять по полбайта с первого и второго чтения

Результат лежит в байте Temp

 

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

замени float на int в скетче

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо! Но я видимо неправильно сформировал свой вопрос. Думаю исходный код передатчика не нужно было трогать. А нужно было убирать нули на выходе приемника

приемник:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <Wire.h>


const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
const uint64_t pipe02 = 0xF0F1F2F3F1LL; // могут различатся только на младший байт

RF24 radio(7, 8); // CE, CSN


void setup() {
  Serial.begin(9600);
  radio.begin();

  delay(2);
  radio.setChannel(9); // канал (0-127)
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);

  radio.openReadingPipe(1, pipe01); // открываем трубу с индитификатором "pipe01"
  radio.openReadingPipe(2, pipe02); // открываем трубу с индитификатором "pipe02"
  //  radio.openReadingPipe(0,pipe01); // или открываем все трубы разом
  radio.startListening(); // включаем приемник, начинаем слушать трубу
}

//  radio.stopListening(); // останавливает приём (нужно перед началом передачи)


void loop()
{
  uint8_t pipeNum = 0;

  if (radio.available(&pipeNum)) { // проверяем не пришло ли чего в буфер.
    if (pipeNum == 1) {
      float temperature = 0;
      radio.read(&temperature, sizeof(temperature));


      Serial.println(temperature);
      Serial.println();
    }
    if (pipeNum == 2) {
      int data[2] = {0};
      radio.read(&data, sizeof(data));


      if (data[0] < 0) Serial.print("-");
      else Serial.print("+");
      Serial.print(data[0]);
      Serial.print("C  ");
      Serial.print(data[1]);
      Serial.println("%");
      Serial.println();
    }
  }
}

как здесь ноли лишнии отсечь?

float temperature = 0;
radio.read(&temperature, sizeof(temperature));
romiras
Offline
Зарегистрирован: 12.07.2015

результат тот же, спасибо

Клапауций 777
Offline
Зарегистрирован: 21.11.2015

romiras пишет:

как здесь ноли лишнии отсечь?

ну, я же тебе сказал, как - юзай целочисленные переменные.

romiras
Offline
Зарегистрирован: 12.07.2015

все, разобрался, спасибо!

bwn
Offline
Зарегистрирован: 25.08.2014

Если по какой то причине float должен быть, то: Serial.print(data[0] , 0); , вроде так.