Go Down

Topic: RF24L01+ Slave per "Signal" starten (Read 192 times) previous topic - next topic

Panda89

Hallo zusammen,

ich baue im Moment ein Lichtschrankensystem aus einem Master (Uno) und dann später 3 Slaves (Nano).
Es wird die Zeit zwischen Licht an Unterbrechung an den Master zurückgeschickt. Bis jetzt wird die Unterbrechung durch einen Taster ausgelöst.

Bis jetzt schalten die Slaves direkt nach dem hochladen des Sketches (am Slave) ein.

Hier der Code am Master
Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN

void setup() {
 Serial.begin(9600);
 radio.begin();
 
}//end of setup

void loop() {
 
 slave1();

}// End of loop


void slave1(){
  byte address[6] = "00001";
  radio.openWritingPipe(address[0]);
 
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_250KBPS);
   
  radio.startListening();
 
  if (radio.available()) {
  const char erg[32] = "";
    radio.read(&erg, sizeof(erg));
    Serial.print(erg); Serial.println(" ms 1");
    delay(50);

  radio.stopListening();
  }
}



 


Das ist der Code der Slaves
Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";

long start;
float dauer;

void setup() {
  radio.begin();
  radio.openWritingPipe(address[0]);
  radio.setPALevel(RF24_PA_MIN);

pinMode(7, INPUT);
pinMode(3, OUTPUT);

digitalWrite(7, HIGH); // Pull-Up-Widerstand aktivieren

 
}
void loop() {

 
  radio.stopListening();

digitalWrite(3, HIGH);
start = millis(); 
  if(digitalRead(7) == LOW) {
     while(digitalRead(7) == LOW) {
       1; // warten, solange Taste gedrueckt
     }
     digitalWrite(3,LOW);
   const float  dauer = millis() - start;
   delay(5);
     
   char erg[32];
dtostrf(dauer,1,0, erg);
radio.write(&erg, sizeof(erg));
delay(500);
 }
}



Ich möchte gerne das der Slave erst nach einem Signal vom Master seinen Loop durchläuft.
Kann ich vom Master aus so ein "Signal"/Impuls/etc. an den Slave senden sodann dieser dann den loop ausführt?

Gibt es strukturrelle Alternativen?


Vielen Dank für eure Hilfe.

Gruß Simon

HotSystems

Wenn du den Sketch korrekt programmiert hast, dann wird eine loop immer ausgeführt und sollte/darf/kann nicht gestoppt werden.

Du musst deine Programmierung so ausführen, dass deine gewollte Funktion erst gestartet wird, wenn dein Steuersignal eintrifft.
Und damit die Funktion nicht beim Starten des Arduino ausgeführt werden, kannst du das durch eine entsprechende Status-Variable verhindern.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

#2
Aug 14, 2018, 08:58 pm Last Edit: Aug 14, 2018, 09:02 pm by combie
Quote
Gibt es strukturrelle Alternativen?
Sicherlich....

Lege den AVR schlafen.
Und wenn ein Paket kommt, lasse den AVR über den IRQ Ausgang des nRF wecken.

So wird dann loop(oder was anderes) nur durchlaufen, wenn Daten anliegen.

--
Aber dennoch, glaube ich, dass du dich auf ein schmales Brett begeben hast.

Mein Tipp:
Sorge dafür, dass loop() möglichst oft und möglichst ungestört durchlaufen wird.
Es sind bei einem UNO locker 100 Tausend Durchläufe pro Sekunde drin.
Nutze das.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Go Up