Перевод float в byte

Mavey
Offline
Зарегистрирован: 29.11.2017
float temp3 = sensors.getTempC (Sensor03);
Wire.write(temp3);
delay(750);

Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании

Иван_123
Offline
Зарегистрирован: 17.01.2018

IMHO

temp3 = (byte)temp3;

...перед Wire.write

Или

Wire.write((byte)temp3);

По крайней мере, с int это точно должно работать.

Жду-с критиков.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Иван_123 пишет:

IMHO

temp3 = (byte)temp3;

...перед Wire.write

Или

Wire.write((byte)temp3);

По крайней мере, с int это точно должно работать.

Жду-с критиков.

нобелевка за "сжатие" типа float в byte ! однозначнА!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Mavey пишет:

float temp3 = sensors.getTempC (Sensor03);
Wire.write(temp3);
delay(750);

Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании

я не знаю ev3 контроллер , но float, который вы получаете при чтении датчика, состоит из 4 байт и упакован неким образом, передать 4 байта по wire не проблема, как воспримит это ev3 контроллер ?

что ему надо передавать, может целую и дробную часть в 2 байтах, может еще чего 

я х.з.

nik182
Offline
Зарегистрирован: 04.05.2015

А что такое ev3 контроллер? Что он отправляет байтами? По сколько? Что из отправки получается?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Иван_123 пишет:

Жду-с критиков.

Напрасно ждёшь. Критиковать можно мысли или идеи, а критиковать безграмотный бред ламера невозможно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Иван_123,

а прежде, чем ждать-с критиков, Вы сами это запускали? Проверяли? И как? Работает?

Mavey
Offline
Зарегистрирован: 29.11.2017

Лучше в трех битах так как температура может быть еще положительная и отрицательная.

Ну ev3 это что-то типо ардуино из лего программируется простым языком из блоков, в него закачал библиотеку для общения по iic там функция ReadByte Пишешь адрес iic и выводишь данные на экранчик (он встроен в ev3)

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Mavey пишет:

Лучше в трех битах так как температура может быть еще положительная и отрицательная.

я даже не знаю стоит пролоджать или нет.

вот не поленился узнать что это за чудо

http://www.proghouse.ru/article-box/90-connecting-ev3-arduino

даже пример есть.

Mavey
Offline
Зарегистрирован: 29.11.2017

Ну я как бы этот гайд и юзал, но там не описано как float значения передавать 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Mavey пишет:

Ну я как бы этот гайд и юзал, но там не описано как float значения передавать 

 

а если я найду ?

Mavey
Offline
Зарегистрирован: 29.11.2017

Буду признателен, но не думаю что тебе это удасться

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Mavey пишет:

Лучше в трех битах так как температура может быть еще положительная и отрицательная.

В трёх битах можно хранить числа со знаком от -4 до 3. Т.е. диапазон возможных значений -4, -3, -2, -1, 0, 1, 2, 3. И ничего больше. Вы уверены, что этого хватит для температуры?

Перечитайте ещё раз пост #3. Вам там сказали, что проблем передать число типа float - нет, но Вы уверены, что на той стороне его правильно примут? Если уверены, то как именно его надо передавать, чтобы приняли правильно? Каким байтов вперёд старшим или младшим? Если Вы ответите на этот вопрос, я покажу Вам как передавать.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Жесть! Что только люди не придумают, чтобы убедить блондинку в том, что она тоже что-то может сделать ничему никогда не учась :(

Serega66
Offline
Зарегистрирован: 23.03.2018

Mavey пишет:

float temp3 = sensors.getTempC (Sensor03);
Wire.write(temp3);
delay(750);

Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании

Самый простой способ умножить на 100, потом отправить по I2C, после получения разделить на 100

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Sapienz
Offline
Зарегистрирован: 25.12.2014

Всем привет. Уже сломал все мозги себе. Помогите пожалуйста.

Задача - передать из одной ардуины в другую FLOAT по I2C. Мастером служит ардуино контролирующая напряжение и ток, слэйвом - ардуина с LCD дисплеем(для отображения информации).  

Подключил библиотеку #include <iarduino_I2C_connect.h>, которая позволяет писать байты в расшаренный массив на слэйве, а затем внутри слэйва обрабатывать и отображать данные на LCD.

Заслал бы в расшареный на слэйве массив байты пользуясь методом 

