Arduino klok, gemaakt met flipperkasttellers.

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 10 Feb 2017, 23:10

Hallo Paul,

Dankje voor je reactie, idd. de aanpassing ivoor zomer/wintertijd is volgens het Sakamoto algoritme.
De delay verlengen voor het bekrachtigen van de solenoid is idd. nodig omdat bij één van de klokken de teller soms blijft hangen.

De 175 in een variabele plaatsen, is dat om geheugenruimte te besparen? Zover had ik nl. nog niet gedacht.

Advertisement

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

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor shooter » 10 Feb 2017, 23:32

een variabele is inderdaad voor geheugenbesparing, maar ook dat je maar op een plek iets hoeft te veranderen.
soms is een antikleefplaatje of een vijl, een goede om afvallen te verbeteren.
meestal zijn die grote spoelen AC, want die hebben hebben geen restmagnetisme.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 23 Feb 2017, 23:41

Hoi Paul,

Ik heb een routine gemaakt voor de daylightsaving van de klok, de mogelijkheid om 'm uit te proberen had ik niet.
ik krijg steeds een foutmelding: exit status 1 lvalue required as left operand of assignment .

via Google kwam ik tegen dat het een Stack Overflow betekend, hoe kan hiermee het geheugen nou vollopen? :shock:

Code: Alles selecteren
//************************************************ zomer/winter ************************************************
void zwt() {
  rtc.getTimeStr();
  ddag = rtc.getDateStr();
  dag = ddag.substring(8, 9);
  dagg = dag.toInt();
  if (rtc.getMonthStr() = 3) & dagg > 25 & dagg < 31) & zt = 0 {
    else if (uur1 = 0 & uur2 = 2 & min1 = 0 & min2 = 0) {
      rtc.setTime(3, 0, 0);
      NullPos();
      readTime();
      tijdZetten();
      zt = 1
    }

  }
  if (rtc.getMonthStr() = 3) & dagg > 25 & dagg < 31) & zt = 1 {
    else if (uur1 = 0 & uur2 = 2 & min1 = 0 & min2 = 0) {
      rtc.setTime(1, 0, 0);
      NullPos();
      readTime();
      tijdZetten();
      zt = 0;
    }

  }

}

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

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Koepel » 24 Feb 2017, 00:55

"zt = 1", daar moet een ';' achter.

Een 'EN' in een if-statement is met twee '&&'. Dat zijn er een stuk of 12.
Een 'OF' in een if-statement is met twee '||'. Dat bedoel je misschien met de 'else if' ?
Een 'IS GELIJK AAN' in een if-statement is met twee '=='. Dat is ook een stuk of 12 keer.

De structure van de if-statements klopt niet. De '(' en ')' komen niet overeen.


Wanneer je code schrijft, probeer dan code te schrijven die zo duidelijk mogelijk is. Laat de compiler het maar optimaliseren. Je hebt nu code die zo'n kluwen is, dat er niet meer uit te halen is wat de oorspronkelijke bedoeling was.

Misschien was dit de bedoeling ? (ik geef het 0% kans dat je dit bedoelde):
Code: Alles selecteren
  if (((rtc.getMonth() == 3) && dagg > 25 && dagg < 31 && zt == 0) ||
    (uur1 == 0 && uur2 == 2 && min1 == 0 && min2 == 0))
  {
    rtc.setTime(3, 0, 0);
    NullPos();
    readTime();
    tijdZetten();
    zt = 1;
  }

Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 24 Feb 2017, 10:50

Hallo Koepel,

Bedankt voor je reactie.
De haakjes klopten idd. niet, 'else if ' zou hetzelfde als 'and' moeten zijn, maar ik kan alles natuurlijk ook in de eerste voorwaarde proppen.
Vanavond ga ik er mee aan de gang en laat ik wel even weten of het werkt.

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

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor shooter » 24 Feb 2017, 11:24

ja die 175 is en voor geheugen, maar als je het boven aan zet, dan hoef je maar op 1 plaats te veranderen, ipv dat je het hele programma moet doorworstelen om een setting te veranderen.
en het is inderdad een stack overflow, maar dat komt omdat de regel niet behandelt kan worden, dus de compiler blijft doorlezen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 25 Feb 2017, 10:09

Hallo Paul,

Ik had al een geintje aangebracht, met een potmeter kan ik nl. het geluid harder en zachter zetten wanneer de hele uren ten gehore worden gegeven. Gewoonweg een analoge ingang gebruikt met een spanningsdeler er aan.
Met delaytime voor de tellers ben ik zuinig geweest om de gang er in te houden bij het aanzetten, maar dat is natuurlijk niet noodzakelijk. Inmiddels met een variabele aangepast, nu worstel ik nog even met de zomer/wintertijd.

Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 25 Feb 2017, 11:21

De zomer/wintertijd routine werkt al is het niet zo fraai bedacht het scheelde wel een paar regels.

Code: Alles selecteren
//************************************************ zomer/winter ************************************************
void zwt() {

  readTime();
  rtc.getTimeStr();
  ddag = rtc.getDateStr();
  dag = ddag.substring(0, 2);
  dagg = dag.toInt();

  //********************** maart *******************

  if (rtc.getMonthStr() == "March" && rtc.getDOWStr() == "Sunday" && dagg > 25 && dagg < 31 && zt == 0 && uur1 == 0 && uur2 == 2 && min1 == 0 && min2 == 0) {

    rtc.setTime(3, 0, 0);
    setup();
    zt = 1;
  }

  //********************** oktober *******************

  if (rtc.getMonthStr() == "October" && rtc.getDOWStr() == "Sunday" && dagg > 25 && dagg < 31 && zt == 1 && uur1 == 0 && uur2 == 2 && min1 == 0 && min2 == 0) {

    rtc.setTime(1, 0, 0);
    setup();
    zt = 0;
  }

}

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

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Koepel » 25 Feb 2017, 14:52

Deze code begrijp ik :)
Het is niet de bedoeling om setup() aan te roepen als je opnieuw wilt beginnen.

In setup() worden de pinnen goed gezet (input of output), er worden libraries geïnitialiseerd, een seriële verbinding opgestart enzovoorts.
Wanneer je opnieuw wilt beginnen, dan zul je de structuur van de code zo moeten maken dat het mogelijk is. Bijvoorbeeld door aan de functie zwt() een return-waarde toe te voegen die aangeeft of de tijd gewijzigd is.

Gebruikers-avatar
Berichten: 48
Geregistreerd: 08 Mei 2014, 22:47
Woonplaats: Westervoort

Re: Arduino klok, gemaakt met flipperkasttellers.

Berichtdoor Grunch » 25 Feb 2017, 15:40

Hallo Koepel,

Voor de returnwaarde gebruik ik de variabele zt, wanneer die 1 is, is het zomertijd.

Wanneer ik setup() niet zou aanroepen krijg ik een hele vreemde tijd, hier moet ik nog even naar kijken.

Ik probeerde eerst alle tellers op '0'te zetten daarna de tijd in te stellen, maar om de een of andere reden wil dat niet lukken.
Blijkbaar ben ik 'lost in sketch'.

onderstaand de code :

Code: Alles selecteren
//*************************************** klok **************************************
//**                                                                               **
//** Gemaakt door Evert Kaatman speciaal voor zijn lieve vriendin Marjan Hasselaar **
//**                                                                               **
//***********************************************************************************

#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  t;

int dlyop = 350;
int dlyaf = 350;
int volume = 0;
int slagw = 0;
int i = 0;
int j = 0;
//rekening houden met de zomer of wintertijd wanneer zt = 1 dan is de zomertijd ingesteld
int zt = 0;
int uur = 3;
int minuut = 0;
int dagg = 0;
int uur1 = 0;
int uur2 = 0;
int min1 = 0;
int min2 = 0;

int duur1 = 0;
int duur2 = 0;
int dmin1 = 0;
int dmin2 = 0;

String u1 = "";
String u2 = "";
String m1 = "";
String m2 = "";
String ddag = "";
String dag = "";
String tijd = "";

void Vol() {
  volume = int(analogRead(0) / 32 + 10);
  if (volume < 12) {
    volume = 0;
  }
}

//Chimes
void DingDong() {

  for (int i = 1; i < 4; i++) {

    Vol();

    if ( volume < 2 ) {
      break;
    }
    digitalWrite (3, HIGH);
    delay (volume);
    digitalWrite (3, LOW);
    delay (145 + (112 - volume));

    digitalWrite (4, HIGH);
    delay (volume );
    digitalWrite (4, LOW);
    delay (145 + (112 - volume));

    digitalWrite (13, HIGH);
    delay (volume );
    digitalWrite (13, LOW);
    delay (145 + (112 - volume ));

    delay(1000);
  }
}


//Tellers op "0" zetten
void NullPos() {

  for (int i = 5; i < 9; i++) {

    while (digitalRead(i + 4) == HIGH) {

      digitalWrite (i, HIGH);
      delay (dlyop);
      digitalWrite (i, LOW);
      delay (dlyaf);

    }
  }
  for (int i = 1; i < 13; i++) {
    Vol();
    digitalWrite (4, HIGH);
    delay (volume);
    digitalWrite (4, LOW);
    delay (1000);

  }
}


