dinsdag 16 november 2010

HamKlok One continue

So today we made some progress the result .

The parts:
Shure display 2416 only 20 dollar on Ebay !!


Home made RTC with Dallas IC !

The schematics:
RTC part !
the Shure display

All parts connected to the Arduino
And at last the first concept program!


/* HamKlok One uitleg sprite
 * 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();

Feel free to use the code. 
If your Dutch isn't that good send me a message and I will explain !
Next step will be , installing some switches to get the right start time/date
in the RTC registers !

Good Luck, Andre





zaterdag 13 november 2010

HamClock One

After playing awhile with the Arduino I decided to make a radioham specialized clock. Not just a clock but a clock with a lot of functionality.
In the next few weeks I will write down how the project will progress and while busy I hope some respons will add new idees for further improofments.
Here the first photo of the project.