Перевод float в byte
- Войдите на сайт для отправки комментариев
Втр, 20/03/2018 - 15:48
float temp3 = sensors.getTempC (Sensor03); Wire.write(temp3); delay(750);
Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании
IMHO
...перед Wire.write
Или
По крайней мере, с int это точно должно работать.
Жду-с критиков.
IMHO
...перед Wire.write
Или
По крайней мере, с int это точно должно работать.
Жду-с критиков.
нобелевка за "сжатие" типа float в byte ! однозначнА!
Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании
я не знаю ev3 контроллер , но float, который вы получаете при чтении датчика, состоит из 4 байт и упакован неким образом, передать 4 байта по wire не проблема, как воспримит это ev3 контроллер ?
что ему надо передавать, может целую и дробную часть в 2 байтах, может еще чего
я х.з.
А что такое ev3 контроллер? Что он отправляет байтами? По сколько? Что из отправки получается?
Жду-с критиков.
Напрасно ждёшь. Критиковать можно мысли или идеи, а критиковать безграмотный бред ламера невозможно.
Иван_123,
а прежде, чем ждать-с критиков, Вы сами это запускали? Проверяли? И как? Работает?
Лучше в трех битах так как температура может быть еще положительная и отрицательная.
Ну ev3 это что-то типо ардуино из лего программируется простым языком из блоков, в него закачал библиотеку для общения по iic там функция ReadByte Пишешь адрес iic и выводишь данные на экранчик (он встроен в ev3)
Лучше в трех битах так как температура может быть еще положительная и отрицательная.
я даже не знаю стоит пролоджать или нет.
вот не поленился узнать что это за чудо
http://www.proghouse.ru/article-box/90-connecting-ev3-arduino
даже пример есть.
Ну я как бы этот гайд и юзал, но там не описано как float значения передавать
Ну я как бы этот гайд и юзал, но там не описано как float значения передавать
а если я найду ?
Буду признателен, но не думаю что тебе это удасться
Лучше в трех битах так как температура может быть еще положительная и отрицательная.
В трёх битах можно хранить числа со знаком от -4 до 3. Т.е. диапазон возможных значений -4, -3, -2, -1, 0, 1, 2, 3. И ничего больше. Вы уверены, что этого хватит для температуры?
Перечитайте ещё раз пост #3. Вам там сказали, что проблем передать число типа float - нет, но Вы уверены, что на той стороне его правильно примут? Если уверены, то как именно его надо передавать, чтобы приняли правильно? Каким байтов вперёд старшим или младшим? Если Вы ответите на этот вопрос, я покажу Вам как передавать.
http://www.proghouse.ru/article-box/90-connecting-ev3-arduino
Жесть! Что только люди не придумают, чтобы убедить блондинку в том, что она тоже что-то может сделать ничему никогда не учась :(
Здравствуйте возникла проблема с передачей данных в ev3 контроллер по i2c (SDA, SCL) Целочисленные и байты отлично отправляет, но на float ругается. Подскажите пожалуйста как решить проблему. К примеру как записать числа с плавающей точкой в byte. Сам новичок только в программировании
Самый простой способ умножить на 100, потом отправить по I2C, после получения разделить на 100
http://www.gammon.com.au/i2c
Всем привет. Уже сломал все мозги себе. Помогите пожалуйста.
Задача - передать из одной ардуины в другую 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); }Всем привет. Уже сломал все мозги себе. Помогите пожалуйста.
Задача - передать из одной ардуины в другую FLOAT по I2C. Мастером служит ардуино контролирующая напряжение и ток, слэйвом - ардуина с LCD дисплеем(для отображения информации).
https://github.com/esp8266/Arduino/blob/master/libraries/EEPROM/EEPROM.h
Огромнейшее спасибо Максиму. С его объяснением тут - http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int - все получилось.
Отправить и получить float или любой другой тип данных .
// 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// 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, считывают правильное количество байтов для типа данных и собирают их обратно в переменную, переданную в качестве аргумента.
lego1 а как наоборот получить мастером информацию от слейва.
Все. Разобрался.