//************************************************ zomer/winter ************************************************
void zwt() {

  readTime();
  rtc.getTimeStr();
  ddag = rtc.getDateStr();
  dag = ddag.substring(0, 2);
  dagg = dag.toInt();

  //********************** maart *******************

  if (rtc.getMonthStr() == "March" && rtc.getDOWStr() == "Sunday" && dagg > 25 && dagg < 31 && zt == 0 && uur1 == 0 && uur2 == 2 && min1 == 0 && min2 == 0) {

    rtc.setTime(3, 0, 0);
    setup();
    zt = 1;
  }

  //********************** oktober *******************

  if (rtc.getMonthStr() == "October" && rtc.getDOWStr() == "Sunday" && dagg > 25 && dagg < 31 && zt == 1 && uur1 == 0 && uur2 == 2 && min1 == 0 && min2 == 0) {

    rtc.setTime(1, 0, 0);
    setup();
    zt = 0;
  }

  //Serial.println(rtc.getTimeStr());
  //Serial.println(rtc.getDateStr());
  //Serial.println(rtc.getMonthStr());
  //Serial.println(rtc.getDOWStr());
  //Serial.println(dagg);
  //Serial.println(uur1);
  //Serial.println(uur2);
  //Serial.println(min1);
  //Serial.println(min2);

}


// *********************************************** tijd uitlezen ***********************************************

void readTime() {

  tijd = rtc.getTimeStr();
  u1 = tijd.substring(0, 1);
  u2 = tijd.substring(1, 2);
  m1 = tijd.substring(3, 4);
  m2 = tijd.substring(4, 5);
  uur1 = u1.toInt();
  uur2 = u2.toInt();
  min1 = m1.toInt();
  min2 = m2.toInt();

}



// *********************************************** tijd zetten ***********************************************

void tijdZetten () {

  for (int i = 0; i < min2; i++) {

    digitalWrite (5, HIGH);
    delay (dlyop);
    digitalWrite (5, LOW);
    delay (dlyaf);
  }

  for (int i = 0; i < min1; i++) {

    digitalWrite (6, HIGH);
    delay (dlyop);
    digitalWrite (6, LOW);
    delay (dlyaf);
  }
  for (int i = 0; i < uur2; i++) {

    digitalWrite (7, HIGH);
    delay (dlyop);
    digitalWrite (7, LOW);
    delay (dlyaf);
  }
  for (int i = 0; i < uur1; i++) {

    digitalWrite (8, HIGH);
    delay (dlyop);
    digitalWrite (8, LOW);
    delay (dlyaf);
  }
}



// ****************************************************************************************************************************************
void setup() {

  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);

  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);

  Serial.begin(9600);

  rtc.begin();

  //tijd en datum instellen  alvorens de 2e keer programeren, onderstaande 3 regels markeren houd rekening met zomer of wintertijd dit is variabele zt
  //rtc.setDOW(SATURDAY);
  //rtc.setDate(25, 2, 2017);
  //rtc.setTime(10, 17, 0);
 
  NullPos();
  readTime();
  DingDong();
  tijdZetten();

  //delay (2000);

  duur1 = uur1;
  duur2 = uur2;
  dmin1 = min1;
  dmin2 = min2;


}

void loop() {


  zwt();


  // ************************************** eenheden minuten **************************************
  if (dmin2 != min2) {

    digitalWrite (5, HIGH);
    delay (dlyop);
    digitalWrite (5, LOW);
    delay (dlyaf);
    dmin2++;
    if (dmin2 == 10) {
      dmin2 = min2;
    }
  }

  // **************************************** tientallen minuten ************************************
  if (dmin1 != min1) {

    digitalWrite (6, HIGH);
    delay (dlyop);
    digitalWrite (6, LOW);
    delay (dlyaf);

    if (dmin1 >= 5) {


      for (int i = 6; i < 10; i++) {

        digitalWrite (6, HIGH);
        delay (dlyop);
        digitalWrite (6, LOW);
        delay (dlyaf);

      }


    }

    dmin1++;

  }
  dmin1 = min1;

  // ************************************** eenheden uren *********************************************
  if (duur2 != uur2) {

    digitalWrite (7, HIGH);
    delay (dlyop);
    digitalWrite (7, LOW);
    delay (dlyaf);
    duur2++;


    // **************** slagwerk ********************

    slagw = int (uur1 * 10 + uur2 + 1);

    if (slagw > 24) {
      goto null ;
    }

    if (slagw > 12) {
      slagw = slagw - 12;
    }

    Vol();
    digitalWrite (3, HIGH);
    delay (volume );
    digitalWrite (3, LOW);
    delay (400);

    digitalWrite (4, HIGH);
    delay (volume );
    digitalWrite (4, LOW);
    delay (400);

    digitalWrite (13, HIGH);
    delay (volume );
    digitalWrite (13, LOW);
    delay (3400);

    for (int i = 1; i < slagw; i++) {
      Vol();
      digitalWrite (4, HIGH);
      delay (volume );
      digitalWrite (4, LOW);
      delay (1000);

    }




    if (duur2 = 10) {
      duur2 = uur2;
    }
  }

  // *************************************** tientallen uren *******************************************


  if (duur1 != uur1) {

    digitalWrite (8, HIGH);
    delay (dlyop);
    digitalWrite (8, LOW);
    delay (dlyaf);
    duur1++;

null:
    if (duur1 >= 3) {
      NullPos();
      duur1 = uur1;
    }


  }

}

VorigeVolgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten