Digitale ledklok in wording

Arduino specifieke Software
Berichten: 35
Geregistreerd: 19 Dec 2014, 00:06
Woonplaats: Heemskerk

Digitale ledklok in wording

Berichtdoor McNes » 15 Aug 2015, 23:27

Na wat langere tijd afwezig te zijn geweest, mijn "oude" project weer opgepakt. Spullen uit China al lang binnen :( . Maar eens een update.

Project is een led klok, bestaande uit 60 rgb leds. Klok is een rtc3231. Dit werkt inmiddels. Moest even de I2C bus onder controle krijgen, maar dat werkt nu:

cpp code
#include "Wire.h"
#define rtc 0x68

// definieren dagen in de week en maanden in het jaar.
char* dagen[]={"nuldag", "zondag","maandag", "dinsdag", "woensdag", "donderdag", "vrijdag","zaterdag" };
char* maanden[]={"nulmaand","januari", "februari", "maart", "april","mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"};


// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{ return( (val/10*16) + (val%10) ); }

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{ return( (val/16*10) + (val%16) ); }

byte seconden, minuten, uren, dag, datum, maand, jaar ;



void setup()
{
Wire.begin(); // I2C bus activeren
Serial.begin(9600);
}

void loop()
{

Wire.beginTransmission(rtc); // RTC @ 0x68 aanroepen
Wire.write(0); // Set register op adres 00h
Wire.endTransmission(); // Sluiten

// Inlezen data
Wire.requestFrom(rtc, 7); // Request 7 bytes data"
seconden = bcdToDec(Wire.read()); // first received byte stored here
minuten = bcdToDec(Wire.read()); // second received byte stored here
uren = bcdToDec(Wire.read()); // etc
dag = bcdToDec(Wire.read());
datum = bcdToDec(Wire.read());
maand = bcdToDec(Wire.read());
jaar = bcdToDec(Wire.read());
Wire.endTransmission(); // sluiten

// presenteren van de ingelezen data
Serial.print("Vandaag is het : ");
Serial.print(dagen[dag]); Serial.print(" ");
Serial.print(datum); Serial.print(" ") ;
Serial.print(maanden[maand]) ; Serial.print(" 20");
Serial.print(jaar); Serial.print(" , ");
Serial.print(uren); Serial.print(" uur , ");
Serial.print(minuten); Serial.print(" Minuten en ");
Serial.print(seconden); Serial.print(" Seconden") ;
Serial.println(" ");

delay(995); // ongeveer 1 seconde wachten. Anders krijg je heeeeel veel data op je scherm

}



De decimale getallen moeten naar leds gezet worden. De leds worden aangestuurd door 74hc595 shift-registers. Via onderstaande code worden nu de decimale seconden omgezet naar de binaire waardes voor de shift-registers. De teller1 simuleert de seconden (tot 24, heb 3 registers aangesloten :) )). De programma's zijn nog niet samengevoegd.

Resultaat werkt mooi!


cpp code
const int SER = 5 ; // data-pin --> serial output naar register
const int LATCH = 6 ; //latch-pin --> data zichtbaar maken (de shift)
const int CLK = 7 ; // clock-pin --> accepteren van de data

int teller1, teller2, blok, waarde, rest;

void setup()
{
pinMode (SER, OUTPUT); // SER is de data pin
pinMode (LATCH, OUTPUT); // LATCH is de LATCH pin
pinMode (CLK, OUTPUT); // CLK is de Klok pin
}

void loop()
{
for (teller1=0 ; teller1 < 24 ; teller1 ++) // simulatie van de seconden. Tot 24 vanwege 3 shiftregisters
{
blok = (int) (teller1 / 8) ; // delen door 8 geeft aan welk shiftregister gevuld moet worden
rest = (int) teller1%8 ; // rest is de waarde na de deling. deze waarde moet vertaald worden naar een bitwaarde
waarde = (int) (pow(2,rest)+0.001); // de waarde wordt 2 tot de macht (rest). Berekening is erg onnauwkeurig. Wijkt snel iets af. correctie door er 0.001 bij op te tellen

int data[3] = {0,0,0} ; // Alle "datablokken" resetten
data[blok] = waarde ; // Schrijf de juiste "binaire"waardein het betreffende register

for (teller2=2 ; teller2 >= 0; teller2 --) { // wegschrijven van de registers in de schuifregisters Beginnen met de "hoogste waarde"
digitalWrite(LATCH, LOW);
shiftOut (SER, CLK, MSBFIRST, data[teller2]);
}
digitalWrite (LATCH, HIGH); // de eigenlijke shift
delay(995) ; // vertraging. Is met de klok niet meer nodig
}
}


Ter lering ende vermaak.

Gr. Hans

Advertisement

Berichten: 35
Geregistreerd: 19 Dec 2014, 00:06
Woonplaats: Heemskerk

Re: Digitale ledklok in wording

Berichtdoor McNes » 15 Aug 2015, 23:47

Oh ja, heb ook een programmaatje gemaakt om de tijd in te kunnen stellen:

cpp code
#include "Wire.h"
#define rtc 0x68 // Adres van de RTC
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{ return( (val/10*16) + (val%10) ); }
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{ return( (val/16*10) + (val%16) ); }

byte s1,s2,s3,s4,s5, s6,s7; // was een beetje lui, geen uitgebreide namen gegeven

void setup() {
s1 = 15; // seconden
s2 = 47; // minuten
s3 = 1; // uren
s4 = 7; // dag
s5 = 15; // datum
s6 = 8; // maand
s7 = 15; // jaar

Wire.begin(); // wake up I2C bus
Wire.beginTransmission(rtc); // Aanroepen RTC op 0x68!
Wire.write(0) ; // Set register op 00h
Wire.write(decToBcd(s1)); // stuur minuten
Wire.write(decToBcd(s2)); // stuur minuten
Wire.write(decToBcd(s3)); // etc...
Wire.write(decToBcd(s4));
Wire.write(decToBcd(s5));
Wire.write(decToBcd(s6));
Wire.write(decToBcd(s7));
Wire.endTransmission(); // Sluiten
}

void loop()
{
// tsja, hier wordt de Arduino niet moe van....... Het instellen van de klok hoeft natuurlijk maar 1 keer te gebeuren
}


Mvg., Hans

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: inteqrupeyeli, Robertkable en 93 gasten