Zoeken in deze blog

dinsdag 30 november 2010

HamKlok One het begin is er...

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();
}

maandag 22 november 2010

Arduino projecten en meer.....: HamKlok One tussenstapje

Arduino projecten en meer.....: HamKlok One tussenstapje: "Voor het instellen van datum en tijd nu de 4 schakelaars geplaatst. Maar hoe ga ik dit softwarematig oplossen. Eerst maar even begrijpen hoe..."

HamKlok One tussenstapje

Voor het instellen van datum en tijd nu de 4 schakelaars geplaatst.
Maar hoe ga ik dit softwarematig oplossen.
Eerst maar even begrijpen hoe ik via een interrupt het klokprogramma kan onderbreken voor het inlezen van de schakelaars. Hiervoor maar even een testprogramma gemaakt.

volatile int menuOn = LOW; deze is nodig om de menu schakelaar te activeren
int MenuPin = 3;  

attachInterrupt(1, top, FALLING);activeren van de interrupt via pin 3 interrupt 1
pinMode(MenuPin, INPUT);pin 3 ingang maken
digitalWrite(MenuPin, HIGH);pin 3 pullup weerstand inschakelen


void top()
{
   menuOn = !menuOn;


Ja zo simpel is de interrupt routine !

Even testen in het hoofdprogramma!

void loop()

// TODO
{
  if(menuOn)
  {
    for (int i = 0; i < 7; i ++)
    {
      shiftIt(FigD[i],0,9+i);
    }
  }
  else
   {
    for (int i = 0; i < 7; i ++)
    {
      shiftIt(FigT[i],0,9+i);
    }
   }
 }



Deze week veel werkdruk dus niet al te veel activiteit !

dinsdag 16 november 2010

HamKlok One vervolg 6

We hebben een klok !



Vandaag komen we tot de werkelijke klok. We gaan de RTC (Real Time Clock) aansluiten, softwarematig van de juiste starttijd/datum voorzien en de uren,minuten en seconden puls uitlezen en op het display zetten!
Het aansluiten moet maar eerst even gebeuren...
pin 7 RTC naar digitale pin 8 op de Arduino, pin 6 RTC naar analoge pin 5 van de Arduino en tot slot pin 5 van de RTC naar analoge pin 4 van de Arduino.

Op de digitale pin 8 komt de 1 Hz klokpuls voor de seconden en de beide analope pinnen worden softwarematig omgeschakeld naar een I2C interface (hier komen we later op terug!)

De software is uitgebreid met het genereren van de seconden puls, het uitlezen van de RTC chip en het plaatsen van de cijfers op het display.
Hier het programma, het bijgeschreven commentaar laat zien hoe het werkt!
Oh ja de geel gemarkeerde delen zijn nieuw de rest is al eerder beschreven!

/* HamKlok One 
 * Sure 2416 display 24*16 leds
 * pa0akv 2010
 * -------------------------------------------
 * Historie 
 * versie 0.0 15 november 2010
 * -------------------------------------------
*/

// Eerst even de juiste bibliotheken ophalen

// Shure 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)
#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;

// geheugen ruimte voor sprites reserveren
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];

// ruimte voor RTC registers maken
int rtc[7];
int sec;
int secr;
int secl;
int mins;
int minr;
int minl;
int hour;
int hourr;
int hourl;


void setup()
{
// Digital I/O eerst definieren
  pinMode(Puls_1Hz,INPUT);
  
  disp.setMaster(0,4);
  
// Klok deel inrichten !  
/* Dit deel voor het gelijk zetten van de klok!
 * Verwijder // om dit deel te activeren
 * Voeg toe // om dit deel over te slaan
 * Nodig zolang er geen gelijk zet functionaliteit
 * aan het programma is toegevoegd !!
 */

//RTC.stop();
//RTC.set(DS1307_SEC,30);    //set de seconden
//RTC.set(DS1307_MIN,14);    //set dee minuten
//RTC.set(DS1307_HR,20);     //set de uren
//RTC.set(DS1307_DOW,2);     //set de dag van de week
//RTC.set(DS1307_DATE,16);   //set de datum
//RTC.set(DS1307_MTH,11);    //set de maand
//RTC.set(DS1307_YR,10);     //set het jaar
//RTC.start(); 
  Set_Square_Wave(0);        // 1Hz pulsen on! 

// 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()
// start met de RTC

  RTC.get(rtc,true);

// issoleer tientallen en eenheden 
// van  RTC minuten register

  mins = rtc[1]; // tweede Kol in RTC array
  if (mins > 9)
  {
    minl = mins/10;
    minr = mins-(minl*10);
  }
  else
  {
    minr = mins;
    minl = 0;
  }
// issoleer tentallen en eenheden
// van  RTC uren register

  hour = rtc[2]; // derde Kol in RTC array
  if (hour > 9)
  {
    hourl = hour/10;
    hourr = hour-(hourl*10);
  }
  else
  {
    hourr = hour;
    hourl = 0;
  }   
// minuten sprites plaatsen
  Display(minr,19,1);
  Display(minl,13,1);

// uren sprites plaatsen
  Display(hourr,6,1);
  Display(hourl,0,1);
  
  // seconden tik !
  if (digitalRead(Puls_1Hz) == HIGH)
  {
    toolbox.setPixel(11,3,1,true);
    toolbox.setPixel(12,3,1,true);
    toolbox.setPixel(11,4,0,true);
    toolbox.setPixel(12,4,0,true);
  }
  else
  {
    toolbox.setPixel(11,3,0,true);
    toolbox.setPixel(12,3,0,true);
    toolbox.setPixel(11,4,1,true);
    toolbox.setPixel(12,4,1,true);
  }

// even wachten 
  delay(200);

}  
// 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 om nummer naar sprite te converteren 
 * en op Shure display te plaatsen
 * Opgave te plaatsen cijfer Tvalue
 * en plaats via kolom en 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;
  case 10 :
for (int i = 0; i < 7; i ++)
{
shiftIt(FigT[i],Col,Row+i);
}
break;
  case 11 :
for (int i = 0; i < 7; i ++)
{
shiftIt(FigD[i],Col,Row+i);
}
break;
  }

/*      Functie om blokpuls van DS1307 te halen
*       Adopted from........
*       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();

Nog een stap en we hebben het klok deel klaar! We moeten nog iets verzinnen om het gelijk zetten van de klok ook zonder de pc te kunnen doen.
Hiervoor hebben we wat schakelaartjes in petto die deze taak voor ons kan klaren.







maandag 15 november 2010

HamKlok One vervolg 5

Deze keer een kleine verbetering. Het lijkt zinvol voor het plaatsen van een cijfer een functie te schrijven.
Hierdoor wordt het werkelijke programma aanmerkelijk overzichtelijker.
Het resultaat is dan:


/* HamKlok One uitleg sprite
 * Sure 2416 display 24*16 leds
 * pa0akv 2010
 * -----------------------------------
 * Historie 
 * versie 0.0 november 2010
 * -----------------------------------
 */


// Eerst even de juiste bibliotheken ophalen
// Shure libraries
#include "MatrixDisplay.h"
#include "DisplayToolbox.h"
#include <WProgram.h>


// 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)


// 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;


// Dit voorbeeld heeft 1 Array Fig5 !
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];


void setup()
{
  disp.setMaster(0,4);


  // 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()

  // Bovenste regel met "nep tijd" plaatsen  
  Display(1,0,1);
  Display(4,6,1);
  Display(5,13,1);
  Display(3,19,1);
  // Dubbele punt als scheiding aanbrengen  
  toolbox.setPixel(11,3,1,true);
  toolbox.setPixel(11,6,1,true);
  // Onderste regel even vullen
  // Met een artistieke seconden aanduiding
  Display(10,9,9);
  delay(800);
  Display(11,9,9);
  delay(800);


}  
// 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 om nummer naar sprite te converteren 
 * en op Shure display te plaatsen
 * Opgave te plaatsen cijfer Tvalue
 * en plaats via kolom en 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;
  case 10 :
    for (int i = 0; i < 7; i ++)
    {
      shiftIt(FigT[i],Col,Row+i);
    }
    break;
  case 11 :
    for (int i = 0; i < 7; i ++)
    {
      shiftIt(FigD[i],Col,Row+i);
    }
    break;
  }


Het groen gedeelte is de nieuwe functie en het gele gedeelte is het deel waar wordt bepaald welke sprites, waar worden geplaatst.
Het resultaat op de bovenste regel 14:53 en op de onderste regel een pijl op neer in het ritme van een seconde!

Nu naderen we bijna de klok functionaliteit. Als we de RTC info inlezen en omzetten naar Sprites begint
het echt op een klok te lijken......

wordt vervolgt !