Hallo und guten Abend zusammen,
es liegt zwar schon ne längere Zeit zurück...aber der ein oder andere erinnert sich bestimmt an die verrückte Rennbahngeschichte.... bin immer noch nicht fertig
Wollte mal versuchen auf eigenden Füßen zu laufen....hat mit meiner Ampel auch ganz gut funktioniert( Bilder gibt es mal vom Ganzen...). Aber jetzt bei dem Versuch eine 8x32 Matrix und einen NRF24 am MEGA 2560 SPI-BUS ans laufen zu bekommen verzweifel ich.
Am Nano habe ich zur Zeit 4 x 8x32Matrix Streifen und den NRF24 am laufen. Nun wollte ich das ganze an einen MEGA anschließen um auf 8 Streifen zu erweitern. Aber da bekomme ich nicht mal den NRF24 mit einer Matrix zum laufen.
Das Problem, lasse ich die Teile alleine laufen.... Alles gut, aber sobald ich die Matrix mit am SPI-Bus hänge, läuft zwar die Matrix aber der NRF24 empfängt nur noch Müll oder auch garnichts.
Daher meine Frage ist der SPI-BUS unterschiedlich? Der vom MEGA empfindlicher?
Da die Leitungen von der Matrix ca.80cm lang ist. Aber wie schon gesagt am NANO klappt es auch mit den langen Leitungen. Am Nano habe ich keine LCD...aber das kann es doch nicht sein oder...?
Bedanke mich im voraus, weil muss jetzt Bettkarte stempeln...
Dankeeeee
// Matrix auf MEGA 2560Pro
const char ver[] = {"MATRIXANZEIGE"};// 19.12.2022
const char Version[] = {"V-1.00"};
#include <Wire.h>
#include <EEPROM.h>
#include <SPI.h>
#include <printf.h>
// Empfänger
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(4, 5); // CE=4, CS=5, SCK=52, MO=51, MI=50
byte address[6] = "00101";
// Matrix-Anzeige
#include <Adafruit_GFX.h> // TH
#include <Max72xxPanel.h> // TH
Max72xxPanel matrix = Max72xxPanel(31, 4, 1); // CS 31, DIN (MO=51) , CLK(SCK=52) Beim MEGA
// Max72xxPanel matrix = Max72xxPanel(4, 4, 1); // CS 4, DIN (MO=11) , CLK(SCK=13) Beim NANO
const byte numberOfHorizontalDisplays = 4;
const byte numberOfVerticalDisplays = 1;
const byte spacer = 1;
const byte width = 5 + spacer; // The font width is 5 pixels
// LCD
#include <LiquidCrystal_I2C.h>
const uint8_t lcdRow = 16;
const uint8_t lcdCol = 2;
LiquidCrystal_I2C lcd(0x27, lcdRow, lcdCol);
// RotaryEncoder
#include <rotary.h>
Rotary r = Rotary(2, 3, 6); // Rotary(Encoder Pin 2, Encoder Pin 3, Button Pin 6)
const uint8_t bounce = 10;
// Uhr
#include <DS1307RTCB.h> // auf die TimeLibB angepasste 1307 von Paul Stoffregen
#include <TimeLibB.h> // auf deutsch umgeschriebene TimeLib von Paul Stoffregen
// Gespeicherte Werte lesen
//uint8_t Helligkeit_Segment = EEPROM.read(1); // Helligkeit für alle 7-Segment Anzeigen
//uint8_t NRF_Kanal = EEPROM.read(2); // Kanal für NRF24 Empfänger
//uint8_t ID_Steuerung = EEPROM.read(3); // ID_Steuerung für Fernsteuerung vom Converter
//uint8_t Einschalt_Display = EEPROM.read(4); // Anzeigebild Turm nach dem Einschalten
//uint8_t AnzahlSpuren = EEPROM.read(5); // Anzahl der Fahrspuren
//uint8_t NRF24_Leistung = EEPROM.read(6); // Empfangsleistung für NRF24 Sender
//uint8_t Datenherkunft = EEPROM.read(7); // NRF24 = 1 / Serial-1 = 2
//uint8_t Helligkeit_Led = EEPROM.read(9); // Helligkeit für Turm Beleuchtungs-Led's
//uint8_t lumiPole = 7; // Helligkeit für führenden Fahrer bzw. Spur bei der Rundenanzeige
enum {uhrzeit, runde, fahrer, laps}; // was angezeigt werden kann
uint8_t displayNum = uhrzeit; // was beim Start angezeigt wird
// Wer bin ich
const uint8_t Id = 4; // Jeder Empfänger bekommt eine eigene einmalige ID
uint8_t meineSpur = 4; // auf welche Spur höre ich
// Renndaten
const uint8_t charNum = 26; // max Anzahl Zeichen (derzeit Fahrername (25+1))
uint16_t RZvk; // Vorkommastellen Rundenzeit
uint16_t RZnk; // Nachkommastellen Rundenzeit
uint16_t R; // Runde
char F[charNum] = {0}; // Fahrername
void setup()
{
// LCD Einschalten
lcd.init();
lcd.backlight();
pinMode(53, OUTPUT); // verhindert den SPI-SlaveMode
printf_begin(); // für NRF-debug Ausgaben
Serial.begin(115200);
Serial.println(F("Start..."));
// Startsequenz nach dem Einschalten
lcd.setCursor(0, 0); lcd.print(ver);
lcd.setCursor(0, 1); lcd.print(F(" BLACK SERIES "));
matrix.setIntensity(1); // Helligkeit Matrix 0 und 15 0=schwach, 15=sehr hell
matrix.setRotation(0, 1); // The first display is position upside down
matrix.setRotation(1, 1); // The first display is position upside down
matrix.setRotation(2, 1); // The first display is position upside down
matrix.setRotation(3, 1); // The first display is position upside down
matrix.write();
delay(1000);
matrix.fillScreen(LOW);
matrix.setCursor(0, 0);
matrix.print("Spur1");
matrix.write();
delay(2000);
// Empfänger Einstellungen
radio.begin();
radio.enableDynamicPayloads(); // wichtig! Es werden nur Nutzdaten übertragen!
radio.setPALevel(RF24_PA_HIGH); // der Sender muss nicht hoch sein(MAX,HIGH,LOW,MIN)
radio.setChannel(77);
radio.setDataRate(RF24_250KBPS);
radio.setAutoAck(0); // NoACK - ein Sender multiple Empfänger
radio.openReadingPipe(0, address);
radio.startListening(); // Start des Empfängermodus
}
void loop()
{
leseEmpfang(); // spaltet Payload auf
zeigDisplay(displayNum); // ausgabe
}
void zeigDisplay(const uint8_t anzeige)
{
static uint16_t lastsecond = 10000;
switch (anzeige)
{
case uhrzeit:
if (lastsecond != (uint16_t) second())
{
lastsecond = (uint16_t) second();
//***** Ausgabe Uhrzeit *****
matrix.fillScreen(LOW);
matrix.setCursor(1, 0);
if ((hour()) < 10) {
matrix.print("0");
}
matrix.print(hour());
matrix.setCursor(13, 0);
matrix.print(":");
if ((minute()) < 10) {
matrix.print("0");
}
matrix.print(minute());
matrix.write();
LCD_UHR();
}
break;
case runde:
if (meineSpur != 0)
matrix.fillScreen(LOW);
matrix.setCursor(0, 0);
matrix.print("R");
if ((R) < 10) {
matrix.setCursor(25, 0);
matrix.print(R);
}
if (((R) > 9) & ((R) < 100)) {
matrix.setCursor(20, 0);
matrix.print(R);
}
if (((R) > 99) & ((R) < 1000)) {
matrix.setCursor(14, 0);
matrix.print(R);
}
if (((R) > 999) & ((R) < 10000)) {
matrix.setCursor(8, 0);
matrix.print(R);
}
matrix.write();
break;
case fahrer:
//Anzeige_Driver();
break;
case laps:
if ((RZvk) > 98) {
//over();
}
else {
matrix.fillScreen(LOW);
if (RZvk < 10) {
matrix.setCursor(6, 0);
}
else {
matrix.setCursor(0, 0);
}
matrix.print(RZvk);
matrix.drawPixel(12, 6, HIGH);
matrix.drawPixel(12, 7, HIGH);
matrix.setCursor(14, 0);
if (RZnk < 100) {
matrix.print("0");
}
if (RZnk < 10) {
matrix.print("0");
}
matrix.print(RZnk);
matrix.write();
}
break;
}
}
void leseEmpfang()
{
if (radio.available())
{
char text[32] = {0};
radio.read(&text, radio.getDynamicPayloadSize());
char *c; // Teilstring
uint8_t zahl = 0;
c = strtok(text, " "); // Lese bis erstes Leerzeichen
Serial.println(c);
if (c[0] - '0' == meineSpur)
{
switch (c[1])
{
case 'R': // Runde für die Spur
R = atoi(strtok(NULL, " "));
break;
case 'Z': // Zeit für die Spur
RZvk = atoi(strtok(NULL, " "));
RZnk = atoi(strtok(NULL, " "));
break;
case 'F': // Fahrername für die Spur
strcpy(F, strtok(NULL, " "));
strcat(F, " ");
strcat(F, strtok(NULL, " "));
break;
}
}
else // Ab hier nur zeigen Fernkonfiguration
{
switch (c[0])
{
case 'T': // T Zeit für RTC
setTime(atol(strtok(NULL, " "))); // übernimmt den Zeitstempel
RTC.set(now()); // setzt die RTC
break;
case 'i':
// zahl = atoi(strtok(NULL, " "));
// if (zahl == Id)
// {
// meineSpur = atoi(strtok(NULL, " "));// Zuweisung der Spur für dieses Gerät
// }
break;
case 'r':
zahl = atoi(strtok(NULL, " "));
if (zahl == Id)
{
//lcd.clear();
displayNum = runde; // Anzeige Runde
}
break;
case 'f':
zahl = atoi(strtok(NULL, " "));
if (zahl == Id)
{
//lcd.clear();
displayNum = fahrer; // Anzeige Fahrername
}
break;
case 'u':
zahl = atoi(strtok(NULL, " "));
if (zahl == Id)
{
//lcd.clear();
displayNum = uhrzeit; // Anzeige Uhrzeit
}
break;
case 'l':
zahl = atoi(strtok(NULL, " "));
if (zahl == Id)
{
//lcd.clear();
displayNum = laps; // Anzeige Rundenzeit
}
break;
}
}
}
}
void LCD_UHR()
{
lcd.clear();
lcd.setCursor(0, 1); lcd.print(hour());
lcd.setCursor(3, 1); lcd.print(minute());
}