Counter

Arduino specifieke Software
Berichten: 2
Geregistreerd: 19 Sep 2019, 17:29

Counter

Berichtdoor Scary-T » 19 Sep 2019, 17:41

Hey,

Ik ben op school bezig met een arduino project. De bedoeling is dat ik met 2 knoppen kan optellen en aftrekken, en dan een led laten aangaan op een bepaalt nummer. Nu zit ik wat vast met de code op internet heb ik een code gevonden die er wat op leek. Ik heb deze wat aangepast en de nodige commentaar toegevoegd alleen kom ik er niet uit wat de laatste lines willen zeggen. Meer bepaald vanaf de eerste bool, ik heb er al iets staan maar als iemand het zou kunnen ophelderen zou dit geweldig zijn. Ook heb ik nog niet gevonden hoe ik een led toevoeg als je hier een voorstel voor hebt zou ik het ook graag horen.

Code: Alles selecteren
const byte led = 13; //ledje zit in pin 13
const byte knopA = 2; //knop A zit op pin 2  // const byte doet hetzelvde als int alleen kan het meer info in een keer aan (vaak gebruikt in complexere programma's)
const byte knopB = 3; //knop B zit op pin 3
int count; //variabele die u knop opgeeft (getal tussen 0 en ∞)

void setup()
{
  Serial.begin(9600);
  pinMode(knopA, INPUT_PULLUP);//knop A is een input aangesloten op de ingebouwde pullup resistor in de arduino uno
  pinMode(knopB, INPUT_PULLUP);//knop B is een input aangesloten op de ingebouwde pullup resistor in de arduino uno
  pinMode(led, OUTPUT);  //ledje is output
}
void loop()
{
if(buttonPressA()) // als knop A word ingedrukt
{
if (count < 0xFFFF)  //en als de count kleiner is dan wat een int kan houden
 count++; //telt 1 bij
 Serial.print(F("UP:\t")); //schrijft UP: in seriële monitor
 Serial.println(count); //schrijft het nummer na up
}
 else if(buttonPressB()) //else if als je meerdere ifs na  elkaar wilt
{
 if (count > 0)
 count--;
 Serial.print(F("DOWN:\t")); //dit doet exact hetzelvde als hierboven maar dan met de count down
 Serial.println(count);
}
}
bool buttonPressA() // Een bool heeft één of twee waarden waar of niet waar dus (kijkt hier naar de waarden als knop A word ingedrukt)
{
  static unsigned long lastMillis = 0;  //word het #milliseconden opgeslagen sinds programma is beginen lopen (overflows na +-50 dagen)
  static byte lastState = HIGH;
  const byte newState = digitalRead(knopA);
  if(newState != lastState)
  {
    if(millis() - lastMillis > 100) //lines 33 tot 46
    {
      lastMillis = millis();
      if(newState == LOW) // pressed
      {
        return true;
}
}
}
  return false;
}
bool buttonPressB()
{
  static unsigned long lastMillis = 0;
  static byte lastState = HIGH;
  const byte newState = digitalRead(knopB);
  if(newState != lastState)
  {
    if(millis() - lastMillis > 100)
    {
      if(newState == LOW) // pressed
      {
        lastMillis = millis();
        return true;
}
}
}
return false;
}

Advertisement

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

Re: Counter

Berichtdoor Koepel » 20 Sep 2019, 08:11

Hallo, en welkom op dit forum.

Tip: werk netjes en gebruik code die je begrijpt. Probeer niet om meteen het eindresultaat neer te zetten. Doe het stap voor stap.

Er zijn leerzame video's van BasOnTech. Begrijp je deze https://arduino-lessen.nl/les/led-met-arduino-schakelen-via-drukknop ?

Maak de tekst van je sketch netjes. Als de tekst er niet netjes uitziet, dan zal de werking van de sketch ook wel een puinhoop zijn ;)
Code die je niet begrijpt kun je niet aanpassen, en je weet niet eens of het werkt. Gebruik dus alleen wat je begrijpt.

Na de 'bool' komen twee functies: "buttonPressA()" en "buttonPressB()". Die functies begrijp ik ook niet, en volgens mij zijn ze niet correct. Dus er is maar één oplossing: weg ermee.
Begin met een gewone digitalRead() om de knoppen te lezen.

In het begin zul je de documentatie veel lezen. Als je eenmaal de functies kent, dan wordt het programmeren gemakkelijker.
Dit is de beschrijving van digitalRead(): https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/.

Code: Alles selecteren
// Schoolopdracht met Arduino
// Optellen en aftellen met twee knoppen.
// De led gaat aan bij een bepaalde waarde.
// september 2019

const byte led = 13; //ledje zit in pin 13
const byte knopA = 2; //knop A zit op pin 2  // const byte doet hetzelvde als int alleen kan het meer info in een keer aan (vaak gebruikt in complexere programma's)
const byte knopB = 3; //knop B zit op pin 3
int count; //variabele die u knop opgeeft (getal tussen 0 en ∞)

