Arduino class

Arduino specifieke Software
Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Arduino class

Berichtdoor Gij Kieken » 23 Feb 2020, 21:19

Ben wat informatie aan het opzoeken inzake werken met class.
Niet direct in het schrijven van een library maar wel om een class te gebruiken in een sketch.
Nu vind ik hier https://roboticsbackend.com/arduino-obj ... mming-oop/
voor mij een stukje onduidelijkheid.
Het betreft de regel this->pin = pin;
Wat betekent dit juist?,is het een pointer via dereference naar de private byte pin?
Kort samengevat hoe werkt dit juist?
In een andere post had ik gelezen dat een private variabele bij conventie als (underscore) _varName geschreven werd.

Code: Alles selecteren
#define LED_1_PIN 9
#define LED_2_PIN 10
#define LED_3_PIN 11
#define LED_4_PIN 12
#define BUTTON_PIN 5
class Led {
  private:
    byte pin;
  public:
    Led(byte pin) {
      // Use 'this->' to make the difference between the
      // 'pin' attribute of the class and the
      // local variable 'pin' created from the parameter.
      this->pin = pin;
      init();
    }
    void init() {
      pinMode(pin, OUTPUT);
      // Always try to avoid duplicate code.
      // Instead of writing digitalWrite(pin, LOW) here,
      // call the function off() which already does that
      off();
    }
    void on() {
      digitalWrite(pin, HIGH);
    }
    void off() {
      digitalWrite(pin, LOW);
    }
}; // don't forget the semicolon at the end of the class
class Button {
  private:
    byte pin;
    byte state;
    byte lastReading;
    unsigned long lastDebounceTime = 0;
    unsigned long debounceDelay = 50;
  public:
    Button(byte pin) {
      this->pin = pin;
      lastReading = LOW;
      init();
    }
    void init() {
      pinMode(pin, INPUT);
      update();
    }
    void update() {
      // You can handle the debounce of the button directly
      // in the class, so you don't have to think about it
      // elsewhere in your code
      byte newReading = digitalRead(pin);
     
      if (newReading != lastReading) {
        lastDebounceTime = millis();
      }
      if (millis() - lastDebounceTime > debounceDelay) {
        // Update the 'state' attribute only if debounce is checked
        state = newReading;
      }
      lastReading = newReading;
    }
    byte getState() {
      update();
      return state;
    }
    bool isPressed() {
      return (getState() == HIGH);
    }
}; // don't forget the semicolon at the end of the class
// Create your objects in the global scope so you can
// get access to them in the setup() and loop() functions
Led led1(LED_1_PIN);
Led led2(LED_2_PIN);
Led led3(LED_3_PIN);
Led led4(LED_4_PIN);
Button button1(BUTTON_PIN);
void setup() { }
void loop() {
  if (button1.isPressed()) {
    led1.on();
    led2.off();
    led3.on();
    led4.off();
  }
  else {
    led1.off();
    led2.on();
    led3.off();
    led4.on();
  }
}

Advertisement

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

Re: Arduino class

Berichtdoor Koepel » 23 Feb 2020, 21:47

Volgens mij werd "this" vroeger vaker gebruikt.

De "this" is een pointer naar je eigen object.
Via "this" kun je dus bij de functies en variabelen van je eigen class, maar dat kun je toch al.
Een voorbeeld met "this": https://www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm

In jouw voorbeeld heet de parameter 'pin' en de private variabele heet ook 'pin'. Dat is niet zo handig.

Tegenwoordig krijgen de private variabelen van een class vaak een underscore, en dan kun je gewoon _pin = pin; doen. Dat is veel handiger en duidelijker.

Als je een class maakt die knippert met millis() en die een 'update' functie heeft, dan kun je voor elk ledje een object maken. Dan in de loop() alle 'update' functies aanroepen. Dan kun je de leds onafhankelijk van elkaar laten knipperen :D

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino class

Berichtdoor Gij Kieken » 23 Feb 2020, 21:59

Bedankt Koepel.
De verwarring zat hem nu ook juist in <de parameter 'pin' en de private variabele heet ook 'pin'>
Het lijkt me ook zeer onhandig zeker voor een leek.
Ken je toevallig nog links naar goede tutorials over het gebruik van een class?
Mij bekend is Ralph S Bacon, Paul Mc Worther,Kevin Darrah en dan nog een paar weinig verklarende sites.
Ik zoek iets met verschillende voorbeeldjes en goed gedetaileerd.
Mijn uiteindelijke doelstelling is om een Arduino mega2560 (omwille van het grote aantal i/O) via een esp 8266 Wifi Webserver te kunnen bedienen(ESP8266-01).
Ik zou dit doen via I²C met level shifters.
Zonder gebruik te maken van de voor-oorlogse AT-commando's.
Op het net vindt je veel voorbeelden daarvan maar allemaal met AT-commando's.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: JamesCrofe en 39 gasten