Klokje loopt niet door op batterij

algemene C code
Berichten: 76
Geregistreerd: 05 Nov 2016, 09:42

Klokje loopt niet door op batterij

Berichtdoor spaansebrabander » 27 Jan 2017, 12:46

Ik ben al enige tijd bezig met een RTC klokje (1307). Het werkte, ik uploade eerst de sketch met de actuele tijd, daarna de sketch met de display en dan kreeg ik iets van 11:58:55 en de volgende regel 20-06-2017. Ik wilde iets hebben als "vrijdag, 11:30" en de volgende regel "27 januari 2017". Tenslotte is me dat gelukt met één sketch. Ik maakte me op om de sketch wat te verfraaien en netjes te maken. Toen bleek dat als ik de arduino losmaakte van de pc en weer verbond, niet de actuele waardes worden weergegeven, maar de waardes van het tijdstip van uploaden. Blijkbaar gaat hier iets fout en worden de waardes opnieuw ingelezen. Wat mis ik?

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klokje loopt niet door op batterij

Berichtdoor shooter » 27 Jan 2017, 20:23

wat is het programma? en hoe komt de arduino aan de upload tijd?
paul deelen
shooter@home.nl

Berichten: 76
Geregistreerd: 05 Nov 2016, 09:42

Re: Klokje loopt niet door op batterij

Berichtdoor spaansebrabander » 28 Jan 2017, 01:00

#include "Wire.h"
#include "RTClib.h"
#include<LiquidCrystal_I2C.h>
//#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround voor melding #527//?
LiquidCrystal_I2C lcd(0x3F, 16, 2);
RTC_DS1307 RTC;

void setup() {
Wire.begin(); //Voor I2C protocol
// Serial.begin(9600);//Start de seriële communicatie
RTC.begin();
lcd.backlight();
lcd.init();
setDateTime(); //Dit is een aanroep naar de functie setDateTime();
lcd.begin(16,2);
if(!RTC.isrunning()){
Serial.println("RTC is not Running");
RTC.adjust(DateTime(__DATE__,__TIME__));
}
}

void loop() {
printDate();//Aanroep naar functie printDate()
delay(1000);//1000 mS = 1 seconde pauzeren
}

void setDateTime() {

byte second = 0; //0-59
byte minute = 31; //0-59
byte hour = 21; //0-23
byte weekDay = 6; //1-7 (zondag =1, maandag=2, enz)
byte monthDay = 27; //1-31
byte month = 1; //1-12
byte year = 17; //0-99

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator

Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));

Wire.write(zero); //start

Wire.endTransmission();

}

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

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

void printDate() {

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //1-7 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

lcd.setCursor(0, 0); // Bovenste regel display, dus zaterdag etc

if (weekDay == 1) { // Dag van de week
lcd.print("Zondag,");
}
else {
if (weekDay == 2) {
lcd.print("Maandag,");
}
else {
if (weekDay == 3) {
lcd.print("Dinsdag,");
}
else {
if (weekDay == 4) {
lcd.print("Woensdag,");
}
else {
if (weekDay == 5) {
lcd.print("Donderdag,");
}
else {
if (weekDay == 6) {
lcd.print("Vrijdag,");
}
else {
if (weekDay == 7) {
lcd.print("Zaterdag,");
}
}
}
}
}
}
}
lcd.print(hour); // 1e regel display, uur
lcd.print(":");
if (minute <= 9) {
lcd.print("0");
}
lcd.print(minute); // 1e regel display, minuten

lcd.setCursor(0, 1); // Begin tweede regel display
lcd.print(monthDay); // de datum dus bv 1, 10, 28 etc
if (month == 1) {
lcd.print("januari,"); // maand van het jaar
}
else {
if (month == 2) {
lcd.print("februari,");
}
else {
if (month == 3) {
lcd.print("maart,");
}
else {
if (month == 4) {
lcd.print("april,");
}
else {
if (month == 5) {
lcd.print("mei,");
}
else {
if (month == 6) {
lcd.print("juni,");
}
else {
if (month == 7) {
lcd.print("juli,");
}
else {
if (month == 8) {
lcd.print("augustus,");
}
else {
if (month == 9) {
lcd.print("september,");
}
else {
if (month == 10) {
lcd.print("oktober,");
}
else {
if (month == 11) {
lcd.print("november,");
}
else {
if (month == 12) {
lcd.print("december,");
}
}
}
}
}
}
}
}
}
}
}
}
lcd.print(" 20"); // 20 van 2017
lcd.print(year); // 17 van 2017
// lcd.print(":"); //seconden uitgezet (kunnen voor testen weer aangezet
// if (second <=9){ lcd.print("0");}
// lcd.print(second);


}

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

Re: Klokje loopt niet door op batterij

Berichtdoor Koepel » 28 Jan 2017, 01:34

In setup() roep je de functie setDateTime() aan, die de tijd van de DS1307 gaat zetten op 21:31 27 januari 2017.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Klokje loopt niet door op batterij

