Потеря цифр после запятой при передаче float.

Comoq
Offline
Зарегистрирован: 08.02.2019

Всем привет. Я доделал тот самый скетч с оператором FOR почти до победного конца. Что то вычитал, что то сам понял. Итак: отправляю инфу о влажности и температуре с DHT21 в формате **.**, но на приёмник приходит только **, без запятой и того, что после неё. Видел тут похожий вопрос, но он сложнее, чем моя самоделка. На Амперке на подобный вопрос ответили, мол умнож на 100 при передаче и раздели на 100 при приёме, я попробовал, допустим влажность 38.20%, умножаю, получаю int со значением 3820 в мониторе порта передатчика, всё классно. Но вот в мониторе приёмника какая то белиберда приходит, 46, 60, 106, и т.д. Даже разделить обратно не успеваю. Подскажите, как передать с дробной частью?

Вставлю исходники без моих попыток вернуть дробную часть, что бы не путаться. 

Код передатчика

#include "DHT.h"
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

#define DHTPIN 2
#define DHTTYPE DHT21

DHT dht (DHTPIN, DHTTYPE);

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 

byte transmit_data[2]; 
byte latest_data[2]; 
boolean flag; 

void setup() 
{
  dht.begin(); 
  Serial.begin(9600); 
  
  radio.begin();
  radio.setAutoAck(1);        
  radio.setRetries(0, 15);   
  radio.enableAckPayload();    
  radio.setPayloadSize(32);    

  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60);  

  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS);
  
  radio.powerUp(); 
  radio.stopListening();  
}
void loop() {

  delay (1000);
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  transmit_data[0] = h;
  transmit_data[1] = t;

  Serial.print("Влажность : ");
  Serial.println(h);
 
  Serial.print("Температура : ");
  Serial.print(t);
  Serial.print(" *C, ");

  for (int i = 0; i < 2; i++) { 
   if (transmit_data[i] != latest_data[i]) { 
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; 
    }
 }
  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); 
    //flag = 0; 
    radio.powerDown(); 
  }
}

Код приёмника

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10); 

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  

byte recieved_data[2]; 

