Probleme mit RF24 Beispiel bei zusätzlichem Keypad

Hallo zusammen,

bin ziemlicher Beginner mit dem ArduinoBoard und bin inzwischen bei den RF24-Beispielen angelangt.

Hier habe ich das LED_Remote-Beispiel nachgestellt was auch funktionierte.

Als nächstes habe ich ein LCD-Display am LED-Arduino (UNO) angeschlossen welches mir den Status zweier LEDs ausgibt. Auch kein Problem.

Nun wollte ich am Remote-Arduino (Mega) ein zusätzliches Keypad anschliessen und bekomme hier einfach keine Ausgabe vom Keypad.
Die Verkabelung passt, da ich das Keypadbeispiel mit den Pins nachstellte und hier funktionierte es.

Anbei der Code:

/*
 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 */

/**
 * Example LED Remote
 *
 * This is an example of how to use the RF24 class to control a remote
 * bank of LED's using buttons on a remote control.
 *
 * On the 'remote', connect any number of buttons or switches from
 * an arduino pin to ground.  Update 'button_pins' to reflect the
 * pins used.
 *
 * On the 'led' board, connect the same number of LED's from an
 * arduino pin to a resistor to ground.  Update 'led_pins' to reflect
 * the pins used.  Also connect a separate pin to ground and change
 * the 'role_pin'.  This tells the sketch it's running on the LED board.
 *
 * Every time the buttons change on the remote, the entire state of
 * buttons is send to the led board, which displays the state.
 */

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

// --------- Anfang LCD -------------------
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);

// --------- Ende LCD -------------------
// --------- Anfang Keypad --------------
#include <Keypad.h>
//Hier wird die größe des Keypads definiert

const byte COLS = 4; //3 Spalten

const byte ROWS = 4; //4 Zeilen

//Die Ziffern/Zeichen:

char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}

};
int anzahl;

byte colPins[COLS] = { 37, 35, 33, 31 }; //Definition der Pins für die 3 Spalten

byte rowPins[ROWS] = { 29, 27, 25, 23 };//Definition der Pins für die 4 Zeilen

char pressedKey; //pressedKey entspricht in Zukunft den gedrückten Tasten

Keypad myKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit myKeypad angesprochen werden

// --------- Ende Keypad --------------

// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 (CE & CS)

RF24 radio(9,10);

// sets the role of this unit in hardware.  Connect to GND to be the 'led' board receiver
// Leave open to be the 'remote' transmitter
const int role_pin = A0;

// Pins on the remote for buttons
const uint8_t button_pins[] = { 43,45 };
const uint8_t num_button_pins = sizeof(button_pins);

// Pins on the LED board for LED's
const uint8_t led_pins[] = { 2,3 };
const uint8_t num_led_pins = sizeof(led_pins);

//
// Topology
//

// Single radio pipe address for the 2 nodes to communicate.
const uint64_t pipe = 0xE8E8F0F0E1LL;

//
// Role management
//
// Set up role.  This sketch uses the same software for all the nodes in this
// system.  Doing so greatly simplifies testing.  The hardware itself specifies
// which node it is.
//
// This is done through the role_pin
//

// The various roles supported by this sketch
typedef enum { role_remote = 1, role_led } role_e;

// The debug-friendly names of those roles
const char* role_friendly_name[] = { "invalid", "Remote", "LED Board"};

// The role of the current running sketch
role_e role;

//
// Payload
//

uint8_t button_states[num_button_pins];
uint8_t led_states[num_led_pins];

//
// Setup
//

