Bitte um Hilfe bei MD_MAX7219 Display

Hallo liebe Community,

ich habe folgendes Problem:
Ich bastel gerade an einer Lauftextanzeige mittels Arduino Uno und einem Matrix-Dot-Display, Typ: 7219.
Nun würde ich gerne mittels eines Tasters das Display einmal ausschalten und mittels eines zweiten Tasters die Helligkeit steuern können.

Ich verwende folgende Bibliotheken:
#include <MD_Parola.h>
#include <MD_MAX72xx.h>

Sobald ich im loop() mein Display mit dem Befehl P.setIntensity(x) abdunkel, bleibt es bis zum Ende des Durchlaufs dunkel. Sobald die Schrift wieder von vorne startet, wird die Helligkeit allerdings wieder auf den ursprünglichen Wert gesetzt.
Ebenso geht das Display aus (Befehl displayShutdown(true)), allerdings bei nächstem Durchlaufen wieder an.

Kann mir hier bitte jemand weiterhelfen?

Schreib uns mal wo wir die beiden Bibliotheken finden können damit wir die gleichen wie du anschauen und nicht lange herumsuchen müssen.
Gib uns den Sketch.
Grüße Uwe

Die Bibliotheken habe ich aus der Arduino IDE (beide male die aktuellsten Versionen)

Anbei mein Code:

#include <SoftwareSerial.h>
#include <Wire.h>
#include <SPI.h>

//Uhr und Temp
#include "RTClib.h"
RTC_DS3231 rtc;
int Minutealt = 0;

//Nachricht:
String message;
String Nachricht;


//Taster
const int Taster1 = 2;          // Der Taster wurde an Pin 2 angeschlossen
const int Taster2 = 3;          // Der Taster wurde an Pin 2 angeschlossen
volatile unsigned long LetzteZeit1 = 0, WarteZeit1 = 500;
volatile unsigned long LetzteZeit2 = 0, WarteZeit2 = 500;


volatile int z = 0;

//Display
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10



MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
uint8_t scrollSpeed = 70;    // Je höher, desto langsamer
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds
// Global message buffers shared by Serial and Scrolling functions
#define  BUF_SIZE  275
char curMessage[BUF_SIZE] = { "I <3 U" };
char zwischenMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "" };
bool newMessageAvailable = true;
int Counter = 0;
int intense = 15;

void setup()
{
  Serial.begin(9600);

  //RTC
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, let's set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   
  }

  Wire.begin(4);
  Wire.onReceive(receiveEvent);
  P.begin();
  P.setIntensity(intense);
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

  //Taster und Interrupt
  pinMode(Taster1, INPUT);       // Hier wird der Taster als INPUT definiert
  digitalWrite(2, HIGH);
  pinMode(Taster2, INPUT);       // Hier wird der Taster als INPUT definiert
  digitalWrite(3, HIGH);
  pinMode(5, OUTPUT);
}

void loop()
{
  DateTime now = rtc.now();
  if (now.minute() != Minutealt) {
    Minutealt = now.minute();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.print("Temperature: ");
    Serial.print(rtc.getTemperature());
    Serial.println(" C");
  }
  if (digitalRead(Taster2) == LOW) {
    P.setIntensity(1);
  }
  
  if (digitalRead(Taster1) == LOW) {
    P.setIntensity(15);
  }


  if (P.displayAnimate()) {

    if (newMessageAvailable)
    {
      Serial.println(Counter);
      strncpy(zwischenMessage, newMessage, Counter - 2); //letzte 2 Zeichen löschen
      zwischenMessage[Counter - 2] = '\0'; //letztes Zeichen ist Ende
      strcpy(curMessage, zwischenMessage);
      newMessageAvailable = false;
    }
    P.displayReset();


  }
}


void receiveEvent()
{ Counter = 0;
  static char *cp = newMessage;
  while (1 < Wire.available())
  {
    *cp = (char)Wire.read();
    if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2)) // end of message character or full buffer
    {
      *cp = '\0'; // end the string
      // restart the index for next filling spree and flag we have a message waiting
      cp = newMessage;
      newMessageAvailable = true;
    }
    else  // move char pointer to next position
      cp++;
    Counter++;
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

Zur kurzen Erklärung:
Es wird von einem 2ten Arduino über eine serielle Verbindung ein Text gesendet, der als neue Nachricht eingelesen wird. Zudem ist später mal eine Uhrzeitanzeige angedacht, daher die RTC

Die serielle Verbindung zum 2. Arduino sollte also I2C sein?

Ich weiß nicht, ob das geht, daß der Arduino mal I2C Slave ist und dann I2C Master für die RTC.

2 mal

#include <SPI.h>

in einem Sketch geht sicher nicht.

Kompiliert Dein Sketch den fehlerfrei?

Grüße Uwe

Ja, lädt ohne Probleme.
Ich probiers mal kurz ohne RTC und melde mich gleich wieder. Danke schon einmal für die Hilfe

Habe es nochmals bissle bereinigt, trotzdem habe ich weiterhin das Problem, dass sich die Helligkeit bei wiederholtem Durchlauf wieder auf Standard setzt... :frowning: :

#include <SoftwareSerial.h>
#include <Wire.h>
//Nachricht:
String message;
String Nachricht;


//Taster
const int Taster1 = 2;          // Der Taster wurde an Pin 2 angeschlossen
const int Taster2 = 3;          // Der Taster wurde an Pin 2 angeschlossen
volatile unsigned long LetzteZeit1 = 0, WarteZeit1 = 500;
volatile unsigned long LetzteZeit2 = 0, WarteZeit2 = 500;


volatile int z = 0;


//Display
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10



MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
uint8_t scrollSpeed = 70;    // Je höher, desto langsamer
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds
// Global message buffers shared by Serial and Scrolling functions
#define  BUF_SIZE  275
char curMessage[BUF_SIZE] = { "I <3 U" };
char zwischenMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "Hello! Enter new message?" };
bool newMessageAvailable = true;
int Counter = 0;
int intense = 15;



void setup()
{
  Serial.begin(9600);

  //Wire.begin(4);
  //Wire.onReceive(receiveEvent);
  P.begin();
  P.setIntensity(intense);
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

  //Taster und Interrupt
  pinMode(Taster1, INPUT);       // Hier wird der Taster als INPUT definiert
  digitalWrite(2, HIGH);
  pinMode(Taster2, INPUT);       // Hier wird der Taster als INPUT definiert
  digitalWrite(3, HIGH);
 
}


void loop()
{
  if (digitalRead(Taster2) == LOW) {
    P.setIntensity(1);
  }

  if (digitalRead(Taster1) == LOW) {
    P.setIntensity(15);
  }

  if (P.displayAnimate()) {

    if (newMessageAvailable)
    {
      Serial.println(Counter);
      strncpy(zwischenMessage, newMessage, Counter - 2); //letzte 2 Zeichen löschen
      zwischenMessage[Counter - 2] = '\0'; //letztes Zeichen ist Ende
      strcpy(curMessage, zwischenMessage);
      newMessageAvailable = false;
    }
    P.displayReset();
  }
}

Hallo,

//Taster
const int Taster1 = 2;          // Der Taster wurde an Pin 2 angeschlossen
const int Taster2 = 3;          // Der Taster wurde an Pin 2 angeschlossen
volatile unsigned long LetzteZeit1 = 0, WarteZeit1 = 500;
volatile unsigned long LetzteZeit2 = 0, WarteZeit2 = 500;

Auch wenn es schwer fällt, kommentiere nichts was beim Code lesen eh klar ist. Zudem durch C&P falsch kommentiert. Gewöhne dir auch nicht an mehrere Variablen Definitionen in eine Zeile zu schreiben. Die Wenigsten wissen was sie dabei tun. In deinem Fall sind Wartezeit1 und Wartezeit2 NICHT volatile. Die letzten 4 werden in deinen Sketch nicht benötigt, also weg damit oder auskommentiert.

//Taster und Interrupt
pinMode(Taster1, INPUT);       // Hier wird der Taster als INPUT definiert
digitalWrite(2, HIGH);
pinMode(Taster2, INPUT);       // Hier wird der Taster als INPUT definiert
digitalWrite(3, HIGH);

Interupt gibts hier nicht > Kommentar kann ganz weg.
Und warum einmal die Pinnummer und einmal die Variable? Ist alles nicht gut für sauberen Code.

Vorschlag:

pinMode(Taster1, INPUT_PULLUP);  
pinMode(Taster2, INPUT_PULLUP);      
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

Hierfür brauchste keine defines. Nimm const int oder const byte.

Die strings brauchst du auch nicht. Weg damit.

Dein Hauptproblem wird sein:

if (P.displayAnimate()) {

    if (newMessageAvailable)
    {
      Serial.println(Counter);
      strncpy(zwischenMessage, newMessage, Counter - 2); //letzte 2 Zeichen löschen
      zwischenMessage[Counter - 2] = '\0'; //letztes Zeichen ist Ende
      strcpy(curMessage, zwischenMessage);
      newMessageAvailable = false;
    }
    P.displayReset();
  }

Klassische Selbstaussperrung. newMessageAvailable wird false und bleibt false. Einlesen tust du auch nichts. Du brauchst irgendwas mit Serial.available() zum Zeichen einlesen und du musst das Ende der Übertragung mitbekommen. Dafür benötigt es ein Protokoll. Im einfachsten Fall am Ende der Nachricht ein LF mitschicken. Darauf triggerst du und weißt alles da, jetzt kann die Nachricht verarbeitet werden.

Lesetipp: Messwert Abfrage über RS232 - #6 by Serenifly

abgeänderte entschärfte Version ohne Zeiger.

// https://forum.arduino.cc/t/messwert-abfrage-uber-rs232/631638/6

const byte READ_BUFFER_SIZE {20};              
char rxBuffer [READ_BUFFER_SIZE + 1];       // Platz für 20 Zeichen + Null-Terminator

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  // liefert true wenn das LF eingelesen wurde
  if (readLine(Serial) )
  {
    Serial.print("Eingelesen: ");
    Serial.println(rxBuffer);
  }
}

bool readLine(Stream& stream)
{
  static byte index {0};
  bool status {false};

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n')                                      // wenn LF eingelesen
    {
      rxBuffer[index] = '\0';                           // String terminieren
      index = 0;
      status = true;                                    // String fertig eingelesen
    }
    else if ( (c >= 32) && (index < READ_BUFFER_SIZE) )   // solange noch Platz im Buffer ist
    {
      rxBuffer[index++] = c;                              // Zeichen abspeichern und Index inkrementieren
    }
  }
  return status;
}

Beim Sender schickste LF mit. Wenn verstanden und funktioniert bauste deinen Sketch um.

Danke, werde es morgen nochmals versuchen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.