Cijfers klok nu juiste volgorde.

Arduino specifieke Software
Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Cijfers klok nu juiste volgorde.

Berichtdoor Hans van Kampen » 18 Aug 2019, 12:25

Ik kreeg een tip op het transistorforum nadat ik de sketch had getoond en als ik dat nou HIER ook had gedaan had Koepel het wellicht ook gezien en dank Koepel net als aan Shooter en PA9CW voor hun tips !!

Ik ben nu pas echt gestapt in de wereld dat arduino heet en leer nog een heleboel. Als je goed kijkt heb ik een account gemaakt in 2016 nadat ik een starterskitje heb gekocht maar er verder niets mee gedaan maar sinds ik enkele maanden 2 Nederlandstalige boeken heb, pak ik de draad op.

Onder een deel van het programma waarin de wijziging plaats moest vinden en is ook logisch (ik leer) dat de data naar het juiste display wordt gestuurd die zijn gemerkt met 0, 1, 2, en 3

Heren, dank nogmaals !!

void ShowTime()
{
//--------------------------------------------
SendDataDotMatrix(3,TimeMinutes1s); // Heb van de 0 een 3 moeten maken
SendDataDotMatrix(2,TimeMinutes10s); // Heb van de 1 een 2 moeten maken

SendDataDotMatrix(1,TimeHours1s); // Heb van de 2 een 1 moeten maken
if(TimeHours10s == 0)
lc.shutdown(0,true);
else
{
lc.shutdown(0,false);
SendDataDotMatrix(0,TimeHours10s); // Heb van de 3 een 0 moeten maken
}

De vorm van de cijfers heb ik zelf kunnen veranderen op de 8x8 dot matrixen door in de code die loopt van 00 t/m FF te wijzigen.

Alleen loopt de klok niet goed en ben aan het experimenteren met de waarde achter delay.

Hieronder dat deel van het programma.

void loop()
{
CalculateTime();
ShowTime();
delay(935); // Met deze waarde moet worden ge-experimenteerd.

Origineel stond er 970 maar klok loopt dan in en half uur 3 minuten achter en met deze waarde loopt ie weinig voor maar ik moet de waarde nog steeds bijstellen. Wat ik niet snap is dat er geen gebruik is gemaakt van een los RTC moduultje.

Hier onder voor de volledigheid de complete scetch die van https://www.picmicrolab.com/4-digit-led ... k-arduino/ komt. Ik heb zelf van de hoekige cijfers die 7 rijen hoog waren een mooie ronde font van gemaakt 8 rijen hoog, de gehele onderste rij led's van de dot matrixen werden niet gebruikt en de originele cijfers zagen er uit als van een 7 segment display.

Ik zou mijn klok willen tonen maar weet hier geen foto te kunnen uploaden, ik krijg geen scherm waarin je in je bestanden kunt navigeren en selecteren maar alleen maar Img tussen blokhaken, op andere fora opent er meteen een scherm naar je bestanden.

Scetch hieronder heb ik aangepast naar mooie hogere cijfers.

/*This software is provided in “AS IS” condition,NO WARRANTIES in any form apply to this software.
picmicrolab.com 11.7.2017
***************************************************************************************************************
4-Digit LED Dot Matrix Clock Arduino
*/
#include "LedControl.h"
LedControl lc=LedControl(2,3,4,4);

//----Time Var----------
int TimeHours10s = 0;
int TimeHours1s = 0;
int TimeMinutes10s = 0;
int TimeMinutes1s = 0;
int TimeSeconds10s = 0;
int TimeSeconds1s = 0;
//----------------------

//---Input Pins for setting Time--
int TimeSet = 7;
int Min = 8;
int Hour = 9;
int Buzzer =10;
//---------------------------------
void setup()
{
// initialize I/O pins----------------------------
pinMode(TimeSet, INPUT_PULLUP); //Bit_7
pinMode(Hour, INPUT_PULLUP); //Bit_8
pinMode(Min, INPUT_PULLUP); //Bit_9
pinMode(Buzzer, OUTPUT); //Bit_10
//-----------------------------------------------
lc.shutdown(0,false);
lc.shutdown(1,false);
lc.shutdown(2,false);
lc.shutdown(3,false);
//set a medium brightness for the Leds
lc.setIntensity(0,2);
lc.setIntensity(1,2);
lc.setIntensity(2,2);
lc.setIntensity(3,2);
}

void loop()
{
CalculateTime();
ShowTime();
delay(935); // origineel: delay(970);
//-------------------------------------Adj Time Value--------------
if(digitalRead(TimeSet)== LOW && digitalRead(Min)== LOW)
{
TimeMinutes1s++;
//delay(500);
CalculateTime();
}
if(digitalRead(TimeSet)== LOW && digitalRead(Hour)== LOW)
{
TimeHours1s++;
//delay(500);
CalculateTime();
}
//------------------------------------------------------------------
}

void SendDataDotMatrix(int DispNumber,int Digit)
{
int dp;
if(Digit == 1)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 1----------------------
lc.setRow(DispNumber,0,0x18 );
lc.setRow(DispNumber,1,0x38 );
lc.setRow(DispNumber,2,0x18 | dp);
lc.setRow(DispNumber,3,0x18 );
lc.setRow(DispNumber,4,0x18 );
lc.setRow(DispNumber,5,0x18 | dp);
lc.setRow(DispNumber,6,0x18 );
lc.setRow(DispNumber,7,0x3c );
//---------------------------------------------
}
if(Digit == 2)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 2----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0xc | dp);
lc.setRow(DispNumber,3,0x8);
lc.setRow(DispNumber,4,0x10);
lc.setRow(DispNumber,5,0x20 | dp);
lc.setRow(DispNumber,6,0x40);
lc.setRow(DispNumber,7,0x7c);
}
//---------------------------------------------
if(Digit == 3)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 3----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0xc| dp);
lc.setRow(DispNumber,3,0x38);
lc.setRow(DispNumber,4,0xc);
lc.setRow(DispNumber,5,0xc| dp);
lc.setRow(DispNumber,6,0x4c);
lc.setRow(DispNumber,7,0x38);
}

//---------------------------------------------
if(Digit == 4)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 4----------------------
lc.setRow(DispNumber,0,0x4c);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0x4c | dp);
lc.setRow(DispNumber,3,0x4c);
lc.setRow(DispNumber,4,0x3c);
lc.setRow(DispNumber,5,0xc | dp);
lc.setRow(DispNumber,6,0xc);
lc.setRow(DispNumber,7,0xc);
}
//---------------------------------------------
if(Digit == 5)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 5----------------------
lc.setRow(DispNumber,0,0x7c);
lc.setRow(DispNumber,1,0x40);
lc.setRow(DispNumber,2,0x40 | dp);
lc.setRow(DispNumber,3,0x38);
lc.setRow(DispNumber,4,0xc);
lc.setRow(DispNumber,5,0xc | dp);
lc.setRow(DispNumber,6,0xc);
lc.setRow(DispNumber,7,0x78);
}
//---------------------------------------------
if(Digit == 6)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 6----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x44);
lc.setRow(DispNumber,2,0x40 | dp);
lc.setRow(DispNumber,3,0x78);
lc.setRow(DispNumber,4,0x4c);
lc.setRow(DispNumber,5,0x4c | dp);
lc.setRow(DispNumber,6,0x4c);
lc.setRow(DispNumber,7,0x38);
}

//---------------------------------------------
if(Digit == 7)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 7----------------------
lc.setRow(DispNumber,0,0x7c);
lc.setRow(DispNumber,1,0xc);
lc.setRow(DispNumber,2,0xc | dp);
lc.setRow(DispNumber,3,0x08);
lc.setRow(DispNumber,4,0x10);
lc.setRow(DispNumber,5,0x20 | dp);
lc.setRow(DispNumber,6,0x40);
lc.setRow(DispNumber,7,0x40);
}
//---------------------------------------------
if(Digit == 8)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 8----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0x4c | dp);
lc.setRow(DispNumber,3,0x38);
lc.setRow(DispNumber,4,0x4c);
lc.setRow(DispNumber,5,0x4c | dp);
lc.setRow(DispNumber,6,0x4c);
lc.setRow(DispNumber,7,0x38);
}
//---------------------------------------------
if(Digit == 9)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 9----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0x4c | dp);
lc.setRow(DispNumber,3,0x3c);
lc.setRow(DispNumber,4,0xc);
lc.setRow(DispNumber,5,0xc | dp);
lc.setRow(DispNumber,6,0x4c);
lc.setRow(DispNumber,7,0x38);
}
//---------------------------------------------
if(Digit == 0)
{
if(DispNumber == 1)//
dp = 0x01;
else
dp = 0x00;
//-----------------Show 0----------------------
lc.setRow(DispNumber,0,0x38);
lc.setRow(DispNumber,1,0x4c);
lc.setRow(DispNumber,2,0x4c | dp);
lc.setRow(DispNumber,3,0x4c);
lc.setRow(DispNumber,4,0x4c);
lc.setRow(DispNumber,5,0x4c | dp);
lc.setRow(DispNumber,6,0x4c);
lc.setRow(DispNumber,7,0x38);
}

}


void ShowTime()
{
//--------------------------------------------
SendDataDotMatrix(3,TimeMinutes1s);
SendDataDotMatrix(2,TimeMinutes10s);

SendDataDotMatrix(1,TimeHours1s);
if(TimeHours10s == 0)
lc.shutdown(0,true);
else
{
lc.shutdown(0,false);
SendDataDotMatrix(0,TimeHours10s);
}

//---------------------------------------------
}


void CalculateTime()
{
TimeSeconds1s++;
if(TimeSeconds1s == 10)
{
TimeSeconds1s = 0;
TimeSeconds10s++;
}
if(TimeSeconds10s == 6)
{
TimeSeconds10s = 0;
TimeSeconds1s = 0;
TimeMinutes1s++;
}
if(TimeMinutes1s == 10)
{
TimeMinutes1s = 0;
TimeSeconds10s = 0;
TimeSeconds1s = 0;
TimeMinutes10s++;
}
if(TimeMinutes10s == 6)
{
TimeMinutes10s = 0;
TimeMinutes1s = 0;
TimeSeconds10s = 0;
TimeSeconds1s = 0;
TimeHours1s++;
}
if(TimeHours1s == 10)
{
TimeHours1s=0;
TimeMinutes10s = 0;
TimeMinutes1s = 0;
TimeSeconds10s = 0;
TimeSeconds1s = 0;
TimeHours10s++;
}
if(TimeHours10s == 2 && TimeHours1s == 4)
{
TimeHours10s=0;
TimeHours1s=0;
TimeMinutes10s = 0;
TimeMinutes1s = 0;
TimeSeconds10s = 0;
TimeSeconds1s = 0;

}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Cijfers klok nu juiste volgorde.

Berichtdoor Koepel » 18 Aug 2019, 15:17

Dankjewel voor de links en de sketch. Er ontbrak nog een link naar je vorige onderwerp ;) : http://arduinoforum.nl/viewtopic.php?f=8&t=3824.

Er staat helaas ook slechte code op internet. Wanneer iemand iets op een forum of op Github.com publiceert, dan kunnen anderen er nog commentaar op geven. Bijvoorbeeld op instructables.com is veel slechte code te vinden.

De manier om met een delay() de tijd bij te houden is een beetje: https://www.youtube.com/watch?v=-W0PReCRg6Y.

Veel Arduino boards hebben een resonator voor de 16MHz, die is niet heel nauwkeurig, maar voor tijdelijk is er mee te werken.
Sommige Arduino clones hebben een crystal, met wat geluk loopt die maar een aantal minuten per jaar verkeerd.
Een chip voor een "Real Time Clock" (RTC) kan minder dan 1 minuut per jaar afwijken, bijvoorbeeld de DS3231.
Regelmatig de tijd van internet ophalen is altijd nauwkeurig. De ESP32 kost 5 euro en kan dat eenvoudig doen. Zie: http://arduinoforum.nl/viewtopic.php?f=18&t=3790.

Kun je eerst beginnen om de tijd net zo nauwkeurig te maken als de 16MHz resonator/crystal ?
Dat kan met millis(). Dit is hoe millis() gebruikt kan worden: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.
En dit is een klok met millis(): https://github.com/Koepel/Fun_with_millis/blob/master/millis_clock.ino.

Alles draait om deze drie regels:
cpp code
if( currentMillis - previousMillis >= interval)
{
previousMillis += interval; // increment with 1 second
seconds++;


Kun je voor de grap eens wat proberen ?
Maak een nieuwe sketch, en vervang de loop() door dit:
cpp code
unsigned long previousMillis;
const unsigned long interval = 1000;

void loop()
{
if( millis() - previousMillis >= interval)
{
previousMillis += interval;

CalculateTime();
ShowTime();

//-------------------------------------Adj Time Value--------------
if (digitalRead(TimeSet) == LOW && digitalRead(Min) == LOW)
{
TimeMinutes1s++;
CalculateTime();
}
if (digitalRead(TimeSet) == LOW && digitalRead(Hour) == LOW)
{
TimeHours1s++;
CalculateTime();
}
//------------------------------------------------------------------
}
}

Ik heb het niet getest.
Als het werkt, dan weet je over een jaar hoeveel het per jaar afwijkt :lol:

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Cijfers klok nu juiste volgorde.

Berichtdoor Hans van Kampen » 18 Aug 2019, 20:10

Dank je wel Koepel, ik ga het allemaal eens bekijken. Voorlopig ben ik al een heel einde.

Vriendelijke groet ;)
Hans

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: iyieeena en 27 gasten