simpel telprogramma.

Software die niet past in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: simpel telprogramma.

Berichtdoor pjh » 03 Apr 2014, 21:49

Hoi Hans,

Nu hebben Nico en Shooter eigenlijk de hele zaak inhoudelijk besproken en is het aan jou om een RTC te monitoren en bij uitval het eeprom van die RTC of van de Arduino zelf te gebruiken voor referentie na reset / herstart.

Maar als ik je programma bekijk, gaat je dat niet zomaar lukken.
Het is een beetje de meubelmaker een stokje geven met de vraag er een stoel van te maken.
Je "spel" met je zoon waardeer ik zeer en je inzet en motivatie zal navenant zijn.

Daarom hier stapsgewijs hieronder je programma met zijn fouten.
Laten we eerst eens lekker van je fouten leren.

1. In je programma schrijf je setup en loop. Dat moet void setup(){...} en void loop(){...} zijn. Het is dus niet zo dat er nog wat aan je programma gesleuteld moet worden, maar de hele basale opmaak is fout. Dit is een standaard Arduino format:
Code: Alles selecteren
void setup(){
   ...
}

void loop(){
   ...
}


Ik vertaal "void" met ruimte. En een ruimte is alleen een ruimte als er grenzen zijn (ons heelal mogelijk uitgezonderd). En dat brengt me op het volgende punt:

2. Je definieert je variabelen in de void setup(). Je sluit ze als het ware op in de void / ruimte van de setup. DUS: zijn ze niet beschikbaar in de void loop()
Probeer dit programmaatje maar eens:
Code: Alles selecteren
int a = 6;

void setup(){
  Serial.begin(9600);
  int b = 13;
}

void loop(){
  Serial.println(a);
  Serial.println(b);
}

Dan krijg je deze foutmelding:
'b' was not declared in this scope.
sketch_apr03b.ino: In function 'void loop()':
sketch_apr03b:10: error: 'b' was not declared in this scope

De compiler laat ons weten dat er in de void loop geen 'b' bekend is.

==> Wanneer je wilt dat een variabele beschikbaar is in je gehele programma, zul je deze buiten de grenzen van de andere ruimtes moeten maken. DUS definieer je GLOBALE variabelen BUITEN de voids. En wanneer je ze bovenaan je programma zet, weet de compiler raad wanneer de variabele verderop wordt aangesproken.

Zo werkt dit niet:
Code: Alles selecteren
int a = 6;

void setup(){
  Serial.begin(9600);
  Serial.println(a);
  Serial.println(b);
}

int b = 13;

void loop(){
}

Maar dit wel:
Code: Alles selecteren
int a = 6;
int b = 13;

void setup(){
  Serial.begin(9600);
  Serial.println(a);
  Serial.println(b);
}

void loop(){
}


Nu we de basale opmaak en de plaats van de variabele declaraties hebben, moeten we het JUISTE VARIABELE type kiezen.

3. Jij gebruikt een integer datatype voor een TIMER die 60 minuten de milliseconden moet bijhouden. 60 minuten = 60 * 60 * 1000 = 3.600.000 milliseconden.
Een integer is twee bytes lang en daarmee 16 bits. Maar omdat een 'gewone' integer zowel de 'plus' als de 'min' bestrijkt, wordt één bit gebruikt voor het "min teken". Dan houd je dus 15 bits over. Het decimale equivalent is daarvan is 32.767
Hmmm, je variabele oudetijd komt dus een factor 3.600.000 / 32.767 = 109 tekort.
===> Gebruik datatype long als je grote getallen gebruikt zoals de milliseconden.

4. If...then is basic, geen C

Basic:
Code: Alles selecteren
10 IF A = 0 THEN PRINT "A is  nul en wordt  honderd" : A = 100

"Arduino's":
Code: Alles selecteren
if (A == 0 ) {
  Serial.prinln("A is nul en wordt honderd");
  A = 100;
}


==> belangrijk is dat bij een vergelijking, (die dus enkel WAAR of NIET WAAR oplevert, zoals in een if..) de dubbele = wordt gebruikt. Bij A = 0, krijgt A de waarde 0.
Bij <, > geldt dit niet. Groter dan of kleiner dan is in zichzelf een vergelijking. Ook in Basic zou
Code: Alles selecteren
10 IF A > 0 THEN PRINT "A is groter dan nul en wordt groter dan honderd" : A > 100
nergens op slaan.

5. Wanneer je minuten-teller vol is, moet hij weer op nul worden gezet.

6. Je vergat de variabele spoelen te declareren. En ´on´ betekend niks. Ik denk dat je dit als remark bedoelde, wat betekend dat je er // voor had moeten zetten.

7. je gebruikt geheel des GWBasics de dubbele punt. Moet punt/komma zijn. Dat weet je wel, maar zit nog niet in je vingers blijkbaar. Ook echt gebruiken want soms ontbrak het geheel.

Zonder ook maar iets aan je programma toe te hebben gevoegd (zie daarvoor Nico en Shooter), had dit je sketch kunnen zijn:
Code: Alles selecteren
int minuten=60;
int spoeltijd=30;
int minutenteller=0;
long oudetijd;

void setup(){
  // poorten openen etc.)
}
void loop(){
  if (millis()-oudetijd > 60000 ) {
    minutenteller=minutenteller+1; // 60000 milliseconden in een minuut
    oudetijd = millis();
  }
  if (minutenteller >= minuten)
  {
    //spoelen=on  digitalWrite output
    delay (spoeltijd*1000);
    minutenteller =0;
  }
}

Paul

Advertisement

Vorige

Terug naar Overige Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten