Hallo liebe Forumsgemeinde,
Ich als "Ober"-Neuling hätte da mal eine Frage. (d.h. hab gar keine Erfahrung)
Die LED Matrix zeigt derzeit die Uhrzeit an, die ich von einer DS3231 erhalte!
Jetzt würde ich gerne das Sie mir per Tasterdruck, für ca. 5-10s, das Datum anzeigt.
Ich komme da einfach nicht weiter.
Ich weiss einfach nicht wie es anstellen soll!
(Hatte kurze Unterstützung, die ist aber selten zu erreichem)
Arduino UNO Klon + 4x 8x8 LED Matrix + DS 3231 + einfachen Taster
// Use the MD_MAX72XX library to scroll text on the display
//
// Demonstrates the use of the callback function to control what
// is scrolled on the display text.
//
// User can enter text on the serial monitor and this will display as a
// scrolling message on the display.
// Speed for the display is controlled by a pot on SPEED_IN analog in.
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock_rtc;
bool h12Flag;
bool pmFlag;
bool century = false;
const int buttonPin = 2; // GND -> Taster -> Pin2(Digital)
int buttonState = 0;
#define PRINT_CALLBACK 0
#define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); }
// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 13 // or SCK
#define DATA_PIN 11 // or MOSI
#define CS_PIN 10 // or SS
// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary pins
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
#define CHAR_SPACING 1 // pixels between characters
// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE 75
char curMessage[BUF_SIZE];
bool newMessageAvailable = true;
void readSerial(void)
{
static uint8_t putIndex = 0;
while (Serial.available())
{
curMessage[putIndex] = (char)Serial.read();
if ((curMessage[putIndex] == '\n') || (putIndex >= BUF_SIZE-3)) // end of message character or full buffer
{
// put in a message separator and end the string
curMessage[putIndex] = '\0';
// restart the index for next filling spree and flag we have a message waiting
putIndex = 0;
newMessageAvailable = true;
}
else
// Just save the next char in next location
curMessage[putIndex++];
}
}
void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)
// Print the text string to the LED matrix modules specified.
// Message area is padded with blank columns after printing.
{
uint8_t state = 0;
uint8_t curLen;
uint16_t showLen;
uint8_t cBuf[8];
int16_t col = ((modEnd + 1) * COL_SIZE) - 1;
mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);
do // finite state machine to print the characters in the space available
{
switch(state)
{
case 0: // Load the next character from the font table
// if we reached end of message, reset the message pointer
if (*pMsg == '\0')
{
showLen = col - (modEnd * COL_SIZE); // padding characters
state = 2;
break;
}
// retrieve the next character form the font file
showLen = mx.getChar(*pMsg++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);
curLen = 0;
state++;
// !! deliberately fall through to next state to start displaying
case 1: // display the next part of the character
mx.setColumn(col--, cBuf[curLen++]);
// done with font character, now display the space between chars
if (curLen == showLen)
{
showLen = CHAR_SPACING;
state = 2;
}
break;
case 2: // initialize state for displaying empty columns
curLen = 0;
state++;
// fall through
case 3: // display inter-character spacing or end of message padding (blank columns)
mx.setColumn(col--, 0);
curLen++;
if (curLen == showLen)
state = 0;
break;
default:
col = -1; // this definitely ends the do loop
}
} while (col >= (modStart * COL_SIZE));
mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}
void intensity() {
mx.control(MD_MAX72XX::INTENSITY, 2);
}
//Uhrzeit-Anzeige
void setmessage_clock()
{
byte hour;
hour = clock_rtc.getHour(h12Flag, pmFlag);
curMessage[0] = 32;
curMessage[1] = (hour/10)+48;
curMessage[2] = (hour%10)+48;
curMessage[3] = 58;
byte minute;
minute = clock_rtc.getMinute();
curMessage[4] = (minute/10)+48;
curMessage[5] = (minute%10)+48;
//curMessage[5] = 58;
/*byte second;
second = clock_rtc.getSecond();
//curMessage[3] = (second/10);
curMessage[3] = (second%10)+58;
//curMessage[8] = 95;
*/
}
// Datum-Anzeige
void setmessage_date()
{
byte day;
day = clock_rtc.getDate();
curMessage[0] = (day/10)+48;
curMessage[1] = (day%10)+48;
byte month;
month = clock_rtc.getMonth(century);
curMessage[2] = 58;
curMessage[3] = (month/10)+48;
curMessage[4] = (month%10)+48;
byte year;
year = clock_rtc.getYear();
curMessage[5] = 58;
curMessage[6] = (year/10)+48;
curMessage[7] = (year%10)+48;
}
void setup()
{
mx.begin();
strcpy(curMessage, " ");
Serial.begin(57600);
Serial.print("\n[MD_MAX72XX Message Display]\nType a message for the scrolling display\nEnd message line with a newline");
Wire.begin();
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
readSerial();
printText(0, MAX_DEVICES-1, curMessage);
intensity();
setmessage_clock();
//setmessage_date();
buttonState = digitalRead(buttonPin);
if (buttonState == LOW)
{
Serial.print(" ");
Serial.print(clock_rtc.getDate(), DEC);
Serial.print(".");
Serial.print(clock_rtc.getMonth(century), DEC);
Serial.print(".");
Serial.print(clock_rtc.getYear(), DEC);
Serial.print(" ");
Serial.print(clock_rtc.getTemperature(), 2);
mx.control(MD_MAX72XX::INTENSITY, 9);
delay (5000);
}
}
Ich hoffe mir kann da mal einer helfen...
Und ich bitte drum alles zu bemängeln was nicht wirklich sinnvoll ist, ich muss es ja wissen,
um es besser machen zu können.
MfG Hirschi