void setup(void)
{
  // ------- Anfang LCD ------------
// initialize the LCD
  lcd.begin();

  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.print("Hellooooo, world!");
  // ------- Ende LCD --------------
  //
  // Role
  //

  // set up the role pin
  pinMode(role_pin, INPUT);
  digitalWrite(role_pin,HIGH);
  delay(20); // Just to get a solid reading on the role pin

  // read the address pin, establish our role
  if ( digitalRead(role_pin) )
    role = role_remote;
  else
    role = role_led;

  //
  // Print preamble
  //

  Serial.begin(115200);
  printf_begin();
  printf("\n\rRF24/examples/led_remote/\n\r");
  printf("ROLE: %s\n\r",role_friendly_name[role]);

  //
  // Setup and configure rf radio
  //

  radio.begin();

  //
  // Open pipes to other nodes for communication
  //

  // This simple sketch opens a single pipes for these two nodes to communicate
  // back and forth.  One listens on it, the other talks to it.

  if ( role == role_remote )
  {
    radio.openWritingPipe(pipe);
  }
  else
  {
    radio.openReadingPipe(1,pipe);
  }

  //
  // Start listening
  //

  if ( role == role_led )
    radio.startListening();

  //
  // Dump the configuration of the rf unit for debugging
  //

  radio.printDetails();

  //
  // Set up buttons / LED's
  //

  // Set pull-up resistors for all buttons
  if ( role == role_remote )
  {
    Serial.print("Anfang Serial Remote");
    int i = num_button_pins;
    while(i--)
    {
      pinMode(button_pins[i],INPUT);
      digitalWrite(button_pins[i],HIGH);
    }
  }

  // Turn LED's ON until we start getting keys
  if ( role == role_led )
  {
    Serial.print("Anfang Serial LED");
    int i = num_led_pins;
    while(i--)
    {
      pinMode(led_pins[i],OUTPUT);
      led_states[i] = HIGH;
      digitalWrite(led_pins[i],led_states[i]);
    }
  }

}

//
// Loop
//

void loop(void)
{
  //
  // Remote role.  If the state of any button has changed, send the whole state of
  // all buttons.
  //
  
  if ( role == role_remote )
  {
  // --------- Anfang Keypad --------------
    if (pressedKey) { //Wenn eine Taste gedrückt wurde
    //anzahl++;
    //Serial.print("Die Taste ");
    Serial.print("Die Taste ");
    Serial.print(pressedKey);
    Serial.print("wurde gedrueckt");
    Serial.println(); //Teile uns am Serial Monitor die gedrückte Taste mit
    }
    // --------- Ende Keypad --------------
      
    
    // Get the current state of buttons, and
    // Test if the current state is different from the last state we sent
    int i = num_button_pins;
    bool different = false;
    while(i--)
    {
      uint8_t state = ! digitalRead(button_pins[i]);
      if ( state != button_states[i] )
      {
        different = true;
        button_states[i] = state;
      }
    }

    // Send the state of the buttons to the LED board
    if ( different )
    {
      printf("Now sending...");
      //printf(button_pins);
      bool ok = radio.write( button_states, num_button_pins );
      if (ok)
        printf("ok\n\r");
      else
        printf("failed\n\r");
    }
    // Try again in a short while
    delay(20);
  }

  //
  // LED role.  Receive the state of all buttons, and reflect that in the LEDs
  //

  if ( role == role_led )
  {
    // if there is data ready
    if ( radio.available() )
    {
      // Dump the payloads until we've gotten everything
      while (radio.available())
      {
        // Fetch the payload, and see if this was the last one.
        radio.read( button_states, num_button_pins );

        // Spew it
        printf("Got buttons\n\r");

        // Anfang LCD ----------------
        lcd.setCursor(0,0); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
        lcd.print("Taste wurde gedrueckt!");
        lcd.setCursor(0,1); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
        lcd.print("LED 1: ");
        lcd.print(led_states[0]);
        lcd.setCursor(0,2); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
        lcd.print("LED 2: ");
        lcd.print(led_states[1]);
        
        // Ende LCD -------------------
        
        // For each button, if the button now on, then toggle the LED
        int i = num_led_pins;
        while(i--)
        {
          if ( button_states[i] )
          {
            led_states[i] ^= HIGH;
            digitalWrite(led_pins[i],led_states[i]);
          }
        }
      }
    }
  }
}
// vim:ai:cin:sts=2 sw=2 ft=cpp

Wäre dankbar wenn mir hier jemand helfen könnte.

Gruss Lars

Liefer uns bitte ein Schaltbild mit dem Keypad und auch einen Link des Keypads. Einen Hyperlink.

Hier der Schaltplan:

Und hier der Link zum Keypad. Die Pins 23-37 sind an dieses angeschalten:
Keypad 4x4

Wie gesagt wenn ich einen Sketch des Keypad einspiele und die Pins hier anpasse, dann bekomme ich meine gedrückte Taste im Serial Monitor angezeigt.

Beispielcode des Keypad welches funktioniert:

#include <Wire.h> // Wire Bibliothek hochladen
#include <LiquidCrystal_I2C.h>// Vorher hinzugefügte LiquidCrystal_I2C Bibliothek hochladen
LiquidCrystal_I2C lcd(0x27, 20, 4);   //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall einer mit 16 Zeichen in 2 Zeilen.
#include <Keypad.h>

//Hier wird die größe des Keypads definiert

const byte COLS = 4; //3 Spalten

const byte ROWS = 4; //4 Zeilen

//Die Ziffern/Zeichen:

char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}

};
int anzahl;
byte colPins[COLS] = { 37, 35, 33, 31 }; //Definition der Pins für die 3 Spalten

byte rowPins[ROWS] = { 29, 27, 25, 23 };//Definition der Pins für die 4 Zeilen
//byte colPins[COLS] = { 9, 8, 7, 6 }; //Definition der Pins für die 3 Spalten

//byte rowPins[ROWS] = { 5, 4, 3, 2 };//Definition der Pins für die 4 Zeilen

char pressedKey; //pressedKey entspricht in Zukunft den gedrückten Tasten

Keypad myKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit myKeypad angesprochen werden

void setup() {
lcd.begin(); //Im Setup wird der LCD gestartet (anders als beim einfachen LCD Modul ohne 16,2 in den Klammern denn das wurde vorher festgelegt

Serial.begin(9600);
}

void loop() {

pressedKey = myKeypad.getKey(); //pressedKey entspricht der gedrückten Taste

if (pressedKey) { //Wenn eine Taste gedrückt wurde
anzahl++;
Serial.print("Die Taste ");
Serial.print(pressedKey);
Serial.print("wurde gedrueckt");
Serial.println(); //Teile uns am Serial Monitor die gedrückte Taste mit

lcd.setCursor(0,0); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
lcd.print("Welche Taste?");
lcd.setCursor(0,1); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
lcd.print("Die Taste");
lcd.setCursor(0,2); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
lcd.print(pressedKey);
lcd.setCursor(0,3); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
lcd.print(anzahl);
if (pressedKey == 'D') {
lcd.setCursor(0,0); //Ab hier kann das I2C LCD Modul genau wie das einfache LCD Modul programmiert werden.
lcd.print("JA");
}  
}
}

Danke für die Hilfe!

Ok, dein Sketch ist nicht richtig:

Diese Zeile fehlt in der Loop.

pressedKey = myKeypad.getKey(); //pressedKey entspricht der gedrückten Taste

das ist die Abfrage der Tastatur.

Du würdest deinen Sketch übersichtlicher gestalten, wenn du die komplette Tastatur-Routine in eine Funktion auslagerst.

Und ob es mit dieser if-Abfrage

 if ( role == role_remote )

vor der Tastaturfunktion auch läuft, bezweifle ich.

Mega, jetzt wo ich es weiss seh ich es auch.

Vielen Dank, funktioniert!

Symbadisch:
Mega, jetzt wo ich es weiss seh ich es auch.

Vielen Dank, funktioniert!

Ahhh....super, freut mich, dass es jetzt funktioniert.