Передача и прием данных
- Войдите на сайт для отправки комментариев
Пт, 25/01/2019 - 20:43
Здравствуйте! Как можно сделать что бы при передачи данных с трансмиттера, на приемнике делалось некое действие до тех пор пока не придут еще данные, все это в цикле. В моем случае нужно что бы при приеме определенной температуры, эта температура выводилась на дисплей пока не придет другая температура. Пока что температура выводится на дисплей 5 секунд после приема данных. Вроде как объяснил)
Передатчик:
#include <OneWire.h> #include <iarduino_RF433_Transmitter.h> // Подключаем библиотеку для работы с передатчиком FS1000A iarduino_RF433_Transmitter radio(12); OneWire ds(2); #include <avr/power.h> #include <LowPower.h> // библиотека сна int sleep_count = 10; void setup() { clock_prescale_set(clock_div_1); 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); } void loop() { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // спать 8 сек. mode POWER_OFF, АЦП выкл sleep_count++; // +1 к счетчику просыпаний if (sleep_count >= 1) { // если время сна превысило 10 минут (75 раз по 8 секунд - подгон = 70) byte i; byte data[12]; byte addr[8]; float celsius; // поиск адреса датчика if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // команда на измерение температуры delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // команда на начало чтения измеренной температуры // считываем показания температуры из внутренней памяти датчика for ( i = 0; i < 9; i++) { data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; // датчик может быть настроен на разную точность, выясняем её byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс // преобразование показаний датчика в градусы Цельсия celsius = (float)raw / 16.0; int o = celsius; Serial.println(o); radio.write(&o, sizeof(1)); delay(2000); // рарешить выполнение расчета sleep_count = 0; // обнулить счетчик delay(2); // задержка для стабильности } }
Приемник:
#include <iarduino_RF433_Receiver.h> // Подключаем библиотеку для работы с приёмником MX-RM-5V #define CLK 5 #define DIO 4 #include "GyverTM1637.h" GyverTM1637 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.clear(); // инициализация disp.brightness(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]); int u = data[0]; switch (u) { case 1: disp.displayByte(_empty, 0x06, 0x58, _empty); delay(5000); break; case 2: disp.displayByte(_empty, 0x5b, 0x58, _empty); delay(5000); break; case 3: disp.displayByte(_empty, 0x4f, 0x58, _empty); delay(5000); break; case 4: disp.displayByte(_empty, 0x66, 0x58, _empty); delay(5000); break; case 5: disp.displayByte(_empty, 0x6d, 0x58, _empty); delay(5000); break; case 6: disp.displayByte(_empty, 0x7d, 0x58, _empty); delay(5000); break; case 7: disp.displayByte(_empty, 0x07, 0x58, _empty); delay(5000); break; case 8: disp.displayByte(_empty, 0x7f, 0x58, _empty); delay(5000); break; case 9: disp.displayByte(_empty, 0x6f, 0x58, _empty); delay(5000); break; case 10: disp.displayByte(_empty, 0x30, 0x3f, 0x58); delay(5000); break; case 11: disp.displayByte(_empty, 0x30, 0x30, 0x58); delay(5000); break; case 12: disp.displayByte(_empty, 0x30, 0x5b, 0x58); delay(5000); break; case 13: disp.displayByte(_empty, 0x30, 0x4f, 0x58); delay(5000); break; case 14: disp.displayByte(_empty, 0x30, 0x66, 0x58); delay(5000); break; case 15: disp.displayByte(_empty, 0x30, 0x6d, 0x58); delay(5000); break; case 16: disp.displayByte(_empty, 0x30, 0x7d, 0x58); delay(5000); break; case 17: disp.displayByte(_empty, 0x30, 0x07, 0x58); delay(5000); break; case 18: disp.displayByte(_empty, 0x30, 0x7f, 0x58); delay(5000); break; case 19: disp.displayByte(_empty, 0x30, 0x6f, 0x58); delay(5000); break; case 20: disp.displayByte(_empty, 0x5b, 0x3f, 0x58); delay(5000); break; case 21: disp.displayByte(_empty, 0x5b, 0x30, 0x58); delay(5000); break; case 22: disp.displayByte(_empty, 0x5b, 0x5b, 0x58); delay(5000); break; case 23: disp.displayByte(_empty, 0x5b, 0x4f, 0x58); delay(5000); break; case 24: disp.displayByte(_empty, 0x5b, 0x66, 0x58); delay(5000); break; case 25: disp.displayByte(_empty, 0x5b, 0x6d, 0x58); delay(5000); break; case 26: disp.displayByte(_empty, 0x5b, 0x7d, 0x58); delay(5000); break; case 27: disp.displayByte(_empty, 0x5b, 0x07, 0x58); delay(5000); break; case 28: disp.displayByte(_empty, 0x5b, 0x7f, 0x58); delay(5000); break; case 29: disp.displayByte(_empty, 0x5b, 0x6f, 0x58); delay(5000); break; case 30: disp.displayByte(_empty, 0x4f, 0x3f, 0x58); delay(5000); break; case 31: disp.displayByte(_empty, 0x4f, 0x30, 0x58); delay(5000); break; case 32: disp.displayByte(_empty, 0x4f, 0x5b, 0x58); delay(5000); break; case 33: disp.displayByte(_empty, 0x4f, 0x4f, 0x58); delay(5000); break; case 34: disp.displayByte(_empty, 0x4f, 0x66, 0x58); delay(5000); break; case 35: disp.displayByte(_empty, 0x4f, 0x6d, 0x58); delay(5000); break; case 36: disp.displayByte(_empty, 0x4f, 0x7d, 0x58); delay(5000); break; case 37: disp.displayByte(_empty, 0x4f, 0x07, 0x58); delay(5000); break; case 38: disp.displayByte(_empty, 0x4f, 0x7f, 0x58); delay(5000); break; case 39: disp.displayByte(_empty, 0x4f, 0x6f, 0x58); delay(5000); break; case 40: disp.displayByte(_empty, 0x66, 0x3f, 0x58); delay(5000); break; case 0: disp.displayByte(_empty, 0x3f, 0x58, _empty); delay(5000); break; case -1: disp.displayByte(0x40, 0x06, 0x58, _empty); delay(5000); break; case -2: disp.displayByte(0x40, 0x5b, 0x58, _empty); delay(5000); break; case -3: disp.displayByte(0x40, 0x4f, 0x58, _empty); delay(5000); break; case -4: disp.displayByte(0x40, 0x66, 0x58, _empty); delay(5000); break; case -5: disp.displayByte(0x40, 0x6d, 0x58, _empty); delay(5000); break; case -6: disp.displayByte(0x40, 0x7d, 0x58, _empty); delay(5000); break; case -7: disp.displayByte(0x40, 0x07, 0x58, _empty); delay(5000); break; case -8: disp.displayByte(0x40, 0x7f, 0x58, _empty); delay(5000); break; case -9: disp.displayByte(0x40, 0x6f, 0x58, _empty); delay(5000); break; case -10: disp.displayByte(0x40, 0x30, 0x3f, 0x58); delay(5000); break; case -11: disp.displayByte(0x40, 0x30, 0x30, 0x58); delay(5000); break; case -12: disp.displayByte(0x40, 0x30, 0x5b, 0x58); delay(5000); break; case -13: disp.displayByte(0x40, 0x30, 0x4f, 0x58); delay(5000); break; case -14: disp.displayByte(0x40, 0x30, 0x66, 0x58); delay(5000); break; case -15: disp.displayByte(0x40, 0x30, 0x6d, 0x58); delay(5000); break; case -16: disp.displayByte(0x40, 0x30, 0x7d, 0x58); delay(5000); break; case -17: disp.displayByte(0x40, 0x30, 0x07, 0x58); delay(5000); break; case -18: disp.displayByte(0x40, 0x30, 0x7f, 0x58); delay(5000); break; case -19: disp.displayByte(0x40, 0x30, 0x6f, 0x58); delay(5000); break; case -20: disp.displayByte(0x40, 0x5b, 0x3f, 0x58); delay(5000); break; case -21: disp.displayByte(0x40, 0x5b, 0x30, 0x58); delay(5000); break; case -22: disp.displayByte(0x40, 0x5b, 0x5b, 0x58); delay(5000); break; case -23: disp.displayByte(0x40, 0x5b, 0x4f, 0x58); delay(5000); break; case -24: disp.displayByte(0x40, 0x5b, 0x66, 0x58); delay(5000); break; case -25: disp.displayByte(0x40, 0x5b, 0x6d, 0x58); delay(5000); break; case -26: disp.displayByte(0x40, 0x5b, 0x7d, 0x58); delay(5000); break; case -27: disp.displayByte(0x40, 0x5b, 0x07, 0x58); delay(5000); break; case -28: disp.displayByte(0x40, 0x5b, 0x7f, 0x58); delay(5000); break; case -29: disp.displayByte(0x40, 0x5b, 0x6f, 0x58); delay(5000); break; case -30: disp.displayByte(0x40, 0x4f, 0x3f, 0x58); delay(5000); break; case -31: disp.displayByte(0x40, 0x4f, 0x30, 0x58); delay(5000); break; case -32: disp.displayByte(0x40, 0x4f, 0x5b, 0x58); delay(5000); break; case -33: disp.displayByte(0x40, 0x4f, 0x4f, 0x58); delay(5000); break; case -34: disp.displayByte(0x40, 0x4f, 0x66, 0x58); delay(5000); break; case -35: disp.displayByte(0x40, 0x4f, 0x6d, 0x58); delay(5000); break; case -36: disp.displayByte(0x40, 0x4f, 0x7d, 0x58); delay(5000); break; case -37: disp.displayByte(0x40, 0x4f, 0x07, 0x58); delay(5000); break; case -38: disp.displayByte(0x40, 0x4f, 0x7f, 0x58); delay(5000); break; case -39: disp.displayByte(0x40, 0x4f, 0x6f, 0x58); delay(5000); break; case -40: disp.displayByte(0x40, 0x66, 0x3f, 0x58); delay(5000); break; } disp.clear(); } } // Если вызвать функцию available с параметром в виде ссылки на переменную типа uint8_t, то мы получим номер трубы, по которой пришли данные (см. урок 26.5)
переставить скобку из 443 строки в конец 29-той, потом разобраться с работой ифа и понять, что сделали.
Потом подумать, зачем столько делеев, если хватит одного после свича или вовсе убрать.
Подумать, зачем чистить дисплей, если все его поля все одно заполняются в свиче.
Почти наверняка вывод можно сделать более компактным при дополнительном использовании disp.displayInt
переставить скобку из 443 строки в конец 29-той, потом разобраться с работой ифа и понять, что сделали.
Потом подумать, зачем столько делеев, если хватит одного после свича или вовсе убрать.
Подумать, зачем чистить дисплей, если все его поля все одно заполняются в свиче.
Почти наверняка вывод можно сделать более компактным при дополнительном использовании disp.displayInt
Так и не понял зачем нужна перестановка скобки, хотя с работой if ознакомлен.
Изначально delay стоял перед дисп клир.
Без очистки дисплея не обновляются данные, даже не печатаются в ком порта, просто зависают на первом принятом значении.
Изначально пытался сделать через disp.displayInt, но я так понял что в библеотеке не было знака минус, поэтому все через byte
так а результат перестановки , видим - не видим?
Изначально delay стоял перед дисп клир.
Без очистки дисплея не обновляются данные, даже не печатаются в ком порта, просто зависают на первом принятом значении.
да, без делея в порт слишком шустро получится
Изначально пытался сделать через disp.displayInt, но я так понял что в библеотеке не было знака минус, поэтому все через byte
минус он вроде печатает сам, надо просто учесть место минуса
вот потестируй вывод для положительных до 99 и отрицательных до -9
так а результат перестановки , видим - не видим?
после перестановки в порт и на дисплей постоянно отправляются нули, значения с передатчика не приходят
минус он вроде печатает сам, надо просто учесть место минуса
Действительно, именно из за этого я и решил все сделать через свич. Вместо отрицательной температуры показывалось непонять что
вот потестируй вывод для положительных до 99 и отрицательных до -9
Не понял, куда это надо?
1. добавьте в определенние массива volatile
3. Там пример вывода, можно на его основе собрать небольшой скетч для теста.
1. добавьте в определенние массива volatile
Добавил, но зачем это нужно если массив у меня и так глобальный?
3. Там пример вывода, можно на его основе собрать небольшой скетч для теста.
А как это поможет в моем случае? Данные вроде и так нормально выводятся
1. добавьте в определенние массива volatile
Добавил, но зачем это нужно если массив у меня и так глобальный?
"после перестановки в порт и на дисплей постоянно отправляются нули, значения с передатчика не приходят"
а массив глобальный
вертайте скобку взад и смотрите, будут нули или нет
вертайте скобку взад и смотрите, будут нули или нет
все так же, нули
загрузите последний скетч
ок, очистка тут все затирает,
попробуйте вернуть свой делей после свича перед клер.
общее подозрение такое, что иногда с эфира принимается нужное значение и пишется, за счет задержки его было видно, но чаще пишется ноль или еще хз что со стороны помех.
в свиче нет
default
:
, обработки неописанной ситуации, вытащите туда что-то , чтобы было виднои по нему смотреть ловлю помех.
от клер тут нужно избавляться, все должно работать без него.
ок, очистка тут все затирает,
попробуйте вернуть свой делей после свича перед клер.
общее подозрение такое, что иногда с эфира принимается нужное значение и пишется, за счет задержки его было видно, но чаще пишется ноль или еще хз что со стороны помех.
в свиче нет
default
:
, обработки неописанной ситуации, вытащите туда что-то , чтобы было виднои по нему смотреть ловлю помех.
от клер тут нужно избавляться, все должно работать без него.
делей вернул, клер убрал, поставил дефолт с выводом значений на дисплей. Все также, в ком порта и на дисплей выводятся значение 0 каждые 1000 милисекунд. Вот думаю может просто сделать все на делей? Что бы значение зависало на дисплее через делей, потом делей прекращался и с передатчика поступало новое значение и все повторялось. Минус этого в том что во время принятия значения с передатчика на дисплее ничего не будет несколько секунд, но если это будет происходить раз в 1 час то нормально. Вот только нужно что бы все работало как часы, что мне кажется с делеем будет проблематично. Что думаете ?
непонятно откуда там вообще нули берутся.
надо проверить сам вывод, залочьте приемник, пропишите в дату значения при объявлении, проверить вывод.
пробовать конечно нужно все, что устраивает
непонятно откуда там вообще нули берутся.
надо проверить сам вывод, залочьте приемник, пропишите в дату значения при объявлении, проверить вывод.
пробовать конечно нужно все, что устраивает
Если я правильно понимаю что вы имеете ввиду то с выводом все хорошо. Скетчи в стартовом топике работали как положено, в порт и на дисплей выводилось. Убрав значение массима data перед свитч у меня началось выполнение default: Не знаю, поможет ли это как то
Убрав значение массима data перед свитч у меня началось выполнение default: Не знаю, поможет ли это как то
т.е. это "u" повисло в воздухе?
я вас просил дописать в 8 строке начальные значения в массив, 7. 8 например. и закомментировать строки обработки приема. т.е. строки 28,29,30
тогда на выходе должно быть 7
Приемник не обрабатывется, работа только с массивом.
хотя там он там ваще непонятно зачем нужен, отправляете вы 1 значение и в массив пишете и читает одно.
А что прописано по дефолту свича?
т.е. это "u" повисло в воздухе?
да, переменная "u"
тогда на выходе должно быть 7
так и получилось
хотя там он там ваще непонятно зачем нужен, отправляете вы 1 значение и в массив пишете и читает одно.
не менял его с начального образца, думал не важно
А что прописано по дефолту свича?
вот
disp.displayByte(0x40, 0x40, 0x40, 0x40);
т.е. вывод работает.
откройте строки 28, 29,30 приемника
и запустите в передатчике передачу одной цифры 9 в цикле с задержкой в 50мс
Что значит открыть строки приемника?
т.е. раскомментировать, мы же их залочили в предыдущем тесте.
теперь открываем и должны настроить передатчик на непрерывную передачу. см. выше.
disp.displayByte(0x40, 0x40, 0x40, 0x40); это сколько на экране?
disp.displayByte(0x40, 0x40, 0x40, 0x40); это сколько на экране?
на экране это 4 минуса.
передатчик настроил как вы сказали, начальные значения массива убрал, но идут все равно нули. Убрал квадратную скобку if на 30 строчке и поставил в конец , данные начали приходить
т.е. все вернулось на круги своя, практически к исходному варианту?
Получается так. Просто я не особо понимаю смысл наших манипуляций.
смысл понять откуда идут нули
не нужно было убирать начальные значения массива, они должны были обновиться приемником
Прошу прощения за мою тупость. Значения массива вернул, в порт и на дисплей выводится 7, но на это никак не влияет передатчик, что включен, что выключен, никакой разницы. А нужно ли Убирать значение массива data перед свитч?
вот что и странно, чем так для приемника отличается ситуация, что в одном случае он изменяет значение в массиве, а в другом нет.
Видимо нужно попросить разъяснить ситуацию кого-то компетентного в этом деле. Я пока не понимаю, как такое может быть.
Хорошо, все равно спасибо
Здравствуйте! Как можно сделать что бы при передачи данных с трансмиттера, на приемнике делалось некое действие до тех пор пока не придут еще данные, все это в цикле. В моем случае нужно что бы при приеме определенной температуры, эта температура выводилась на дисплей пока не придет другая температура. Пока что температура выводится на дисплей 5 секунд после приема данных. Вроде как объяснил)
Очень легко. В коде из стартового поста уберите фигурную скобку со строки 443 и вставьте ее после строки 31. Получите ровно то что нужно.
Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?
Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?
Очень легко. В коде из стартового поста уберите фигурную скобку со строки 443 и вставьте ее после строки 31. Получите ровно то что нужно.
Не работает. Сначало ардуино ругалась как я понял на локальную переменную, после я сделал ее глобальной. Но на дисплее все так же приходил ноль
Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?
Я не совневаюсь в вашем умении программирования ардуино, сам я знаком с ней около месяца, вообщем то как и с программированием в целом.
Проблему решил просто используя другую библиотеку для дисплея