Hallo, schon wieder ich.
Ich habe ein Problem mit zwei rf24l01 Modulen. Was soll gemacht werden? Ich versuche es so knapp wie möglich zu beschreiben:
Arduino1 fungiert als Fernbedienung. Auf Tastendruck startet ein Timer (4 Digit 7 Segment), dann soll per RF24 ein Signal von Arduino2 (und später noch zwei weiteren) empfangen werden welches die Zeit auf dem 7-Segment Display nicht mehr weiter aktualisiert.
Das Signal von Arduino2 soll dann gesendet werden wenn ein Piezosensor einen bestimmten Wert überschreitet. Gleichzeitig wechseln an Arduino2 LEDs von rot auf grün. Diese LEDs wiederum werden erst wieder rot, wenn an Arduino1 ein anderer Taster betätigt wird.
Nun zum Problem: Piezo funktioniert, LEDs werden grün, allerdings empfängt die "Fernbedienung" das Signal zum Timer-Stop nicht. Der Reset-Taster um die LEDs wieder rot zu schalten funktioniert allerdings.
Wieder einmal bin ich absolut neu auf dem Gebiet (wireless), ich habe verschiedenste Tutorials geschaut und Beispielcodes gelesen, aber ich finde meinen Fehler nicht.
Arduino1/Fernbedienung:
#include "nRF24L01.h" //NRF24L01 library created by TMRh20 https://github.com/TMRh20/RF24
#include "RF24.h"
#include "SPI.h"
#include <TM1637.h>
int CLK = 2;
int DIO = 3;
TM1637 tm(CLK, DIO);
#define SwitchPin 6 //Reset
#define StartPin 5 //Start
int SentMessage[1] = {000};
int ReceivedMessage[1] = {000};
int Target1 = 0;
int Target2 = 0;
int Target3 = 0;
int Started = 0;
// variables for digits
int Hundertstel, Zehntel, Eins, Zehn;
unsigned long Startmillis = 0;
unsigned long Messung = 0;
RF24 radio(9, 10); // NRF24L01 used SPI pins + Pin 9 and 10 on the NANO
const uint64_t pipe[2] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
//const uint64_t pipe = 0xE6E6E6E6E6E6; // Needs to be the same for communicating between 2 NRF24L01
//const uint64_t pipe2 = 0xE8E8F0F0E1LL;
void setup(void)
{
Serial.begin(9600);
pinMode(SwitchPin, INPUT_PULLUP);
digitalWrite(SwitchPin, HIGH);
radio.begin(); // Start the NRF24L01
// radio.openReadingPipe(1, pipe); // Get NRF24L01 ready to receive
// radio.openWritingPipe(pipe); // Get NRF24L01 ready to transmit
tm.init();
// set brightness; 0-7
tm.set(4);
tm.display(0, 0);
tm.display(1, 0);
tm.point(1);
tm.display(2, 0); //10==A
tm.display(3, 0); //11==B...
}
void loop(void) {
if (digitalRead(SwitchPin) == LOW) // RESET ALL
{
radio.stopListening();
radio.openWritingPipe(pipe[1]);
SentMessage[0] = 111;
radio.write(SentMessage, 1); // Send pressed data to NRF24L01
SentMessage[0] = 222;
radio.write(SentMessage, 1); //
SentMessage[0] = 333;
radio.write(SentMessage, 1); // 111,222,333 = Reset 1,2,3
SentMessage[0] = 000;
radio.write(SentMessage, 1); // Send idle data to NRF24L01
Started = 0;
displayNumber(0000);
}
if (digitalRead(StartPin) == LOW && Started == 0) {
Started = 1;
Target1 = 0;
Target2 = 0;
Target3 = 0;
Startmillis = millis();
}
if (Started == 1) {
//Start Timer
Messung = millis() - Startmillis;
radio.openReadingPipe(1, pipe[0]);
radio.startListening(); // Listen to see if information received
while (radio.available())
{
radio.read(ReceivedMessage, 1); // Read information from the NRF24L01
if (ReceivedMessage[0] == 444) {
Target1 = 1;
}
if (ReceivedMessage[0] == 555) {
Target2 = 1;
}
if (ReceivedMessage[0] == 666) {
Target3 = 1;
}
}
Serial.println(Target1);
Hundertstel = (Messung / 10) % 10;
Zehntel = (Messung / 100) % 10;
Eins = (Messung / 1000) % 10;
Zehn = (Messung / 10000) % 10;
if (Target1 == 1) { //&& Target2 == 1 && Target3 == 1
radio.stopListening();
Started = 0;
}
if (Target1 == 0) { // && Target2 == 0 && Target3 == 0
tm.display(3, Hundertstel);
tm.display(2, Zehntel);
tm.display(1, Eins);
tm.display(0, Zehn);
}
}
}
//Funktion displayNumber(XXXX);
void displayNumber(int num) {
tm.display(3, num % 10);
tm.display(2, num / 10 % 10);
tm.display(1, num / 100 % 10);
tm.display(0, num / 1000 % 10);
}
Arduino2/Piezo+LEDs
#include <Adafruit_NeoPixel.h>
#include "nRF24L01.h" // NRF24L01 library created by TMRh20 https://github.com/TMRh20/RF24
#include "RF24.h"
#include "SPI.h"
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define LED_PIN 5
#define LED_COUNT 6
const int buzzer = 3;
int Treffer = 0;
int ReceivedMessage[1] = {000}; // Used to store value received by the NRF24L01
int SentMessage[1] = {000};
RF24 radio(9, 10); // NRF24L01 SPI pins. Pin 9 and 10 on the Nano
//const uint64_t pipe = 0xE6E6E6E6E6E6; // Needs to be the same for communicating between 2 NRF24L01
//const uint64_t pipe2 = 0xE8E8F0F0E1LL;
const uint64_t pipe[2] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(200);
for (int i = 0; i < LED_COUNT; i++) { // Set all LEDs to red Status "off"
strip.setPixelColor(i, 255, 0, 0);
}
strip.show();
radio.begin(); // Start the NRF24L01
// radio.openReadingPipe(1, pipe); // Get NRF24L01 ready to receive
// radio.openWritingPipe(pipe); // Get NRF24L01 ready to transmit
}
void loop() {
if (Treffer == 0) {
int val = analogRead(A0); // Piezo an A0 lesen
//Serial.println(val, DEC); //Ausgabe A0 an Serial Monitor
if (val > 100) { //Treffer
//ZUERST AN FERNBEDIENUNG SENDEN
//radio.openWritingPipe(pipe); // Get NRF24L01 ready to transmit
radio.stopListening();
radio.openWritingPipe(pipe[0]); // Get NRF24L01 ready to transmit
SentMessage[0] = 444; // TARGET1 555 und 666 für 2&3
radio.write(SentMessage, 1); // Send pressed data to NRF24L01
delay(200);
Treffer = 1;
for (int i = 0; i < LED_COUNT; i++) { // LEDs grün
strip.setPixelColor(i, 0, 255, 0);
}
strip.show();
tone(buzzer, 4700); //Beep
delay(300);
noTone(buzzer);
}
}
if (Treffer == 1) {
//Warten auf Reset von Fernbedienung
radio.openReadingPipe(1, pipe[1]); // Get NRF24L01 ready to receive
radio.startListening(); // Listen to see if information received
while (radio.available())
{
radio.read(ReceivedMessage, 1); // Read information from the NRF24L01
}
if (ReceivedMessage[0] == 111) // Indicates switch is pressed
{
Treffer = 0;
for (int i = 0; i < LED_COUNT; i++) { // Set all LEDs to red
strip.setPixelColor(i, 255, 0, 0);
}
strip.show();
}
}
}
Über Hilfe und Anregungen bin ich wie immer dankbar!