Hulp gevraagd met klok

IDE gerelateerde berichten
Berichten: 15
Geregistreerd: 29 Sep 2013, 00:36

Hulp gevraagd met klok

Berichtdoor donleo2001 » 22 Jul 2015, 23:35

Hallo allemaal,

Ik heb een vraag.
Ik ben een wakeup light / wekker aan het bouwen.

Hardware is voor mij geen probleem maar programmeren wel en toch wil ik het :-)

Ik gebruik het voorbeeld van Jeroen op DFrobot.
Hij werkt goed alleen de interne clock van Arduino loopt in een dag al 6 min achter.
Nu heb ik een RTC1307 gekocht en wil deze gebruiken.
Is er iemand die me kan vertellen wat te doen?
Ik ben nu al 2 weken aan het zoeken op Internet en alles aan het proberen maar lukt niet.
Ik voeg hier de code bij.

#include <Wire.h>
#include <Time.h>
#include <LiquidCrystal_I2C.h>
#include <AlarmController.h>
#include <AlarmSettings.h>
#include <Bounce.h>
#include <Alarm.h>

const uint8_t snoozePin = 2; //Purple
const uint8_t leftPin = 3; //Green
const uint8_t rightPin = 4; //Brown
const uint8_t upPin = 5; //Blue
const uint8_t downPin = 6; //Orange
const uint8_t okPin = 8; //Yellow
const uint8_t cancelPin = 8; //Grey
const uint8_t ledPin = 9; //White

const uint8_t buzzerPin = 13;

const uint8_t bounceDelay = 8;

double fadeValue = 0.0;
unsigned long timeStart = 0;
unsigned long timeHigh = 0;
unsigned long timeOn = 0;
unsigned long timeOnPrev = 0;
unsigned long buzzerStart = 0;
// x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
const int buzzerP[] = {150,2000,150,2000,150,2000,150,2000,150,80,150,2000,150,80,150,2000,150,80,150,80,150,2000,150,80,150,80,150,2000,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,80,150,1000};
const int buzzerPL = 64;
const uint8_t buzzerL = 54;
int buzzerPI = 0;

AlarmSettings set;
LiquidCrystal_I2C lcd(0x27,16,2);

AlarmController ac(&set,&lcd,ledPin);

Bounce btnLeft = Bounce(leftPin,bounceDelay);
Bounce btnRight = Bounce(rightPin,bounceDelay);
Bounce btnUp = Bounce(upPin,bounceDelay);
Bounce btnDown = Bounce(downPin,bounceDelay);
Bounce btnOK = Bounce(okPin,bounceDelay);
Bounce btnCancel = Bounce(cancelPin,bounceDelay);
Bounce btnSnooze = Bounce(snoozePin,bounceDelay);

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(snoozePin, INPUT);
pinMode(leftPin, INPUT);
pinMode(rightPin, INPUT);
pinMode(upPin, INPUT);
pinMode(downPin, INPUT);
pinMode(okPin, INPUT);
pinMode(cancelPin, INPUT);
pinMode(buzzerPin, OUTPUT);
timeStart = millis();
timeOn = millis();
timeOnPrev = timeOn;
lcd.init();
lcd.setBacklight(1);
lcd.home();

lcd.print(F("setup "));

uint8_t ledOff[8] = {0b00000,
0b00000,
0b00000,
0b00000,
0b00100,
0b01110,
0b01110,
0b01110 };
uint8_t ledOn[8] = {0b00100,
0b10101,
0b10101,
0b00000,
0b00100,
0b01110,
0b01110,
0b01110 };

uint8_t checkbox1[8] = {0b00000,
0b11111,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111,
0b00000 };

uint8_t checkbox2[8] = {0b00000,
0b11111,
0b10001,
0b10101,
0b10101,
0b10001,
0b11111,
0b00000 };

lcd.createChar(0b00000, ledOff);
lcd.createChar(0b00001, ledOn);

lcd.createChar(0b00010, checkbox1);
lcd.createChar(0b00011, checkbox2);

digitalWrite(buzzerPin, LOW);
analogWrite(ledPin, 0);

ac.setMakeLight(analogWrite);
}

void loop() {
//update time
timeOn = millis();
if(timeOn<timeOnPrev) { //overflow!!
set.getTime()->addMillis((4294967295ul - timeOnPrev) + timeOn);
}
else{
set.getTime()->addMillis(timeOn - timeOnPrev);
}
timeOnPrev = timeOn;

//update AlarmState
ac.checkAlarmState();

//make noise?
if(ac.mustMakeNoise()) {
if(buzzerPI % 2 == 0) {
digitalWrite(buzzerPin, HIGH);
}
else {
digitalWrite(buzzerPin, LOW);
}
if(abs(millis() - buzzerStart) > buzzerP[buzzerPI]) {
buzzerPI++;
if(buzzerPI == buzzerPL)
buzzerPI = buzzerL;
buzzerStart = millis();
}
}
else {
buzzerPI = 0;
digitalWrite(buzzerPin, LOW);
}

//update LCD
ac.printLCD();

//check snooze-button
btnSnooze.update();
if(btnSnooze.risingEdge()) {
ac.doSnooze();
if(ac.getAlarmState() == 0) {
timeStart = millis();
btnSnooze.update();
ac.printLCD();
fadeValue = 0.0;
analogWrite(ledPin,round(fadeValue));
while(btnSnooze.read() == HIGH) {
if(abs(millis() - timeStart) > 600) {
//fadeValue += 15;
fadeValue += (fadeValue / 600) + 1;
if(fadeValue > 255) {
fadeValue = 255.0;
}
analogWrite(ledPin,round(fadeValue));
delay(10);
}
btnSnooze.update();
}
}
}

//Check other buttons
btnLeft.update();
btnRight.update();
btnUp.update();
btnDown.update();
btnOK.update();
btnCancel.update();

if(btnOK.risingEdge()) {
ac.doOK();
}
else if(btnCancel.risingEdge()) {
ac.doCancel();
}
else if(btnLeft.risingEdge()) {
ac.doLeft();
}
else if(btnLeft.fallingEdge()) {
ac.endLeft();
}
else if(btnRight.risingEdge()) {
ac.doRight();
}
else if(btnRight.fallingEdge()) {
ac.endRight();
}
else if(btnUp.risingEdge()) {
ac.doUp();
btnUp.update();
timeStart = millis();
ac.printLCD();
while(btnUp.read() == HIGH) {
if(abs(millis() - timeStart) > 800) {
ac.doUp();
ac.printLCD();
delay(140);
}
btnUp.update();
}
}
else if(btnDown.risingEdge()) {
ac.doDown();
btnUp.update();
timeStart = millis();
ac.printLCD();
while(btnDown.read() == HIGH) {
if(abs(millis() - timeStart) > 800) {
ac.doDown();
ac.printLCD();
delay(140);
}
btnDown.update();
}
}

}

Ik heb de library 1307 op alle fronten geprobeerd te implementeren maar lukt niet

IK zou erg blij zijn met hulp.

Groet
Leo

Advertisement

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

Re: Hulp gevraagd met klok

Berichtdoor shooter » 23 Jul 2015, 10:40

Schrijf eerst maar eens een simpel programma met die library, en een simpel serial.print dan kun je kijken wat er zou moeten gebeuren. er staat nergens in je programma een declaratie naar Time.
zie verder op http://playground.arduino.cc/code/time
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hulp gevraagd met klok

Berichtdoor nicoverduin » 23 Jul 2015, 17:59

Om de code wat leesbaarder hier neer te zetten moet je even dit lezen : viewtopic.php?f=16&t=903

Dan komt de code er zo uit te zien:

cpp code
#include <Wire.h>
#include <Time.h>
#include <LiquidCrystal_I2C.h>
#include <AlarmController.h>
#include <AlarmSettings.h>
#include <Bounce.h>
#include <Alarm.h>

const uint8_t snoozePin = 2; //Purple
const uint8_t leftPin = 3; //Green
const uint8_t rightPin = 4; //Brown
const uint8_t upPin = 5; //Blue
const uint8_t downPin = 6; //Orange
const uint8_t okPin = 8; //Yellow
const uint8_t cancelPin = 8; //Grey
const uint8_t ledPin = 9; //White

const uint8_t buzzerPin = 13;

const uint8_t bounceDelay = 8;

double fadeValue = 0.0;
unsigned long timeStart = 0;
unsigned long timeHigh = 0;
unsigned long timeOn = 0;
unsigned long timeOnPrev = 0;
unsigned long buzzerStart = 0;
// x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
const int buzzerP[] = { 150, 2000, 150, 2000, 150, 2000, 150, 2000, 150, 80,
150, 2000, 150, 80, 150, 2000, 150, 80, 150, 80, 150, 2000, 150, 80,
150, 80, 150, 2000, 150, 80, 150, 80, 150, 80, 150, 2000, 150, 80, 150,
80, 150, 80, 150, 2000, 150, 80, 150, 80, 150, 80, 150, 80, 150, 2000,
150, 80, 150, 80, 150, 80, 150, 80, 150, 1000 };
const int buzzerPL = 64;
const uint8_t buzzerL = 54;
int buzzerPI = 0;

AlarmSettings set;
LiquidCrystal_I2C lcd(0x27, 16, 2);

AlarmController ac(&set, &lcd, ledPin);

Bounce btnLeft = Bounce(leftPin, bounceDelay);
Bounce btnRight = Bounce(rightPin, bounceDelay);
Bounce btnUp = Bounce(upPin, bounceDelay);
Bounce btnDown = Bounce(downPin, bounceDelay);
Bounce btnOK = Bounce(okPin, bounceDelay);
Bounce btnCancel = Bounce(cancelPin, bounceDelay);
Bounce btnSnooze = Bounce(snoozePin, bounceDelay);

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(snoozePin, INPUT);
pinMode(leftPin, INPUT);
pinMode(rightPin, INPUT);
pinMode(upPin, INPUT);
pinMode(downPin, INPUT);
pinMode(okPin, INPUT);
pinMode(cancelPin, INPUT);
pinMode(buzzerPin, OUTPUT);
timeStart = millis();
timeOn = millis();
timeOnPrev = timeOn;
lcd.init();
lcd.setBacklight(1);
lcd.home();

lcd.print(F("setup "));

uint8_t ledOff[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b01110,
0b01110, 0b01110 };
uint8_t ledOn[8] = { 0b00100, 0b10101, 0b10101, 0b00000, 0b00100, 0b01110,
0b01110, 0b01110 };

uint8_t checkbox1[8] = { 0b00000, 0b11111, 0b10001, 0b10001, 0b10001,
0b10001, 0b11111, 0b00000 };

uint8_t checkbox2[8] = { 0b00000, 0b11111, 0b10001, 0b10101, 0b10101,
0b10001, 0b11111, 0b00000 };

lcd.createChar(0b00000, ledOff);
lcd.createChar(0b00001, ledOn);

lcd.createChar(0b00010, checkbox1);
lcd.createChar(0b00011, checkbox2);

digitalWrite(buzzerPin, LOW);
analogWrite(ledPin, 0);

ac.setMakeLight(analogWrite);
}

void loop() {
//update time
timeOn = millis();
if (timeOn < timeOnPrev) { //overflow!!
set.getTime()->addMillis((4294967295ul - timeOnPrev) + timeOn);
} else {
set.getTime()->addMillis(timeOn - timeOnPrev);
}
timeOnPrev = timeOn;

//update AlarmState
ac.checkAlarmState();

//make noise?
if (ac.mustMakeNoise()) {
if (buzzerPI % 2 == 0) {
digitalWrite(buzzerPin, HIGH);
} else {
digitalWrite(buzzerPin, LOW);
}
if (abs(millis() - buzzerStart) > buzzerP[buzzerPI]) {
buzzerPI++;
if (buzzerPI == buzzerPL)
buzzerPI = buzzerL;
buzzerStart = millis();
}
} else {
buzzerPI = 0;
digitalWrite(buzzerPin, LOW);
}

//update LCD
ac.printLCD();

//check snooze-button
btnSnooze.update();
if (btnSnooze.risingEdge()) {
ac.doSnooze();
if (ac.getAlarmState() == 0) {
timeStart = millis();
btnSnooze.update();
ac.printLCD();
fadeValue = 0.0;
analogWrite(ledPin, round(fadeValue));
while (btnSnooze.read() == HIGH) {
if (abs(millis() - timeStart) > 600) {
//fadeValue += 15;
fadeValue += (fadeValue / 600) + 1;
if (fadeValue > 255) {
fadeValue = 255.0;
}
analogWrite(ledPin, round(fadeValue));
delay(10);
}
btnSnooze.update();
}
}
}

//Check other buttons
btnLeft.update();
btnRight.update();
btnUp.update();
btnDown.update();
btnOK.update();
btnCancel.update();

if (btnOK.risingEdge()) {
ac.doOK();
} else if (btnCancel.risingEdge()) {
ac.doCancel();
} else if (btnLeft.risingEdge()) {
ac.doLeft();
} else if (btnLeft.fallingEdge()) {
ac.endLeft();
} else if (btnRight.risingEdge()) {
ac.doRight();
} else if (btnRight.fallingEdge()) {
ac.endRight();
} else if (btnUp.risingEdge()) {
ac.doUp();
btnUp.update();
timeStart = millis();
ac.printLCD();
while (btnUp.read() == HIGH) {
if (abs(millis() - timeStart) > 800) {
ac.doUp();
ac.printLCD();
delay(140);
}
btnUp.update();
}
} else if (btnDown.risingEdge()) {
ac.doDown();
btnUp.update();
timeStart = millis();
ac.printLCD();
while (btnDown.read() == HIGH) {
if (abs(millis() - timeStart) > 800) {
ac.doDown();
ac.printLCD();
delay(140);
}
btnDown.update();
}
}

}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 15
Geregistreerd: 29 Sep 2013, 00:36

Re: Hulp gevraagd met klok

Berichtdoor donleo2001 » 24 Jul 2015, 22:21

Bedankt, Ik ga hier niet uitkomen.
Ik had gehoopt dat iemand wist hoe je een rtc er bij kon plaatsen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hulp gevraagd met klok

Berichtdoor nicoverduin » 24 Jul 2015, 22:30

Misschien is het handiger om eerst te leren hoe die RTC werkt. Dus een sketch te maken die alleen met de RTC werkt. Dan krijg je het in je vingers.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 15
Geregistreerd: 29 Sep 2013, 00:36

Re: Hulp gevraagd met klok

Berichtdoor donleo2001 » 24 Jul 2015, 23:33

Ja ik begrijp dat dat de juiste stappen zijn Nico.
Maar ik heb een ernstig concentratie probleem dus ik leer er niets van.
Ik heb ook een sketch gedownload voor een klok dat werkt prima.
Maar zelf iets maken of aanpassen software matig is net te doen.
Ik vind het leuk om iets kant en klaar te bouwen maar aanpassen gaat niet.
Bedankt voor je hulp , ik hoor je denken wt doe je hier dan :-)
Ik had gehoopt dat het met een eenvoudige aanpassing kon.

In ieder geval bedankt voor je inzet
Groet
leo

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

Re: Hulp gevraagd met klok

Berichtdoor shooter » 25 Jul 2015, 10:45

ja het kan ook wel met wat simpele handelingen:
copieer wat boven setup staat in je totaal programma
dan alles wat tussen de {} staat van setup
(zet er even bij met // wat het is.
en hetzelfde voor de loop dingen
en natuurlijk ook de diverse functies die onder de loop staan.
dan is het de kunst van programmeren om de goede variabelen te vullen met de juiste waarden uit de functies.

je moet dus iets doen om timeon met de goede waarde te vullen(dat worden dus geen millis maar seconden.
als jij dus een concentratieprobleem hebt, is het veel handiger als je zelf het programma schrijft, en natuurlijk veel commentaar erin, dus je drukt het voorbeeld af en dan begin je heel simpel met overtypen wat je snapt, en telkens proberen wat er gebeurt.
Een groot programma zoals jij nu laat zien, is voor ons ervaren gasten, ook heel erg moeilijk te volgen.
dus ga uit van dat rtc programma en bouw daar 1 drukknop bij, kijk of dat werkt en dan de volgende.
paul deelen
shooter@home.nl

Berichten: 15
Geregistreerd: 29 Sep 2013, 00:36

Re: Hulp gevraagd met klok

Berichtdoor donleo2001 » 25 Jul 2015, 16:03

Ok Paul tnx ik ga het proberen.
Bedankt

groet
Leo

Gebruikers-avatar
Berichten: 26
Geregistreerd: 22 Dec 2015, 13:40
Woonplaats: Zandvoort

Re: Hulp gevraagd met klok

Berichtdoor marc verlooy » 04 Feb 2016, 12:53

Ik ken dat gedoe met tijdmeting en Arduino die niet gelijk loopt... heb het popgelost door een GPS-module op m'n Arduino aan te sluiten. Zo loopt je klok ook bij zomer- en wintertijdwisselingen correct!

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten