Vor einer Weile schrieb ich mal von Problemen mehre von diesen 8x8 LED-Quadraten mit MAX7219 zum arbeiten zu bewegen. Das klappt jetzt sicher indem ich a) jeden MAX mit 10µF abgeblockt habe und b) das Timing in der MAX72xx Lib pro Byte etwas verlangsamt habe.
Das ganze soll eine Jux Anwendung für einen Bekannten werden. Jetzt soll das ganze mit einer Fernbedienung auf nrf24 bedient werden. Der Fernbedienungssender ist schon seit 3 Jahren fertig und
arbeitet mit einer anderen Anwendung Problemlos zusammen. Auch die Empfangsroutinen waren flux
eingebaut und dann ging die ParolaLib für die LEDs nicht mehr. An der Fernbedienung habe ich eine
Error LED die mir anzeigt ob das Paket angekommen ist. Die blieb aus ! Also ging der Empfänger.
Ach so alles läuft auf einem ProMini dessen Bootloader als UNO geflasht wurde.
Also wollte ich nachschauen ob auch wirklich empfangen wurde.
Serial.begin rein und ein paar Testausgaben.
Und was passiert : Alles funktioniert. Die Texte scrollen brav durch die Anzeige und Kommandos
der Fernbedienung kommen einwandfrei durch.
Testausgaben raus. Nix geht mehr. Nur das Serial.begin(9600) drin gelassen und es funktioniert.
Das da war faul ist ist mir klar. Nur ich sehe nicht wo. Die Hardware tut es einwandfrei daher schiebe
ich das rein auf die Software. Erst dachte ich ja das sich irgendwelche Hardwarekonflikte zwische NRF-Lib und Parola lib da rein geschlichen haben. Aber Parola nutzt SoftSPI und NRF HardSpi.
Könnte es einfach so lassen aber es macht mich verrückt.
Die Source : (musste Kommentare raus nehmen weil sonst > 9000)
#define SOFT_SPI 1
#ifdef SOFT_SPI
#define DATA_PIN 7
#define CS_PIN 8
#define CLK_PIN 9
#else
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#endif
#define RCVLED 2
#define NUM_MAX 16
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
//#include <SPI.h>
#include "RF24.h"
RF24 radio(A0, 10);
#define BASECHANNEL 111
//--------------------------------------------------------------------------------------------------
// Used to control whether this node is sending or receiving
//--------------------------------------------------------------------------------------------------
const uint64_t addresses[8] = {0xE8E8F0F0E1LL,0xE8E8F0F0E2LL,0xE8E8F0F0E3LL,0xE8E8F0F0E4LL,
0xE8E8F0F0E5LL,0xE8E8F0F0E6LL,0xE8E8F0F0E7LL,0xE8E8F0F0E8LL};
//--------------------------------------------------------------------------------------------------
// Struktur zum Senden und empfangen
typedef struct d
{
uint16_t key;
uint16_t dip;
uint16_t pwr;
} data;
data sendData; // Machen wir global und schreiben einmal initial die DIP-Schalter rein
//--------------------------------------------------------------------------------------------------
// Statische Variablen
//--------------------------------------------------------------------------------------------------
uint64_t sendQueue; // Variable Sendque
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 16
#define SPEED_TIME 29 // 25
#define PAUSE_TIME 750 // 1000
#ifdef SOFT_SPI
MD_Parola p = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
#else
MD_Parola p = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
#endif
#define ZAEHLER2 0
#define SAUF 1
#define ZAEHLER1 2
uint8_t readDip()
{
uint8_t cnt;
uint8_t retVal;
retVal = 0;
for (cnt = A3;cnt > A0;cnt--) // A4 nicht angeschlossen
{
pinMode(cnt,INPUT);
digitalWrite(cnt,HIGH); // PULL UP HIGH !
retVal = retVal << 1;
if (! digitalRead(cnt))
{
retVal = retVal | 1;
}
digitalWrite(cnt,LOW); // PULL UP Wieder weg ! um Energie zu sparen
}
return(retVal);
}
//--------------------------------------------------------------------------------------------------
void setup()
{
uint8_t channel;
uint8_t queue;
uint8_t cnt;
Serial.begin(9600);
pinMode(RCVLED,OUTPUT);
for (cnt = 0 ; cnt < 10 ; cnt++)
{
digitalWrite(RCVLED,!digitalRead(RCVLED));
delay(250);
}
digitalWrite(RCVLED,LOW);
channel = readDip();
sendData.dip = channel; // Only for debuging send dip-status
queue = channel & 0x07;
channel = BASECHANNEL + (channel & 0x08);
sendQueue = addresses[queue];
radio.begin();
radio.setChannel(channel);
radio.setRetries(15, 15);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_2MBPS);
radio.openReadingPipe(1, addresses[queue]);
radio.startListening();
pinMode(DATA_PIN,OUTPUT);
pinMode(CS_PIN,OUTPUT);
pinMode(CLK_PIN,OUTPUT);
delay(500);
p.begin(3);
p.setInvert(false);
p.setZone(ZAEHLER2,0,3);
p.setZone(SAUF,4,11);
p.setZone(ZAEHLER1,12,15);
p.displayZoneText(ZAEHLER2,"4 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(SAUF,"Saufspiel V0.9",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(ZAEHLER1,"1 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
}
int flag = 0;
char VarText[80];
void loop()
{
uint8_t pipeNr;
uint16_t taste;
uint16_t extTaste;
data DataRead;
uint8_t received;
uint32_t lastMillis;
while (!p.getZoneStatus(0)) p.displayAnimate();
while (!p.getZoneStatus(1)) p.displayAnimate();
while (!p.getZoneStatus(2)) p.displayAnimate();
lastMillis = millis();
received = 0;
while ( (!received) && ((millis() - lastMillis) < 3000) )
{
received = radio.available(&pipeNr);
}
if (received)
{
digitalWrite(RCVLED,!digitalRead(RCVLED));
radio.read(&DataRead,sizeof(data));
taste = DataRead.key & 0x00FF;
extTaste = DataRead.key & 0xFF00;
sprintf(VarText,"Taste %c Ext %d",taste,extTaste >> 8);
}
else
{
strcpy(VarText,"Nothing on air !");
}
switch(flag)
{
case 0:
{
p.displayClear(SAUF);
p.displayClear(ZAEHLER2);
p.displayClear(ZAEHLER1);
p.displayZoneText(ZAEHLER2,"4 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(ZAEHLER1,"1 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(SAUF,VarText,PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
}
break;
case 1:
{
p.displayClear(SAUF);
p.displayClear(ZAEHLER2);
p.displayClear(ZAEHLER1);
p.displayZoneText(ZAEHLER2,"9 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(ZAEHLER1,"12 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(SAUF,VarText,PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
}
break;
case 2:
{
p.displayClear(SAUF);
p.displayClear(ZAEHLER2);
p.displayClear(ZAEHLER1);
p.displayZoneText(ZAEHLER2,"3 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(ZAEHLER1,"2 Pkt",PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
p.displayZoneText(SAUF,VarText,PA_CENTER,SPEED_TIME, PAUSE_TIME,PA_SCROLL_LEFT);
}
break;
}
flag++;
if (flag == 3) flag = 0;
}
Ulli