Forum: Mikrocontroller und Digitale Elektronik Adruino Programmerklärung


von John B. (johnny1456)


Lesenswert?

Hallo,

da ich vorher noch nie Adruino Programme geschrieben habe und wir in 2 
Wochen unsere Praktische Zwischenprüfung haben, wollte ich fragen, ob 
mir jemand mit Kommentaren das Programm, welches wir auf unserem Adruino 
haben sollen erklären kann.
Das schreiben von eigenen Programmen kommt leider erst später in der 
Berufsschule und ich habe das Bedenken, dass die Prüfer mir eventuell 
trotzdem zu dem Programm fragen stellen könnten, möchte gern auf alle 
Eventualitäten vorbereitet sein.
Etwas konnte ich schon entschlüsseln, leider aber nicht alles.
Danke im Vorraus.


#include <EEPROM.h> //EEPROM Speicher einbeziehen
const int LED_PIN=7; //Pin 7 für LED

const int R_PIN=A0;
const int G_PIN=A1;
const int B_PIN=A2;

const int DATEN_PIN=8;
const int TAKT_PIN=10;
const int SPEICHERN_PIN=9;

const int TASTER_PIN=2;

const int LED_RT=0x10;
const int LED_GE=0x08;
const int LED_GN=0x04;
const int LED_BL=0x02;
const int LED_WS=0x01;

const int R_REF_ADR=0;
const int G_REF_ADR=2;
const int B_REF_ADR=4;

const int WS_GRENZE=10;

const int MAX_GRENZE=40;
const int MIN_GRENZE=0;

int Leds=0;

int R_Spg;
int G_Spg;
int B_Spg;

int R_Ref;
int G_Ref;
int B_Ref;

int R_Map1, R_Map2;
int G_Map1, G_Map2;
int B_Map1, B_Map2;

int Max_Wert;
int Min_Wert;

int RG_Dif;
int RB_Dif;
int GB_Dif;

bool Taster;

void setup() {
  pinMode(LED_PIN,OUTPUT);  //Pin 7 als Ausgang setzen
  pinMode(DATEN_PIN,OUTPUT);
  pinMode(TAKT_PIN,OUTPUT);
  pinMode(SPEICHERN_PIN,OUTPUT);
  pinMode(TASTER_PIN,INPUT_PULLUP);

  digitalWrite(DATEN_PIN,LOW); //Pin 8 wird bei Einschalten auf Low 
gesetzt (Pulldown)
  digitalWrite(TAKT_PIN,LOW);
  digitalWrite(SPEICHERN_PIN,HIGH);
  zeigeLeds(0);

  digitalWrite(LED_PIN,LOW);
  delay(500);
  Serial.begin(9600);
  Serial.println("Fruehjahr 2020");
}

void loop() {
  eingabe();
  verarbeitung();
  ausgabe();
}


void eingabe(void) {
  R_Spg=0; G_Spg=0; B_Spg=0;
  for (int i=0; i<5; i++) {
    R_Spg=R_Spg+analogRead(R_PIN);
    G_Spg=G_Spg+analogRead(G_PIN);
    B_Spg=B_Spg+analogRead(B_PIN);
    delay(1);
  }
  R_Spg=R_Spg/5;
  G_Spg=G_Spg/5;
  B_Spg=B_Spg/5;
  Taster=digitalRead(TASTER_PIN);
}

void verarbeitung(void) {
  readRef();

  R_Map1=map(R_Spg,0,R_Ref,0,100);
  G_Map1=map(G_Spg,0,G_Ref,0,100);
  B_Map1=map(B_Spg,0,B_Ref,0,100);

  Max_Wert=max(R_Map1,max(G_Map1,B_Map1));
  Min_Wert=min(R_Map1,min(G_Map1,B_Map1));
  if (Min_Wert==Max_Wert) Min_Wert--;

  R_Map2=map(R_Map1,Min_Wert,Max_Wert,0,100);
  G_Map2=map(G_Map1,Min_Wert,Max_Wert,0,100);
  B_Map2=map(B_Map1,Min_Wert,Max_Wert,0,100);

  Leds=0;
  if (Max_Wert>=MAX_GRENZE) {
    if (Max_Wert-Min_Wert<=WS_GRENZE) {
      Leds=LED_WS;
    } else if (R_Map2==100) {
        if (G_Map2==0) Leds=LED_RT; else Leds=LED_GE;
      } else if (G_Map2==100) {
        Leds=LED_GN;
      } else if (B_Map2==100) {
        Leds=LED_BL;
      }
  }
}

void ausgabe(void) {
  static int Zeile=0;
  zeigeLeds(Leds);
  if(Taster==LOW) writeRef();
  delay(200);
}

