nrf24l01+mega+nano

Elfec
Offline
Зарегистрирован: 22.12.2012

В наличии одна мега, одна нано и 4 радиомодуля nrf24l01. Был небольшой тестовый проект - на ардуину нано собирались данные с датчиков

#include <duino.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <DHT.h>
DHT dht(3, DHT22);  //Создаем датчик DHT11 на 3 пине
void setup(){
  Serial.begin(9600);
  Mirf.cePin = 8;
  Mirf.csnPin = 10;
  dht.begin(); //Инициализируем датчик DHT
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"nano");
  Mirf.payload = 8;
  Mirf.config();
   Serial.println("Beginning ... "); 
}

void loop(){
  float t1 = 0;
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  unsigned long time = millis();
  Serial.print("Local_temp=");
  Serial.println(t);
  Serial.println(h);
duino2_ temphum = {t,h};  // передаём температуру
 Serial.println(temphum.Y);
 Serial.println(temphum.Z);
  Mirf.setTADDR((byte *)"mega");
  
  
  Mirf.send((byte *)&temphum);
  
  while(Mirf.isSending()){
  }
  Serial.println("Finished sending");
  delay(1000);
}
  

И потом пересылались на мегу где выводились на lcd с включаемой по движению подсветкой

#include <duino.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
        int backLight = 13; 
        const int analogInPin = A0;
         int sensorValue = 0;
void setup(){
           Serial.begin(9600);
           pinMode(backLight, OUTPUT);
  Mirf.csnPin = 53;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.payload = 8;
  Mirf.config();
            Serial.println("Listening..."); 

}

void loop(){

 //byte data[Mirf.payload];
 float t = 0; 
 float h = 0;
 duino2_ temphum = {t,h};
      if(!Mirf.isSending() && Mirf.dataReady())
          {             
              Mirf.getData((byte *)&temphum);
              Serial.println(temphum.Y);
              Serial.println(temphum.Z);
        lcd.begin(16,2);      
        lcd.clear();                 
        lcd.setCursor(0,0);           
        lcd.print("Temperatyra: "); 
        lcd.print(temphum.Y);
        lcd.setCursor(0,1);         
        lcd.print("Vlajnost: ");
        lcd.print(temphum.Z);
        lcd.print("%");
  delay(500);
sensorValue = analogRead(analogInPin);
  if (sensorValue >=500){
       digitalWrite(backLight, HIGH);
      }
  else
       digitalWrite(backLight, LOW);
        }
  //Serial.println(data);
  //Serial.println(sensorValue);
}


Все до поры до времени работало, потом после какой то сборки-переборки и других проектов, было все снова собрано, подключено и перепроверено по нескольку раз, но так ничего и не заработало. В ходе экспериментов было выявлено, что если мега выступает в качестве передатчика то нано нормально принимает данные, а если наоборот то мега ничего не может принять, в чем может быть проблема? Все пины при подключении вызванивались несколько раз, подключено все верно :(

maksim
Offline
Зарегистрирован: 12.02.2012

А куда со стороны Меги у вас подключен вывод модуля СЕ ?

Elfec
Offline
Зарегистрирован: 22.12.2012

maksim пишет:

А куда со стороны Меги у вас подключен вывод модуля СЕ ?

По дефолту на 8й и вручную используя Mirf.cePin на другие переключал толку ноль

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Так и где он у вас проинициализирован в коде?

Elfec
Offline
Зарегистрирован: 22.12.2012

Ну как я понял из описания библиотеки он 8й пин использует по умолчанию, можно переназначить на другой если надо, но даже когда менял в коде и менял подключение например на 9й и дописывал Mirf.cePin = 9  толку небыло

maksim
Offline
Зарегистрирован: 12.02.2012

Да есть такое, а со стороны меги адреса не должны быть прописаны?

Mirf.setRADDR((byte *)"mega");
Mirf.setTADDR((byte *)"nano");

хотя бы адрес приема?

Elfec
Offline
Зарегистрирован: 22.12.2012

Да есть такое в этой версии забыл дописать, но с ним ничего не изменилось ( 

Да и просто там с библиотекой есть скетчи примеры пинг_серв и пинг_клиент и с ними тоже нифига теперь не работает, самое интересное что думал мол проблема в модулях, сегодня приехали новые и такая же ситуация, а на старых если на питания модуля подать вместо 3.3в подать 5в, то начинает хоть как то работать

ustas
Offline
Зарегистрирован: 12.03.2012

5В подавать не стоит - спалите модули

Кстати, дома больше нет других, работающих модулей nrf24? 

У меня была проблема, что два "модуля" работали между собой прекрасно. А вот когда в систему стал добавлять третий - были большие затыки и ничего толком не работало. Решение описал тут: http://arduino.ru/forum/proekty/peredacha-temperatury-s-datchikov-dht11-ds18b20-cherez-nrf24l01#comment-9619

Elfec
Offline
Зарегистрирован: 22.12.2012

ustas пишет:

5В подавать не стоит - спалите модули

Кстати, дома больше нет других, работающих модулей nrf24? 

У меня была проблема, что два "модуля" работали между собой прекрасно. А вот когда в систему стал добавлять третий - были большие затыки и ничего толком не работало. Решение описал тут: http://arduino.ru/forum/proekty/peredacha-temperatury-s-datchikov-dht11-ds18b20-cherez-nrf24l01#comment-9619

Да я знаю что 5в не стоит, просто решил проверить и каким то чудом заработало :) Модулей всего 4 передавать только между двумя пробовал, но тасовал их по разному эффект тот же. Мог на меге заглючить один из выводов SPI? MISO например и теперь не передает данные к мастеру,  и как его проверить можно? Желательно без осцилографа)

Elfec
Offline
Зарегистрирован: 22.12.2012

Самое интересное что в первоначальном варианте все работало, данные передавались-принимались и отлично выводились

Elfec
Offline
Зарегистрирован: 22.12.2012

Если вдруг кто столкнется с такой же проблемой, то решение было найдено на другом форуме: 

The power supply on the megas can mess up this module. Try adding a large capacitor (>1uf) across 3.3v and ground

И правда установка конденсатора помогла решить проблему.

ustas
Offline
Зарегистрирован: 12.03.2012

угу.. "блокировочные конденсаторы" - их вообще полезно ставить

dmw
Offline
Зарегистрирован: 24.03.2013

Добрый день.

Почти такаяже ситуация. Есть 3 дуины: UNO (приемник), Mega256 (передатчик) и Pro Mini (передатчик).

у Mega и Pro Mini код один и тотже:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <Wire.h>
#include <DHT.h>

//int battVolts;
int count;    //переменная для счётчика циклов
volatile boolean wdt_tripped=1;

RF24 radio(9,10); // было 8,7
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

DHT dht(6, DHT22);  //Создаем датчик DHT22 на 6 пине

//создаём структуру для передачи 4х значений
typedef struct{         
  int W;
  int X;
  float Y;
  float 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()
{
  Serial.begin(9600);
  wdt_disable();
  wdt_reset();
  wdt_enable(WDTO_8S);   //пробуждение каждые 8 сек
  count = 0;
  
  dht.begin();           //Инициализируем датчик DHT
  radio.begin();
  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");
                    float h = dht.readHumidity();
                    float t = dht.readTemperature();
                    delay(20);
                    int vb = getBandgap (); // записываем в переменную vb значение замеренного напряжения с батарии

                    //записываем в структуру данные для передачи
                    if (isnan(t) || isnan(h)) {
                      duino2.W = 11;  // этот номер передатчика для идентификации в принятом пакете данных
                      duino2.X = vb;  // передаём напряжение батареи
                      duino2.Y = 0;   
                      duino2.Z = 0;
                    }
                    else {
                      duino2.W = 11;  // этот номер передатчика для идентификации в принятом пакете данных
                      duino2.X = vb;  // передаём напряжение батареи
                      duino2.Y = t;   // передаём температуру
                      duino2.Z = h;   // передаем влажность
                    }
                    
                    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();   //МК засыпает
 

}

//внутренний контроль напряжения на батареи 

const long InternalReferenceVoltage = 1062; 
int getBandgap () 
  {
  // REFS0 : Selects AVcc external reference
  // MUX3 MUX2 MUX1 : Selects 1.1V (VBG)  
   ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1);
   ADCSRA |= _BV( ADSC );  // start conversion
   while (ADCSRA & _BV (ADSC))
     { }  // wait for conversion to complete
   int results = (((InternalReferenceVoltage * 1024) / ADC) + 5) / 10; 
   return results;
  } // end of getBandgap

У приемника такой:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

typedef struct{
  int W;
  int X;
  float Y;
  float Z;
}
B_t;
B_t duino2;
 
RF24 radio(9,10);   //RF24 radio(uint8_t _cepin, uint8_t _cspin);
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("Battery voltage= ");
  Serial.println(duino2.X);
  Serial.print("Temperature = ");
  Serial.println(duino2.Y);
  Serial.print("Humidity = ");
  Serial.println(duino2.Z); 
  }
  }

}

Только Mega работает нормально, а Pro Mini ничего абсолютно не передает в эфир. Вот схема для последней:

В этой схеме менял Pro Mini на Mega - все работает. Возвращаю обратно - опять тишина.

Пробовал запитывать схему через модуль питания мекетки MB102, такой: http://www.ebay.com/itm/170886733144 на дуину подавал +5В, на NRF24L01 +3.3В с общей землей - все равно не работает.

Куда копать уже мысли кончились.

dmw
Offline
Зарегистрирован: 24.03.2013

Оказывается напутал всетаки с питанием.

Та что выше схема, скорее всего будет работать только с Arduino Pro Mini 3.3V 8M (как приедет буду проверять).

Для Arduino Pro Mini 5V 16M необходимо добавить стабилизатор AMS1117-3.3 или LM1117-3.3. Вот с такой схемой работает все нормально:

Nonsens
Offline
Зарегистрирован: 19.09.2013

Elfec пишет:

В наличии одна мега, одна нано и 4 радиомодуля nrf24l01. Был небольшой тестовый проект - на ардуину нано собирались данные с датчиков

Доброго времени суток!  Начинаю осваивать библиотеки для дуино и появились  вопросы.  Помогите пожалуйста разобраться с библиотекой SPI применительно к NRF2L01

http://arduino.ru/forum/programmirovanie/rabota-s-spi

 

 

Nonsens
Offline
Зарегистрирован: 19.09.2013

ustas пишет:
5В подавать не стоит - спалите модули

я собрался собрался использовать NRF24L01 на 5В от  Mega2560б ,  или так не надо делать?   (еще мне будут доступны Mini Micro и UNO, но  все они пятивольтовые);  прочел в обзоре, что модули NRF24L01 лояльны к входным сигналам 5В:

Цитата:
Для работы требуется напряжение в диапазоне от 1,8 до 3,6 вольт, входы/выходы толерантны к 5 вольтам, поэтому при подключении к пяти вольтовым устройствам дополнительные согласующие цепи ставить нет необходимости.   
Источник:

http://avrproject.ru/publ/kak_podkljuchit/radiomoduli_nrf24l01/2-1-0-92  

 

BolshoyPapa
Offline
Зарегистрирован: 07.08.2014

dmw пишет:

Почти такаяже ситуация. Есть 3 дуины: UNO (приемник), Mega256 (передатчик) и Pro Mini (передатчик).

у Mega и Pro Mini код один и тотже:

У приемника такой:

Подскажите у вас получилось передавать данные с двух передатчиков и принимать их.

У меня 1 UNO в качестве сервера  на ней кроме  nrf24l01 еще DS1302 и Ethernet shield с SD картой. 

В качестве передатчиков 2 NANO с nrf24l01 и HT11-HT22.

Пробовал ваш скетч. Немного переделав под себя.

Все модули работают корректно и выдают в СОМ порт то, что задумано.

Все нормально работает только когда один передатчик в эфире.

Когда включаю второй. данные идут в разнобой. правильная комбинация иногда совпадает, но редко, примерно 1 раз в 26 сек, иногда реже.

Имена всех переменных иддивидуальны, имена контроллеров доже разные.

может быть есть полность рабочий комплект скетчей на два передатчика и один приемник.

В идеале планируется добиться получения с 4-х клиентов информацию с нескольких подключенных к ним датчиков (разных-температуры, растояния, газа, света) на центральный блок. с него отдавать инфу на WEB морду, записывать лог с датчиков на SD с привязкой ко времени. И обратная связь: т.е. возможность управлять 2-3 реле на каждом клиенте.

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

Буду признателен за помощь и подсказки, ссылки по теме.

 

 

derver
Offline
Зарегистрирован: 11.05.2014

помогите пожалуйста

на меге подключаю sd card и nrf24l01 по шине spi начинает конфликтовать nrf24l01 а отдельно все работает

