Hallo allemaal.
Eerste post van mij op dit forum.
Laatste post in dit topic is alweer een tijdje geleden, maar ik hoop dat het onderwerp op de achtergrond nog leeft.

Ik bestelde een paar dagen geleden ook een FDS-132 matrixboard bij Baco, maar kreeg weer een andere variant geleverd dan jullie hierboven. Op mijn bord staat FDS-32 en ziet er ook weer anders uit mbt aanwezige componenten dan de boards beschreven in dit topic.

Het vervelende is dat het bijgeleverde schema niet van het geleverde board is, maar van de FDS-132...

Op mijn board zit geen CPLD of iets wat daar voor door moet gaan.

Globaal zie ik dezelfde opbouw van shiftregisters and buffers om de leds aan te sturen.
Daarnaast 7 Darlingtons type BDX54B.
Deze darlingtons worden aangestuurd door een ULN2003 die op zijn beurt weer wordt aangestuurd door een 74HC238.
Naast deze ic's zitten er nog 3 ic op de print:
74HC164 (8-bit serial-in, parallel-out shift register)
74HC191 (Presettable synchronous 4-bit binary up/down counter)
74HC00 (Quad 2-input NAND gate)
Uit de exacte werking van de combinatie van 3 IC's word ik niet helemaal wijs.
Vooral omdat de print maar twee connectoren heeft: één voor de voeding en één 5 polige die waarschijnlijk voor de signalen Dr, Strobe, Clk, ResRed en Dor is.
Ik zie niet hoe ik de rows aan kan sturen.
Ik denk dat aansturing van de rows op een of andere manier vanuit een van de signalen (middels de eerder genoemde drie ic's) op de 5 polige connector wordt herleid, maar zonder schema en met niet te traceren printspoortjes kom ik hier niet uit.
Heeft iemand hier misschien ook al eens zo'n FDS-32 print werkend gekregen? Of heeft iemand misschien het schema?
Alle info is welkom.

Op 2 augustus 2013 17:34:21 schreef Mathijs_h:
Laatste post in dit topic is alweer een tijdje geleden, maar ik hoop dat het onderwerp op de achtergrond nog leeft.

Nee helemaal vergeten, tot hier weer in gepost werd.

Ik heb besloten eindelijk eens wat software te schrijven voor de PC. in plaats van een enkele regel een bericht kan worden samengesteld dat bestaat uit een of meerdere regels tekst.

In een filmpje:
http://www.youtube.com/watch?v=f1-hFLuhxxc

De nieuwe software:
http://img6.imageshack.us/img6/6898/2683.png

Meer teksten in een screen:
http://img825.imageshack.us/img825/894/snds.jpg

Ik zit alleen nog met het probleem van de voeding. Er word nu een atx voeding gebruikt die op 6,5V gemod is. fan word gevoed door een 12volt voeding omdat 6,5 niet genoeg is.
Dit kan natuurlijk niet zo blijven want die voeding begeeft het ooit. De voeding is gerate op 12A op 12v ik gebruik zeker meer dan die 12a.

Humzz, je kunt eventueel opzoek gaan naar een server voeding en deze gebruiken.
Heb hier zo'n voeding van HP liggen, deze aangepast zodat deze nu ook standalone kan draaien. Deze voeding levert op 12v max 62,5A, zou ideaal zijn voor dit project (zijn klein en licht).

Heb hier nog voedingen liggen van een server Sun Fire 3800, weet niet wat die leveren. Zijn 56V en 20A.

[Bericht gewijzigd door Damic op (12%)]

Nice, en nog een stukje bruikbare software erbij ook!

Wordt het geheel door de PIC gerenderd, of moet de PC altijd aangesloten blijven tijdens de weergave?

[Bericht gewijzigd door Jochem op (50%)]

Nee de pc is nodig de PIC's zijn enkel frame buffer, ik geloof niet dat het haalbaar is om het allemaal in de PIC's te doen.

Het liefst zou ik een kant en klare voeding gebruiken, maar ik geloof dat dat niet haalbaar is. Hoogstens twee 3,3v voedingen in serie maar 3,3v op 10-20A is ook al behoorlijk aan de prijs.

Een ander idee is een 12v voeding en dan een serie switchers naar 6,5V en dan schermen per twee voeden ofzo.

Ik denk dat ik uiteindelijk toch uitkomt bij een server of atx voeding modden.(is die te koop Diamon?)

EDIT:
http://www.meanwell.nl/products/Meanwell-S-150-75---PSU-enclosed-75V-2…

betaalbaar en instelbaar van 6 tot 8 volt.

[Bericht gewijzigd door JesperR op (13%)]

Er stond in Friedrichshafen iemnad met 12V(?) voedingen voor, ik dacht 40 en 65A, die zoiets tussen 10 en 15 Euro waren.
Ik kom eind volgende maand in de grote beurs in La Louvière. Als je wilt wil ik er wel naar kijken of hij er weer staat.

Bedankt voor het aanbod, als het nodig is stuur ik je voor die tijd een berichtje :)

Als je de spanningsregelaar bypasst , dan kan heb je ook nog de keuze om 5v te voeren aan het geheel.

Baco zelf: 5v/20A + 12v+32A voor €25
http://www.baco-army-goods.nl/lichtnet-voedingen-adapters/voeding-12-1…
Maxwell heeft soms ook iets:
http://sharon.esrac.ele.tue.nl/verkopen/
Of Mean Well van ebay (ik zou geen no name van ebay nemen)
http://www.ebay.nl/itm/Mean-Well-MW-5V-20A-100W-AC-DC-Switching-Power-…

Hallo JesperR,

Ik was vandaag samen met maartenbakker mij Max So, die de uitverkoop van de oude Beeldbuizenfabriek in Heerlen regelt. We vonden daar twee mooie Philips 12V 26A lineaire voedingen staan. Is dat iets voor jou? Ik denk niet dat hij er veel voor zal vragen ( iets in de orde van 10 à 15 Euro, denk ik). Ze zijn uit de tijd dat Philips meetinstrumeneten nog stevig en degelijk gemaakt werden. Laat even weten, misschien kan ik dan iets regelen.
Maarten bakker heeft foto's, maar had niet het snoertje dat nodig is om ze naar mijn PC te uploaden. Zodra hij ze heeft overgestuurd zal ik ze hier publiceren.

Ik denk dat je met 5volt teveel inlevert op helderheid, ik zie namelijk de verschillende tussen de LED's onderling. hoe dichter de spanning bij die 7volt hoe minder t opvalt.

@Tidak,
Is het met t doel die aan te passen naar de gewenste spanning, als dat haalbaar is... ik kan er zo geen inschatting voor maken maar voor 2x15€ wil ik daar wel een gok op wagen.

Om deze post niet heel kaal te laten zijn even ene foto van het werk van vandaag.
Bakje omheen gebouwd, in het midden zitten scharnieren waardoor je het kunt opvouwen tot een paket van n meter. kwa formaat is het nu handelbaar, maar tis nu wel n heel gewicht geworden :p

Zeker met het ophangen iets om rekening mee te houden...
http://img20.imageshack.us/img20/151/6wpl.jpg

Edit mijn kamer is te klein om t fatsoenlijk te fotograferen xD

Ik heb ook twee FSD132 Boards gekocht, leek me leuk om mee te experimenteren. Al veel info gevonden op dit forum.
Mischien kan ik later nog iets bijdragen.
Als eerste heb ik op een board de modificatie gedaan, dikke chip eraf, aansluitingen maken voor Microcontroller. Ik heb deze methode gebruikt om de chip eraf te halen : dunste stift in de soldeerbout en dan een pin verwarmen en die pin met een scherp pincet naar buiten vouwen en uiteindelijk helemaal omhoog buigen. Dit gaat niet snel maar wel heel netjes, geen schade aan andere componenten.
Zo is het geworden :
http://i10.photobucket.com/albums/a134/Rlnd/fds132/board4_zpsbbdf39c8.jpg
Dat was het even voor nu, volgend stap is hem aan een Arduino te knopen. (Ik kreeg trouwens een rood en een groen bord geleverd, wel leuk, van elke kleur eentje)
Edit : beide borden blijken rood te zijn.

Op de site van Baco staan nu weer nieuwe matrix borden die in een kast zitten, ze staan op de home page als nieuw binnengekomen, kan ze nog niet in de webshop vinden.

Hallo Knutsel vrienden,

Ik ben een Nieuwe gebruiker op dit Topic maar heb met belangstelling al diverse items gelezen.
Geïnspireerd door het enorme enthousiasme heb ik ook bij Baco 3 FDS 132 matrixborden besteld.

Inmiddels bij Conrad enkele meters glasfiber besteld en enkele Toslink zenders.

Wat code ingetikt en ik zie inmiddels allemaal strepen op mijn displays dansen, echter niet gestructureerd
en ik kan ze ook niet onder controle krijgen.

Wat wil ik gaan Knutselen,

Ten eerste voor mijn twee kleinzoons van rond de 4 jaar die net naar de basisschool gaan.
Hiermede kunnen we woordjes gaan maken van de geleerde letters, een leuke bezigheid.

En ten tweede een XYZ display voor Opa zijn Fraismachientje heb ik minder problemen om
de schuifmaat uit te lezen.

Wie heeft inmiddels een FDS132 onder controle via de Toslink.

En wie zou deze kennis met mij willen delen.

Met vriendelijke Groet

Opa-Knutsel.

Hey knutsel opa :) volgens mij heeft er nog niemand de code gekraakt hoe je het moet aansturen via toslink, maar ik kan me vergissen (misschien over gelezen).

Jawel, @Blurp heeft de code voor de FDS185 gekraakt, voor de FDS132 zal je wat kleine aanpassingen moeten doen vermoed ik.
http://www.circuitsonline.net/forum/view/message/1499764#1499764
Ik wacht nog steeds met smart op het artikeltje dat Blurp beloofd heeft :P

[Bericht gewijzigd door Zonnepaneeltje op (14%)]

Op 29 oktober 2013 17:54:17 schreef Zonnepaneeltje:
Ik wacht nog steeds met smart op het artikeltje dat Blurp beloofd heeft :P

Het staat nog op mijn todo lijst.. Maar heel snel gaat het niet, dat is waar.
Opzich staat alles wel een keer in dit topic genoemd, en als je een concrete vraag steld in die topic dan beantwoord ik hem wel effe tussendoor.

Ik moet de hele software zelf schrijven in asm omdat ik geen bal snap van C.
Het is me ook niet gelukt om te achterhalen uit je uitleg en je code hoe je signaal er exact uitziet.
Ik zou dus erg geholpen zijn als je een volledige stap-voor-stap beschrijving kan maken van hoe het totale signaal is opgebouwd. Misschien in pseudo-code?

Wat een Reacties beste vrienden, ja natuurlijk heb ik alle artikelen gelezen van Blurp en Zonnepaneeltje,
daarnaast ook gekeken op Arduino forum waar ook mensen bezig zijn met de FDS132.

Allen die demonteren gelijk de cpld en sluiten hem volledig op een controller aan.
Ik vind die toslink geweldig daar die ook tegen HF kan en grotere machnetische storingen rond mijn
fraismachientje.

Ik heb een atm88 gebruikt op een knutselbord van elektuur en de code van Blurp erin gezet en
geprobeerd te begrijpen wat hij de software probeerde te laten doen.

Ik zat dus ook met smart te wachten op zijn goed gedocumenteerd artikeltje ha,hi.
Maar weet dat dit een heel karwij is omdat goed op te zetten.

Afijn er gebeurd iets wat goed is want als ik de toslink eruit haal blijft het bord uit.
Ik zie ook pulsen op de ingang van het bord.

Maar ik kan niet ontdekken waar hij bijvoorbeeld van rij 1 matrixen naar rij 2 matrixen overschakelt.
Ik kan ook niet ontdekken waar de lengte van een rij leds (bits) bepaald wordt.

Dus ben ik gewoon gaan sleutelen in de software hier en daar waarden gaan veranderen,
géén verandering in het beeld terug gezet naar de originele waarden.