void zeigeLeds(int Leds) {
  digitalWrite(SPEICHERN_PIN,LOW);
  delay(1);
  for (int i=0; i<5; i++) {
    digitalWrite(DATEN_PIN,bitRead(Leds,i));
    delay(1);
    digitalWrite(TAKT_PIN,HIGH);
    delay(1);
    digitalWrite(TAKT_PIN,LOW);
    delay(1);
  }
  digitalWrite(DATEN_PIN,LOW);
  delay(1);
  digitalWrite(SPEICHERN_PIN,HIGH);
}

void readRef(void) {
  EEPROM.get(R_REF_ADR,R_Ref);
  EEPROM.get(G_REF_ADR,G_Ref);
  EEPROM.get(B_REF_ADR,B_Ref);
}

void writeRef(void) {
  EEPROM.put(R_REF_ADR,R_Spg);
  EEPROM.put(G_REF_ADR,G_Spg);
  EEPROM.put(B_REF_ADR,B_Spg);
}

: Verschoben durch Moderator
Beitrag #6161261 wurde von einem Moderator gelöscht.
Beitrag #6161264 wurde von einem Moderator gelöscht.
Beitrag #6161266 wurde von einem Moderator gelöscht.
Beitrag #6161269 wurde von einem Moderator gelöscht.
Beitrag #6161270 wurde von einem Moderator gelöscht.
Beitrag #6161272 wurde vom Autor gelöscht.
von Günter Lenz (Gast)


Lesenswert?


von John B. (johnny1456)


Lesenswert?

Danke

Beitrag #6161288 wurde von einem Moderator gelöscht.
von Böser Onkel (Gast)


Lesenswert?

Nutze doch einen Debugger oder Simulator um das Programm zu verstehen.
Wenn man den Controller nicht versteht, versteht man auch kein
Programm.

von John B. (johnny1456)


Lesenswert?

Böser Onkel schrieb:
> Nutze doch einen Debugger oder Simulator um das Programm zu verstehen.
> Wenn man den Controller nicht versteht, versteht man auch kein
> Programm.

Danke.

von Franz M. (elmo64)


Lesenswert?

John B. schrieb:
> Programm, welches wir auf unserem Adruino haben sollen

Welcher "Adruino"?

Böser Onkel schrieb:
> Nutze doch einen Debugger oder Simulator um das Programm zu verstehen.
> Wenn man den Controller nicht versteht, versteht man auch kein Programm.

Wer Arduino nutzt, möchte/muss den Controller nicht so richtig 
verstehen.

Dem TO geht es ja nur um das Programm. Neben C, bzw. C++ muss er erst 
einmal nur das Arduino-framework können:

Günter Lenz schrieb:
> https://www.arduino.cc/reference/en/

John B. schrieb:
> Das schreiben von eigenen Programmen kommt leider erst später in der
> Berufsschule

Das Programm ist mmn. von niedriger Qualität und wurde vermutlich von 
einem Anfänger mit dem Anspruch, dass es IRGENDWIE funktioniert, 
geschrieben. Es ist KEIN gutes Beispiel.

Um es zu verstehen, versuche nachzuvollziehen, was jede Funktion/Zeile 
tut und warum sie da stehen könnte.

Zeichne ein Flussdiagramm!!!

(Vorher wäre es eine gute Idee das Programm mal aufzuräumen, geht aber 
auch so.)

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

John B. schrieb:
> Etwas konnte ich schon entschlüsseln, leider aber nicht alles.

Die bisherigen Kommentare können ganz leicht zu bösen Fallen werden.
> pinMode(LED_PIN,OUTPUT);  //Pin 7 als Ausgang setzen

> digitalWrite(DATEN_PIN,LOW); //Pin 8 wird bei Einschalten auf Low

Spätestens, wenn in den Zeilen
> const int LED_PIN=7; //Pin 7 für LED
oder
> const int DATEN_PIN=8;

die Zahl geändert wird, sind die Kommentare unten im Programm 
irreführend und nicht mehr die Bytes wert, in denen sie gespeichert 
sind.

von Wolfgang (Gast)


Lesenswert?

A. M. schrieb:
> Zeichne ein Flussdiagramm!!!

Ein Flussdiagramm ist denkbar ungeeignet, um eine blockorientierte 
Programmierung darzustellen.
Die Blockstruktur findet man in einem Nassi-Shneiderman-Diagramm 
deutlich besser wieder.
https://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm

von Roland F. (rhf)


Lesenswert?

Hallo,
> (Vorher wäre es eine gute Idee das Programm mal aufzuräumen, geht aber
> auch so.)

Dazu muss man aber wissen was man tut (und eventuell auch wissen was das 
Programm überhaupt tun soll), aber genau daran scheitert es hier. Henne 
<--> Ei-Problem.

rhf

von Ralph S. (jjflash)


Lesenswert?

Ich nehme an, du wirst zum EGS ausgebildet... Aus gewissen Gründen kann 
ich dir sagen, dass während deines Interviews garantiert keine Fragen 
gestellt werden.

Wenn, dann im besten Fall zu den Anschluss anm Controller... und, wen 
ich die Prüfungsunterlagen so anschau (die gelben Blätter), dann würde 
ichir den Schaltplan vornehmen... und mich über Schieberegister kundig 
machen.

Im übrigen wird der Prüfungsausschuss nur Fragen zu Lernfeldern stellen, 
die in der fachlich und zeitlichen Gliederung auch schon drangekommen 
sind.

Außerdem sind in jedem Ausschuss auch Lehrer vertreten und in aller 
Regel wissen die Prüfer schon, was sie fragen können und was nicht.

Außerdem, (wenn man nicht gerade an einen üblen Prüfer gerät) gilt der 
Grundsatz: Ich will wissen was du weißt und nicht, was du nicht weißt. 
Stellt der Prüfer fest, dass du auf EINEM Gebiet schwach bist oder etwas 
nicht weiß... gibt er dir dort Punktabzug und geht zum nächsten Punkt 
über.

Immer schön dran denken: Prüfer sind Menschen, die selbst auch schon 
Prüfungen abgelegt haben. In aller Regel sind sie fair und gerecht. 
Selbst wenn einer dir einmal eins reinwirken WOLLTE, wird die Gruppe des 
Prüfungsausschusses ihn zurückpfeifen und mässigen...

Mach dich mit den Unterlagen vertraut, schau dir den Schaltplan an, geh 
in Gedanken durch, wie du das aufbaust und stell dir selbst Fragen dazu. 
Dann hast du deine AP1 verstanden und bist für das Gespräch mit dem 
Prüfer gut gerüstet

von Einer K. (Gast)


Lesenswert?

A. M. schrieb:
> Wer Arduino nutzt, möchte/muss den Controller nicht so richtig
> verstehen.

Es ist wahr, dass viele Arduino User ohne Fachwissen in diese Welt 
stolpern.
Das erlaubt aber nicht die Sache so zu verdrehen, als "wollten" Arduino 
Einsteiger nicht verstehen. Oder als wäre das nicht doch notwendig.
Denn das ist in vielen Fällen stumpf gelogen.

Es sei denn du möchtest diskriminieren, polemisieren oder/und dich wie 
ein Arschloch verhalten.

Wie lange benötigt man um zu einem guten erfahrenem Schaltungsentwickler 
und Programmierer zu werden?
10 Jahre?

Ja, ich halte es für ein fürchterlich ekelhaftes Verhalten, Anfänger vor 
einem so langen und auch steinigen Weg, von Anfang an irrationale 
Vorurteile an den Kopf zu werfen, und gegen diese Personengruppe als 
Ganzes Stimmung zu machen.

Nur ein Punkt:
Wie lange hast du gebraucht um C++ zu kapieren?


Hier kann man auch sehen wie das Arduinoforum mit solchen umgeht:
https://forum.arduino.cc/index.php?topic=667736.0
Ob der Umgang korrekt, oder besser ist, ist dann die zweite Frage...

von Franz M. (elmo64)


Lesenswert?

<offtopic>

Arduino Fanboy D. schrieb:
> Ja, ich halte es für ein fürchterlich ekelhaftes Verhalten

Arduino Fanboy D. schrieb:
> dich wie ein Arschloch verhalten.

Arduino Fanboy D. schrieb:
> Hier kann man auch sehen wie das Arduinoforum mit solchen [Fragen] umgeht

Das Niveau dieses Forums ist wirklich tief gesunken. Wir müssen ALLE 
endlich wieder zu einem angemessenen Umgangston zurückfinden. Darum 
bitte ich, falls ich vorher jemanden beleidigt haben sollte, diesen um 
Entschuldigung.

</offtopic>


John B. schrieb:
> Programm, welches wir auf unserem Adruino haben sollen erklären kann. Das
> schreiben von eigenen Programmen kommt leider erst später

Ich habe das so verstanden, dass das Programm nicht vom TO, sondern von 
jemand drittes, möglicherweise einer Lehrkraft stammt, bei der man 
gewisse Kenntnisse voraussetzen kann.

: Bearbeitet durch User
Beitrag #6162386 wurde von einem Moderator gelöscht.
von Einer K. (Gast)


Lesenswert?

A. M. schrieb:
> mit solchen [Fragen] umgeht

Merke:
Nicht "[Fragen]" sondern mit diesem konkreten Menschen und seinem 
Problem!


Außerdem finde ich es äußert befremdlich wenn man mich zitiert und diese 
meine Worte dabei im *Zitat* verfälscht.

Mitteilung:
Zitat Verfälschung ist echt die unterste Sohle.

Zitate aus dem Zusammenhang reißen, ist vielleicht blöd, aber üblich, 
verfälschen ist Vorsatz.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.