Berichtdoor Gij Kieken » 28 Jan 2017, 12:18

Koepel schreef:In setup() roep je de functie setDateTime() aan, die de tijd van de DS1307 gaat zetten op 21:31 27 januari 2017.

Maak er dit van in Setup.
//setDateTime(); //Dit is een aanroep naar de functie setDateTime();

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klokje loopt niet door op batterij

Berichtdoor shooter » 28 Jan 2017, 20:07

omdat je eigenlijk maar een keer die klok te zetten dus die setclock kun je er helemaal uithalen en in een apart pro zetten.
en als de tijd niet meer goed staat dan draai je dat progje even
later kun je via de serial input eventueel gelijk zetten in je normale programma.

je moet overigens in de gaten houden dat als je de usb aansluit de arduino reset, net zoals trouwens als je de voeding aansluit en dan wordt dus gewoon bovenaan begonnen dus ook de setup.
paul deelen
shooter@home.nl

Berichten: 76
Geregistreerd: 05 Nov 2016, 09:42

Re: Klokje loopt niet door op batterij

Berichtdoor spaansebrabander » 28 Jan 2017, 23:11

Mede dank zij SHooter ben ik er uit. Probleem was dat de regel:

setDateTime(); //Dit is een aanroep naar de functie setDateTime();let op let op let op let op l

Als je de spanning van de arduino haalt en deze weer aanzet, dan stelde deze regel de beginwaardes weer in in plaats van de werkelijke waardes..
De truuk is dus uploaden met de juiste waarden, vervolgens // voor setDateTime() te zetten en DIT WEER UP TE LOADEN, dan is het goed
Hier is de volledige code. Waarschijnlijk staat er nog te veel in, dan hoor ik dat graag.
Allemaal heel hartelijk bedankt!!!!!

#include "Wire.h"
#include "RTClib.h"
#include<LiquidCrystal_I2C.h>
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround voor melding #527//?
LiquidCrystal_I2C lcd(0x3F, 16, 2);
RTC_DS1307 RTC;

void setup() {
Wire.begin(); //Voor I2C protocol
RTC.begin();
lcd.backlight();
lcd.init();
lcd.begin(16, 2);
// setDateTime(); //Dit is een aanroep naar de functie setDateTime();let op let op let op let op let op let op

if(!RTC.isrunning()){
Serial.println("RTC is not Running");
RTC.adjust(DateTime(__DATE__,__TIME__));
}
}

void loop() {
printDate();//Aanroep naar functie printDate()
delay(1000);//1000 mS = 1 seconde pauzeren
}

void setDateTime() {
byte second = 0; //0-59
byte minute = 41; //0-59
byte hour = 21; //0-23
byte weekDay = 7; //1-7 (zondag =1, maandag=2, enz)
byte monthDay = 28; //1-31
byte month = 1; //1-12
byte year = 17; //0-99

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator

Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));

Wire.write(zero); //start

Wire.endTransmission();

}

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

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

void printDate() {

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //1-7 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
lcd.setCursor(0, 0);
switch (weekDay) {
case 1: lcd.print("Zondag ");
break;
case 2: lcd.print("Maandag ");
break;
case 3: lcd.print("Dinsdag ");
break;
case 4: lcd.print("Woensdag ");
break;
case 5: lcd.print("Donderdag ");
break;
case 6: lcd.print("Vrijdag ");
break;
case 7: lcd.print("Zaterdag ");
break;
}
lcd.print(hour);
lcd.print(":");
if (minute <= 9) {
lcd.print("0");
}
lcd.print(minute);

// if (second <= 9) {
// lcd.print("0");
// }
// lcd.print (second);

lcd.setCursor(0, 1);
lcd.print(monthDay);
switch (month) {
case 1: lcd.print(" januari");
break;
case 2: lcd.print(" februari");
break;
case 3: lcd.print(" maart");
break;
case 4: lcd.print(" april");
break;
case 5: lcd.print(" mei");
break;
case 6: lcd.print(" juni");
break;
case 7: lcd.print(" juli");
break;
case 8: lcd.print(" augustus");
break;
case 9: lcd.print(" september");
break;
case 10: lcd.print(" oktober");
break;
case 11: lcd.print(" november");
break;
case 12: lcd.print(" december");
break;
}

lcd.print(" 20");
lcd.print(year);
}

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

Re: Klokje loopt niet door op batterij

Berichtdoor Koepel » 29 Jan 2017, 00:11

De switch-case voor de maanden en de dagen van de week ziet er zo veel beter uit. Ik zou nog een stapje verder gaan en ze in een tabel zetten. Probeer je de volgende keer "code tags" te gebruiken ? Dan ziet het er netter als code uit.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klokje loopt niet door op batterij

Berichtdoor shooter » 30 Jan 2017, 13:48

maak alle teksten even lang want anders blijven er tekens staan.
of je moet lcd.clear gebruiken, maar dan gaat het scherm knipperen.
paul deelen
shooter@home.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten