Помогите разобраться с приемом/передачей данных

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Конечная цель такая- сделать передачу температуры по радио каналу 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);                                            // пауза между пакетами
}

 

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

1. Что означает sizeof(10000) в строке 96 передатчика? Можете пояснить?

2. Вы троке 96 передатчика Вы пытаетесь отправить величину steinhart типа float (неправильно, но пытаетесь), а в строке 28 приёмника, Вы пытаетесь прочитать её в data - массив двух целых!  (да ещё при этом печатаете только первое из них, а на второе вообще забили!). Вы не пробовали читать то, что отправляете? Попробуйте, Вам понравится.

qwerty13rus пишет:
информатику в школе прогуливал

Так берите учебник и прокачивайтесь. Тупое, без понимания что написано, копирование с lesson.iarduino.ru и попытки подладить под себя методом тыка Вам ничего не дадут - так не работает.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

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

1. Что означает sizeof(10000) в строке 96 передатчика? Можете пояснить?

2. Вы троке 96 передатчика Вы пытаетесь отправить величину steinhart типа float (неправильно, но пытаетесь), а в строке 28 приёмника, Вы пытаетесь прочитать её в data - массив двух целых!  (да ещё при этом печатаете только первое из них, а на второе вообще забили!). Вы не пробовали читать то, что отправляете? Попробуйте, Вам понравится.

qwerty13rus пишет:
информатику в школе прогуливал

Так берите учебник и прокачивайтесь. Тупое, без понимания что написано, копирование с lesson.iarduino.ru и попытки подладить под себя методом тыка Вам ничего не дадут - так не работает.

1. Объяснить не могу, поставил от балды, думал не важно.

2. При передаче числовой переменной было все нормально, число принималось и выводилось на дисплей, думал и с температурной переменной прокатит)

 

 

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Разобрался! Просто переназначил переменную float в int

Спасибо ЕвгенийП!

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

qwerty13rus пишет:

думал не важно.

А оно вона как!

qwerty13rus пишет:

1. Объяснить не могу, поставил от балды, 

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

qwerty13rus пишет:

2. При передаче числовой переменной было все нормально, число принималось и выводилось на дисплей, думал и с температурной переменной прокатит)

на самом деле нормально было пока Вы запускали пример из урока. Но как только начали менять его методом тыка, всё и сломалось. Это как раз то, о чём я Вам говорил в прошлом посте. Прогуливали - навёрстывайте, но метод тыка без малейшего понимания тут не работает.

Итак, чтобы исправить ситуацияю Вам нужно

1. Нормально передать переменную steinhart, для этого нужно понять что же там должно быть вторым параметром (это написано в комментарии) и подставить правильное значение.

2. Нормально её принять в приёмнике. Для этого нужно наконец понять что именно Вы передаёте и принимать именно это а не что-то другое, как Вы делаете сейчас.

Работайте. Как сделаете первый пункт, покажите и переходите ко второму.

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

qwerty13rus пишет:

Разобрался! Просто переназначил переменную float в int

Мрак! Она же у Вас по-жизни float!

Вы ж её вычислете именно как float. Обозвав её int, Вы наложили огромную кучу на Ваши же вычисления в строках 80-88!

Просто передавайте float и не выпендривайтесь, а то через час прибежите "памагити у меня вся дробная часть куда-то пропала, мож потому что ардуина китайская"

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

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

qwerty13rus пишет:

Разобрался! Просто переназначил переменную float в int

Мрак! Она же у Вас по-жизни float!

Вы ж её вычислете именно как float. Обозвав её int, Вы наложили огромную кучу на Ваши же вычисления в строках 80-88!

Просто передавайте float и не выпендривайтесь, а то через час прибежите "памагити у меня вся дробная часть куда-то пропала, мож потому что ардуина китайская"

Неправильно пояснил, не переназначил, а создал переменную int и задал ей переменную steinhart

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

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

qwerty13rus пишет:

Неправильно пояснил, не переназначил, а создал переменную int и задал ей переменную steinhart

И просто выбросили дробную часть. Если Ваша steinhart окажется 20,999, то Ваша int будет 20.

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

qwerty13rus пишет:

но все оказалось в разы проще.

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

Понимания как не было так и нет. Просто, ценой потери точности хоть как-то заскрипело.

Если это то. что Вам нужно, то успехов.

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

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

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

Еще не разобрался с массивами, так что пока так

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

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

Понимания как не было так и нет. Просто, ценой потери точности хоть как-то заскрипело.

Если это то. что Вам нужно, то успехов.

Для моих нужд, сойдет

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Не успел я порадоваться маленькой победой, как появилась новая проблема) Абсолютно рандомно зависает дисплей. включил, зависло челез 10 секунд, перезагрузил питание, проработало 10 минут без зависания. Не знаете с чем это может быть связано?

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

qwerty13rus пишет:

Не знаете с чем это может быть связано?

Знаю, и уже говорил Вам, но Вы не верите.

ЕвгенийП пишет:
берите учебник и прокачивайтесь. Тупое, без понимания что написано, копирование с lesson.iarduino.ru и попытки подладить под себя методом тыка Вам ничего не дадут - так не работает.