Tutorial für Anfänger, von delay zum Object

Hallo,

Auf Grund der immer wieder aufkommenden gleichen Fragen von insbesondere von Anfängern habe ich heute ein kleines Tutorial geschrieben. Dabei geht es darum einen einfache Aufgabe für Anfänger auf unterschiedliche Arten zu lösen und dabei zu zeigen wo die Vor und Nachteile liegen. Das ganze soll möglichst einfach und für Anfänger nachvollziehbar sein. Aufbauend Schritt für Schritt von delay() über millis() und den Nachtwächter, erstellen einer eigenen Funktionen, bis hin zur Erstellung einer einfachen Klasse und der Verwendung eines Objektes daraus.

Ich hab da jetzt sechs verschieden Sketche, alle laufen, und 5 Seiten Prosa zusammen geschrieben. Eigendlich würde ich das gerne hier veröffentlichen wenn Interesse besteht. Zudem wäre mir aber auch lieb wenn jemand noch mal sozusagen als Co-Moderator drüber sieht damit die gröbsten Schnitzer raus sind.

Wer Intresse hat mal mit drüber zu sehen kann sich gerne bei mit melden. Ich schicke das dann als PM aun Ihn.

Heinz

Klar, gib mal her.

Gruß Tommy

Ich auch

Hallo,

danke für das Angebot und das Interesse . Ich denke zwei Helfer reicht erst mal ich muss es ja auch einflegen.

Die Prosa hab ich derzeit als odt vorliegen.

ich habe gerade festgestellt das man an PM´s keine Anhänge anhängen kann. Ich werde Euch morgen 5-6 PM´s senden mit jeweils der Prosa und dem zugehärigen Sketch. Dann ist das bereits in Etwas so aufgeteilt wie es letzlich sein wird, ich hoffe es passt.

Danke nochmals für das Angebot

Heinz

Rentner:
Wer Intresse hat mal mit drüber zu sehen kann sich gerne bei mit melden. Ich schicke das dann als PM aun Ihn.

Da ich seit längerem überlege, ein kurzes Textchen zum Thema Klassen zu verbrechen, würde auch ich gerne lesen, was Dir dazu eingefallen ist.

Gruß

Gregor

Hallo,
es ist geschafft, vielen Dank nochmals an Tommy56 der mir als Co-Moderator insbesondere bei dem Thema Klassen noch etwas auf die Sprünge geholfen hat.

Im Anhang findet Ihr das Tutorial als PDF. Zu jedem Abschnitt gibt´s einen Sketch als Beispiel. Der Inhalt erhebt natürlich keinen Anspruch auf Vollständigkeit, und ich bin mir sicher es gibt auch bessere Wege als die hier gezeigten. Er soll dem Anfänger anhand eines einfachen Beispiels zeigen was mit delay geht und wie man das durch millis ersetzt. Wie man einen Sketche mit einer Funktion strukturiert und doppelten Code vermeiden kann. Zudem wird gezeigt wann es mehr Sinn macht eine Klasse zu verwenden.

Viel Spass
Heinz

Nachtrag 14.02.2020

ich habe den Nachtrag #9 etwas weiter unten noch mit in das Tutorial aufgenommen und ein paar Fehler beseitigt.

fade1.ino (1.14 KB)

fade2.ino (1.42 KB)

fade3.ino (1.92 KB)

fade4.ino (1.5 KB)

fade4a.ino (1.84 KB)

fade5.ino (1.87 KB)

fade5a.ino (1.86 KB)

von delay bis zur Methode.pdf (154 KB)

Dafür gibt's ein dickes Karma von mir

Danke dir, habe ich auf Arbeit mal was zu lesen

Prima Sache, werde ich durcharbeiten.
Vielen Dank dafür!

mfg

Frank

Hallo,

ich hab jetzt noch einen kleinen Nachrtag zum Thema. Darin möchte ich noch zeigen wie man den letzten Sketch, unter Verwendung von Arrays, noch so umbauen kann das der eigendliche Code sehr klein werden kann. Für unser Beispiel trifft das aber nicht zu, aber es geht ja auch nur um´s Prinzip hier. Leider geht dabei die Information, ob es sich gerade um die rote, oder die grüne LED handelt, verloren. Anstelle dessen müssen wir uns mit dem Index als Unterscheidung anfreunden. Oft ist es aber tatsächlich auch egal ob die LED rot oder grün ist.

Natürlich macht es Sinn Eingänge und Ausgänge ebenfalls als Array´s anzulegen.

const byte led[] {5, 6};// Pin´s für LED zwei Elemente
const byte btn[] {7, 8};// Pin´s für Button