void setup()
{
  Serial.begin(9600);
 
  pinMode(knopA, INPUT_PULLUP);//knop A is een input aangesloten op de ingebouwde pullup resistor in de arduino uno
  pinMode(knopB, INPUT_PULLUP);//knop B is een input aangesloten op de ingebouwde pullup resistor in de arduino uno
  pinMode(led, OUTPUT);  //ledje is output
}


void loop()
{
  if( digitalRead(knopA) == LOW) // als knop A word ingedrukt
  {
    if (count < 0xFFFF)  //en als de count kleiner is dan wat een int kan houden
    {
      count++; //telt 1 bij
    }
   
    Serial.print(F("UP:\t")); //schrijft UP: in seriële monitor
    Serial.println(count); //schrijft het nummer na up
  }
 
  if( digitalRead(knopB) == LOW)
  {
    if (count > 0)
    {
      count--;
    }
   
    Serial.print(F("DOWN:\t")); //dit doet exact hetzelvde als hierboven maar dan met de count down
    Serial.println(count);
  }
 
 
  // Voeg hier code toe om te kijken of "count" een bepaalde waarde heeft.
  // Bij een bepaalde waarde de led aanzetten.
 
 
 
 
  // Vertraag de sketch, zodat het optellen en aftellen niet te hard gaat.
  // Een vertraging helpt ook tegen contact-dender van de knoppen.
  delay(200);
}


Ik heb het inspringen beter gedaan. Voor de duidelijkheid heb ik bij elk if-statement een '{' en '}' toegevoegd. Er is een "header" bijgekomen (een paar regels commentaar bovenaan).

De sketch hierboven is echter nog steeds slordig :o
Wil je na een "if" een spatie of niet ? Kies een bepaalde stijl en hou je daar aan.
Kun je de "header" uitbreiden ? Bijvoorbeeld met de versie van de Arduino IDE die je gebruikt, welk Arduino board je gebruikt, enzovoorts.
De variabele 'led' kun je 'ledPin' noemen, dan is het duidelijker dat het om de pin van de led gaat. Een Arduino Uno heeft al een weerstand + led op het board zitten bij pin 13.
Je kunt in setup() al een tekst naar de seriële monitor sturen. Dan weet je dat de Arduino gestart is.

Als je de bovenstaande sketch probeert, dan merk je dat het tellen doorgaat als je de knop blijft indrukken.
Daarom kun je voor beide knoppen de StateChangeDetection toevoegen: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
De delay() onderin kan verkort worden naar 20ms als je de StateChangeDetection gebruikt.
De delay() onderin kan helemaal weg als je het denderen van de knop tegengaat. Daar is een library voor, of je maakt zelf iets.


Een schema of foto of plaatje er bij is ook altijd handig.
Bijlagen
schoolopdracht.png
Een plaatje gemaakt met tinkercad.com
schoolopdracht.png (37.27 KiB) 4048 keer bekeken

Berichten: 2
Geregistreerd: 19 Sep 2019, 17:29

Re: Counter

Berichtdoor Scary-T » 20 Sep 2019, 11:42

Bedankt voor de goeie tips. Na nog wat sleutelen staat mijn code op punt. Ik snap hem nu ook volledig.

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

Re: Counter

Berichtdoor Koepel » 20 Sep 2019, 12:09

Ik zie nu opeens een probleem bij het verhogen van count :geek:
Een "signed" int op een Arduino Uno is 16 bit. Als het hoogste bit (bit 15, het meest linkse bit) op '1' staat, dan is het een negatief getal.
Dus 0xFFFF is een negatief getal. Dus dit werkt niet: if (count < 0xFFFF)
Dat wordt weer lezen: https://www.arduino.cc/reference/en/language/variables/data-types/int/.

Het is misschien vreemd als iemand zo vaak op de knop gaat drukken, maar in de praktijk kan dat gemakkelijk voorkomen. Bijvoorbeeld als de knop vuil is waardoor het lijkt alsof hij steeds wordt ingedrukt. Of als iemand een boormachine er naast aan zet, en door de storing lijkt het alsof die knop steeds wordt ingedrukt.

Wat wil je als maximum getal om te tellen ?
Je kunt precies de grens van 32767 (= 0x7FFF) kiezen, of je maakt het jezelf gemakkelijk en kiest 1000.
De Arduino Uno heeft variabelen van 8, 16 en 32 bit. De compiler accepteert zelfs 64 bit integers.

Als je nummers leuk vind, dan is er BigNumber: http://www.gammon.com.au/forum/?id=11519.
Dat is een library die met grote getallen kan rekenen. Dat komt al aardig in de buurt van oneindig :lol:

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

Re: Counter

Berichtdoor shooter » 20 Sep 2019, 22:34

Eindelijk iemand die er commentaar bij schrijft, goed bezig man.
Druk eens op CtrlT dan verspringt alles tot een leesbare vorm.
en je gebruikt het ledje niet, dat doe je meestal met een digitalWrite commando.
en zoals gebruikelijk gaat koepel wel erg ver, maar hij is wel goed bezig.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ayaanoplreeva, KeithGam en 26 gasten