Mijn kennis is te laag om een progje te schrijven om bijvoorbeeld een loop te maken dat de 7 rijen van onder naar boven lopen, en dan van eerste rij matrixen naar de tweede en de derde.

Dan weet ik dat alles werkt en kan ik verder gaan knutselen.

Zo, ik heb weer even tijd gehad om te knutselen.

Nu kan het ding video afspelen met 4 bits grijswaarde. Wat fancy software op de pc zet met behulp van VLC een video om in het goede formaat en stuurt dat door. Op dit moment 1/10 panelen.

http://www.youtube.com/watch?v=tnwPlCfOMXs

Ik moet nog even wat beter kijken naar het data inschieten, op dit moment glitcht hij af en toe waardoor er 1 frame scheef op komt te staan.

Woeha! Zeker ergens motivatie gevonden :)

Nu nog voor de hele lengte en we hebben een attractie!

Doet me denken aan van die mooie flipperkast animaties
http://vpforums.org/imghost/72/7aebf8aa67eea8157cc0e9002826e4f8.gif

Eigenlijk was er motivatie voor je mail, het zat al langer in de planning. Maarja dat motiveert ook wel hoor :-)

Is wel een goed idee om in mijn software een optie voor gifjes te maken he... Misschien dat tegen die tijd iemand een mooie animatie in elkaar moet steken, zelf ben ik daar niet zo heel bedreven in.

Na het lezen van veel info van jullie over de FDS-132 matrixborden op Circuits Online en het Nedrlands Arduino Forum heb ik ook 3 van deze borden bij Baco besteld.
1 was er kapot: schuifregister chip vanaf gebroken. Baco heeft me zonder kosten een nieuwe gestuurd (terwijl ik, voordat ik er achter kwam dat de oude kapot was, de CPLD er al vanaf had gebrand...). Dat is echt service!

Ik heb veel van jullie programma's en libraries gedownload en nog meer geprobeerd om er achter te komen hoe het bord werkt.
Uiteindelijk door inspiratie van o.a. blurp, zerobase, Rudi en Rolo (en vele anderen) een toepassing gemaakt voor mijn zoon: een Klok met diverse acties.
Gebaseerd op de originele lichtkrant van Rolo, uitbreiding met RTC en wat leuke schermacties als random text, curtain close (scherm zwart maken als gordijn sluiten) en een space invader die je scherm leeg komt eten.
Waarschijnlijk niet de beste code, maar het functioneert en wellicht kan het iemand helpen ook wat leuke dingen te doen met het LED board.

Verdere uitbreidingen die ik nog wil doen: proportional font(s) ( als in lib van Bart De Waal), ombouw maken zodat klok kan hangen, koppelen UNO met PC via RS323 om data te laten zien, scrollende tekst op 1 Row.

Een foto van UNO met RTC aangesloten
http://www.uploadarchief.net/files/download/uno_rtc2.jpg

en een filmpje van het scherm en de acties
http://www.youtube.com/watch?v=czUkzuXeas8

Hierbij de code:

// Timer 1 Info :  http://playground.arduino.cc/code/timer1
// Using PROGMEM : http://arduino.cc/en/Reference/PROGMEM


// The matrix board is controlled by timer0 overflow interrupt. This gives a steady image and the display can be handled like a static type.
// The main code does not have to control the board, just set or clear bits in the data array to put some led's on or off.
// Logically it's organized in colums, 270 in total. This sofware defines column 0 as the upper left column and 271 is the right bottom column.
// This makes it more easy to arrange the text on the board. There is no checking if the text fits on the display.
//
// Column layout :    Line 0 : 0 to 89
//                    Line 1 : 90 to 179     
//                    Line 2 : 180 to 271
//
//
//
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <avr/pgmspace.h>             // Include pgmspace so data tables can be stored in program memory, see PROGMEM info
#include <SPI.h>                      // Include SPI comunications, used for high speed clocking to display shiftregisters
#include "TimerOne.h"                 // Include Timer1 library, used for timer overflow interrupt                                    
                                                        
const int strobePin = 10;             // Define I/O pins connected to the display board                 
const int clockPin = 13;                               
const int dataPin = 11;                                
const int resredPin = 9;                               
const int row_a = 5;                                      
const int row_b = 6;                                    
const int row_c = 7;                                     
const int rtcPlusPin = 17;            // +5V RTC module.  
const int rtcMinPin = 16;             // gnd RTC module.  
const int ClockPin = 2;
const int ClockPinMin = 1;

String tijd;
int blinkToggle=1;
int blinks=0;
String topText = "De tijd is";
int willekMinuut = random(0,59);     // generate random number between 0 en 59 
int willekMinuut2 = random(0,59);    // generate random number between 0 en 59  

byte Space1[7]; 


int RowCount = 0;             // Counter for the current row, do not change this value in the main code, it's handeld in the interrupt routine  
int teller=0;
unsigned long tijdNu=millis();

#include "font75.h";         // Standard 5x7 font ASCII Table

byte ColumnBytes[8][34];     // This is the data array that is used as buffer. The display data is in this buffer and the timeroverflow routine scans this
                             // buffer and shows it on the display. So read and write to this buffer to change display data.
                             // No strings are stored here, its the raw bit data that has to be shifted into the display.
                         
byte ColumnBytesBuffer[8][34];  // Backup for ColumnBytes[8][34]