An der Klasse selbst wurden keine Änderungen gemacht. Etwas Tricki war noch die Erstellung der beiden Objekte, die jetzt ebenfalls als Array vorliegen sollen. Wegen der Übergabe der Parameter, delaytime und fadstep, ist eine einfache Erstellung der beiden Objekte in der Form: Fade LED[2] nicht möglich. Es sind zwei Varianten möglich.

// Variante 1 zwei Objekte erstellen und Parameter einzeln übergeben 
Fade LED[2] {{fadstep, delaytime}, {fadstep, delaytime}};
// Variante 2 zwei Objekte erstellen und parameter an alle übergeben 
Fade* LED = new Fade[2](fadstep, delaytime);// Besser für viele Elemente

damit wird ein Array der Objekte angelegt und an jedes Objekt werden die Parameter übergeben. Angeprochen wird unsere Methode z.B dann mit:

byte hell= LED[Index].fade(statusBtn);

Um die Elemente der Array zu verarbeiten und anzusprechen bietet sich, wie sollte es anders sein, diesmal eine For Schleife an.

Heinz

Sketch Fade5a.ino

/* Beispiel 5a
    zwei Led mit Taster auf/ ab faden
    mit Verwendung einer Classe und dem Aufruf einer
    Methode daraus.
    Verarbeitung mit Arays

*/

const byte led[] {5, 6};// Pin´s für LED zwei Elemente
const byte btn[] {7, 8};// Pin´s für Button

const byte fadstep = 10;
const byte delaytime = 50;

class Fade {    // classe fade
  private:
    uint32_t altzeit = 0;
    byte hell = 0;
    const byte delaytime;
    const byte fadstep;

  public:
    // Konstruktor
    Fade(byte fadstep, byte delaytime) : fadstep{fadstep}, delaytime{delaytime} {}

    byte fadeLed(bool ein) {   // die Methode
      if (ein) {
        if (millis() - altzeit >= delaytime) {
          altzeit = millis();            // aktuelle zeit merken
          if (hell + fadstep <= 255 ) {  // max noch nicht erreicht
            hell = hell + fadstep;      // erhöhen
          }
        }
      }
      else {
        if (millis() - altzeit >= delaytime) {
          altzeit = millis();
          if (hell - fadstep >= 0 ) {    // min noch nicht erreicht
            hell = hell - fadstep;
          }
        }
      }
      return hell;
    }
};// Achtung Das Semikolon ist hier wichtig

// Variante 1 zwei Objekte erstellen und Parameter einzeln übergeben 
//Fade LED[2] {{fadstep, delaytime}, {fadstep, delaytime}};

// Variante 2 zwei Objekte erstellen und parameter an alle übergeben 
Fade* LED = new Fade[2](fadstep, delaytime);// Besser für viele Elemente

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  for (byte i = 0; i < 2; i++) {   
    pinMode(btn[i], INPUT_PULLUP);  // Eingänge festlegen
  }
}
void loop() {

  // put your main code here, to run repeatedly:
  for (byte i = 0; i < 2; i++) {
    // alles in einer Zeile
    analogWrite(led[i], LED[i].fadeLed(!digitalRead(btn[i])));
  }
}

Rentner:
Leider geht dabei die Information, ob es sich gerade um die rote oder die grüne LED handelt, verloren.

Das kommt mir bekannt vor und habe es durch enum {ROT, GRUEN}; gelöst.

Wobei ich den Eindruck habe, Du machst es Dir unnötig schwer, weil Du Feld und Klasse mischst. Ist momentan aber nur ein Bauchgefühl, könnte auch am aufkommenden Hunger liegen.

class Fade {    // classe fade
  private:

Die Elemente einer Klasse sind immer private, ist also Pleonasmus.

Wenn Du Deiner Dokumentation noch ein paar Kommata spendieren würdest, fände ich sie leichter lesbar.

EDIT: "Elemente einer Klasse" geändert.

agmue:

class Fade {    // classe fade

private:



Eine Klasse ist immer private, ist also [Pleonasmus](https://de.wikipedia.org/wiki/Pleonasmus).

Die Klasse selbst nicht, aber ggf. deren Elemente.

Gruß

Gregor

Dass die Elemente einer Klasse immer private sind, ist klar. Ich schreibe private/public/protected aber auch trotzdem immer zur Verdeutlichung mit hin. Ich war auch mal in einem JAVA-Projekt, in dem das explizit in den Regeln gefordert war.

Gruß Tommy

Hallo Heinz

vielen Dank für Deine arbeit.
Sehr interresant, werde das mal die Tage durchlesen und den ein oder Sketch laufen lassen.

Gruß Martin