Klokje loopt niet door op batterij
9 berichten
• Pagina 1 van 1
- spaansebrabander
- Berichten: 76
- Geregistreerd: 05 Nov 2016, 09:42
Klokje loopt niet door op batterij
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
Re: Klokje loopt niet door op batterij
wat is het programma? en hoe komt de arduino aan de upload tijd?
paul deelen
shooter@home.nl
shooter@home.nl
- spaansebrabander
- Berichten: 76
- Geregistreerd: 05 Nov 2016, 09:42
Re: Klokje loopt niet door op batterij
#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);
}
#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);
}
Re: Klokje loopt niet door op batterij
In setup() roep je de functie setDateTime() aan, die de tijd van de DS1307 gaat zetten op 21:31 27 januari 2017.
- Gij Kieken
-
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Klokje loopt niet door op batterij
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();
Re: Klokje loopt niet door op batterij
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.
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
shooter@home.nl
- spaansebrabander
- Berichten: 76
- Geregistreerd: 05 Nov 2016, 09:42
Re: Klokje loopt niet door op batterij
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);
}
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);
}
Re: Klokje loopt niet door op batterij
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.
Re: Klokje loopt niet door op batterij
maak alle teksten even lang want anders blijven er tekens staan.
of je moet lcd.clear gebruiken, maar dan gaat het scherm knipperen.
of je moet lcd.clear gebruiken, maar dan gaat het scherm knipperen.
paul deelen
shooter@home.nl
shooter@home.nl
9 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten