klok probleem

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 46
Geregistreerd: 13 Okt 2016, 22:25

klok probleem

Berichtdoor tijne » 26 Nov 2016, 01:09

beste,

ik begin aardig op weg te komen met me sketch maar me klok doet rare dingen en ik kom er niet uit wat er aan de hand is.

na 12 uur snachts als de klok op 00.00.00 heeft gestaan dat gaat hij bij iedere minut 11 minuten tellen. dus van 9 minutten staat de tijd op 00.99.00 nou heb ik altijd al het idee dat de tijd erg snel gaat maar zo gaat hij wel heel erg snel voor bij.

wie o wie heeft de oplossing voor mij?

Code: Alles selecteren
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"




OneWire ds(2);  // on pin 10


unsigned int settemp = 5.00;
const unsigned int MinTemp = 2.00;
const unsigned int MaxTemp = 30.00;

unsigned long starttime = 0;
unsigned long endtime = 0;
unsigned long vertraging = 10000;

unsigned long starttimeLVa = 0;
unsigned long endtimeLVa = 0;
unsigned long vertragingLVa = 3000;

unsigned long starttimeLVu = 0;
unsigned long endtimeLVu = 0;
unsigned long vertragingLVu = 5000;

unsigned long starttimeLAa = 0;
unsigned long endtimeLAa = 0;
unsigned long vertragingLAa = 3000;

unsigned long starttimeLAu = 0;
unsigned long endtimeLAu = 0;
unsigned long vertragingLAu = 5000;

unsigned int setMenu = 0;
const unsigned int MinMenu = 0;
const unsigned int MaxMenu = 2;

const int buttonPin1 = 45;
const int buttonPin2 = 46;
const int buttonPin3 = 47;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;

const int kachel = 41;
const int compressor = 30;
const int magazijn = 31;
const int werkbank = 32;
const int lichtsensor = 33;
const int buitvoor = 34;
const int buitachter = 35;

String sensortext = ("aan");

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

RTC_Millis rtc;

void setup(void) {

  pinMode(buitvoor, OUTPUT);
  pinMode(buitachter, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(compressor, OUTPUT);
  pinMode(magazijn, OUTPUT);
  pinMode(werkbank, OUTPUT);
  pinMode(kachel, OUTPUT);
  pinMode(lichtsensor, INPUT);
  digitalWrite(kachel, HIGH);
  digitalWrite(compressor, HIGH);
  digitalWrite(magazijn, HIGH);
  digitalWrite(werkbank, HIGH);
  digitalWrite(buitvoor, HIGH);
  digitalWrite(buitachter, HIGH);
  digitalRead(lichtsensor);

  Serial.begin(9600);
  lcd.begin(20, 4);
  rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
  lcd.backlight();
}

void loop(void) {
  DateTime now = rtc.now();

  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  ds.reset_search();
  if ( !ds.search(addr)) {
    // Serial.print("No more addresses.\n");
    ds.reset_search();
    return;
  }


  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);


  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    // Serial.print(data[i], HEX);
    //Serial.print(" ");
  }
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);

  if (millis() >= endtime && starttime != 0) {
    setMenu = 0;
    starttime = 0;
  }

  if (buttonState3 == HIGH) {
    if (starttime == 0) {
      starttime = millis();
      endtime = starttime + vertraging;
      setMenu++;
      lcd.clear();
    }
  }
  if (millis() >= endtimeLVu && digitalRead(lichtsensor) == HIGH) {
    starttimeLVa = 0;
  }
  if (millis() >= endtimeLVa && digitalRead(lichtsensor) == LOW) {
    starttimeLVu = 0;
  }
  if (millis() >= endtimeLAu && digitalRead(lichtsensor) == HIGH) {
    starttimeLAa = 0;
  }
  if (millis() >= endtimeLAa && digitalRead(lichtsensor) == LOW) {
    starttimeLAu = 0;
  }



  if (digitalRead(33) == HIGH) {
    if (starttimeLVa == 0) {
      starttimeLVa = millis();
      endtimeLVa = starttimeLVa + vertragingLVa;
      digitalWrite(buitvoor, LOW);
    }
  }

  if  (digitalRead(33) == LOW) {
    if (starttimeLVu == 0) {
      starttimeLVu = millis();
      endtimeLVu = starttimeLVu + vertragingLVu;
      digitalWrite(buitvoor, HIGH);
    }
  }

  if (digitalRead(33) == HIGH && now.hour() > 6 && now.hour() < 24) {                                              //buitenlicht achter
    if (starttimeLAa == 0) {
      starttimeLAa = millis();
      endtimeLAa = starttimeLAa + vertragingLAa;
      digitalWrite(buitachter, LOW);
    }
  }
  if (digitalRead(33) == LOW) {
    if (starttimeLAu == 0) {
      starttimeLAu = millis();
      endtimeLAu = starttimeLAu + vertragingLAu;
      digitalWrite(buitachter, HIGH);
    }
  }


  if (settemp < MaxTemp && buttonState1 == HIGH) {
    settemp++;
  }
  if (settemp > MinTemp && buttonState2 == HIGH) {
    settemp--;
  }
  if (settemp < (Whole)) {
    digitalWrite(kachel, HIGH);
  }
  if (settemp > (Whole)) {
    digitalWrite(kachel, LOW);
  }



  if (setMenu == 0) {
    if (digitalRead(41)) {
      lcd.setCursor(6, 1);
      lcd.print("uit");
      lcd.setCursor(9, 1);
      lcd.print("  ");
    } else {
      lcd.setCursor(9, 1);
      lcd.print("  ");
      lcd.setCursor(6, 1);
      lcd.print("aan");
    }

    if (digitalRead(30)) {
      digitalWrite(compressor, LOW);
      lcd.setCursor(16, 1);
      lcd.print("  ");
      lcd.setCursor(17, 1);
      lcd.print("aan");
    } else {
      lcd.setCursor(16, 1);
      lcd.print("  ");
      lcd.setCursor(17, 1);
      lcd.print("uit");
    }

    if (digitalRead(31)) {
      digitalWrite(magazijn, LOW);
      lcd.setCursor(6, 2);
      lcd.print("aan");
    } else {
      lcd.setCursor(6, 2);
      lcd.print("uit");
    }

    if (digitalRead(32)) {
      digitalWrite(werkbank, LOW);
      lcd.setCursor(17, 2);
      lcd.print("aan");
    } else {
      lcd.setCursor(17, 2);
      lcd.print("uit");
    }

    lcd.setCursor(0, 1);
    lcd.print("Kach: ");

    lcd.setCursor(11, 1);
    lcd.print("Comp:");

    lcd.setCursor(5, 2);
    lcd.print(" ");
    lcd.setCursor(9, 2);
    lcd.print("  ");
    lcd.setCursor(0, 2);
    lcd.print("Maga:");

    lcd.setCursor(16, 2);
    lcd.print(" ");
    lcd.setCursor(11, 2);
    lcd.print("Werk:");

    lcd.setCursor(0, 0);
    lcd.print("Temp:");

    lcd.setCursor(10, 0);
    lcd.print("c");

    lcd.setCursor(5, 0);
    lcd.print(Whole);

    lcd.setCursor(7, 0);
    lcd.print(",");

    lcd.setCursor(8, 0);
    lcd.print(Fract);

    lcd.setCursor(11, 0);
    lcd.print("tempV:");

    lcd.setCursor(19, 0);
    lcd.print(" ");

    if (settemp < 10) {
      lcd.setCursor(17, 0);
      lcd.print("0");
      lcd.setCursor(18, 0);
      lcd.print(settemp);
    } else {
      lcd.setCursor(17, 0);
      lcd.print(settemp);
    }

    lcd.setCursor(19, 0);
    lcd.print("c");

    if (now.hour() < 10) {
      lcd.setCursor(0, 3);
      lcd.print("0");
      lcd.setCursor(1, 3);
      lcd.print(now.hour(), DEC);
    } else {
      lcd.setCursor(0, 3);
      lcd.print(now.hour(), DEC);
    }
    lcd.setCursor(2, 3);
    lcd.print(":");

    if (now.minute() < 10) {
      lcd.setCursor(3, 3);
      lcd.print("0");
      lcd.setCursor(4, 3);
      lcd.print(now.minute(), DEC);
    } else {
      lcd.setCursor(3, 3);
      lcd.print(now.minute(), DEC);
    }

    lcd.setCursor(3, 3);
    lcd.print(now.minute(), DEC);

    lcd.setCursor(5, 3);
    lcd.print(":");

    if (now.second() < 10) {
      lcd.setCursor(6, 3);
      lcd.print("0");
      lcd.setCursor(7, 3);
      lcd.print(now.second(), DEC);
    } else {
      lcd.setCursor(6, 3);
      lcd.print(now.second(), DEC);
    }

    lcd.setCursor(10, 3);
    lcd.print(now.day(), DEC);

    lcd.setCursor(12, 3);
    lcd.print("-");

    lcd.setCursor(13, 3);
    lcd.print(now.month(), DEC);

    lcd.setCursor(15, 3);
    lcd.print("-");

    lcd.setCursor(16, 3);
    lcd.print(now.year(), DEC);
  }


  if (setMenu == 1) {

    lcd.setCursor(0, 0);
    lcd.print("Lichtsensor:");

    lcd.setCursor(15, 0);
    if  (digitalRead (33)) {
      lcd.print("aan");
    }
    else {
      lcd.print("uit") ;
    }

    lcd.setCursor(0, 1);
    lcd.print("Buiten Voor:");

    lcd.setCursor(15, 1);
    if  (digitalRead (34)) {
      lcd.print("uit");
    }
    else {
      lcd.print("aan") ;
    }

    lcd.setCursor(0, 2);
    lcd.print("Buiten achter:");

    lcd.setCursor(15, 2);
    if  (digitalRead (35)) {
      lcd.print("uit");
    }
    else {
      lcd.print("aan");
    }

  }

}


alvast bedankt.

gr martijn

Advertisement

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

Re: klok probleem

Berichtdoor Koepel » 26 Nov 2016, 01:51

Je kunt de tijd naar de seriële monitor dumpen, dan zul je zien dat de tijd in de seriële monitor wel goed is.

Eerlijk gezegd begon ik een beetje aan mezelf te twijfelen, omdat ik niet meteen zag wie dat extra cijfer verstuurt. Jij ziet de tijd met 11 minuten verspringen, maar ik zie een extra cijfer als de minuten kleiner dan 10 zijn.
Gelukkig kan ik met een gerust hart gaan slapen, want deze twee regels staan er nog eens extra bij nadat de minuten correct op het display zijn gezet. Deze extra regels kunnen weg:
Code: Alles selecteren
    lcd.setCursor(3, 3);
    lcd.print(now.minute(), DEC);


Om millis() goed te laten werken, mag je geen waarde in de toekomst berekenen.
Je mag alleen het huidige moment onthouden.
Bijvoorbeeld hier met 'endtimeLVa' :
Code: Alles selecteren
      starttimeLVa = millis();
      endtimeLVa = starttimeLVa + vertragingLVa;

Het huidige moment onthouden met starttimeLVa is okay, maar daar mag je de vertraging niet bij optellen.

Je gebruikt het opvragen van de tijd meerdere keren. Dat tijd kan intussen verder zijn.
Bijvoorbeeld hier kan de tweede now.second() een seconde verder zijn:
Code: Alles selecteren
   if (now.second() < 10) {
      lcd.setCursor(6, 3);
      lcd.print("0");
      lcd.setCursor(7, 3);
      lcd.print(now.second(), DEC);
    } else {
      lcd.setCursor(6, 3);
      lcd.print(now.second(), DEC);
    }

Maar ook bij de tijd opvragen voor minuten, en dan even later voor seconden, dan kan intussen de minuten verder gesprongen zijn.
Eigenlijk kun je maar één keer de tijd vragen, en die ene tijd en datum afdrukken.

Je gebruikt de starttijd als een vlag (niet nul is aktief) en om de millis() te onthouden. Dat zijn nog steeds twee dingen die niet in dezelfde variabele kunnen.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten