Go Down

Topic: Meinen Arduino Code verstehen. Was ist was? (Read 3158 times) previous topic - next topic

Marino_needing_help

Code: [Select]
/**
 * 8 Taster, gegen GND geschaltet
 * also invers funktionierend
 *
 * 8 Relais auf einer der China üblichen Relaiskarte
 * ebenfalls invers schaltend
 *
 * Die Entprellzeit von 20ms ist in CombieTimer als default
 * vorgegeben.
 *
 * Funktion:
 * Jeder Tastendruck toggelt den Schaltzustand des zugehörigen Relais.
 */

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>



class TasterDingen
{
  public:
  virtual void init() = 0;
  virtual void run()  = 0;
};

template<byte inPin,byte outPin>
class Taster2Relais: public TasterDingen
{
  private:
  Combie::Pin::TasterGND<inPin>    taster;
  Combie::Pin::RelaisINV<outPin>   relais;
  Combie::Timer::EntprellTimer     entpreller;
  Combie::Tools::FlankenErkennung  flankenerkennung;
  byte state; // hier drin werden die Tastendruecke gezaehlt

  public:
  Taster2Relais():state(0){}

  virtual void init()
  {
    taster.initPullup();
    relais.init();
  }

  virtual void run()
  {
    if(flankenerkennung = entpreller = taster)
      relais = ++state & 1; // Niederwertigstes Bit wird Relaiszustand
  }
};


TasterDingen * dinger[] = {
                            new Taster2Relais<2,10>(),
                            new Taster2Relais<3,11>(),
                            new Taster2Relais<4,12>(),
                            new Taster2Relais<5,13>(),
                            new Taster2Relais<6,A2>(),
                            new Taster2Relais<7,A3>(),
                            new Taster2Relais<8,A4>(),
                            new Taster2Relais<9,A5>(),
                          };
void setup()
{
  // ForEach TasterDingen, in dinger, tue init()
  for(TasterDingen * ding:dinger) ding->init();
}

void loop()
{
  // ForEach TasterDingen, in dinger, tue run()
  for(TasterDingen * ding:dinger) ding->run();
}


Diesen Code hat mir hier vor längerer Zeit al jemand geschrieben.

Jetzt will ich mal verstehen, was das alles ist.

bei include werden ja die ganzen Libs. eingebunden.

Aber was genau macht jetzt zB. die class "TasterDingen"

Oder was soll eine template sein?

Könnte mir jemand das mal netterweise erklären?

combie

#1
Jun 16, 2018, 09:57 am Last Edit: Jun 16, 2018, 10:06 am by combie
Hi!

Ich empfehle dir ein modernes  dickes C++ Buch!
z.B. dieses Der C++ Pogrammierer
Oder, "Die C++-Programmiersprache" vom Erfinder Bjarne Stroustrup

Quote
Oder was soll eine template sein?
Ein Template ist eine Erzeugungsschablone für Code.


Quote
Aber was genau macht jetzt zB. die class "TasterDingen"
Tasterdingen ist eine "pure abstrakte Klasse".
Im Grunde hier nur vereinfacht...
In meiner (kleinen OOP) Welt ist sie die Mutter aller Tasks.
Dann heißt sie allerdings nicht "TasterDingen", sondern einfach nur Task.

Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle und Emotionen bestimmt.

Marino_needing_help

Hi!

Ich empfehle dir ein modernes  dickes C++ Buch!
z.B. dieses Der C++ Pogrammierer
Oder, "Die C++-Programmiersprache" vom Erfinder Bjarne Stroustrup
Ein Template ist eine Erzeugungsschablone für Code.

Tasterdingen ist eine "pure abstrakte Klasse".
Im Grunde hier nur vereinfacht...
In meiner Welt ist sie die Mutter aller Tasks.
Dann heißt sie allerdings nicht "TasterDingen", sondern einfach nur Task.


Ja, ich glaube, ich werde mir mal so eins beschaffen, weil ich demnächst mehr damit machen will.

agmue

Als Fahranfänger versuchst Du gerade, ein F1-Auto zu besteigen. Anders als beim Auto kannst Du mit dem Arduino wenig zerstören, dennoch ginge es auch anfängerfreundlicher.

Daher mein Tipp: Fange einfach an und nimm Dir die CombieTools als Ziel.

Marino_needing_help

#4
Jun 16, 2018, 11:12 am Last Edit: Jun 16, 2018, 11:15 am by Marino_needing_help
Das gibt für mich nur mehr Fragen als Antworten.

Was ist using?

Was ist taster.initPullup();?

Was wird hier gemacht:

EingabeTaster        taster;
EntprellTimer         entprellen(20);
FlankenErkennung  flankenerkennung;
Counter                 counter;

?

ich versteh davon gar nichts.

combie

#5
Jun 16, 2018, 11:20 am Last Edit: Jun 16, 2018, 11:25 am by combie
Quote
Was ist using?
Die using Direktive
Und den dortigen Links folgen.
Alle drei Varianten setze ich ein.


Quote
Was ist taster.initPullup();?
Die Tasterinstanz wird angewiesen sich zu initialisieren und dabei den internen Pullup zu aktivieren.

Quote
Was wird hier gemacht:

EingabeTaster        taster;
EntprellTimer         entprellen(20);
FlankenErkennung  flankenerkennung;
Counter                 counter;
Es werden Instanzen der betreffenden Klassen erzeugt.

Quote
Das gibt für mich nur mehr Fragen als Antworten.
Das ist ganz normal....
C++ lernen ist ein Prozess!
Bin mittlerweile ca 3 Jahre dabei, und noch lange nicht fertig.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle und Emotionen bestimmt.

Marino_needing_help

Da ich selber das ganze im Arduino Typischen C schreiben wollte (C++ ist mir zu schwer),
habe ich das Problem mit dem Entprellen und Relais umschalten.

Ich kann jedem Taster ein Relais zuweisen und beim Drücken auch umschalten.
Wenn ich loslasse, geht es aber wieder aus.

Und in einem anderen Code, den ich noch hier habe, schaltet der Taster nicht immer sauber um.

Da schaltet das Relais teilweise nur hin und her.

Wie könnte denn so etwas in C aussehen?

combie

Quote
Da ich selber das ganze im Arduino Typischen C schreiben wollte (C++ ist mir zu schwer),
Arduino ist C++, und nicht C.

An anderer Stelle wurde dir schon gezeigt, wie man das mit Arrays abhandelt.
Das sieht dann etwas C artiger aus.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle und Emotionen bestimmt.

noiasca

wenn du das ganze prozedural haben willst,
mache das Digital|Debounce Beispiel aus der IDE.

Wenn es mit einem Relais klappt, erweitere es um weitere 7.
DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

HotSystems

Du solltest dir C++ aneignen, damit wird der Arduino in erster Linie programmiert.
Also besorge dir ein C++ Buch und ein Arduino-Buch für Anfänger, damit kannst du sicher starten.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Marino_needing_help

Du solltest dir C++ aneignen, damit wird der Arduino in erster Linie programmiert.
Also besorge dir ein C++ Buch und ein Arduino-Buch für Anfänger, damit kannst du sicher starten.

Davon gibt es ja so viele wie Sand am Meer.

Welches soll man sich denn da holen?

HotSystems

Davon gibt es ja so viele wie Sand am Meer.

Welches soll man sich denn da holen?
Da ich deine bisherigen Kenntnisse nicht einschätzen kann, solltest du eines nehmen, was du auch verstehst.
Sieh die die Beispiele Online an.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Marino_needing_help

Diese ganzen simplen Sachen verstehe ich ja ganz gut, nur sobald es eben an so Sachen wie Taster Auswertung geht, wird es schwierig.

bis if Schleife verstehe ich das eigentlich.

HotSystems

#13
Jun 16, 2018, 11:58 am Last Edit: Jun 16, 2018, 12:01 pm by HotSystems
Diese ganzen simplen Sachen verstehe ich ja ganz gut, nur sobald es eben an so Sachen wie Taster Auswertung geht, wird es schwierig.

bis if Schleife verstehe ich das eigentlich.
Wie.....Tasterauswertung ist ja nun wirklich einfach.

Dann übe doch mal mit den Beispielen in der IDE. Und ein Arduino Anfängerbuch sollte dann reichen.

Und das du mit einer if-Abfrage klar kommst, kann ich nicht erkennen.
Das ist keine Schleife.

Und somit fehlen dir noch sehr viele Grundlagen, die du erstmal lernen musst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

#14
Jun 16, 2018, 12:27 pm Last Edit: Jun 16, 2018, 12:37 pm by combie
Quote
nur sobald es eben an so Sachen wie Taster Auswertung geht, wird es schwierig
Von der Initialisierung der Taste, bis zur Betätigung des Relais, wollen viele kleine Schritte gegangen werden.

Die OOP, zumindest so wie ich es versuche, bietet den Weg das in klar abgegrenzte kleine Bereiche aufzuteilen. Diese einzelnen Teile werden dann wie hier zu einem Ganzen zusammen gebunden.

In der OOP versucht man/ich Daten und Programm, welches zusammen gehört, in einer Klasse/Objekt zu kapseln. In der prozeduralen Programmierung, z.B. in C, liegen diese Dinge weit verteilt vor.
Diese Verteilung macht die Dinge unübersichtlich und fehlerträchtig!
Im Allgemeinen: Je größer das Projekt, desto problematischer.

Ein Ziel der OOP ist die Wiederverwendung von Code.
Unter weitgehender Vermeidung von Copy&Paste.

----
Mein Tipp:
Lese OOP Tutorials.
Experimentiere mit Klassen und deren Instanzen.

Je mehr du übst, desto besser wirst du (nicht nur) meinen Code verstehen lernen.
Nahezu alle Arduino Libraries haben einen OOP Aufbau.

Schaue dir an, wie die Libs aufgebaut sind.



Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle und Emotionen bestimmt.

Go Up