что надо при этом сделать

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Вангую, что пин Chip Select (CS) для обоих устройств задан один и тот же. Он для каждого устройства должен быть свой.

derver
Offline
Зарегистрирован: 11.05.2014

нет для обоих разный

для одного 53

для другого 47

derver
Offline
Зарегистрирован: 11.05.2014

передатчик 

передатчик

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include "DHT.h"
#include <nRF24L01.h>
#include <RF24.h>
 
File myFile; // SD CARD
 
#define DHTPIN 13     
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
int SaveTemperature; // Для фиксации температуры.
 
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
//  const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe
const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала
 
#define CE_PIN 48
#define CSN_PIN 47
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
//переменная для радио кодов
int radiocode[1];
 
int joystick[2];  // 2 element array holding Joystick readings
 
void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
 
 
  pinMode(53, OUTPUT);
  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
//  radio.begin();
//  radio.openWritingPipe(pipe);
  //настройки для радио модуля NRF24L01+ 2.4GHz
  radio.begin();  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
 
 
 
   SDcardWrite(); // Запускаем функцию записи на SD card.
// Установка часов если надо
 // RTC.stop();
//  RTC.set(DS1307_SEC,1);        //set the seconds
//  RTC.set(DS1307_MIN,37);     //set the minutes
 // RTC.set(DS1307_HR,11);       //set the hours
//  RTC.set(DS1307_DOW,4);       //set the day of the week
//  RTC.set(DS1307_DATE,29);       //set the date
//  RTC.set(DS1307_MTH,9);        //set the month
//  RTC.set(DS1307_YR,14);         //set the year
//  RTC.start();
 
// проверка сенсора температуры
 Serial.println("DHT11 test!"); 
  dht.begin();
 SaveTemperature = dht.readTemperature(); // Фиксируем текущую температуру.
}
 
// ***************************************
 
// -------------------
// Делаем функцию для чтения с SD card и вывода в Serial монитор.
void SDcardRead()
{
  // re-open the file for reading:
  myFile = SD.open("dimasens.txt");
  if (myFile) {
    Serial.println("dimasens.txt:");
 
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening dimasens.txt");
  }
}
 
void SDcardWrite()  // Делаем функцию, для записи на SD card.
 
{
  myFile = SD.open("dimasens.txt", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to dimasens.txt...");
          myFile.print("\nActual time : ");
 myFile.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
 myFile.print(":");
 myFile.print(RTC.get(DS1307_MIN,true));//read minutes without update (false)
myFile.print(":");
myFile.print(RTC.get(DS1307_SEC,true));//read seconds
myFile.print(" ");                 // some space for a more happy life
    
    myFile.print(" -- ");
     myFile.print(RTC.get(DS1307_DATE,true));//read date
 myFile.print("/");
myFile.print(RTC.get(DS1307_MTH,true));//read month
myFile.print("/");
 myFile.println(RTC.get(DS1307_YR,true)); //read year 
    
    myFile.print(" -- ");
 
    myFile.print("Humidity: "); 
    myFile.print(dht.readHumidity()); // Значения влажности.
    myFile.print(" %\t");
    myFile.print("Temperature: "); 
    myFile.print(dht.readTemperature()); // Значения температуры.
    myFile.println(" *C"); 
 
 
    myFile.close();  // close the file:
    Serial.println("done.");
  
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening dimasens.txt");
  }
}
 
 
void Joy()
{
//  radio.begin();
//  radio.openWritingPipe(pipe);
//  joystick[0] = analogRead(JOYSTICK_X);
//  joystick[1] = analogRead(JOYSTICK_Y);
//  radio.write( joystick, sizeof(joystick) );
 
    radiocode[0] = 140; 
    radio.stopListening();
    radio.write(radiocode, 1);
    radio.startListening();
 
   
}
 
// ************************************
 
void loop()
{
 Joy();
//SDcardWrite(); 
 if (SaveTemperature != dht.readTemperature())
 { 
//   Serial.println("pered zapis'u");
    SDcardWrite(); // Запускаем функцию записи на SD card.
    // Снова фиксируем текущее значение температуры.
  //  Serial.println("posle zapisi");
    SaveTemperature = dht.readTemperature();
  // Serial.println("save temp"); 
     
 
   }
 
 
  // Для вывода в  Serial монитор данных с  SD card. 
 
  if (Serial.available() > 0) {   
    // Если отправляем через Serial монитор цифру 1 
    // запускаем функцию SDcardRead.
    // То есть выводим в Serial монитор всё содержимое файла dimasens.txt  
    if (Serial.read()-48 == 1)SDcardRead(); 
  }
 
  
  // nothing happens after setup*/
}
 
