Потеря цифр после запятой при передаче float.
- Войдите на сайт для отправки комментариев
Всем привет. Я доделал тот самый скетч с оператором 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); } }
строка 46 передачика
Размерность элемента массива transmit_data[0] - 1 байт. Размерность float h на ардуине - 4 байта
Дальше, я думаю, для того, кто понимает memcmp - все должно быть ясно
А как хитро себя обманул в 50 и 53 строках.
отправляю инфу о влажности и температуре с DHT21 в формате **.** .... в мониторе порта передатчика, всё классно.
Так Вы бы ещё в монитор просто печатали "Vse klassno" и нам бы тут рассказывали.
Вы что отравляете в строке 64? Массив transmit_data? А что печатаете в строках 50 и 53? Нафига Вы печатаете не то, что отправляете? Сами себе мозг компостируете?
Вы уж печатайте то, что отправляете, оно может и не всё классно будет, но зато полезно для дела.
И, поймите Вы наконец, до тех пор, пока
Т.е. до тех пока Вы вместо нормальной литературы будете пялиться в ютубы всяких гайверов, проблемы такого рода будут возникать ПОСТОЯННО. И Вы постоянно будете выставлять себя идиотом на различных форумах. Просто читайте нормальную литературу и всё придёт.
Господа, вы зачем то ищите дурака, там где его нет, сами себе выдумываете демонов, проблема была лишь в моей невнимательности, объявил массив как float, а не byte и всё заработало, на приёмнике всё верно до сотой доли, да, это отчасти из-за "насмотревшись видео", но ведь я решил проблему, а значит медленно, но верно движусь к "кодовой грамотности", и не важно какой дорогой, важно что это работает, это мой путь, я прошу лишь помочь с вопросами. Спасибо b707 за подсказку куда смотреть.
А в строках 50-53 я что отправляю, то и вывожу в порт, так как переменные t и h у меня что в порт, что в передачу одинаковые, даже если они не будут совпадать (не представляю почему), кусок с монитором нужен просто для слежения что DHT не отвалился, он на макетке висит и провода иногда выскакивают.
Господа, вы зачем то ищите дурака, там где его нет
И ведь нходим же!
А в строках 50-53 я что отправляю, то и вывожу в порт
Выводите Вы t и h, а отправляете transmit_data, и если Вы до сих пор не поняли, что это разные вещи, то это Ваша проблема.
движусь к "кодовой грамотности"
Это заметно по Вашим вопросам
это мой путь
Побираться по форумам за каждой запятой и выставлять себя идиотом? Похоже, что да, действительно Ваш.
Побираться по форумам за каждой запятой и выставлять себя идиотом? Похоже, что да, действительно Ваш.
Смешно читать, честное слово, как вы, старожил, огрызаетесь на новичка. Воспитание, однако.
Мне всё равно что там в массиве, я отслеживаю значение переменных h и t, они же записаны в элементы массива, подставил элементы вместо переменных:
И знаете что?.... А ничего не изменилось, какой кошмар. И если я не прав, объясните суть, а быть обиженным в детстве и "бить палкой" не объясняя может каждый.
Я объясню. Если бы вы выводили в Serial элементы массива, то давно бы уже приметили, что цифры "не те" и поставили массиву правильный тип.
Я объясню. Если бы вы выводили в Serial элементы массива, то давно бы уже приметили, что цифры "не те" и поставили массиву правильный тип.
Доходчиво, даже сказать нечего, спасибо, это полезно, такого в книжке нет (читаю программирование на C++ в примерах и задачах Васильева А.Н.), это опыт.
Так суть-то проста. Если хочешь узнать что передаётся в линию, то печатать нужно именно то, что передаётся. Если бы Вы это сделали - не было бы этого поста, т.к. Вы бы сразу увидели, что передаётся совсем не то, что надо. Неужели Вам это непонятно? Ну, если непонятно, то ... ладно, я промолчу. А поскольку Вы этого не сделали, появился этот пост с идиотским утверждением, что
Вы бы привыкали за помощь и объяснения говорить "спасибо", а не наезжать на помогающих, а то ведь и я, и b707, и остальные рано или поздно присоединимся к Воротам, кому будете следующие вопросы задавать?
Мне. Но не долго.
Вы бы сразу увидели, что передаётся совсем не то, что надо. Неужели Вам это непонятно?
кому будете следующие вопросы задавать?
На тот момент да, было не понятно, правильно сказали, что распутывать клубок пока не умею, но и на тексте я учиться тоже не могу, не идёт и всё, только так запоминаю, на ошибках.
В про следующие вопросы...а вы уверены, что я дотерплю ваши оскорбления (которых априори изначально быть не должно) до момента присоединения к Воротам? Я никогда ещё не наезжал на того, кто старается помочь, а не кидает мне фразы типа "да ты ещё зелёный, ты сначала почитай, ты сначала поучи, да нихрена ты не понимаешь..". Это не помощь, может быть при совке так было. Я сам могу трезво оценить где у меня проседает теория. Я не настолько самоуверен, что бы заявлять "да всё я знаю", нет, я знаю что ещё учить и учить. Но я попросил помощи в конкретном вопросе и я ни в коем случае не просил объяснить мне, как повысить грамотность. Чувствуете разницу? Форум это место, где решают вопросы, а не "мозги компостируют" и не отсылают в "школу", и сидеть тут, что бы засерать новичков это конечно очень полезное времяпрепровождение.
И насчёт спасибо перечитайте обе темы, все мои посты, и осознайте, в чём вы не правы, думаю у такого гуру это получится без указания "строки кода".
А когда я Вам в посте всё это #3 разжевал.
Разжевал мне b707 и sadman41, а вы раскритиковали. Без опыта ваш комментарий бесполезен для новичка. Там нет фактической информации как действовать, только указание неточности, которая вобще не понятно почему была неточностью (что так же не "разжевали"). Когда что то объясняешь, надо объяснять для ищущего, а не для себя, об этом многие часто забывают.
Но я попросил помощи в конкретном вопросе и я ни в коем случае не просил объяснить мне, как повысить грамотность. Чувствуете разницу? Форум это место, где решают вопросы, а не "мозги компостируют" и не отсылают в "школу", и сидеть тут, что бы засерать новичков это конечно очень полезное времяпрепровождение.
Рубикон вы перешли, что сказать ещё...
Рубикон вы перешли, что сказать ещё...
Если я не прав, то пропишите в FAQ, что "на форуме тебе помогут, только сначала быстро сделают поспешный вывод о грамотности, унизят, будут надсмехаться, выставят полным идиотом и в самом конце за это же тебя самого и обвинят, а потом помогут".
Впрочем, всё. Мне надоело. Я присоединяюсь в Воротам. Всего хорошего.
Ты чему-то научишься только тогда, когда у тебя хватит мозгов это понять, и не раньше.
Разжевал мне b707 и sadman41, а вы раскритиковали. Без опыта ваш комментарий бесполезен для новичка. Там нет фактической информации как действовать, только указание неточности, которая вобще не понятно почему была неточностью (что так же не "разжевали"). Когда что то объясняешь, надо объяснять для ищущего, а не для себя, об этом многие часто забывают.
Особенно это касается случаев, когда на форуме задаются непрофильные вопросы, например, на форуме Ардуино - вопросы по основам программирования.