Как преобразовать из double64.

Grigoresku
Offline
Зарегистрирован: 03.11.2014

Добрый день,

Хочется вывести показания с счетчика воды на lcd.

Счетчик выдает значения как double64 младшим байтом вперед а именно 000000c0298c6741.

Перевернув получаем 41678c29c0000000 конвертируем через сайт http://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html получаем 12345678.000000000.

Собственно как на Ардуино микро преобразовать double64 000000c0298c6741 в 12345678.000000000 ?

 

 

 

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

сначала так https://www.google.com/search?hl=ru&q=arduino+double64&gws_rd=ssl , если возникнут вопросы - обращайся.

sva1509
Offline
Зарегистрирован: 07.12.2012

я думаю както так :

union {
        double db
        byte b[8];
}un;

после чего в нужном порядке заполняете b[x], а из db считываете в том типе который вам надо.

Grigoresku
Offline
Зарегистрирован: 03.11.2014

Что то не выходит,  note:   no known conversion for argument 1 from 'double' to 'String'

#include <LCD5110_Basic.h>
LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t SmallFont[];

union {
      double db;
      byte b[8];
} un;

void setup()
{
 un.b=41678c29c0000000;
 myGLCD.InitLCD();
 myGLCD.setFont(SmallFont);
}

void loop()
{
  myGLCD.clrScr();
  myGLCD.print("TEST", CENTER, 0);
  myGLCD.print(un.db, CENTER, 16);
  delay (5000);
}

 

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Дело в том, что метод вашего объекта myGLCD.print первым аргументом требует строку, а вы ему подсоввываете double. Во вторых - массив так:un.b=41678c29c0000000; не заполняется.

я думаю правильней будет вот так:

#include <LCD5110_Basic.h>
LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t SmallFont[];
 
union {
      double db;
      byte b[8];
} un;

byte bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41};
char str1[32];

double fromBytes(byte *b)
{
      for(i=0;i<8;i++)
          {
                un.b[i]=b[7-i];
          }
      return(un.db);
}
 
void setup()
{
 sprintf(str1,"%f",fromBytes(bs));
 myGLCD.InitLCD();
 myGLCD.setFont(SmallFont);
}
 
void loop()
{
  myGLCD.clrScr();
  myGLCD.print("TEST", CENTER, 0);
  myGLCD.print(str1, CENTER, 16);
  delay (5000);
}

 

sva1509
Offline
Зарегистрирован: 07.12.2012

А еще правильней будет так:

#include <LCD5110_Basic.h>
LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t SmallFont[];
 
typedef union {
      double db;
      byte b[8];
} DByte;

byte bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41};
char str1[32];

double fromBytes(byte *b)
{
DByte un;

      for(int i=0;i<8;i++)
          {
                un.b[i]=b[7-i];
          }
      return(un.db);
}
 
void setup()
{
 sprintf(str1,"%f",fromBytes(bs));
 myGLCD.InitLCD();
 myGLCD.setFont(SmallFont);
}
 
void loop()
{
  myGLCD.clrScr();
  myGLCD.print("TEST", CENTER, 0);
  myGLCD.print(str1, CENTER, 16);
  delay (5000);
}

что бы память на конвертацию выделялась динамически

Grigoresku
Offline
Зарегистрирован: 03.11.2014

Спасибо за помощь, но где то закралась ошибка.

На lcd выводит знак ?

sva1509
Offline
Зарегистрирован: 07.12.2012

Попробуйте так, если не правильный результат даст попробуйте заменить на un.b[i]=b[i]; без переворота

на компе у меня так и прошло.

#include <stdio.h>

unsigned char bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41};

typedef union {
        double db;
        unsigned char b[8];
} DByte;

double fromByte(unsigned char *b)
{
DByte un;

      for(int i=0;i<8;i++)
          {
                un.b[i]=b[i];
          }
      return(un.db);
}

int main()
{
        printf("%f, %lu\n",fromByte(bs),sizeof(double));
        return(0);
}

результат:

12345678.000000, 8