void setup()
{
  Serial.begin(9600); 
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0,15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);    

  radio.openReadingPipe(1,address[0]);    
  radio.setChannel(0x60);  

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

  radio.powerUp(); 
  radio.startListening();  
}
void loop() 
{
    byte pipeNo;                          
    while( radio.available(&pipeNo)){   
      radio.read( &recieved_data, sizeof(recieved_data) );      
         float h = recieved_data[0];
         float t = recieved_data[1];

      Serial.print("HUM");
      //Serial.print(recieved_data[0]);
      Serial.print(h);
      Serial.println("TEMP");
      //Serial.print(recieved_data[1]);
      Serial.print(t); 
   } 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

строка 46 передачика

Размерность элемента массива transmit_data[0] - 1 байт. Размерность float h на ардуине - 4 байта

Дальше, я думаю, для того, кто понимает memcmp - все должно быть ясно

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

А как хитро себя обманул в 50 и 53 строках.

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

Comoq пишет:

отправляю инфу о влажности и температуре с DHT21 в формате **.** ....  в мониторе порта передатчика, всё классно. 

Так Вы бы ещё в монитор просто печатали "Vse klassno" и нам бы тут рассказывали.

Вы что отравляете в строке 64? Массив transmit_data? А что печатаете в строках 50 и 53? Нафига Вы печатаете не то, что отправляете? Сами себе мозг компостируете?

Вы уж печатайте то, что отправляете, оно может и не всё классно будет, но зато полезно для дела.

И, поймите Вы наконец, до тех пор, пока

Comoq пишет:
только не надо на книги кидать, на сайте полно конкретных гайдов, можно пнуть в сторону одного из них

Т.е. до тех пока Вы вместо нормальной литературы будете пялиться в ютубы всяких гайверов, проблемы такого рода будут возникать ПОСТОЯННО. И Вы постоянно будете выставлять себя идиотом на различных форумах. Просто читайте нормальную литературу и всё придёт.

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

b707 пишет:
для того, кто понимает memcmp
Да, Вы повнимательнее там почитайте. Особенно не первое сообщение, где он что-то прочитал и скопипастил, а последующе. Там видно, что ничерта не понимает.

Comoq
Offline
Зарегистрирован: 08.02.2019

Господа, вы зачем то ищите дурака, там где его нет, сами себе выдумываете демонов, проблема была лишь в моей невнимательности, объявил массив как float, а не byte и всё заработало, на приёмнике всё верно до сотой доли, да, это отчасти из-за "насмотревшись видео", но ведь я решил проблему, а значит медленно, но верно движусь к "кодовой грамотности", и не важно какой дорогой, важно что это работает, это мой путь, я прошу лишь помочь с вопросами. Спасибо b707 за подсказку куда смотреть.

А в строках 50-53 я что отправляю, то и вывожу в порт, так как переменные t и h у меня что в порт, что в передачу одинаковые, даже если они не будут совпадать (не представляю почему), кусок с монитором нужен просто для слежения что DHT не отвалился, он на макетке висит и провода иногда выскакивают.

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

Comoq пишет:

Господа, вы зачем то ищите дурака, там где его нет

И ведь нходим же!

Comoq пишет:

А в строках 50-53 я что отправляю, то и вывожу в порт

Выводите Вы t и h, а отправляете transmit_data, и если Вы до сих пор не поняли, что это разные вещи, то это Ваша проблема.

Comoq пишет:

движусь к "кодовой грамотности"

Это заметно по Вашим вопросам

Comoq пишет:

это мой путь

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

Comoq
Offline
Зарегистрирован: 08.02.2019

ЕвгенийП пишет:

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

Смешно читать, честное слово, как вы, старожил, огрызаетесь на новичка. Воспитание, однако.

Мне всё равно что там в массиве, я отслеживаю значение переменных h и t, они же записаны в элементы массива, подставил элементы вместо переменных:

Serial.print("Влажность : ");
  Serial.println(transmit_data[0]);
 
  Serial.print("Температура : ");
  Serial.print(transmit_data[1]);
  Serial.print(" *C, ");

 И знаете что?.... А ничего не изменилось, какой кошмар. И если я не прав, объясните суть, а быть обиженным в детстве и "бить палкой" не объясняя может каждый.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я объясню. Если бы вы выводили в Serial элементы массива, то давно бы уже приметили, что цифры "не те" и поставили массиву правильный тип. 

Comoq
Offline
Зарегистрирован: 08.02.2019

sadman41 пишет:

Я объясню. Если бы вы выводили в Serial элементы массива, то давно бы уже приметили, что цифры "не те" и поставили массиву правильный тип. 

Доходчиво, даже сказать нечего, спасибо, это полезно, такого в книжке нет (читаю программирование на C++ в примерах и задачах Васильева А.Н.), это опыт.

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

Comoq пишет:
объясните суть

Так суть-то проста. Если хочешь узнать что передаётся в линию, то печатать нужно именно то, что передаётся. Если бы Вы это сделали - не было бы этого поста, т.к. Вы бы сразу увидели, что передаётся совсем не то, что надо. Неужели Вам это непонятно? Ну, если непонятно, то ... ладно, я промолчу. А поскольку Вы этого не сделали, появился этот пост с идиотским утверждением, что

Comoq пишет:
в мониторе порта передатчика, всё классно.
А когда я Вам в посте всё это #3 разжевал, то выяснилось, что я же ещё в чём-то и виноват.

Вы бы привыкали за помощь и объяснения говорить "спасибо", а не наезжать на помогающих, а то ведь и я, и b707, и остальные  рано или поздно присоединимся к Воротам, кому будете следующие вопросы задавать?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мне. Но не долго. 

Comoq
Offline
Зарегистрирован: 08.02.2019

ЕвгенийП пишет:

Вы бы сразу увидели, что передаётся совсем не то, что надо. Неужели Вам это непонятно?

кому будете следующие вопросы задавать?

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

В про следующие вопросы...а вы уверены, что я дотерплю ваши оскорбления (которых априори изначально быть не должно) до момента присоединения к Воротам? Я никогда ещё не наезжал на того, кто старается помочь, а не кидает мне фразы типа "да ты ещё зелёный, ты сначала почитай, ты сначала поучи, да нихрена ты не понимаешь..". Это не помощь, может быть при совке так было. Я сам могу трезво оценить где у меня проседает теория. Я не настолько самоуверен, что бы заявлять "да всё я знаю", нет, я знаю что ещё учить и учить. Но я попросил помощи в конкретном вопросе и я ни в коем случае не просил объяснить мне, как повысить грамотность. Чувствуете разницу? Форум это место, где решают вопросы, а не "мозги компостируют" и не отсылают в "школу", и сидеть тут, что бы засерать новичков это конечно очень полезное времяпрепровождение.

И насчёт спасибо перечитайте обе темы, все мои посты, и осознайте, в чём вы не правы, думаю у такого гуру это получится без указания "строки кода".

Comoq
Offline
Зарегистрирован: 08.02.2019

ЕвгенийП пишет:

А когда я Вам в посте всё это #3 разжевал.

Разжевал мне b707 и sadman41, а вы раскритиковали. Без опыта ваш комментарий бесполезен для новичка. Там нет фактической информации как действовать, только указание неточности, которая вобще не понятно почему была неточностью (что так же не "разжевали"). Когда что то объясняешь, надо объяснять для ищущего, а не для себя, об этом многие часто забывают.

sadman41
Offline
Зарегистрирован: 19.10.2016

Comoq пишет:

Но я попросил помощи в конкретном вопросе и я ни в коем случае не просил объяснить мне, как повысить грамотность. Чувствуете разницу? Форум это место, где решают вопросы, а не "мозги компостируют" и не отсылают в "школу", и сидеть тут, что бы засерать новичков это конечно очень полезное времяпрепровождение.

Рубикон вы перешли, что сказать ещё...

Comoq
Offline
Зарегистрирован: 08.02.2019

sadman41 пишет:

Рубикон вы перешли, что сказать ещё...

Если я не прав, то пропишите в FAQ, что "на форуме тебе помогут, только сначала быстро сделают поспешный вывод о грамотности, унизят, будут надсмехаться, выставят полным идиотом и в самом конце за это же тебя самого и обвинят, а потом помогут".

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

Comoq пишет:
я попросил помощи в конкретном вопросе и я ни в коем случае не просил объяснить мне, как повысить грамотность. Чувствуете разницу?
А я Вам объяснил, что без повышения грамотности, помочь Вам нельзя, но Вы этого не прочувствовали.

Впрочем, всё. Мне надоело. Я присоединяюсь в Воротам. Всего хорошего.

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

Comoq пишет:
выставят полным идиотом
Полным идиотом ты выставляешь себя сам, и никто, кроме тебя самого.

Ты чему-то научишься только тогда, когда у тебя хватит мозгов это понять, и не раньше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Comoq пишет:

Разжевал мне b707 и sadman41, а вы раскритиковали. Без опыта ваш комментарий бесполезен для новичка. Там нет фактической информации как действовать, только указание неточности, которая вобще не понятно почему была неточностью (что так же не "разжевали"). Когда что то объясняешь, надо объяснять для ищущего, а не для себя, об этом многие часто забывают.

IMHO объяснять вообще не нужно. Нужно лишь дать слючевые слова, по которым новичок может самостоятельно либо поискать в Гугле, либо найти нужный параграф в рекомендованной литературе. Если ему это делать лень, помощи он не достоин.

Особенно это касается случаев, когда на форуме задаются непрофильные вопросы, например, на форуме Ардуино - вопросы по основам программирования.