приемник
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN   9
#define CSN_PIN 10
 
// NOTE: the "LL" at the end of the constant is "LongLong" type
 
const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала
//переменная для радио кода
int radiocode[1];
 
/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/
int joystick[2];  // 2 element array holding Joystick readings
 
void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);
  delay(1000);
  Serial.println("Nrf24L01 Receiver Starting");
 
//  radio.begin();
//  radio.openReadingPipe(1,pipe);
//  radio.startListening();;
 
  radio.begin();  
  radio.setDataRate(RF24_250KBPS);  // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
  
  
  
}//--(end setup )---
 
 
void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
/*  if ( radio.available() )
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
      // Fetch the data payload
      done = radio.read( joystick, sizeof(joystick) );
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);
    }
  }
  else
  {    
      Serial.println("No radio available");
  }
*/
 
// начинаем слушать радио эфир
  if (radio.available());
  bool done = false;
  while (!done)done = radio.read(radiocode, 1); 
 
   // если пришёл радио код 101 то digitalWrite(ledPin2, HIGH);
 
  if (radiocode[0] == 140)
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
      // Fetch the data payload
      done = radio.read( joystick, sizeof(joystick) );
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);
    }
  }
  else
  {    
      Serial.println("No radio available");
  }
 
 
 
 
}//--(end main loop )---
 
/*-----( Declare User-written Functions )-----*/
 
//NONE
//*********( THE END )***********
 
 
 
derver
Offline
Зарегистрирован: 11.05.2014
передатчик

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include "DHT.h"
#include <nRF24L01.h>
#include <RF24.h>
 
File myFile; // SD CARD
 
#define DHTPIN 13     
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
int SaveTemperature; // Для фиксации температуры.
 
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
//  const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe
const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала
 
#define CE_PIN 48
#define CSN_PIN 47
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
//переменная для радио кодов
int radiocode[1];
 
int joystick[2];  // 2 element array holding Joystick readings
 
void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
 
 
  pinMode(53, OUTPUT);
  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
//  radio.begin();
//  radio.openWritingPipe(pipe);
  //настройки для радио модуля NRF24L01+ 2.4GHz
  radio.begin();  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
 
 
 
   SDcardWrite(); // Запускаем функцию записи на SD card.
// Установка часов если надо
 // RTC.stop();
//  RTC.set(DS1307_SEC,1);        //set the seconds
//  RTC.set(DS1307_MIN,37);     //set the minutes
 // RTC.set(DS1307_HR,11);       //set the hours
//  RTC.set(DS1307_DOW,4);       //set the day of the week
//  RTC.set(DS1307_DATE,29);       //set the date
//  RTC.set(DS1307_MTH,9);        //set the month
//  RTC.set(DS1307_YR,14);         //set the year
//  RTC.start();
 
// проверка сенсора температуры
 Serial.println("DHT11 test!"); 
  dht.begin();
 SaveTemperature = dht.readTemperature(); // Фиксируем текущую температуру.
}
 
// ***************************************
 
// -------------------
// Делаем функцию для чтения с SD card и вывода в Serial монитор.
void SDcardRead()
{
  // re-open the file for reading:
  myFile = SD.open("dimasens.txt");
  if (myFile) {
    Serial.println("dimasens.txt:");
 
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening dimasens.txt");
  }
}
 
void SDcardWrite()  // Делаем функцию, для записи на SD card.
 