// =========================================================================================
// Setup routine, mandatory.
// =========================================================================================

 void setup() {   
  pinMode (strobePin, OUTPUT);                              // Define IO          
  pinMode (clockPin, OUTPUT);  
  pinMode (dataPin, OUTPUT);  
  pinMode (row_c, OUTPUT);  
  pinMode (row_b, OUTPUT);  
  pinMode (row_a, OUTPUT);  
  pinMode (resredPin, OUTPUT);  
  pinMode (rtcMinPin, OUTPUT);  
  pinMode (rtcPlusPin, OUTPUT);  
  digitalWrite(rtcMinPin, LOW);                       // 0V (gnd) voor RTC module.  
  digitalWrite(rtcPlusPin, HIGH);                     // +5V voor RTC module.  
  digitalWrite (resredPin, LOW);                       
  digitalWrite (strobePin, LOW);                        
  //Serial.begin(9600);                               // Include serial routine, used for debugging and testing
  SPI.begin();                                        // Start SPI comunications
  SPI.setBitOrder(LSBFIRST);                          // Initialize SPI comunications
  Timer1.initialize(2000);                            // initialize timer1, overflow timer1 handles the display driver, period (in microseconds)
  Timer1.attachInterrupt(DisplayControl);             // attaches timer1 overflow interrupt routine
  randomSeed(analogRead(0));                          // voedt de randomgenerator aan de hand van waarde niet aangesloten analoge poort.  

   Space1[0]=B00011000;                               // create sprite Space Invaders
   Space1[1]=B00111100; 
   Space1[2]=B01111110; 
   Space1[3]=B11011011; 
   Space1[4]=B01111110; 
   Space1[5]=B11000011; 
   Space1[6]=B01100110;

 
// Start code here
  ClearDisplay();
  PlaceText(topText,17); 

 }  

// =========================================================================================
// loop routine, mandatory
// Take notice when using time crititical code the interrupt is running to control 
// the display.
// =========================================================================================

void loop()  
{  
   tmElements_t tm;  //activate RTC lib
   String uren;
   String minuten;
   String seconden;
   
   if (RTC.read(tm)) {                                                                     //read RTC
     if (tm.Hour<=9){uren="0"+String(tm.Hour);}else{uren=String(tm.Hour);}                 //leading zero's
     if (tm.Minute<=9){minuten="0"+String(tm.Minute);}else{minuten=String(tm.Minute);}     //if 
     if (tm.Second<=9){seconden="0"+String(tm.Second);}else{seconden=String(tm.Second);}   //UU,MM,SS < 10
 
     tijd = uren+":"+minuten+":"+seconden;
     PlaceText(tijd,110);
   }

     // put date in Row 3
     String maand[13] = {"leeg", "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"};
     String datum = String(tm.Day)+ " "+ maand[tm.Month]+ " "+ String(tmYearToCalendar(tm.Year)); 
     PlaceText (datum, 192);
 
   if (tm.Second == 10) randomText();                   // just for fun: show screen actions every minute
   if (tm.Second == 15) Curtain();                      // delete these 3 lines and use following functions
   if (tm.Second == 25) PlaceSprite();                  // to show them at random times

/*
   if (tm.Minute == willekMinuut && tm.Second < 1){      // put Random text in Row1
     randomText();   
     int willekMinuut = random(0,59);                    // generate randow number between 0 en 59.  
   }
 
   if (tm.Minute == willekMinuut2 && tm.Second < 1){    // Show sprite
     PlaceSprite();
     willekMinuut2 = random(0,59);                       // generate randow number between 0 en 59. 
   }

   if (tm.Minute == willekMinuut2 + 14 && tm.Second < 1){ // Clear like curtain
     Curtain();
   }
*/
}



// =========================================================================================
// Timer1 overflow intterupt routine, 
// Does the Display shifting and muliplexing
// =========================================================================================

 void DisplayControl()  
 {  
     digitalWrite(strobePin, LOW);                        // StrobePin LOW, so led's do not change during clocking
     digitalWrite (resredPin, LOW);                       // Display off to prevent ghosting  
 
       for (int q = 0; q<34; q++) {                       // Shift the bytes in for the current Row
       SPI.transfer(ColumnBytes[RowCount][q]);}
    
     digitalWrite (row_a, RowCount & 1);                  // Switch the current column on, will be on until next interrupt
     digitalWrite (row_b, RowCount & 2);                
     digitalWrite (row_c, RowCount & 4);            
     
     digitalWrite(strobePin, HIGH);                       // Strobe the shiftregisters so data is presented to the LED's 
     digitalWrite (resredPin, HIGH);                      // Display back on 

     RowCount++;                                          // Increment Row 
     if (RowCount == 7) RowCount = 0 ;                    // Row is 0 to 6
 }  

// =========================================================================================
// Place text on display, uses the standard 5x7 font
// Call this routine with the text to display and the starting column to place the text
// Example : PlaceText("FDS132",27); Places the text "FDS132" starting on column 27
// =========================================================================================

void PlaceText(String text, int ColPos) {
    byte displayByte;  
    char CurChar;
    int bitpos;
    int bytepos;
    int pixelpos;
    int charCount = text.length();
    int store = ColPos;

   for (int i = 0; i < charCount; i++) {                                     // Loop for all the characters in the string
    CurChar = text.charAt(i);                                                // Read ascii value of current character
    CurChar = CurChar - 32;                                                  // Minus 32 to get the right pointer to the ascii table, the first 32 ascii code are not in the table    
     
     for (int y = 0; y<7; y++) {                                             // y loop is used to handle the 7 rows
       for (int x = 0; x<5; x++) {                                           // x loop is the pointer to the indiviual bits in the byte from the table 
         displayByte = (pgm_read_word_near(Font75 + (CurChar*7)+y));         // Read byte from table 
         pixelpos = abs(ColPos - 271);                                       // Calculate start position to place the data on display
         bytepos = ((pixelpos)/8);                                           
         bitpos = (pixelpos) - (bytepos*8);
         boolean bitStatus = bitRead(displayByte, x);                        // Probe the bits   
         if(bitStatus == 0) bitClear(ColumnBytes[y][bytepos], bitpos);       // And set or clear the corrosponding bits in de display buffer   
         if(bitStatus == 1) bitSet(ColumnBytes[y][bytepos], bitpos);       
         ColPos++;                                                           
      }
       ColPos = store;                                                       // Reset the column pointer so the next byte is shown on the same position 
     }
    ColPos = ColPos + 6;                                                     // 6 is used here to give one column spacing between characters (one character is 5 bits wide)
    store = ColPos;                                                          // For more space between the characters increase this number 
 }
}      

// =========================================================================================
// Make a sprite clear the screen from Row3 to Row2
// =========================================================================================
void PlaceSprite() {
    byte displayByte;  
    char CurChar;
    int bitpos;
    int bytepos;
    int pixelpos;
    int ColPos = 269;
    int store = ColPos;
    int Sbytepos;
    int Sbitpos;

    for (int z = 0; z < 189; z++){      
     for (int y = 0; y < 7; y++) {                                           // y loop is used to handle the 7 rows
      for (int x = 0; x < 8; x++) {                                          // x loop is the pointer to the indiviual bits in the byte from the table 
         displayByte = Space1[y];                                            // Read byte from table 
         pixelpos = abs(ColPos + z - 271);                                   // Calculate start position to place the data on display
         if (pixelpos > 180) pixelpos = 180;                                 // only move on the bottom 2 bars
         bytepos = ((pixelpos)/8);                                           
         bitpos = (pixelpos) - (bytepos*8);
         boolean bitStatus = bitRead(displayByte, x);                        // Probe the bits   
         if(bitStatus == 0) bitClear(ColumnBytes[y][bytepos], bitpos);       // And set or clear the corrosponding bits in de display buffer   
         if(bitStatus == 1) bitSet(ColumnBytes[y][bytepos], bitpos);
         if(x < 1){ 
            Sbytepos = bytepos;
            Sbitpos = bitpos;
         }
         ColPos++;                                                           
      }
       ColPos = store;                                                       // Reset the column pointer so the next byte is shown on the same position 
     }
      delay(50);
      for (int d = 0; d < 7; d++){                                           // clear trailing set bits
        bitClear(ColumnBytes[d][Sbytepos],Sbitpos);
      }
  } 
 delay(500);
}      


// =========================================================================================
// Clears the screen like curtain
// =========================================================================================
void Curtain() {

  for (int i = 0; i < 35; i++){                //use byte ColumnBytesBuffer[8][34] as backup
      for (int j = 0; j < 7; j++){ 
        ColumnBytesBuffer[j][i] = ColumnBytes[j][i];
      }
    }  
  
   for (int k = 0; k < 6; k++){
     for (int l = 0; l < 8; l++){
      for (int m = 0; m < 7; m++){
       bitClear(ColumnBytes[m][k],l);            // clear right to left Row1
       bitClear(ColumnBytes[m][11-k],7-l);       // clear left to right Row1
       bitClear(ColumnBytes[m][11+k],l);         // clear right to left Row2
       bitClear(ColumnBytes[m][22-k],7-l);       // clear left to right Row2
       bitClear(ColumnBytes[m][22+k],l);         // clear right to left Row3
       bitClear(ColumnBytes[m][33-k],7-l);       // clear left to right Row3
       delay(20);
      }
     }
    delay (50);
   } 
   delay(500);
   for (int i = 0; i < 35; i++){                 // put buffer back
     for (int j = 0; j < 7; j++){ 
       ColumnBytes[j][i] = ColumnBytesBuffer[j][i];
     }
   }  
}


// =========================================================================================
// Put Random Text in centre of top row
// =========================================================================================
void randomText(){
  ClearDisplay();

  String topText[5] = {"Goeiedag!", "Hallo Alex", "Het is nu:", "Is het al tijd?", "De tijd is:"}; 
  int wilTop = random(0,4);
  
  int offsTop = (90 - topText[wilTop].length() * 6)/2;  // calculate offset to centre the text
  PlaceText (topText[wilTop], offsTop);
}


// =========================================================================================
// Clear display
// All bytes in buffer are set to zero
// =========================================================================================
void ClearDisplay() {
    for (int y = 0; y<8; y++) {     
       for (int x = 0; x<34; x++) {     
         ColumnBytes[y][x] = 0;
       }
    }     
}  


// =========================================================================================
// Clear Row1 (topRow)
// All bytes in topRow are set to zero (almost)
// =========================================================================================
void ClearRow1() {
    for (int y = 0; y<8; y++) {     
       for (int x = 22; x<34; x++) {     
         ColumnBytes[y][x] = 0;
       }
    }     
}  

en de font-code van Rolo

// ASCII Table
PROGMEM  prog_uchar Font75[]  = {
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,     //  
0x04 ,0x04 ,0x04 ,0x04 ,0x00 ,0x00 ,0x04 ,     // !
0x0A ,0x0A ,0x0A ,0x00 ,0x00 ,0x00 ,0x00 ,     // "
0x0A ,0x0A ,0x1F ,0x0A ,0x1F ,0x0A ,0x0A ,     // #
0x04 ,0x1E ,0x05 ,0x0E ,0x14 ,0x0F ,0x04 ,     // $
0x03 ,0x13 ,0x08 ,0x04 ,0x02 ,0x19 ,0x18 ,     // %
0x06 ,0x09 ,0x05 ,0x02 ,0x15 ,0x09 ,0x16 ,     // &
0x06 ,0x04 ,0x02 ,0x00 ,0x00 ,0x00 ,0x00 ,     // '
0x08 ,0x04 ,0x02 ,0x02 ,0x02 ,0x04 ,0x08 ,     // (
0x02 ,0x04 ,0x08 ,0x08 ,0x08 ,0x04 ,0x02 ,     // )
0x00 ,0x04 ,0x15 ,0x0E ,0x15 ,0x04 ,0x00 ,     // *
0x00 ,0x04 ,0x04 ,0x1F ,0x04 ,0x04 ,0x00 ,     // +
0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x04 ,0x02 ,     // Comma
0x00 ,0x00 ,0x00 ,0x1F ,0x00 ,0x00 ,0x00 ,     // -
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x06 ,     // .
0x00 ,0x10 ,0x08 ,0x04 ,0x02 ,0x01 ,0x00 ,     // Slash
0x0E ,0x11 ,0x19 ,0x15 ,0x13 ,0x11 ,0x0E ,     // 0
0x04 ,0x06 ,0x04 ,0x04 ,0x04 ,0x04 ,0x0E ,     // 1
0x0E ,0x11 ,0x10 ,0x08 ,0x04 ,0x02 ,0x1F ,     // 2
0x1F ,0x08 ,0x04 ,0x08 ,0x10 ,0x11 ,0x0E ,     // 3
0x08 ,0x0C ,0x0A ,0x09 ,0x1F ,0x08 ,0x08 ,     // 4
0x1F ,0x01 ,0x0F ,0x10 ,0x10 ,0x11 ,0x0E ,     // 5
0x0C ,0x02 ,0x01 ,0x0F ,0x11 ,0x11 ,0x0E ,     // 6
0x1F ,0x10 ,0x08 ,0x04 ,0x02 ,0x02 ,0x02 ,     // 7
0x0E ,0x11 ,0x11 ,0x0E ,0x11 ,0x11 ,0x0E ,     // 8
0x0E ,0x11 ,0x11 ,0x1E ,0x10 ,0x08 ,0x06 ,     // 9
0x00 ,0x06 ,0x06 ,0x00 ,0x06 ,0x06 ,0x00 ,     // :
0x00 ,0x06 ,0x06 ,0x00 ,0x06 ,0x04 ,0x02 ,     // ;
0x08 ,0x04 ,0x02 ,0x01 ,0x02 ,0x04 ,0x08 ,     // <
0x00 ,0x00 ,0x1F ,0x00 ,0x1F ,0x00 ,0x00 ,     // =
0x02 ,0x04 ,0x08 ,0x10 ,0x08 ,0x04 ,0x02 ,     // >
0x0E ,0x11 ,0x10 ,0x08 ,0x04 ,0x00 ,0x04 ,     // ?
0x0E ,0x11 ,0x10 ,0x16 ,0x15 ,0x15 ,0x0E ,     // @
0x0E ,0x11 ,0x11 ,0x11 ,0x1F ,0x11 ,0x11 ,     // A
0x0F ,0x11 ,0x11 ,0x0F ,0x11 ,0x11 ,0x0F ,     // B
0x0E ,0x11 ,0x01 ,0x01 ,0x01 ,0x11 ,0x0E ,     // C
0x07 ,0x09 ,0x11 ,0x11 ,0x11 ,0x09 ,0x07 ,     // D
0x1F ,0x01 ,0x01 ,0x0F ,0x01 ,0x01 ,0x1F ,     // E
0x1F ,0x01 ,0x01 ,0x0F ,0x01 ,0x01 ,0x01 ,     // F
0x0E ,0x11 ,0x01 ,0x1D ,0x11 ,0x11 ,0x1E ,     // G
0x11 ,0x11 ,0x11 ,0x1F ,0x11 ,0x11 ,0x11 ,     // H
0x0E ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x0E ,     // I
0x1C ,0x08 ,0x08 ,0x08 ,0x08 ,0x09 ,0x06 ,     // J
0x11 ,0x09 ,0x05 ,0x03 ,0x05 ,0x09 ,0x11 ,     // K
0x01 ,0x01 ,0x01 ,0x01 ,0x01 ,0x01 ,0x1F ,     // L
0x11 ,0x1B ,0x15 ,0x15 ,0x11 ,0x11 ,0x11 ,     // M
0x11 ,0x11 ,0x13 ,0x15 ,0x19 ,0x11 ,0x11 ,     // N
0x0E ,0x11 ,0x11 ,0x11 ,0x11 ,0x11 ,0x0E ,     // O
0x0F ,0x11 ,0x11 ,0x0F ,0x01 ,0x01 ,0x01 ,     // P
0x0E ,0x11 ,0x11 ,0x11 ,0x15 ,0x09 ,0x16 ,     // Q
0x0F ,0x11 ,0x11 ,0x0F ,0x05 ,0x09 ,0x11 ,     // R
0x1E ,0x01 ,0x01 ,0x0E ,0x10 ,0x10 ,0x0F ,     // S
0x1F ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,     // T
0x11 ,0x11 ,0x11 ,0x11 ,0x11 ,0x11 ,0x0E ,     // U
0x11 ,0x11 ,0x11 ,0x11 ,0x11 ,0x0A ,0x04 ,     // V
0x11 ,0x11 ,0x11 ,0x15 ,0x15 ,0x15 ,0x0A ,     // W
0x11 ,0x11 ,0x0A ,0x04 ,0x0A ,0x11 ,0x11 ,     // X
0x11 ,0x11 ,0x11 ,0x0A ,0x04 ,0x04 ,0x04 ,     // Y
0x1F ,0x10 ,0x08 ,0x04 ,0x02 ,0x01 ,0x1F ,     // Z
0x0E ,0x02 ,0x02 ,0x02 ,0x02 ,0x02 ,0x0E ,     // [
0x00 ,0x01 ,0x02 ,0x04 ,0x08 ,0x10 ,0x00 ,     // Backslash
0x0E ,0x08 ,0x08 ,0x08 ,0x08 ,0x08 ,0x0E ,     // ]
0x04 ,0x0A ,0x11 ,0x00 ,0x00 ,0x00 ,0x00 ,     // ^
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1F ,     // _
0x02 ,0x04 ,0x08 ,0x00 ,0x00 ,0x00 ,0x00 ,     // High Comma 
0x00 ,0x00 ,0x0E ,0x10 ,0x1E ,0x11 ,0x1E ,     // a
0x01 ,0x01 ,0x0D ,0x13 ,0x11 ,0x11 ,0x0F ,     // b
0x00 ,0x00 ,0x0E ,0x01 ,0x01 ,0x11 ,0x0E ,     // c
0x10 ,0x10 ,0x16 ,0x19 ,0x11 ,0x11 ,0x1E ,     // d
0x00 ,0x00 ,0x0E ,0x11 ,0x1F ,0x01 ,0x0E ,     // e
0x0C ,0x12 ,0x02 ,0x07 ,0x02 ,0x02 ,0x02 ,     // f
0x00 ,0x1E ,0x11 ,0x11 ,0x1E ,0x10 ,0x0E ,     // g
0x01 ,0x01 ,0x0D ,0x13 ,0x11 ,0x11 ,0x11 ,     // h
0x04 ,0x00 ,0x06 ,0x04 ,0x04 ,0x04 ,0x0E ,     // i
0x08 ,0x00 ,0x0C ,0x08 ,0x08 ,0x09 ,0x06 ,     // j
0x01 ,0x01 ,0x09 ,0x05 ,0x03 ,0x05 ,0x09 ,     // k
0x06 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x0E ,     // l
0x00 ,0x00 ,0x0B ,0x15 ,0x15 ,0x11 ,0x11 ,     // m
0x00 ,0x00 ,0x0D ,0x13 ,0x11 ,0x11 ,0x11 ,     // n
0x00 ,0x00 ,0x0E ,0x11 ,0x11 ,0x11 ,0x0E ,     // o
0x00 ,0x00 ,0x0F ,0x11 ,0x0F ,0x01 ,0x01 ,     // p
0x00 ,0x00 ,0x16 ,0x19 ,0x1E ,0x10 ,0x10 ,     // q
0x00 ,0x00 ,0x0D ,0x13 ,0x01 ,0x01 ,0x01 ,     // r
0x00 ,0x00 ,0x0E ,0x01 ,0x0E ,0x10 ,0x0F ,     // s
0x02 ,0x02 ,0x07 ,0x02 ,0x02 ,0x12 ,0x0C ,     // t
0x00 ,0x00 ,0x11 ,0x11 ,0x11 ,0x19 ,0x16 ,     // u
0x00 ,0x00 ,0x11 ,0x11 ,0x11 ,0x0A ,0x04 ,     // v
0x00 ,0x00 ,0x11 ,0x11 ,0x15 ,0x15 ,0x0A ,     // w
0x00 ,0x00 ,0x11 ,0x0A ,0x04 ,0x0A ,0x11 ,     // x
0x00 ,0x00 ,0x11 ,0x11 ,0x1E ,0x10 ,0x0E ,     // y
0x00 ,0x00 ,0x1F ,0x08 ,0x04 ,0x02 ,0x1F ,     // z
0x08 ,0x04 ,0x04 ,0x02 ,0x04 ,0x04 ,0x08 ,     // {
0x04 ,0x04 ,0x04 ,0x00 ,0x04 ,0x04 ,0x04 ,     // |
0x02 ,0x04 ,0x04 ,0x08 ,0x04 ,0x04 ,0x02 ,     // }
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,     // ~ 
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,     // Block 
};

Veel succes ermee!

Max

Hallo Allemaal
Beste MaxJ

Met grote belangstelling jou oplossing bekeken en dat is bijna wat ik zoek.
Het betreft het volgende, bij BACO staat dit bord met een plaatje waarop de tijd, datum en dag is te zien.
Dat is nu precies wat ik nodig heb voor mijn schoonmoeder (nu ff geen grapjes over schoonmoeders, ik heb echt een hele lieve schoonmoeder). De dagen gaan snel en soms weet ze even niet of het nu zondag is of niet (en dan staat er ineens een grote pot koffie klaar voor...) dus om dat te voorkomen leek mij dat bord als klok en datum dag aanduiding de ideale oplossing.
Probleem is alleen dat A) het geen kant en klaar ding is, B) iedereen hier op het forum met hele mooie oplossingen bezig zijn, maar net niet de mijne.
Ik heb niet zoveel kennis van Micro controllers, maar een Arduino van de juiste sketch voorzien moet lukken. Solderen etc. mag geen probleem zijn, dus de controller eraf en touwtjes eraan, prima.
Maar dan? Van MaxJ ziet het er bijna uit zoals ik het graag zou hebben, maar nog beter is zoals op de foto bij BACO.
Wie o Wie gaat mij en indirect mijn lieve schoonmoeder helpen?
Ik weet zeker dat ze dit al niet meer kan volgen, maar zeker zou iets zou zeggen als "wat een lieve jongens allemaal dat ze me zo geholpen hebben"
Misschien een leuk project voor ieder bejaarden tehuis!

Alvast bedankt, ook namens mijn schoonmoeder.

Hi Martin01,

Als ik het goed begrijp is het enige probleem dat de dag niet wordt getoond... Nou dat kan ook hoor!
De meeste RTC's (Real Time Clock) hebben ook een DOW (Day Of Week) variabele. Deze heb ik in mijn sketch niet gebruikt, maar is eenvoudig te implementeren en dus kun je ook de weekdag op het display tonen.
Zoiets als dit:
http://www.uploadarchief.net/files/download/2014-01-20%2013.07.09.jpg

Dan is hier de code:

// Timer 1 Info :  http://playground.arduino.cc/code/timer1
// Using PROGMEM : http://arduino.cc/en/Reference/PROGMEM


// The matrix board is controlled by timer0 overflow interrupt. This gives a steady image and the display can be handled like a static type.
// The main code does not have to control the board, just set or clear bits in the data array to put some led's on or off.
// Logically it's organized in colums, 270 in total. This sofware defines column 0 as the upper left column and 271 is the right bottom column.
// This makes it more easy to arrange the text on the board. There is no checking if the text fits on the display.
//
// Column layout :    Line 0 : 0 to 89
//                    Line 1 : 90 to 179     
//                    Line 2 : 180 to 271
//
//
//
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <avr/pgmspace.h>             // Include pgmspace so data tables can be stored in program memory, see PROGMEM info
#include <SPI.h>                      // Include SPI comunications, used for high speed clocking to display shiftregisters
#include "TimerOne.h"                 // Include Timer1 library, used for timer overflow interrupt                                    
                                                        
const int strobePin = 10;             // Define I/O pins connected to the display board                 
const int clockPin = 13;                               
const int dataPin = 11;                                
const int resredPin = 9;                               
const int row_a = 5;                                      
const int row_b = 6;                                    
const int row_c = 7;                                     
const int rtcPlusPin = 17;            // +5V RTC module.  
const int rtcMinPin = 16;             // gnd RTC module.  
const int ClockPin = 2;
const int ClockPinMin = 1;

String tijd;
int blinkToggle=1;
int blinks=0;
String topText = "De tijd is";

int RowCount = 0;             // Counter for the current row, do not change this value in the main code, it's handeld in the interrupt routine  
int teller=0;
unsigned long tijdNu=millis();

#include "font75.h";         // Standard 5x7 font ASCII Table

byte ColumnBytes[8][34];     // This is the data array that is used as buffer. The display data is in this buffer and the timeroverflow routine scans this
                             // buffer and shows it on the display. So read and write to this buffer to change display data.
                             // No strings are stored here, its the raw bit data that has to be shifted into the display.
                         

