Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • NRF24L01 + arduino

NRF24L01 + arduino

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

NRF24L01 + arduino

Odoslaťod 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 

}
termixnator
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 798
Vek: 25.21
Založený: 18.01.2010
Bydlisko: PRAHA
Karma: 2

Re: NRF24L01 + arduino

Odoslaťod 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 :)
termixnator
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 798
Vek: 25.21
Založený: 18.01.2010
Bydlisko: PRAHA
Karma: 2

Re: NRF24L01 + arduino

Odoslaťod 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) Stiahnutá 11 krát
sraj
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 272
Založený: 26.06.2009
Bydlisko: PP
Karma: 6

Re: NRF24L01 + arduino

Odoslaťod 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.
termixnator
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 798
Vek: 25.21
Založený: 18.01.2010
Bydlisko: PRAHA
Karma: 2


Naspäť na Arduino

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.21 sekúnd