Помогите разобраться с приемом/передачей данных
- Войдите на сайт для отправки комментариев
Вс, 20/01/2019 - 20:39
Конечная цель такая- сделать передачу температуры по радио каналу 433 Мгц, и вывод этой температуры на дисплей TM1637. Радио модули рабочие, передают/принимают заданную переменную, далее выводят все на дисплей. Но с передачей или приемом температурных данных творится неведомо что- в ком порта приемника выводит абсолютно рандомные числа. Хотя без радиомодулей все работало как надо, читались показания с терморизистора и выводились на дисплей. Сам в программировании не шарю, информатику в школе прогуливал.
ПРИЕМНИК:
#include <iarduino_RF433_Receiver.h> // Подключаем библиотеку для работы с приёмником MX-RM-5V #define CLK 5 #define DIO 4 #include "TM1637.h" TM1637 disp(CLK, DIO); iarduino_RF433_Receiver radio(2); // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён приёмник (можно подключать только к выводам использующим внешние прерывания) int data[2]; // Создаём массив для приёма данных const uint8_t pinLED=11; // Создаём константу с указанием вывода ШИМ к которому подключён светодиод void setup(){ pinMode(2, OUTPUT); digitalWrite(2, 1); Serial.begin(9600); disp.init(); // инициализация disp.set(7); Serial.begin(9600); // Инициируем работу LED индикатора radio.begin(); // Инициируем работу приёмника MX-RM-5V (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate) radio.setDataRate (i433_1KBPS); // Указываем скорость приёма данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек radio.openReadingPipe (5); // Открываем 5 трубу для приема данных (если вызвать функцию без параметра, то будут открыты все трубы сразу, от 0 до 7) // radio.openReadingPipe (2); // Открываем 2 трубу для приёма данных (таким образом можно прослушивать сразу несколько труб) // radio.closeReadingPipe(2); // Закрываем 2 трубу от приёма данных (если вызвать функцию без параметра, то будут закрыты все трубы сразу, от 0 до 7) radio.startListening (); // Включаем приемник, начинаем прослушивать открытую трубу // radio.stopListening (); // Выключаем приёмник, если потребуется } void loop(){ if(radio.available()){ // Если в буфере имеются принятые данные radio.read(&data, sizeof(data)); // Читаем данные в массив data и указываем сколько байт читать Serial.println(data[0]); disp.displayInt(data[0]); delay(1000); disp.clearDisplay(); } // Если вызвать функцию available с параметром в виде ссылки на переменную типа uint8_t, то мы получим номер трубы, по которой пришли данные (см. урок 26.5) }
ПЕРЕДАТЧИК:
#include <iarduino_RF433_Transmitter.h> // Подключаем библиотеку для работы с передатчиком FS1000A iarduino_RF433_Transmitter radio(12); // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён передатчик int p = 122; #define THERMISTORPIN A0 // сопротивление при 25 градусах по Цельсию #define THERMISTORNOMINAL 10000 // temp. для номинального сопротивления (практически всегда равна 25 C) #define TEMPERATURENOMINAL 25 // сколько показаний используем для определения среднего значения #define NUMSAMPLES 5 // бета коэффициент термистора (обычно 3000-4000) #define BCOEFFICIENT 3950 // сопротивление второго резистора #define SERIESRESISTOR 10000 int samples[NUMSAMPLES]; void setup(){ analogReference(EXTERNAL); radio.begin(); // Инициируем работу передатчика FS1000A (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate) radio.setDataRate (i433_1KBPS); // Указываем скорость передачи данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек radio.openWritingPipe (5); // Открываем 5 трубу для передачи данных (передатчик может передавать данные только по одной из труб: 0...7) } // Если повторно вызвать функцию openWritingPipe указав другой номер трубы, то передатчик начнёт передавать данные по вновь указанной трубе void loop(){ uint8_t i; float average; // сводим показания в вектор с небольшой задержкой между снятием показаний for (i=0; i< NUMSAMPLES; i++) { samples[i] = analogRead(THERMISTORPIN); delay(10); } // рассчитываем среднее значение average = 0; for (i=0; i< NUMSAMPLES; i++) { average += samples[i]; } average /= NUMSAMPLES; Serial.print("Average analog reading "); Serial.println(average); // конвертируем значение в сопротивление average = 1023 / average - 1; average = SERIESRESISTOR / average; Serial.print("Thermistor resistance "); Serial.println(average); float steinhart; steinhart = average / THERMISTORNOMINAL; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // инвертируем steinhart -= 273.15; // конвертируем в градусы по Цельсию Serial.print("Temperature "); Serial.print(steinhart); Serial.println(" *C"); radio.write(&steinhart, sizeof(10000)); // отправляем данные из массива data указывая сколько байт массива мы хотим отправить delay(10); // пауза между пакетами }
1. Что означает sizeof(10000) в строке 96 передатчика? Можете пояснить?
2. Вы троке 96 передатчика Вы пытаетесь отправить величину steinhart типа float (неправильно, но пытаетесь), а в строке 28 приёмника, Вы пытаетесь прочитать её в data - массив двух целых! (да ещё при этом печатаете только первое из них, а на второе вообще забили!). Вы не пробовали читать то, что отправляете? Попробуйте, Вам понравится.
Так берите учебник и прокачивайтесь. Тупое, без понимания что написано, копирование с lesson.iarduino.ru и попытки подладить под себя методом тыка Вам ничего не дадут - так не работает.
1. Что означает sizeof(10000) в строке 96 передатчика? Можете пояснить?
2. Вы троке 96 передатчика Вы пытаетесь отправить величину steinhart типа float (неправильно, но пытаетесь), а в строке 28 приёмника, Вы пытаетесь прочитать её в data - массив двух целых! (да ещё при этом печатаете только первое из них, а на второе вообще забили!). Вы не пробовали читать то, что отправляете? Попробуйте, Вам понравится.
Так берите учебник и прокачивайтесь. Тупое, без понимания что написано, копирование с lesson.iarduino.ru и попытки подладить под себя методом тыка Вам ничего не дадут - так не работает.
1. Объяснить не могу, поставил от балды, думал не важно.
2. При передаче числовой переменной было все нормально, число принималось и выводилось на дисплей, думал и с температурной переменной прокатит)
Разобрался! Просто переназначил переменную float в int
Спасибо ЕвгенийП!
думал не важно.
А оно вона как!
1. Объяснить не могу, поставил от балды,
У Вас там в коде в этой же строке по-русски написано что это за число. Вы код-то хотя бы читали или просто копипастили? Прочитайте. Прямо в этой строке и написано что должно быть на месте вашего "от балды".
2. При передаче числовой переменной было все нормально, число принималось и выводилось на дисплей, думал и с температурной переменной прокатит)
на самом деле нормально было пока Вы запускали пример из урока. Но как только начали менять его методом тыка, всё и сломалось. Это как раз то, о чём я Вам говорил в прошлом посте. Прогуливали - навёрстывайте, но метод тыка без малейшего понимания тут не работает.
Итак, чтобы исправить ситуацияю Вам нужно
1. Нормально передать переменную steinhart, для этого нужно понять что же там должно быть вторым параметром (это написано в комментарии) и подставить правильное значение.
2. Нормально её принять в приёмнике. Для этого нужно наконец понять что именно Вы передаёте и принимать именно это а не что-то другое, как Вы делаете сейчас.
Работайте. Как сделаете первый пункт, покажите и переходите ко второму.
Разобрался! Просто переназначил переменную float в int
Мрак! Она же у Вас по-жизни float!
Вы ж её вычислете именно как float. Обозвав её int, Вы наложили огромную кучу на Ваши же вычисления в строках 80-88!
Просто передавайте float и не выпендривайтесь, а то через час прибежите "памагити у меня вся дробная часть куда-то пропала, мож потому что ардуина китайская"
Разобрался! Просто переназначил переменную float в int
Мрак! Она же у Вас по-жизни float!
Вы ж её вычислете именно как float. Обозвав её int, Вы наложили огромную кучу на Ваши же вычисления в строках 80-88!
Просто передавайте float и не выпендривайтесь, а то через час прибежите "памагити у меня вся дробная часть куда-то пропала, мож потому что ардуина китайская"
Неправильно пояснил, не переназначил, а создал переменную int и задал ей переменную steinhart
Спасибо конечно за вашу попытку помочь, но все оказалось в разы проще.
Неправильно пояснил, не переназначил, а создал переменную int и задал ей переменную steinhart
И просто выбросили дробную часть. Если Ваша steinhart окажется 20,999, то Ваша int будет 20.
Если это Вас устраивает, то ради бога. Только в приёмнике Вы зачем-то принимаете два целых числа, хотя передёте одно.
но все оказалось в разы проще.
Да, ничего не оказалось. Случайный тык "кажется заработал". Правда неправильно, но уже лучше. чем было.
Понимания как не было так и нет. Просто, ценой потери точности хоть как-то заскрипело.
Если это то. что Вам нужно, то успехов.
Если это Вас устраивает, то ради бога. Только в приёмнике Вы зачем-то принимаете два целых числа, хотя передёте одно.
Еще не разобрался с массивами, так что пока так
Да, ничего не оказалось. Случайный тык "кажется заработал". Правда неправильно, но уже лучше. чем было.
Понимания как не было так и нет. Просто, ценой потери точности хоть как-то заскрипело.
Если это то. что Вам нужно, то успехов.
Для моих нужд, сойдет
Не успел я порадоваться маленькой победой, как появилась новая проблема) Абсолютно рандомно зависает дисплей. включил, зависло челез 10 секунд, перезагрузил питание, проработало 10 минут без зависания. Не знаете с чем это может быть связано?
Не знаете с чем это может быть связано?
Знаю, и уже говорил Вам, но Вы не верите.