Ok het even een paar dagen stil geweest maar dat kwam door de drukte op het werk en ik had wat moeite om schakelaars goed in te lezen.
Het schema van de schakelaars moet nog aangepast en het debounce effect is nog niet optimaal maar de eerste schreden zijn gezet om een echte klok te krijgen.
Voor de ongeduldigen hier het nog niet opgeschoonde programma.
Vandaag toch even een kleine up-date gemaakt!
/*
HamKlok One uitleg sprite
*
Sure 2416 display 24*16 leds
*
pa0akv 2010
*
-----------------------------------
*
Historie
*
versie 0.0 oktober 2010
*
versie 0.1 december 2010
*
De klok is deels gereed voor gebruik.
*
Gelijk zetten is mogelijk met de eerste
* drie schakelaars.
*
-----------------------------------
*/
// Eerst even de juiste bibliotheken ophalen
// Sure libraries
#include "MatrixDisplay.h"
#include "DisplayToolbox.h"
#include <WProgram.h>
// DS1307 libraries
#include <Wire.h>
#include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson
// Het display heeft nog wat aanvullende info nodig
// Easy to use function
#define setMaster(dispNum, CSPin) initDisplay(dispNum,CSPin,true)
#define setSlave(dispNum, CSPin) initDisplay(dispNum,CSPin,false)
// 1Hz puls aan digitale ingang 9
#define Puls_1Hz 9
// We hebben maar 1 display! De bibliotheek kan er meer aansturen
// 1 = Number of displays
// Data = 10
// WR == 11
// False - we dont need a shadow buffer for this example. saves 50% memory!
// Initaliseer Shure display met juiste aansluitingen!
MatrixDisplay disp(4,11,10, false);
// Pass a copy of the display into the toolbox
DisplayToolbox toolbox(&disp);
// In totaal 3 groepen van 8 leds = 24
// De eerste is positie 0 de laatste = 23
// Twee groepen hoog dus rechts boven is 0
// Rechts onder is dan 15
uint8_t X_MAX = 23;
uint8_t Y_MAX = 15;
// variabelen voor menu
uint8_t MenuTeller = 0;
uint8_t PosTeller = 1;
uint8_t Fig0[7];
uint8_t Fig1[7];
uint8_t Fig2[7];
uint8_t Fig3[7];
uint8_t Fig4[7];
uint8_t Fig5[7];
uint8_t Fig6[7];
uint8_t Fig7[7];
uint8_t Fig8[7];
uint8_t Fig9[7];
uint8_t FigT[7];
uint8_t FigD[7];
//Menu schakelaar aan digitale ingang 3
//Positie schakelaar aan digitale ingang 5
//Ingave waarde schakelaar ingang 7
int MenuPin = 3;
int PosPin = 5;
int OphoogPin =7;
int val = 0;
int pval = 0;
int OphoogTeller;
// variabelen voor klok
int UurTien = 0;
int UurEen = 0;
int UurTot = 0;
int MinTien = 0;
int MinEen = 0;
int MinTot = 0;
int Wtotaal = 0;
int MaandTien = 0;
int MaandEen = 0;
int DagTien = 0;
int DagEen = 0;
int MaandTot = 0;
int DagTot = 0;
int ClearEnable = 0;
int rtc[7];
int sec;
int secr;
int secl;
int mins;
int minr;
int minl;
int hour;
int hourr;
int hourl;
void setup()
{
Serial.begin(9600);
disp.setMaster(0,4);
//Overschakelen van normaal naar
//MENU bedrijf via interrupt 1
//Interrupt 1 hangt aan de menu
//schakelaar ingang 3
//Afvragen schakelaar in functie menu
//Interrupt op opgaande flank!
attachInterrupt(1, menu, RISING);
//maak de ingangen..
pinMode(MenuPin, INPUT);
pinMode(PosPin,INPUT);
pinMode(OphoogPin,INPUT);
pinMode(Puls_1Hz,INPUT);
MenuTeller = 1;
// Opbouwen van de sprite !
Fig0[0] = B01110;
Fig0[1] = B10001;
Fig0[2] = B10001;
Fig0[3] = B10001;
Fig0[4] = B10001;
Fig0[5] = B10001;
Fig0[6] = B01110;
Fig1[0] = B00110;
Fig1[1] = B00101;
Fig1[2] = B00100;
Fig1[3] = B00100;
Fig1[4] = B00100;
Fig1[5] = B00100;
Fig1[6] = B11111;
Fig2[0] = B01110;
Fig2[1] = B10001;
Fig2[2] = B10000;
Fig2[3] = B01100;
Fig2[4] = B00010;
Fig2[5] = B00001;
Fig2[6] = B11111;
Fig3[0] = B01110;
Fig3[1] = B10001;
Fig3[2] = B10000;
Fig3[3] = B01110;
Fig3[4] = B10000;
Fig3[5] = B10001;
Fig3[6] = B01110;
Fig4[0] = B00001;
Fig4[1] = B00001;
Fig4[2] = B01001;
Fig4[3] = B01001;
Fig4[4] = B11111;
Fig4[5] = B01000;
Fig4[6] = B01000;
Fig5[0] = B01111;
Fig5[1] = B00001;
Fig5[2] = B00001;
Fig5[3] = B01111;
Fig5[4] = B10000;
Fig5[5] = B10000;
Fig5[6] = B01111;
Fig6[0] = B01110;
Fig6[1] = B00001;
Fig6[2] = B00001;
Fig6[3] = B01111;
Fig6[4] = B10001;
Fig6[5] = B10001;
Fig6[6] = B01110;
Fig7[0] = B11111;
Fig7[1] = B10000;
Fig7[2] = B01000;
Fig7[3] = B00100;
Fig7[4] = B00010;
Fig7[5] = B00010;
Fig7[6] = B00010;
Fig8[0] = B01110;
Fig8[1] = B10001;
Fig8[2] = B10001;
Fig8[3] = B01110;
Fig8[4] = B10001;
Fig8[5] = B10001;
Fig8[6] = B01110;
Fig9[0] = B01110;
Fig9[1] = B10001;
Fig9[2] = B10001;
Fig9[3] = B11110;
Fig9[4] = B10000;
Fig9[5] = B10000;
Fig9[6] = B01110;
FigT[0] = B11111;
FigT[1] = B01110;
FigT[2] = B00100;
FigT[3] = B00000;
FigT[4] = B00000;
FigT[5] = B00000;
FigT[6] = B00000;
FigD[0] = B00000;
FigD[1] = B00000;
FigD[2] = B00000;
FigD[3] = B00000;
FigD[4] = B00100;
FigD[5] = B01110;
FigD[6] = B11111;
}
// Hier begint het eigenlijke programma !
void loop()
//Klok uitlezen en gelijkzetten werkt nu!
//
TODO
//Datum zichtbaar maken op verzoek knop 4
//Instellen meerdere tijden
//via + - uren tov Amsterdam
//tijdzone aangeven bv AMS = Amsterdam
{
switch(MenuTeller)
{
case 1 :
//Display menu, dit is de ruststand
//Klok start in deze situatie
//Door indrukken MENU knop
//komen we in de verschillende menu's
if (ClearEnable =0)
{
disp.clear();
disp.syncDisplays();
ClearEnable = 1;
}
PosTeller = 1;
// Tijd laten zien !
RTC.get(rtc,true);
// issolate tents and units
// from RTC minutes
mins = rtc[1];
// second Col in RTC array
if (mins > 9)
{
minl = mins/10;
minr = mins-(minl*10);
}
else
{
minr = mins;
minl = 0;
}
// issolate tents and units
// from RTC hours
hour = rtc[2];
// thirth Col in RTC array
if (hour > 9)
{
hourl = hour/10;
hourr = hour-(hourl*10);
}
else
{
hourr = hour;
hourl = 0;
}
// place figures minutes
Display(minr,19,0);
Display(minl,13,0);
// place figures hours
Display(hourr,6,0);
Display(hourl,0,0);
// place seconds sign
if (digitalRead(Puls_1Hz) == HIGH)
{
toolbox.setPixel(12,2,1,true);
toolbox.setPixel(12,5,0,true);
}
else
{
toolbox.setPixel(12,2,0,true);
toolbox.setPixel(12,5,1,true);
}
break;
case 2 :
// Menu stand 2
// we willen de tijd instellen!
// uur tiental,uur eenheden
// minuut tiental-eenheden
// positie instellen met
// positie schakelaar
// led geeft positie aan !
toolbox.setPixel(11,8,1,true);
toolbox.setPixel(11,9,0,true);
toolbox.setPixel(11,10,0,true);
toolbox.setPixel(11,11,0,true);
toolbox.setPixel(11,12,0,true);
//PosTeller = 1;
Instellen (7,1);
break;
case 3 :
// Menu stand 3
// we willen de datum instellen!
// tientallen en eenheden
// instellen volgens menu 2
// info komt nu op onderste
// displays.
toolbox.setPixel(2,7,0,true);
toolbox.setPixel(8,7,0,true);
toolbox.setPixel(15,7,0,true);
toolbox.setPixel(21,7,0,true);
toolbox.setPixel(11,8,0,true);
toolbox.setPixel(11,9,1,true);
toolbox.setPixel(11,10,0,true);
toolbox.setPixel(11,11,0,true);
toolbox.setPixel(11,12,0,true);
//PosTeller = 1;
Instellen (15,2);
ClearEnable = 1;
break;
case 4 :
// we willen tijd 2 en 3 instellen
//TODO !
if(ClearEnable ==1)
{
disp.clear();
disp.syncDisplays();
ClearEnable = 0;
}
toolbox.setPixel(11,8,0,true);
toolbox.setPixel(11,10,1,true);
toolbox.setPixel(11,9,0,true);
toolbox.setPixel(11,11,0,true);
toolbox.setPixel(11,12,0,true);
break;
case 5 :
// we willen de locaties instelen
// TODO !
toolbox.setPixel(11,10,0,true);
toolbox.setPixel(11,9,0,true);
toolbox.setPixel(11,8,0,true);
toolbox.setPixel(11,12,0,true);
toolbox.setPixel(11,11,1,true);
break;
case 6 :
// Menu 6
// Alle ingegeven waarden
// naar RTC overhevelen.
// Ingestelde tijd naar RTC !
toolbox.setPixel(11,8,0,true);
toolbox.setPixel(11,12,1,true);
toolbox.setPixel(11,9,0,true);
toolbox.setPixel(11,10,0,true);
toolbox.setPixel(11,11,0,true);
RTC.stop();
RTC.set(DS1307_SEC,30);
//set de seconden
RTC.set(DS1307_MIN,MinTot);
//set de minuten
RTC.set(DS1307_HR,UurTot);
//set de uren
RTC.set(DS1307_DATE,DagTot);
//set de dag
RTC.set(DS1307_MTH,MaandTot); //set de maand
RTC.set(DS1307_YR,10);
//set het jaar
RTC.start();
Set_Square_Wave(0); // 1Hz pulsen aan!
break;
}
delay(150);
}
// Hier eindigd het eigenlijke programma !
// En dan opnieuw beginnen !
/*
Functie voor het opbouwen van de sprite
*
deze functie wordt elke keer opgeroepen
*
als we een cijfer op het display zetten
*
opgave welke sprite SpriteIn
*
en de plaats op het display 0,0 Xin,Yin
*/
void shiftIt(byte SpriteIn,int Xin,int Yin)
{
// Shift out 5 bits LSB first
boolean LedStatus;
// for each bit in SpriteIn test a bit
for (int i=0; i<5; i++)
{
// if the value of SpriteIn and (logical AND) a bitmask
// are true, set LedStatus to 1 (HIGH)
if ( SpriteIn & (1<<i) )
{
LedStatus = HIGH;
toolbox.setPixel(Xin+i, Yin, LedStatus, true);
}
else
{
LedStatus = LOW;
toolbox.setPixel(Xin+i, Yin, LedStatus, true);
}
}
}
//Functie aangeroepen door de interrupt
//Ophogen van de menuteller
//1 = display RTC
//2-6 zijn de instellingen !
void menu()
{
if (MenuTeller <6)
{
MenuTeller = ++ MenuTeller;
}
else
{
MenuTeller = 1;
}
}
//Functie voor het weergeven van info
//op het display
//ingave,waarde-kolom-rij
void Display(int Tvalue,int Col,int Row)
{
switch (Tvalue)
{
case 0 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig0[i],Col,Row+i);
}
break;
case 1 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig1[i],Col,Row+i);
}
break;
case 2 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig2[i],Col,Row+i);
}
break;
case 3 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig3[i],Col,Row+i);
}
break;
case 4 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig4[i],Col,Row+i);
}
break;
case 5 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig5[i],Col,Row+i);
}
break;
case 6 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig6[i],Col,Row+i);
}
break;
case 7 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig7[i],Col,Row+i);
}
break;
case 8 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig8[i],Col,Row+i);
}
break;
case 9 :
for (int i = 0; i < 7; i ++)
{
shiftIt(Fig9[i],Col,Row+i);
}
break;
}
}
//Functie voor het instellen van de waarden
//schakelaar voor positie bepaald welke waarde
//aangegeven door een led op actieve positie
//ophogen waarde met ophoog schakelaar
//ingave waarde is "intelligent"
void Instellen(int Regel,int Mode)
{
val = digitalRead(PosPin); // read the input pin
if (val)
{
PosTeller ++;
if(PosTeller >4)
{
PosTeller = 0;
}
}
switch(PosTeller)
{
case 0 :
toolbox.setPixel(21,Regel,0,true);
//lege positie
break;
case 1 :
toolbox.setPixel(2,Regel,1,true);
if (Mode ==1)
{
//instellen tientallen uren
OpHoog(UurTien,2,0,0);
UurTien = OphoogTeller;
}
else if (Mode ==2)
{
//instellen tientallen dag
OpHoog(DagTien,3,0,8);
DagTien = OphoogTeller;
}
break;
case 2 :
toolbox.setPixel(2,Regel,0,true);
toolbox.setPixel(8,Regel,1,true);
if (Mode ==1)
{
//instellen eenheden uren
if(UurTien==2)
{
OpHoog(UurEen,4,6,0);
UurEen = OphoogTeller;
}
else
{
OpHoog(UurEen,9,6,0);
UurEen = OphoogTeller;
}
UurTot = (UurTien*10)+UurEen;
}
else if (Mode ==2)
{
//instellen eenheden dag
if(DagTien < 3)
{
OpHoog(DagEen,9,6,8);
DagEen = OphoogTeller;
}
else
{
OpHoog(DagEen,1,6,8);
DagEen = OphoogTeller;
}
}
break;
case 3 :
toolbox.setPixel(8,Regel,0,true);
toolbox.setPixel(15,Regel,1,true);
if (Mode ==1)
{
//instellen tientallen minuten
OpHoog(MinTien,5,13,0);
MinTien = OphoogTeller;
}
else if (Mode ==2)
{
//instellen tientallen maand
OpHoog(MaandTien,1,13,8);
MaandTien = OphoogTeller;
}
break;
case 4 :
toolbox.setPixel(15,Regel,0,true);
toolbox.setPixel(21,Regel,1,true);
if (Mode ==1)
{
//instellen eenheden minuten
OpHoog(MinEen,9,19,0);
MinEen = OphoogTeller;
MinTot = (MinTien * 10) + MinEen;
}
else if (Mode ==2)
{
if(MaandTien ==1)
{
OpHoog(MaandEen,2,19,8);
MaandEen = OphoogTeller;
}
else
{
OpHoog(MaandEen,9,19,8);
MaandEen = OphoogTeller;
}
}
MaandTot = (MaandTien * 10) + MaandEen;
DagTot = (DagTien * 10) + DagEen;
break;
}
}
//Functie voor het "intelligent" ophogen
//van de actieve positie
void OpHoog(int Win,int Wstop,int Reg,int Kol)
{
pval =digitalRead(OphoogPin);
if(pval)
{
OphoogTeller ++;
}
if(OphoogTeller > Wstop)
{
OphoogTeller = 0;
}
Win = OphoogTeller;
Display(Win,Reg,Kol);
}
/* Function to get square wave from DS1307
* Adopted from........
* Gepikt dus gelaten zoals die was !
* Set to 90 hex to get 1 Hz pulses !
*/
void Set_Square_Wave(int rate)
{
rate = rate + 144; // 144 = 0x90
Wire.beginTransmission(0x68); // write to control reg.
Wire.send(0x07); // reg adres 07
Wire.send(0x90);
Wire.endTransmission();
}