N
Hab das Problem behoben.
Hab einfach die Arrays in Funktionen Abgekapselt.
Danach gab es das Problem nicht mehr.
Vielen Dank für euere Hilfe.
Gruss
Hier noch der Code:
// RTC
#include "Wire.h"
#define DS1307_ADDRESS 0x68
// Define SPI Pins
#define DATAOUT 11//MOSI MasterOutputSlaveInput (connect to --> MISO of device)
#define DATAIN 12//MISO MasterInputSlaveOutput (connect to --> MOSI of device)
#define SPICLOCK 13//sck
#define SLAVESELECT 10//ss
// RGB MATRIX definitions
int NUM_BOARDS = 1;
#define NUM_ROWS 8
#define NUM_COLUMNS 8
#define NUM_PIXELS 64
#define BUFFER 4 // for 8 Matrixes = 10
// Screen Buffer
typedef struct{
char pixel[NUM_PIXELS];
}
screen;
screen screenBuffer[BUFFER]; // Array of screens that represents the entire frame of matrices (if using a multi-board system)
screen myScreen[BUFFER]; // Array of screens used for scrolling text.
// Define the "Normal" 8 bit colors
#define BLACK 0
#define RED 0xE0
#define GREEN 0x1C
#define BLUE 0x03
#define ORANGE RED|GREEN
#define MAGENTA RED|BLUE
#define TEAL BLUE|GREEN
#define WHITE (RED|GREEN|BLUE)-0x60
// 8x8 font.
const char letters[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //32/ --> ' '
0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x00, //33/ --> !
0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00, //34/ --> "
0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00, //35/ --> #
0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00, //36/ --> $
0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00, //37/ --> %
0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00, //38/ --> &
0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00, //39/ --> '
0x00,0x00,0x1C,0x22,0x41,0x00,0x00,0x00, //40/ --> (
0x00,0x00,0x41,0x22,0x1C,0x00,0x00,0x00, //41/ --> )
0x00,0x14,0x08,0x3E,0x08,0x14,0x00,0x00, //42/ --> *
0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, //43/ --> +
0x00,0x00,0x50,0x30,0x00,0x00,0x00,0x00, //44/ --> ,
0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, //45/ --> -
0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00, //46/ --> .
0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00, //47/ --> /
0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00, //48/ --> 0
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00, //49/ --> 1
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00, //50/ --> 2
0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00, //51/ --> 3
0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00, //52/ --> 4
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //53/ --> 5
0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00, //54/ --> 6
0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00, //55/ --> 7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //56/ --> 8
0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00, //57/ --> 9
0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00, //58/ --> :
0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x00, //59/ --> ;
0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00, //60/ --> <
0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00, //61/ --> =
0x00,0x00,0x41,0x22,0x14,0x08,0x00,0x00, //62/ --> >
0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00, //63/ --> ?
0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00, //64/ --> @
0x00,0x7E,0x11,0x11,0x11,0x7E,0x00,0x00, //65/ --> A
0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00, //66/ --> B
0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00, //67/ --> C
0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00, //68/ --> D
0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00, //69/ --> E
0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00, //70/ --> F
0x00,0x3E,0x41,0x49,0x49,0x3A,0x00,0x00, //71/ --> G
0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00, //72/ --> H
0x00,0x00,0x41,0x7F,0x41,0x00,0x00,0x00, //73/ --> I
0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00, //74/ --> J
0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00, //75/ --> K
0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00, //76/ --> L
0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00, //77/ --> M
0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00, //78/ --> N
0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00, //79/ --> O
0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00, //80/ --> P
0x3E,0x41,0x51,0x21,0x5E,0x00,0x00,0x00, //81/ --> Q
0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00, //82/ --> R
0x00,0x46,0x49,0x49,0x49,0x31,0x00,0x00, //83/ --> S
0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00, //84/ --> T
0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00, //85/ --> U
0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00, //86/ --> V
0x00,0x3F,0x40,0x70,0x40,0x3F,0x00,0x00, //87/ --> W
0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00, //88/ --> X
0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00, //89/ --> Y
0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00, //90/ --> Z
};
void setup()
{
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
pinMode(SLAVESELECT, OUTPUT);
delay(10);
digitalWrite(SLAVESELECT, HIGH); // disable RGB MATRIX
delay(10);
SPCR = 0b01010011;
delay(5000);
digitalWrite(SLAVESELECT, LOW);
delay(10);
spiTransfer('%');
delay(10);
digitalWrite(SLAVESELECT, HIGH);
//Configure the correct number of boards
digitalWrite(SLAVESELECT, LOW);
delay(10);
spiTransfer(NUM_BOARDS);
delay(10);
digitalWrite(SLAVESELECT, HIGH);
delay(10);
Wire.begin();
delay(5000);
}
void loop()
{
for(int i=0; i<5; i++){
displayTime();
}
displayDate();
}
void displayTime(){
String timestring = getTime();
char timearray[7] = "";
timearray[0]=' ';
timearray[6]=' ';
for(int i=1; i<6; i++){
timearray[i]=timestring[i-1];
}
scroll(timearray, MAGENTA, 50);
clear();
}
void displayDate(){
String datestring = getDate();
char datearray[16] = "";
datearray[0]=' ';
datearray[15]=' ';
for(int i=1; i<15; i++){
datearray[i]=datestring[i-1];
}
scroll(datearray, MAGENTA, 50);
clear();
}
char spiTransfer(char value)
{
SPDR = value; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait for the end of the transmission
{
};
return SPDR; // return the received byte
}
char fillPixel(int screen, int row, int column, char color)
{
if((screen > NUM_BOARDS) || (screen < 0))return 0;
if((column < 0) || column > NUM_COLUMNS)return 0;
if((row < 0) || row > NUM_ROWS)return 0;
if(color == 0x25 || color == 0x26)return 0;
screenBuffer[screen].pixel[row*8+column]=color;
}
char fillColumn(int screen, int column, char color)
{
if((screen > NUM_BOARDS) || (screen < 0))return 0;
if((column < 0) || column > NUM_COLUMNS)return 0;
if(color == 0x25 || color == 0x26)return 0;
for(int row=0; row<NUM_ROWS; row++)
{
screenBuffer[screen].pixel[column+(row*NUM_ROWS)]=color;
}
return 1;
}
char fillRow(int screen, int row, char color)
{
if((screen > NUM_BOARDS) || (screen < 0))return 0;
if((row < 0) || row > NUM_ROWS)return 0;
if(color == 0x25 || color == 0x26)return 0;
for(int column=0; column<NUM_COLUMNS; column++)
{
screenBuffer[screen].pixel[row*NUM_ROWS+column]=color;
}
return 1;
}
char fillScreen(int screen, char color)
{
if((screen < 0) || (screen > NUM_BOARDS))return 0;
if(color == 0x25 || color == 0x26)return 0;
for(int row=0; row<NUM_ROWS; row++)
{
for(int column=0; column<NUM_COLUMNS; column++)
{
screenBuffer[screen].pixel[row*NUM_ROWS+column]=color;
}
}
return 1;
}
char fillChar(int screen, char letter, char color)
{
int letter_offset=0; //The position of the letter in the letters[] array.
if((screen < 0) || (screen > NUM_BOARDS))return 0;
if(color == 0x25 || color == 0x26)return 0;
if(isalpha(letter))letter = toupper(letter); //Convert to uppercase
letter_offset = letter - 32; //Find the offset in the letters[] array
letter_offset *=8;
if(letter == ' ')letter_offset=0; //If we get a space or invalid character, display a space
if(!isalpha(letter)&&(letter>123||letter<33))letter_offset=0;
//Fill the screen with data from the letters[] array
for(int column=0; column<NUM_COLUMNS; column++)
{
for(int row=0; row<NUM_ROWS; row++)
{
//Strange looking algorithm converts rows to columns and vice versa.
if(letters[letter_offset+(7-column)] & (1<<row))screenBuffer[screen].pixel[row*8+column]=color;
else screenBuffer[screen].pixel[row*8+column]=BLACK;
}
}
return 1;
}
void display(void)
{
digitalWrite(SLAVESELECT, LOW); //Select the LED matrices
spiTransfer(0x26); //SEnd the Start of frame character
//Use the _num_boards parameter to determine how many frames to send
for(int screen=0; screen<NUM_BOARDS; screen++)
{
sendScreen(screenBuffer[screen].pixel); //Send frame data over SPI.
}
digitalWrite(SLAVESELECT, HIGH); //Unselect the LED matrices
}
void sendScreen(char * screen)
{
for(int row=0; row<NUM_ROWS; row++)
{
for(int column=0; column<NUM_COLUMNS; column++)
{
spiTransfer(screen[(row*8)+column]);
}
}
}
void scrollBuffer(int speed)
{
//This huge loop scrolls a character one column to the left each time through.
for(int scroll = 7; scroll >=0; scroll--)
{
for(int board = NUM_BOARDS+1; board >=0; board--)
{
for(int row=0; row<NUM_ROWS; row++)
{
for(int column=0; column<NUM_COLUMNS; column++)
{
myScreen[board].pixel[row*NUM_ROWS+column]=screenBuffer[(column+scroll)/8+board].pixel[(row*NUM_ROWS)+(column+scroll)%8];
}
}
}
digitalWrite(SLAVESELECT, LOW);
spiTransfer(0x26);
//We start from the second index so that a character can be scrolled all the way off the frame.
for(int i=0; i<NUM_BOARDS; i++)sendScreen(myScreen[i].pixel);
digitalWrite(SLAVESELECT, HIGH);
delay(speed);
}
}
//char
void scroll(char * message, char color, int speed)
{
int messageLength=0;
char disp[58]="";
if(color == 0x25 || color == 0x26);
else{
//Precede the message with spaces so the message starts off of the frame.
for(int i=0; i<NUM_BOARDS; i++)disp[i]=' ';
strcat(disp, message);
//Find the length of the screen (including the spaces we added).
messageLength=strlen(disp);
//Scroll each character onto and off of the frame.
for(int messageIndex=0; messageIndex<messageLength; messageIndex++)
{
for(int screen=NUM_BOARDS+1; screen>=0; screen--)
{
fillChar(NUM_BOARDS+1-screen, disp[messageIndex+screen], color);
}
scrollBuffer(speed);
}
}
}
void clear(void)
{
for(int board=0; board<NUM_BOARDS; board++)
{
fillScreen(board, BLACK);
//free(screenBuffer[board].pixel);
//memset(&screenBuffer[board].pixel, 0, sizeof (screen));
}
display();
}
//************ CLOCK FUNCTIONS *****************************************************************************************
// CONVERTERS ##########################################################################################################
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
// END: CONVERTERS #####################################################################################################
// TIME GETTERS ########################################################################################################
// GET TIME ------------------------------------------------------------------------------------------------------------
String getTime(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.receive());
int minute = bcdToDec(Wire.receive());
int hour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.receive());
int month = bcdToDec(Wire.receive());
int year = bcdToDec(Wire.receive());
String h = hour;
if(hour<10) h = "0"+h;
String m = minute;
if(minute<10) m = "0"+m;
String all = h+":"+m;
return all;
}
// END: GET TIME -------------------------------------------------------------------------------------------------------
// GET DATE ------------------------------------------------------------------------------------------------------------
String getDate(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.receive());
int minute = bcdToDec(Wire.receive());
int hour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.receive());
int month = bcdToDec(Wire.receive());
int year = bcdToDec(Wire.receive());
String date;
switch(weekDay){ // Weekdays in German
case 1:
date = "MO";
break;
case 2:
date = "DI";
break;
case 3:
date = "MI";
break;
case 4:
date = "DO";
break;
case 5:
date = "FR";
break;
case 6:
date = "SA";
break;
case 7:
date = "SO";
break;
default:
break;
}
String monthDayString = monthDay;
String monthString = month;
if(monthDay<10) monthDayString = "0"+monthDayString;
if(month<10) monthString = "0"+monthString;
date = date+", "+monthDayString+"."+monthString+".20"+year;
return date;
}
// END: GET DATE -------------------------------------------------------------------------------------------------------
// END: TIME GETTERS ###################################################################################################
// TIME SETTERS ########################################################################################################
// CHANGE HOUR (DESIGNED FOR +-1) --------------------------------------------------------------------------------------
void changeHour(int h){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.receive());
int minute = bcdToDec(Wire.receive());
int hour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.receive());
int month = bcdToDec(Wire.receive());
int year = bcdToDec(Wire.receive());
if(hour==23) hour = 0;
else hour = hour + h;
setDateTime(second, minute, hour, weekDay, monthDay, month, year);
}
// END: CHANGE HOUR ----------------------------------------------------------------------------------------------------
// CHANGE MINUTE (DESIGNED FOR +-1) ------------------------------------------------------------------------------------
void changeMinute(int m){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.receive());
int minute = bcdToDec(Wire.receive());
int hour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.receive());
int month = bcdToDec(Wire.receive());
int year = bcdToDec(Wire.receive());
if(minute==59) minute = 0;
else minute = minute + m;
setDateTime(second, minute, hour, weekDay, monthDay, month, year);
}
// END: CHANGE MINUTE --------------------------------------------------------------------------------------------------
// SET TIME ------------------------------------------------------------------------------------------------------------
void setDateTime(int second, int minute, int hour, int weekDay, int day, int month, int year){
byte s = (byte) second; //0-59
byte m = (byte) minute; //0-59
byte h = (byte) hour; //0-23
byte w = (byte) weekDay; //1-7
byte d = (byte) day; //1-31
byte m2 = (byte) month; //1-12
byte y = (byte) year; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0); //stop Oscillator
Wire.send(decToBcd(s));
Wire.send(decToBcd(m));
Wire.send(decToBcd(h));
Wire.send(decToBcd(w));
Wire.send(decToBcd(d));
Wire.send(decToBcd(m2));
Wire.send(decToBcd(y));
Wire.send(0); //start
Wire.endTransmission();
}
// END: SET TIME -------------------------------------------------------------------------------------------------------
// END: TIME SETTERS ###################################################################################################
// END: ******* CLOCK FUNCTIONS ****************************************************************************************