Arduino DUE + nRF24L01
- Войдите на сайт для отправки комментариев
Пнд, 17/02/2014 - 00:27
Здравствуйте. Сделал беспроводной датчик температуры и влажности на основе DHT22, Arduino Mini PRO и nRF24L01 (передатчик). Сделал приемник на основе Arduino Mini PRO и nRF24L01 (приемник). Данные температуры и влажности передаются без ошибок, все хорошо. Подсоединил nRF24L01 к Arduino DUE и сделал его как приемник. Данные получает, но не верные! То есть Arduino Mini PRO передает данные на Arduino DUE с ошибками, а Arduino Mini PRO на Arduino Mini PRO - без ошибок. Код не менял. Может кто знает в чем дело?
Код приемника: (Arduino DUE)
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" typedef struct { int W; int X; int Y; int Z; } B_t; B_t duino2; RF24 radio(9, 10); //RF24 radio(uint8_t _cepin, uint8_t _cspin); для DUE const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1, pipes[0]); radio.startListening(); } void loop(void) { //Serial.println("Begining."); if ( radio.available() ) { bool done = false; while (!done) { done = radio.read( &duino2, sizeof(duino2) ); Serial.print("Controller = "); Serial.println(duino2.W); Serial.print("T= "); Serial.println(duino2.X); Serial.print("H = "); Serial.println(duino2.Y); Serial.print("DP = "); Serial.println(duino2.Z); } } }
Код передатчика: (Arduino Mini PRO)
#include <SPI.h> #include "RF24.h" #include <avr/sleep.h> #include <avr/wdt.h> //int battVolts; int count; //переменная для счётчика циклов int h = 0; //влажность int t = 0; //температура int dp = 0; //точка росы volatile boolean wdt_tripped = 1; RF24 radio(9, 10); const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; #include <dht22.h> dht22 DHT22; //создаём структуру для передачи 4х значений typedef struct { int W; int X; int Y; int Z; } B_t; B_t duino2; //режим сна для МК void system_sleep() { delay(2); // Wait for serial traffic _SFR_BYTE(ADCSRA) &= ~_BV(ADEN); // Switch ADC off set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); // System sleeps here sleep_disable(); _SFR_BYTE(ADCSRA) |= _BV(ADEN); // Switch ADC on } void wdt_interrupt_mode() { wdt_reset(); WDTCSR |= _BV(WDIE); // Restore WDT interrupt mode } ISR(WDT_vect) { wdt_tripped = 1; // set global volatile variable } void setup() { pinMode(5, OUTPUT); //Пин на который подключено питание DHT22 digitalWrite(5, HIGH); DHT22.attach(2); //Инициализируем датчик DHT Serial.begin(9600); wdt_disable(); wdt_reset(); wdt_enable(WDTO_8S); //пробуждение каждые 8 сек count = 0; radio.begin(); radio.setRetries(15, 15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1, pipes[1]); } void loop(void) { //тут можно увеличить интервал времени между отправками данных по RF24 за счёт счётчика циклов Serial.println("Wakeup duino"); wdt_interrupt_mode(); if (wdt_tripped) { count++; wdt_tripped = 0; Serial.print("Run mine module #"); Serial.println(count); if (count == 9) { // каждые 8 сек * 9 циклов = 72 секунды делаем измерения и отправляем на базу: Serial.println("Reding sensor DHT"); int chk = DHT22.read(); h = int(floor(DHT22.humidity + 0.5)); //Влажность t = int(floor(DHT22.temperature + 0.5)); //Температура dp = int(floor(DHT22.dewPoint() + 0.5)); //Точка росы //записываем в структуру данные для передачи if (isnan(t) || isnan(h)) { duino2.W = 1; // этот номер передатчика для идентификации в принятом пакете данных duino2.X = 0; duino2.Y = 0; duino2.Z = 0; } else { duino2.W = 1; // этот номер передатчика для идентификации в принятом пакете данных duino2.X = t; // передаём температуру duino2.Y = h; // передаем влажность duino2.Z = dp; // передаем точку росы } Serial.print("Controller = "); Serial.println(duino2.W); Serial.print("Battery voltage= "); Serial.println(duino2.X); Serial.print("Temperature = "); Serial.println(duino2.Y); Serial.print("Humidity = "); Serial.println(duino2.Z); radio.powerUp(); //подаём питание на NRF24 radio.stopListening(); // отключаем режим приёма Serial.println("Start send"); bool ok = radio.write( &duino2, sizeof(duino2) ); //отправляем данные по RF24 Serial.println("End send"); delay(20); count = 0; radio.powerDown(); //отключаем питание RF24 штатно } } system_sleep(); //МК засыпает }
Приведу еще пример, как неправильно показывает значения:
Controller = 1572865
T= 524324
H = 0
DP = 0
А должно быть к примеру:
Controller = 1
T= 24
H = 36
DP = 8
В том что Mini PRO имеет 8-ми битное ядро, а DUE 32-битное.
http://arduino.cc/en/Reference/Int
И ваши переданные 4 инта по 16 бит с атмеги поместились в 2 инта по 32 бита на саме.
То есть
int
W;(16)
иint
X;(16)
сидят вint
W;(32)
, аint
Y;(16)
иint
Z;(16)
вint
X;(32)
.Попробуйте на дуе сделать так:
если не прокатит, можно так:
Спасибо огромное!! получилось сразу!
Может кому интересно будет, тут http://hackaday.com/2013/09/21/sending-data-over-bluetooth-low-energy-with-a-cheap-nrf24l01-module/ , http://dmitry.gr/index.php?r=05.Projects&proj=15&proj=11.%20Bluetooth%20LE%20fakery про отправку с nrf24l01 на bluetooth и в обратном порядке
Если не секрет к каким пинам на дуе подключали nRF24?
Перепробовал уже и так и сяк в результате коменды radio.printDetails(); получаю следующее
Пробовал так:
Но тоже столкнулся с проблемой - модуль не отправляет данные, а только может прнять...
А пример кода можеш скинуть?
Код есть в примерах самой библиотеки RF24.
Использовал "Getting Started". Также где-то находил модифицированный код:
Здравствуйте dardik. Подскажите пожалуйста, что надо изменить в вашем коде чтобы температура и заряд батарей отображались в таком виде "26,1" и "3,7".Заранее спасибо за ответ.
Здравствуйте. Подскажите неграмотному, к каким пинам Arduino DUE подключить nRF24L01. Есть UNO - передает данные, и есть DUE - должна принимать. Пробовал и как к Меге 2560 и к SPI, результата никакого. Библиотека RF24
Соединять прямо к выводам SPI расположенным в центре платы
Здравствуйте. Если возможно обновите ссылку на библиотеку DHT22. Спасибо