// =========================================================================================
// Setup routine, mandatory.
// =========================================================================================

 void setup() {   
  pinMode (strobePin, OUTPUT);                              // Define IO          
  pinMode (clockPin, OUTPUT);  
  pinMode (dataPin, OUTPUT);  
  pinMode (row_c, OUTPUT);  
  pinMode (row_b, OUTPUT);  
  pinMode (row_a, OUTPUT);  
  pinMode (resredPin, OUTPUT);  
  pinMode (rtcMinPin, OUTPUT);  
  pinMode (rtcPlusPin, OUTPUT);  
  pinMode (ClockPin, INPUT_PULLUP);  
  pinMode (ClockPinMin, OUTPUT);  
  digitalWrite(rtcMinPin, LOW);                       // 0V (gnd) voor RTC module.  
  digitalWrite(rtcPlusPin, HIGH);                     // +5V voor RTC module.  
  digitalWrite (resredPin, LOW);                       
  digitalWrite (strobePin, LOW);                        
  digitalWrite(ClockPinMin, LOW);                     // +5V voor Clock instelknop  
  //Serial.begin(9600);                                       // Include serial routine, used for debugging and testing
  SPI.begin();                                              // Start SPI comunications
  SPI.setBitOrder(LSBFIRST);                                // Initialize SPI comunications
  Timer1.initialize(2000);                                  // initialize timer1, overflow timer1 handles the display driver, period (in microseconds)
  Timer1.attachInterrupt(DisplayControl);                   // attaches timer1 overflow interrupt routine
 
 
// Start code here
  ClearDisplay();

}  

// =========================================================================================
// loop routine, mandatory
// Take notice when using time crititical code the interrupt is running to control 
// the display.
// =========================================================================================

void loop()  
{  
   tmElements_t tm;  //activate RTC lib
   String uren;
   String minuten;
   String seconden;

// zet tijd in bovenste balk   
   if (RTC.read(tm)) {                                                                     //read RTC
     if (tm.Hour<=9){uren="0"+String(tm.Hour);}else{uren=String(tm.Hour);}                 //leading zero's
     if (tm.Minute<=9){minuten="0"+String(tm.Minute);}else{minuten=String(tm.Minute);}     //if 
     if (tm.Second<=9){seconden="0"+String(tm.Second);}else{seconden=String(tm.Second);}   //UU,MM,SS < 10
 
     tijd = uren+":"+minuten+":"+seconden;
     PlaceText(tijd,20);
   }
 // zet DOW in middelste balk
     String DOW[7] = {"zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};
     String dag = DOW[tm.Wday];   
     PlaceText (dag, 113);
     
 // zet de datum in onderste balk
     String maand[13] = {"leeg", "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"};
     String datum = String(tm.Day)+ " "+ maand[tm.Month]+ " "+ String(tmYearToCalendar(tm.Year)); 
     PlaceText (datum, 193);
 

}



// =========================================================================================
// Timer1 overflow intterupt routine, 
// Does the Display shifting and muliplexing
// =========================================================================================

 void DisplayControl()  
 {  
     digitalWrite(strobePin, LOW);                        // StrobePin LOW, so led's do not change during clocking
     digitalWrite (resredPin, LOW);                       // Display off to prevent ghosting  
 
       for (int q = 0; q<34; q++) {                       // Shift the bytes in for the current Row
       SPI.transfer(ColumnBytes[RowCount][q]);}
    
     digitalWrite (row_a, RowCount & 1);                  // Switch the current column on, will be on until next interrupt
     digitalWrite (row_b, RowCount & 2);                
     digitalWrite (row_c, RowCount & 4);            
     
     digitalWrite(strobePin, HIGH);                       // Strobe the shiftregisters so data is presented to the LED's 
     digitalWrite (resredPin, HIGH);                      // Display back on 

     RowCount++;                                          // Increment Row 
     if (RowCount == 7) RowCount = 0 ;                    // Row is 0 to 6
 }  

// =========================================================================================
// Place text on display, uses the standard 5x7 font
// Call this routine with the text to display and the starting column to place the text
// Example : PlaceText("FDS132",27); Places the text "FDS132" starting on column 27
// =========================================================================================

void PlaceText(String text, int ColPos) {
    byte displayByte;  
    char CurChar;
    int bitpos;
    int bytepos;
    int pixelpos;
    int charCount = text.length();
    int store = ColPos;

   for (int i = 0; i < charCount; i++) {                                     // Loop for all the characters in the string
    CurChar = text.charAt(i);                                                // Read ascii value of current character
    CurChar = CurChar - 32;                                                  // Minus 32 to get the right pointer to the ascii table, the first 32 ascii code are not in the table    
     
     for (int y = 0; y<7; y++) {                                             // y loop is used to handle the 7 rows
       for (int x = 0; x<5; x++) {                                           // x loop is the pointer to the indiviual bits in the byte from the table 
         displayByte = (pgm_read_word_near(Font75 + (CurChar*7)+y));         // Read byte from table 
         pixelpos = abs(ColPos - 271);                                       // Calculate start position to place the data on display
         bytepos = ((pixelpos)/8);                                           
         bitpos = (pixelpos) - (bytepos*8);
         boolean bitStatus = bitRead(displayByte, x);                        // Probe the bits   
         if(bitStatus == 0) bitClear(ColumnBytes[y][bytepos], bitpos);       // And set or clear the corrosponding bits in de display buffer   
         if(bitStatus == 1) bitSet(ColumnBytes[y][bytepos], bitpos);       
         ColPos++;                                                           
      }
       ColPos = store;                                                      // Reset the column pointer so the next byte is shown on the same position 
     }
    ColPos = ColPos + 6;                                                    // 6 is used here to give one column spacing between characters (one character is 5 bits wide)
    store = ColPos;                                                         // For more space between the characters increase this number 
 }
}      



// =========================================================================================
// Clear display
// All bytes in buffer are set to zero
// =========================================================================================

void ClearDisplay() {
    for (int y = 0; y<8; y++) {     
       for (int x = 0; x<34; x++) {     
         ColumnBytes[y][x] = 0;
       }
    }     
}  


Succes en de groeten aan je schoonmoeder.

Max