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

Geen opmerkingen:

Een reactie posten