NRF24L01 + arduino

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

NRF24L01 + arduino

Príspevok od používateľa termixnator » 14 Jún 2017, 16:43

Ahoj, mám takový problém s propojením čidel a "základny" pokud využívám jen 2x NRF tak mi vše funguje jak má a bez problému, ale pokud se snažím nějak přidat třetí NRF tak program nefunguje vůbec... Nevím jestli je problém v oddělení NRFek jen kanálem nebo adresami ( nikde jsem nenašel pěkný příklad z kterého bych se přiučil jak spojit více NRF a nedělat síť ). Už se s tím babrám pár dní a nemůžu přijít na to kde je zakopanej pes :( Kdyby byl někdo tak hodný a poradil by tak bych byl vděčný (upravený program mohu testnou okamžitě mám vše u sebe. Jinak program je takovej poplacanej hlava nehlava protože jsem ho za těch pár dní zkoušel rozchodit a ani prd :( tak to prosím omluvte.

Ještě jsem zkoušel jiné verze RF24 knihovny a buď je to stejné nebo to nejde zkompilovat vůbec (aktuálně používám verzi 1.1.7
Občas se po restartu něco zobrazí na LCD "vypnuto" nebo nějaká divná hatmatilka místo teploty a po nějakém čase se jednou pošle i teplota, ale je to dost nahodilé... snaha by tedy byla... :(

Základna:

Kód: Vybrať všetko

#include <SPI.h> 
#include <nRF24L01.h> 
#include <RF24.h> 
#include <LiquidCrystal_I2C.h> 
#include <Wire.h> 

#define button 4 

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display 
RF24 radio(7, 8); // CNS, CE 
  
byte stupen[8] = { 0x6,0x9,0x9,0x6,0x0,0x0,0x0 }; //znak stupne 
byte teplomer[8] = { 0x4,0xa,0xa,0xe,0xe,0x1f,0x1f,0xe }; //znak teplomer 
//byte antena[8] = { 0x1f,0x15,0xe,0x4,0x4,0x4,0x4,0x4 }; //znak antena 
//byte xantena[8] = { 0x1f,0x15,0xe,0x5,0x6,0x4,0xc,0x14 }; //preskrtla antena 

boolean buttonState = 0; 

const byte addresses[][6] = {"00001", "00002"}; 
int kanal1 = 111; 
int kanal2 = 112; 
//unsigned long time = millis(); 


void setup(void) { 
Serial.begin(9600); 
 lcd.init(); 
 lcd.backlight(); 
 pinMode(button, INPUT); 
  
radio.begin(); 
radio.setDataRate(RF24_1MBPS); // nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS 
radio.setPALevel(RF24_PA_LOW); // nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj 
} 

void loop() { 

  delay(15); 
     radio.setChannel(kanal1); 
       //nastaveno na příjem 
  radio.openWritingPipe(addresses[1]); // 00001 
  radio.openReadingPipe(1, addresses[0]); // 00002  
  radio.startListening(); 
  
  if ( radio.available()) { 
      float temperature = 0; 
      radio.read(&temperature, sizeof(temperature)); 
      Serial.print("Temperature : "); 
Serial.println(temperature); 

lcd.createChar(0, stupen);   //odeslání definice 1. znaku (znak 0) 
  lcd.createChar(1, teplomer);   //odeslání definice 1. znaku (znak 0) 
//lcd.createChar(2, antena);   //odeslání definice 1. znaku (znak 0) 
//lcd.createChar(3, xantena);   //odeslání definice 1. znaku (znak 0) 

    lcd.setCursor (0,0 ); 
   lcd.write(byte(1));    //zobrazí znak teplomeru (znak 0) 
    lcd.setCursor(1,0); 
  lcd.print(temperature,1); 
  lcd.setCursor(5, 0); 
  lcd.write(byte(0));    //zobrazí znak stupne (znak 0 
    lcd.setCursor(6,0); 
  lcd.print("C"); 

 // lcd.setCursor (8,0 ); 
 // lcd.write(byte(2));    //zobrazí znak anteny (znak 0) 
  
 //time = millis(); //srovnání hodnot time a millis 
  
 // if(millis()-time > 60000) { //uběhlo 15 sec od posledního odeslání teploty nebo od zapnutí? a radio je nedostupne? 
 // lcd.setCursor (8,0 ); 
  //lcd.print(byte(3));    
  
 } 
  
delay(15); 
     radio.setChannel(kanal2); 
    //nastaveno na příjem 
  radio.openWritingPipe(addresses[1]); // 00002 
  radio.openReadingPipe(1, addresses[0]); // 00001  
  radio.startListening(); 

  
  if ( radio.available()) { 
    
  char text[32] = ""; 
  radio.read(&text, sizeof(text)); 
  lcd.setCursor (0,1 ); 
  lcd.print(text); 
  
  char textt[32] = ""; 
  radio.read(&textt, sizeof(textt)); 
  lcd.setCursor (0,1 ); 
  lcd.print(textt); 
    
 delay(15); 
//nastaveno na vysílání 
  radio.openWritingPipe(addresses[0]); // 00001 
  radio.openReadingPipe(0, addresses[1]); // 00002  
  radio.stopListening(); 
  
 buttonState = digitalRead(button); 
 radio.write(&buttonState, sizeof(buttonState)); 
  } 

    
}

Přijímač s relátkem:

Kód: Vybrať všetko

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

#define rele 6 
boolean buttonState = 0; 

RF24 radio(7, 8);  //CNS, CE 
const byte addresses[][6] = {"00001", "00002"}; 
int kanal2 = 112; 

void setup() { 

  pinMode(6, OUTPUT); 
  radio.begin(); 
  radio.setDataRate(RF24_1MBPS);  //nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS 
  radio.setPALevel(RF24_PA_LOW);  //nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj 
  radio.setChannel(kanal2); 
} 


void loop() { 
  delay(15); 

  //nastaveno na vysílání 
  radio.openWritingPipe(addresses[0]); // 00001 
  radio.openReadingPipe(0, addresses[1]); // 00002 
  radio.stopListening(); 

  if (buttonState == HIGH) { 
    const char text[] = "Zapnuto"; 
    radio.write(&text, sizeof(text)); 
  } 
  else { 
    const char textt[] = "Vypnuto"; 
    radio.write(&textt, sizeof(textt)); 
  } 
  
  delay(15); 
  //nastaveno na příjem 
  radio.openWritingPipe(addresses[1]); // 00002 
  radio.openReadingPipe(1, addresses[0]); // 00001  
  radio.startListening(); 

  while (!radio.available()); 
  radio.read(&buttonState, sizeof(buttonState)); 
  if (buttonState == HIGH) { 
    digitalWrite(rele, HIGH); 
  } 
  else { 
    digitalWrite(rele, LOW); 
  } 
}

Vysílač teploty (je to nepřehledné díky deep sleepu) jinak teplota se na sériovém monitoru normálně zobrazuje jak má:

Kód: Vybrať všetko

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); 


RF24 radio(7, 8); // CNS, CE 

const byte addresses[][6] = {"00001", "00002"}; 
int kanal1 = 111;

// zde se bude ukládat zda přišel impuls z watchdog timeru
// hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
volatile int impuls_z_wdt=1;
// zde se ukládají impulsy
volatile int citac_impulsu= 2;
// zde nastavíme potřebný počet impulsů
// podle nastavení WDT viz níže je jeden impuls 8 sekund
volatile int impulsu_ke_spusteni = 5;

/* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou
   načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k
   spánkovému režimu budou tyto hodnoty určitě poté přesné.
*/
// impuls z WATCHDOG TIMERU /////////////////
ISR(WDT_vect) 
{
  //když je proměnná impuls_z_wdt na 0 
  if(impuls_z_wdt == 0)
  {
    // zapiš do proměnné 1
    impuls_z_wdt=1;
  }
}

void enterSleep(void)

{
  //nastavení nejúspornějšího módu
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  // spánkový režim je povolený
  sleep_enable();  
  // spuštění režimu spánku
  sleep_mode();
  // tady bude program pokračovat když se probud
  // spánek zakázán
  sleep_disable();   

  //znovu zapojení všech funkcí 

  power_all_enable();

}

void setup()
{
Serial.begin(9600);
sensors.begin();
radio.begin();
radio.setDataRate(RF24_1MBPS); // nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
radio.setPALevel(RF24_PA_LOW); // nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj
radio.setChannel(kanal1);

//nastaveno na vysílání
   radio.openWritingPipe(addresses[0]); // 00001 
  radio.openReadingPipe(0, addresses[1]); // 00002 
  radio.stopListening();
  
  // nastavení WATCHDOG TIMERU    

  MCUSR &= ~(1<<WDRF); // neřešte
  WDTCSR |= (1<<WDCE) | (1<<WDE); // neřešte

  // nastavení času impulsu
  WDTCSR = 1<<WDP0 | 1<<WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda

  WDTCSR |= _BV(WDIE); //neřešte

}

void loop()

{
  //když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
  if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
  {
    ///////////////////////////////////////////////////////////////


    // zde je ukázkový kód, upravte si sami podle potřeby


sensors.requestTemperatures();
sensors.setResolution(12); //nastaveni presnosti mereni teploty moznosti 9 bits 0.5°C 93.75 ms - 10 bits 0.25°C 187.5 ms - 11 bits 0.125°C 375 ms - 12 bits 0.0625°C  750 ms
float temperature = sensors.getTempCByIndex(0);
Serial.print ( temperature );
radio.write(&temperature, sizeof(temperature));

    // konec ukázkového kódu, který se v nastaveném intervalu

    // bude provádět


    //////////////////////////////////////////////////////////////


    citac_impulsu = 0;// vynuluj čítač
    impuls_z_wdt = 0; // vynuluj impuls    
    enterSleep();// znovu do spánku

  }
  else
  {
    enterSleep();//znovu do spánku
  }
citac_impulsu++; // inpuls se přičte i když nic neproběhlo  

}
0

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: NRF24L01 + arduino

Príspevok od používateľa termixnator » 15 Jún 2017, 16:49

Případně by mi stačil nějaký příklad třeba dvou čidel a jedné základní stanice co by s nimi komunikovala... Dál bych si to překopal. Pokud jste někdo něco dělal tak sem s tím :)
0

Používateľov profilový obrázok
sraj
Stály člen
Stály člen
Príspevky: 400
Dátum registrácie: 26 Jún 2009, 00:00
Bydlisko: PP
Kontaktovať používateľa:

Re: NRF24L01 + arduino

Príspevok od používateľa sraj » 18 Jún 2017, 16:07

tiež som mal problém pre viac vysielačov nakoniec som vychádzal z tohto, je to funkčné, treba sa v tom vysomáriť
Prílohy
TX1_TX2_RX.zip
(2.66 KiB) 73 stiahnutí
0
https://www.meteopp.eu/ MeteoStanica POPRAD - aktuálne údaje , +meteokamerka(test)
Mini Meteostanica Poprad : http://svetelektro.com/Forum/mini-meteo ... 42443.html
TempLogger : http://svetelektro.com/Forum/templogger-t8407.html

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: NRF24L01 + arduino

Príspevok od používateľa termixnator » 19 Jún 2017, 18:57

Zatím jsem to vyřešil IDčkem jednotlivých modulů, ale díky mrknu na to.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok