nrF24L01 en aanverwanten
18 berichten
• Pagina 2 van 2 • 1, 2
Re: nrF24L01 en aanverwanten
Dank,
ik ga eerst uitproberen.
Mogelijk alleen de masternode in het (de?) Mesh voorzien van een PA en LNA versie.
Nadeel van een antenne is dat de ontvanger, met trilmotortje, dan weer slechter in je borstzak past....
ik ga eerst uitproberen.
Mogelijk alleen de masternode in het (de?) Mesh voorzien van een PA en LNA versie.
Nadeel van een antenne is dat de ontvanger, met trilmotortje, dan weer slechter in je borstzak past....
Advertisement
Re: nrF24L01 en aanverwanten
Nou, prototypes draaien
Masternode met nrf24, trilmotor en per node een 2-kleurige led
Node(s) met nrf24, pir sensor en 2-kleurige led.
Zelfs het dynamisch adresseren in een mesh werkt top
Alleen wel allemaal binnen een straal van 5 meter.
Niet verwacht dat het bereik zo slecht is van die rf modules
Zelfs de positie van de rf module heeft invloed..
Gericht op ontvanger geeft 5 meter bereik, omhoog gericht geeft 4 meter bereik.
En nu... Externe antennes gaan gebruiken of 'sterkere' rf modules gaan zoeken ?
In iedergeval een betere foutafhandeling in gaan bouwen..
G.
Masternode met nrf24, trilmotor en per node een 2-kleurige led
Node(s) met nrf24, pir sensor en 2-kleurige led.
Zelfs het dynamisch adresseren in een mesh werkt top
Alleen wel allemaal binnen een straal van 5 meter.
Niet verwacht dat het bereik zo slecht is van die rf modules
Zelfs de positie van de rf module heeft invloed..
Gericht op ontvanger geeft 5 meter bereik, omhoog gericht geeft 4 meter bereik.
En nu... Externe antennes gaan gebruiken of 'sterkere' rf modules gaan zoeken ?
In iedergeval een betere foutafhandeling in gaan bouwen..
G.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: nrF24L01 en aanverwanten
Laat je code hier zien dan kunnen wij ook meedenken
Re: nrF24L01 en aanverwanten
Met foutafhandeling bedoel ik op de master beter afhandelen van niet ontvangen pakketjes.
Ik ga er nu vanuit dat een alarm gereset wordt op de ontvanger doordat de node een IDLE pakketje zend.
Maar als juist dan de verbinding uitvalt, blijft het alarm actief.
Dus resetten van alarmstatus moet ik verplaatsen naar de ontvanger omdat ik nooit zeker kan zijn van de verbinding.
Ik zal zo even mn sketches uploaden. Die staan niet op mn ipad.....
Ik ga er nu vanuit dat een alarm gereset wordt op de ontvanger doordat de node een IDLE pakketje zend.
Maar als juist dan de verbinding uitvalt, blijft het alarm actief.
Dus resetten van alarmstatus moet ik verplaatsen naar de ontvanger omdat ik nooit zeker kan zijn van de verbinding.
Ik zal zo even mn sketches uploaden. Die staan niet op mn ipad.....
Re: nrF24L01 en aanverwanten
De sketches zijn ruim voorzien van debugregels en ook ruim van commentaar voorzien...
Oude gewoontes roesten niet heh
Tevens is de masternode tijdelijk aangepast naar een SODQA MOJA, aangezien ik niet voldoende nano's in huis had. Wordt later omgebouwd naar 5 leds voor 5 nodes
De masternode:
En de node sketch (dit is node nr 2)
Oude gewoontes roesten niet heh
Tevens is de masternode tijdelijk aangepast naar een SODQA MOJA, aangezien ik niet voldoende nano's in huis had. Wordt later omgebouwd naar 5 leds voor 5 nodes
De masternode:
- Code: Alles selecteren
/*
Bewegingsmelder ontvanger
NRFMesh Auto Dynamic Addressing sensornodes over RF network
*
* Note: This sketch only functions on SODAQ MOJA
*/
#define VERSIE "1.0.a"
#define GREENLED1 4 // Digital Pin Green led1
#define GREENLED2 5 // Digital Pin Green led2
//#define GREENLED3 6 // Pin 6 op MOJO board is power grove connectors, niet bruikbaar voor led
#define REDLED1 7 // Digital Pin Red led1
#define REDLED2 8 // Digital Pin Red led2
#define BUZZER 9 // Digital Pin trilmotor
#define AAN LOW // Sinking schakelen naar 0
#define UIT HIGH
#include "RF24.h"
#include "RF24Network.h"
#include "RF24Mesh.h"
#include "SPI.h"
//Include eeprom.h for AVR (Uno, Nano) etc. except ATTiny // ***nodig ??**
#include "EEPROM.h"
/***** Configure the chosen CE,CS pins *****/
RF24 radio(3, 2); // RF Radio normaalgesproken op 9,10 op SODAQ MOJA 3 2n 2
RF24Network network(radio);
RF24Mesh mesh(radio, network);
// Configure the payload
struct payload_t {
int node;
char sensortype;
char versie[6];
};
//Setpup led array
int WarmUpLED[3] = { 0, GREENLED1, GREENLED2 };
int AlarmLED[3] = { 0, REDLED1, REDLED2 };
void setup() {
//Debug Serial
Serial.begin(57600);
Serial.println("Entering Setup");
// Setup pins for Buzzer and leds
Serial.println("Setting up pins");
PinSettings();
//Startup looplicht
Serial.println("Flashing Leds up");
LoopLichtUp();
// Set the nodeID to 0 for the master node
Serial.println("Setting nodeID 0");
mesh.setNodeID(0);
// Connect to the mesh
Serial.println("Beginning mesh");
mesh.begin();
//Einde Startup looplicht
Serial.println("Flashing Leds down");
LoopLichtDown();
Serial.println("Leaving setup, starting loop and updating mesh");
}
void loop() {
// Call mesh.update to keep the network updated
mesh.update();
// In addition, keep the 'DHCP service' running on the master node
// so addresses will be assigned to the sensor nodes
mesh.DHCP();
// Check for incoming data from the sensors
if (network.available()) {
Serial.println("Incoming package and preparing payload");
//Prepare payload
payload_t payload;
//Read header
Serial.print("Reading header, ");
RF24NetworkHeader header;
Serial.print("Filling payload, ");
network.read(header, &payload, sizeof(payload));
// Actie afhankelijk van type alarm
Serial.print("Taking action with header.type :");
Serial.println(char(header.type));
switch (header.type) {
// Als WARMUP message
case 'W':
// Warmup acties
// Switch on corresponding LED
Serial.print("W - Warmup - turn on greenled number ");
Serial.println(payload.node);
digitalWrite(WarmUpLED[payload.node], AAN);
break;
case 'L':
// Warmup acties
// Switch off corresponding LED
Serial.print("L - Warmup - turn off greenled number ");
Serial.println(payload.node);
digitalWrite(WarmUpLED[payload.node], UIT);
break;
case 'I':
// Idle acties
Serial.print("I - Idle - turn off both leds node ");
Serial.println(payload.node);
digitalWrite(AlarmLED[payload.node], UIT);
digitalWrite(WarmUpLED[payload.node], UIT); // just in case
break;
case 'A':
// ALARM acties
Serial.print("A - Alarm - turn on buzzer and Red led for node ");
Serial.println(payload.node);
digitalWrite(AlarmLED[payload.node], AAN);
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
break;
case 'R':
// Reay acties
Serial.print("R - Armed and Ready - turn off Red led for node ");
Serial.println(payload.node);
digitalWrite(AlarmLED[payload.node], UIT);
break;
default:
Serial.println("Onbekend bericht");
// Onbekend type bericht
Serial.print("Unknown action with header.type :");
Serial.println(header.type);
break;
}
}
}
void PinSettings() {
// Setup pins for Buzzer and leds
pinMode(BUZZER, OUTPUT);
pinMode(GREENLED1, OUTPUT);
pinMode(GREENLED2, OUTPUT);
// pinMode(GREENLED3, OUTPUT); // Tijdelijk op SODAQ
pinMode(6, OUTPUT); // Power op grove connectors aan zetten
digitalWrite(6, HIGH);
pinMode(REDLED1, OUTPUT);
pinMode(REDLED2, OUTPUT);
// pinMode(REDLED3, OUTPUT);
}
void LoopLichtUp() {
// Buzzer
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
// Leds
for (int nI = 1; nI < 3; nI++) {
digitalWrite(AlarmLED[nI], AAN);
delay(100);
digitalWrite(AlarmLED[nI], UIT);
delay(100);
digitalWrite(WarmUpLED[nI], AAN);
delay(100);
}
}
void LoopLichtDown() {
// Leds
for (int nI = 2; nI > 0; nI--) {
digitalWrite(WarmUpLED[nI], UIT);
delay(100);
digitalWrite(AlarmLED[nI], AAN);
delay(100);
digitalWrite(AlarmLED[nI], UIT);
delay(100);
}
// Buzzer
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
}
En de node sketch (dit is node nr 2)
- Code: Alles selecteren
/*
Bewegingsmelder zender
NRFMesh Auto Dynamic Addressing sensornodes over RF network
*/
#define nodeNummer 2 // Physical Sensor ID
#define nodeTYPE 'P' // Type sensor voor toekomstig gebruik
#define nodeVERSIE "1.0.a" // Versie software voor toekomstig gebruik
#define PIR_MOTION_SENSOR 4 // Digital Pin Bewegingsmelder
#define REDLED 5 // Digital Pin Red led
#define GREENLED 6 // Digital Pin Green led
#define AAN LOW // Sinking led aanzetten door pin LOW te zetten
#define UIT HIGH // Sinking led uitzetten door pin HIGH te zetten
#include "EEPROM.h"
#include "RF24.h" // RF module
#include "RF24Network.h" // RFNetwork functionaliteit
#include "RF24Mesh.h" // RFMesh functionaliteit
#include "SPI.h" // Serial Peripheral Interface
RF24 radio(9, 10); // RF Radio op pin 9 en 10
RF24Network network(radio); // Setup network
RF24Mesh mesh(radio, network); // Setup Mesh
// Configure the payload
struct payload_t {
int node;
char sensortype;
char versie[6];
};
// Setup variabelen
int nIdleCounter = 0;
bool lAlarmGemeld = false;
void setup() {
//Debug Serial
Serial.begin(57600);
Serial.println("Entering Setup");
// Setup pins
PinSettings();
Serial.println("Flashing Leds");
DubbelFlashLed();
// Setp Mesh
Serial.println("Setting up nodeID");
Serial.print("nodeID: ");
Serial.println(nodeNummer);
mesh.setNodeID(nodeNummer);
Serial.println("Flashing Leds");
DubbelFlashLed();
// Connect to the mesh
Serial.println("Connecting to mesh");
mesh.begin();
Serial.println("Flashing Leds");
DubbelFlashLed();
Serial.println("Updating mesh");
mesh.update();
Serial.println("Flashing Leds");
DubbelFlashLed();
Serial.println("Payload pakketje vullen");
// vul payload
payload_t pakketje;
pakketje.node = nodeNummer;
pakketje.sensortype = nodeTYPE;
strcpy(pakketje.versie, nodeVERSIE);
// Debug
Serial.print("nodeID: ");
Serial.println(nodeNummer);
Serial.print("nodeTYPE: ");
Serial.println(nodeTYPE);
Serial.print("nodeVERSIE: ");
Serial.println(nodeVERSIE);
Serial.println("Warming up PIR for 1 min.");
Serial.print("Send WARMUP message: ");
/* Warmup PIR sensor 1 min */
// Doe 150 keer = 1 minuut
for (int nI=0; nI < 150; nI++) {
// Groene led AAN
digitalWrite(GREENLED, AAN);
Serial.print(nI);
Serial.print(" W");
// Send an 'WARMUP' type message containing nodeID and type of sensor
if (!mesh.write(&pakketje, 'W', sizeof(pakketje))) {
// If a write fails, check connectivity to the mesh network
Serial.println("Write failed, checking connectivity");
if (!mesh.checkConnection()) {
Serial.println("Connection failed, refreshing address");
//refresh the network address
mesh.renewAddress();
}
}
// Wacht 0.2 seconde
delay(200);
// Groene Led UIT
digitalWrite(GREENLED, UIT);
Serial.print("L ");
// Schakel Led op ontvanger uit
mesh.write(&pakketje, 'L', sizeof(pakketje));
// Wacht 0.2 seconde
delay(200);
}
// Zend Ready and Armed
Serial.println("Zend Ready and Armed pakketje");
if (!mesh.write(&pakketje, 'R', sizeof(pakketje))) {
// If a write fails, check connectivity to the mesh network and try again only once
Serial.println("Write fail");
if (!mesh.checkConnection()) {
//refresh the network address
Serial.println("Geen connection, renew address");
mesh.renewAddress();
}
Serial.println("Herkansing READY pakketje");
mesh.write(&pakketje, 'R', sizeof(pakketje));
}
// Led Uit
Serial.println("LEDs knipperen en uit zetten");
DubbelFlashLed();
Serial.println("Leaving Setup en starting Loop met update mesh");
}
void loop()
{
// Mesh update
mesh.update();
// vul payload
payload_t pakketje;
pakketje.node = nodeNummer;
pakketje.sensortype = nodeTYPE;
strcpy(pakketje.versie, nodeVERSIE);
//Check PIR Sensor for movement
int sensorValue = digitalRead(PIR_MOTION_SENSOR);
// Idle loop counter
bool lGelukt = true;
// Beweging gedetecteerd
if (sensorValue == HIGH) {
Serial.println("MOTION DETECTED, send A message");
// Zend 'Alarm' message
lGelukt = mesh.write(&pakketje, 'A', sizeof(pakketje));
nIdleCounter = 0;
lAlarmGemeld = true;
}
else {
// Zend 'IDLE' message 1 keer per minuut en READY 10 seconde na laatste alarm
if (nIdleCounter == 10) {
if (lAlarmGemeld) {
lGelukt = mesh.write(&pakketje, 'R', sizeof(pakketje));
lAlarmGemeld = false;
}
}
if (nIdleCounter > 59) {
Serial.println("IDLE, once a minute send I message");
lGelukt = mesh.write(&pakketje, 'I', sizeof(pakketje));
nIdleCounter = 0;
}
else {
nIdleCounter += 1;
}
}
// Wacht 1 seconde
delay(1000);
//Als mesh fail, retry
if (!lGelukt) {
Serial.println("Send niet gelukt, check connectie");
if (!mesh.checkConnection()) {
Serial.println("Connection lost, renewing address");
//refresh the network address
mesh.renewAddress();
}
}
}
void DubbelFlashLed() {
digitalWrite(GREENLED, AAN);
delay(200);
digitalWrite(GREENLED, UIT);
delay(200);
digitalWrite(REDLED, AAN);
delay(200);
digitalWrite(REDLED, UIT);
delay(200);
}
void PinSettings() {
// Setup leds
pinMode(REDLED, OUTPUT);
pinMode(GREENLED, OUTPUT);
// Setup PIR Sensor
pinMode(PIR_MOTION_SENSOR, INPUT);
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: nrF24L01 en aanverwanten
Ik heb nog eens gekeken hoe ik toen met die dingen om ging ('t is ook alweer een tijdje geleden), maar ik gebruikte dit om de modules op te starten.
cpp code
En met name dat PA level zou kunnen helpen.
cpp code
/**
* @name setupRF24()
* setup the nRF24l01 module
*/
void setupRF24() {
//
// setup the nRF24L01 module
//
printf_begin();
radio.begin(); // Enable the RF24
radio.setDataRate(RF24_250KBPS); // transmission rate 250K-bps
radio.setPALevel(RF24_PA_MAX); // set transmitter to maximum level
radio.setChannel(RF24_CHANNEL); // use channel
radio.enableDynamicPayloads(); // enable dynamic message sizes
radio.setRetries(0, 0); // set the maximum number of retries and duration
radio.setCRCLength(RF24_CRC_16); // 16 bit CRC is used
radio.setAutoAck(false); // we have to do ou own handshaking as we need more than 6 devices to control
//
// create the message pipes
//
radio.openWritingPipe(pipes[0]); // pipe zero for sending
radio.openReadingPipe(1, pipes[1]); // one pipe for receiving
//
// start executing
//
radio.startListening(); // go into listen mode
radio.printDetails(); // show the details on the serial
}
En met name dat PA level zou kunnen helpen.
Re: nrF24L01 en aanverwanten
Ik zal eens duiken in de rfnetwork librarys die ik gebruik welke pa levels en data-rate gebruikt worden als default
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: nrF24L01 en aanverwanten
Palumbus schreef:Ik zal eens duiken in de rfnetwork librarys die ik gebruik welke pa levels en data-rate gebruikt worden als default
Ik heb zo 's gekeken in die libraries en je zou kunnen proberen:
cpp code
setPaLevel(RF24_PA_MAX);
Ik neem tenminste aan de je de libraries van TMRh20?
18 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 31 gasten