{
  myFile = SD.open("dimasens.txt", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to dimasens.txt...");
          myFile.print("\nActual time : ");
 myFile.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
 myFile.print(":");
 myFile.print(RTC.get(DS1307_MIN,true));//read minutes without update (false)
myFile.print(":");
myFile.print(RTC.get(DS1307_SEC,true));//read seconds
myFile.print(" ");                 // some space for a more happy life
    
    myFile.print(" -- ");
     myFile.print(RTC.get(DS1307_DATE,true));//read date
 myFile.print("/");
myFile.print(RTC.get(DS1307_MTH,true));//read month
myFile.print("/");
 myFile.println(RTC.get(DS1307_YR,true)); //read year 
    
    myFile.print(" -- ");
 
    myFile.print("Humidity: "); 
    myFile.print(dht.readHumidity()); // Значения влажности.
    myFile.print(" %\t");
    myFile.print("Temperature: "); 
    myFile.print(dht.readTemperature()); // Значения температуры.
    myFile.println(" *C"); 
 
 
    myFile.close();  // close the file:
    Serial.println("done.");
  
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening dimasens.txt");
  }
}
 
 
void Joy()
{
//  radio.begin();
//  radio.openWritingPipe(pipe);
//  joystick[0] = analogRead(JOYSTICK_X);
//  joystick[1] = analogRead(JOYSTICK_Y);
//  radio.write( joystick, sizeof(joystick) );
 
    radiocode[0] = 140; 
    radio.stopListening();
    radio.write(radiocode, 1);
    radio.startListening();
 
   
}
 
// ************************************
 
void loop()
{
 Joy();
//SDcardWrite(); 
 if (SaveTemperature != dht.readTemperature())
 { 
//   Serial.println("pered zapis'u");
    SDcardWrite(); // Запускаем функцию записи на SD card.
    // Снова фиксируем текущее значение температуры.
  //  Serial.println("posle zapisi");
    SaveTemperature = dht.readTemperature();
  // Serial.println("save temp"); 
     
 
   }
 
 
  // Для вывода в  Serial монитор данных с  SD card. 
 
  if (Serial.available() > 0) {   
    // Если отправляем через Serial монитор цифру 1 
    // запускаем функцию SDcardRead.
    // То есть выводим в Serial монитор всё содержимое файла dimasens.txt  
    if (Serial.read()-48 == 1)SDcardRead(); 
  }
 
  
  // nothing happens after setup*/
}
 
приемник
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN   9
#define CSN_PIN 10
 
// NOTE: the "LL" at the end of the constant is "LongLong" type
 
const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи радио сигнала
//переменная для радио кода
int radiocode[1];
 
/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/
int joystick[2];  // 2 element array holding Joystick readings
 
void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);
  delay(1000);
  Serial.println("Nrf24L01 Receiver Starting");
 
//  radio.begin();
//  radio.openReadingPipe(1,pipe);
//  radio.startListening();;
 
  radio.begin();  
  radio.setDataRate(RF24_250KBPS);  // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
  
  
  
}//--(end setup )---
 
 
void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
/*  if ( radio.available() )
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
      // Fetch the data payload
      done = radio.read( joystick, sizeof(joystick) );
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);
    }
  }
  else
  {    
      Serial.println("No radio available");
  }
*/
 
// начинаем слушать радио эфир
  if (radio.available());
  bool done = false;
  while (!done)done = radio.read(radiocode, 1); 
 
   // если пришёл радио код 101 то digitalWrite(ledPin2, HIGH);
 
  if (radiocode[0] == 140)
  {
    // Read the data payload until we've received everything
    bool done = false;
    while (!done)
    {
      // Fetch the data payload
      done = radio.read( joystick, sizeof(joystick) );
      Serial.print("X = ");
      Serial.print(joystick[0]);
      Serial.print(" Y = ");      
      Serial.println(joystick[1]);
    }
  }
  else
  {    
      Serial.println("No radio available");
  }
 
 
 
 
}//--(end main loop )---
 
/*-----( Declare User-written Functions )-----*/
 
//NONE
//*********( THE END )***********
 

мега в передатчике в loop после joy(); есть  

if (SaveTemperature != dht.readTemperature())

 { 
//   Serial.println("pered zapis'u");
    SDcardWrite(); // Запускаем функцию записи на SD card.
    // Снова фиксируем текущее значение температуры.
  //  Serial.println("posle zapisi");
    SaveTemperature = dht.readTemperature();
  // Serial.println("save temp"); 
     
 
   }
с ним ошибка без него ошибки нет
Alexander
Offline
Зарегистрирован: 25.04.2010
helix
Offline
Зарегистрирован: 02.10.2014

Не стал создавать тему отдельную, мжет тут кт тветит)

Хчу сделать авторизацию "свей" метки 2.4ггц, как на современных автосигнализациях. Аппаратно для этого что потребуется? или проще купить метки от сигнализации и их уже женить с например NRF24L01?