void I2CSend(){
four = (ValueToSend & 0xFF);
three = ((ValueToSend >> 8) & 0xFF);
two = ((ValueToSend >> 16) & 0xFF);
one = ((ValueToSend >> 24) & 0xFF);
I2C2.writeByte(0x01,AdresI2C,four);
I2C2.writeByte(0x01,AdresI2C+1,three);
I2C2.writeByte(0x01,AdresI2C+2,two);
I2C2.writeByte(0x01,AdresI2C+3,one);
}

 

но с флоатом эта конструкция не работает. Можете подсказать - как разбить флоат на четыре байта, и каждый заслать в свою переменную? Чтобы потом переменную передать в модуль отображения информации.  
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Sapienz пишет:

Всем привет. Уже сломал все мозги себе. Помогите пожалуйста.

Задача - передать из одной ардуины в другую FLOAT по I2C. Мастером служит ардуино контролирующая напряжение и ток, слэйвом - ардуина с LCD дисплеем(для отображения информации). 

может вам не надо это. Потому что если были эти , которые вы сломали то глянули библиотеку EEPROM.h  Там тоже такая задача стояла. Но ничего через шаблон справились . В общем это универсальное решение.

https://github.com/esp8266/Arduino/blob/master/libraries/EEPROM/EEPROM.h

Sapienz
Offline
Зарегистрирован: 25.12.2014

Огромнейшее спасибо Максиму. С его объяснением тут - http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int - все получилось.

lego1
Offline
Зарегистрирован: 09.03.2018

Отправить и получить float или любой другой тип данных . 

Базовая библиотека I2C просто отправляет и получает байты. Достаточно часто нужно отправить float, int или long. Небольшая библиотека I2C_Anything помогает решить эту проблему.
 
Библиотека в основном состоит из этого файла:
 
I2C_Anything.h
// Written by Nick Gammon
// May 2012

#include <Arduino.h>
#include <Wire.h>

template <typename T> unsigned int I2C_writeAnything (const T& value)
  {
  Wire.write((byte *) &value, sizeof (value));
  return sizeof (value);
  }  // end of I2C_writeAnything

template <typename T> unsigned int I2C_readAnything(T& value)
  {
    byte * p = (byte*) &value;
    unsigned int i;
    for (i = 0; i < sizeof value; i++)
          *p++ = Wire.read();
    return i;
  }  // end of I2C_readAnything

Он использует шаблоны для преобразования любого типа данных в поток байтов. Например, отправить float или long на другую Arduino ... . (Просто создайте необработанный файл I2C_Anything.h в и поместите его в папку «I2C_Anything» директории «библиотеки» вашего Arduino. Затем перезапустите IDE, и вы готовы использовать его.).  Теперь простой скетч. 

Master

// Written by Nick Gammon
// May 2012

#include <Wire.h>
#include <I2C_Anything.h>

const byte SLAVE_ADDRESS = 42;

void setup() 
{
  Wire.begin ();
}  // end of setup

void loop() 
{

 long foo = 42;
 
 for (float fnum = 1; fnum <= 10; fnum += 0.015)
    {  
    Wire.beginTransmission (SLAVE_ADDRESS);
    I2C_writeAnything (fnum);
    I2C_writeAnything (foo++);
    Wire.endTransmission ();
      
    delay (200);
    }  // end of for

}  // end of loop
Две строки, начинающиеся с I2C_writeAnything, используют шаблон для отправки fnum и foo в качестве соответствующей серии байтов.
Затем, чтобы получить их:
 
Slave

// Written by Nick Gammon
// May 2012

#include <Wire.h>
#include <I2C_Anything.h>

const byte MY_ADDRESS = 42;

void setup() 
{
  Wire.begin (MY_ADDRESS);
  Serial.begin (115200);
  Wire.onReceive (receiveEvent);
}  // end of setup

volatile boolean haveData = false;
volatile float fnum;
volatile long foo;

void loop() 
{
  if (haveData)
    {
    Serial.print ("Received fnum = ");
    Serial.println (fnum);  
    Serial.print ("Received foo = ");
    Serial.println (foo);  
    haveData = false;  
    }  // end if haveData

}  // end of loop

// called by interrupt service routine when incoming data arrives
void receiveEvent (int howMany)
 {
 if (howMany >= (sizeof fnum) + (sizeof foo))
   {
   I2C_readAnything (fnum);   
   I2C_readAnything (foo);   
   haveData = true;     
   }  // end if have enough data
 }  // end of receiveEvent

Строки, начинающиеся с I2C_readAnything, считывают правильное количество байтов для типа данных и собирают их обратно в переменную, переданную в качестве аргумента.

Delphin911
Offline
Зарегистрирован: 25.12.2019

lego1 а как наоборот получить мастером информацию от слейва.

Все. Разобрался.