Go Down

Topic: Start / Stop Knopf (Read 2097 times) previous topic - next topic

agmue

Ein Compiler braucht Festlegungen, wie er mit den zur Verfügung stehenden Informationen umgehen soll. Speicher ist bei Arduinos knapp, weshalb man durch geschickte Typenwahl diesen effektiv einsetzen kann. Die richtige Typenwahl gehört einfach zu einer Programmierung dazu und zeigt mir als Leser, ob Du Dir darüber Gedanken gemacht hast.

Allerdings hat der selbstoptimierende Compiler die eine oder andere Überraschung auf Lager, aber das ist dann ein Thema für Leute, die den erzeugten Maschinencode vergleichen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Doc_Arduino

Ich verstehe leider nicht warum man überhaupt das byte oder uint8_t davor schreiben muss?
Gegenfrage. Warum schreibst du int? Erst dann kann deine Frage sinnvoll beantwortet werden.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Timbonade

Hallo mal wieder.

Ich habe den Code :

Code: [Select]


Combie::Timer::SimpleTimer timer; // timer Instanz anlegen
using Combie::Timer::EntprellTimer;
EntprellTimer entprellenLadung(30);
EntprellTimer entprellenKnopf(30);
EntprellTimer entprellenBremse(30);

const byte Ladung = 2;
const byte Knopf = 3;
const byte Bremse = 4;
const byte Rot = 9;
const byte Gruen = 10;
const byte Zuendung = 11;
const byte Start = 12;
const uint32_t drueckzeit = 3000;
byte schritt;
bool aktLadung, altLadung, aktKnopf, altKnopf, aktBremse, altBremse, einmal;
enum {WARTEN, ROT, ZEIT, GRUEN};

void setup() {
  pinMode(Ladung, INPUT_PULLUP);
  pinMode(Knopf, INPUT_PULLUP);
  pinMode(Bremse, INPUT_PULLUP);
  pinMode(Rot, OUTPUT);
  pinMode(Gruen, OUTPUT);
  pinMode(Zuendung, OUTPUT);
  pinMode(Start, OUTPUT);
}

void loop()
{
  altLadung = aktLadung;
  aktLadung = entprellenLadung(!digitalRead(Ladung)); // invers, wg. pullup
  altKnopf = aktKnopf;
  aktKnopf = entprellenKnopf(!digitalRead(Knopf)); // invers, wg. pullup
  altBremse = aktBremse;
  aktBremse = entprellenBremse(!digitalRead(Bremse)); // invers, wg. pullup

  switch (schritt)
  {
    case WARTEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, LOW);
        digitalWrite(Start, LOW);
      }
      if (aktBremse)
      {
        if (!altKnopf && aktKnopf)
        {
          einmal = true;
          schritt = ZEIT;
        }
      } else {
        if (!altKnopf && aktKnopf)
        {
          einmal = true;
          schritt = ROT;
        }
      }
      break;
    case ROT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
      }
      if (!altKnopf && aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
    case ZEIT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
        timer.start();
      }
      if (!aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      if (timer(drueckzeit))
      {
        einmal = true;
        schritt = GRUEN;
      }
      break;
    case GRUEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, HIGH);
        digitalWrite(Zuendung, HIGH);
        digitalWrite(Start, HIGH);
      }
      if (!aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
  }
}



Einfach mal kopiert, aber der Compiler meldet fehler. Ich muss bestimmt diese Bibliothek herunter laden oder eintragen. Oder was habe ich nun wieder nicht verstanden?  

Sorry wenn ich hier alles von anderen machen lasse. ich muss wirklich mal C++ lernen glaube ich, damit ich so manche Abkürzungen einfach verstehe. Den mal wieder verstehe ich den Code zum teil, aber irgend wann hört es dann wieder auf und ich sehe nur noch irgend welche Zeichen, auf gut Deutsch, ich sehe den Wald vor lauter Bäumen nicht.

Ich weiß nicht jeder kann alles wissen, aber ich komme mir hier wie der Totale Depp vor...
Ich bin ja schon kurz davor zu sagen, komm schreib mir einer bitte das Fertige Programm mit allem was ich auf den Arduino aufspielen muss und er bekommt x € dafür.

:smiley-roll-sweat:

Danke erst mal an alle die sich an dem Thema beteiligen.

combie

Quote
Ich habe den Code :
Ja, das nutzt Teile meiner Lib.

Quote
Ich muss bestimmt diese Bibliothek herunter laden oder eintragen. Oder was habe ich nun wieder nicht verstanden? 
Ja, das hast du total richtig verstanden.
Im Quellcode findet sich ein Verweis auf die Lib.
Folge diesem.

Und ja, ganz einfach ist das Zeugs nicht zu verstehen, wenn man das dicke, über 1000 seitige, C++ Buch noch nicht auswendig gelernt hat.
Säge kein Sägemehl.

agmue

Ich weiß nicht jeder kann alles wissen, aber ich komme mir hier wie der Totale Depp vor...
Wenn ich mir die Bibliotheken von combie ansehe, geht es mir Hobbyprogrammierer nicht anders. Darum habe ich sie in diesem Beispiel mal als schwarze Kiste ausprobiert (mein Lerneffekt). Bei meinem Auto kenne ich auch nicht die Bedeutung jeder Strippe. Es genügt, wenn ich weiß, wo der Benzineinfüllstutzen ist und wie ich den Gasschlauch anschließe :D

Ich bin ja schon kurz davor zu sagen, komm schreib mir einer bitte das Fertige Programm mit allem was ich auf den Arduino aufspielen muss und er bekommt x € dafür.
Gute C++-Programmierer sind teuer, sei gewarnt 8)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

combie

Quote
Darum habe ich sie in diesem Beispiel mal als schwarze Kiste ausprobiert (mein Lerneffekt).
Und?
Wie funktionieren sie als Blackbox?
bzw. wie fühlt es sich an?
Säge kein Sägemehl.

agmue

Wie funktionieren sie als Blackbox?
bzw. wie fühlt es sich an?
Meinen Vorschlag aus #9 habe ich mit den Pins im Feld (nicht gespeichert) und Struktur probiert:

Code: [Select]
#include <CombieTimer.h> // Quelle: https://forum.arduino.cc/index.php?topic=542332.msg3716132#msg3716132
Combie::Timer::SimpleTimer timer; // timer Instanz anlegen
using Combie::Timer::EntprellTimer;

struct Taster {
  const byte pin;
  EntprellTimer entprellen;
  bool aktZustand, altZustand;
  Taster(const byte pin) : pin(pin), entprellen(30), aktZustand(0), altZustand(0) {}

  void init() {
    pinMode(pin, INPUT_PULLUP);
  }

  void aktualisieren() {
    altZustand = aktZustand;
    aktZustand = entprellen(!digitalRead(pin)); // invers, wg. pullup
  }
};

Taster taster[] = {
  2,  // Ladung
  3,  // Knopf
  4   // Bremse
};

const byte Rot = 9;
const byte Gruen = 10;
const byte Zuendung = 11;
const byte Start = 12;
const uint32_t drueckzeit = 3000;
byte schritt;
bool einmal;
enum {WARTEN, ROT, ZEIT, GRUEN};
enum {LADUNG, KNOPF, BREMSE};

void setup() {
  for (Taster &t : taster) t.init();
  pinMode(Rot, OUTPUT);
  pinMode(Gruen, OUTPUT);
  pinMode(Zuendung, OUTPUT);
  pinMode(Start, OUTPUT);
}

void loop()
{
  for (Taster &t : taster) t.aktualisieren();
  switch (schritt)
  {
    case WARTEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, LOW);
        digitalWrite(Start, LOW);
      }
      if (taster[BREMSE].aktZustand)
      {
        if (!taster[KNOPF].altZustand && taster[KNOPF].aktZustand)
        {
          einmal = true;
          schritt = ZEIT;
        }
      } else {
        if (!taster[KNOPF].altZustand && taster[KNOPF].aktZustand)
        {
          einmal = true;
          schritt = ROT;
        }
      }
      break;
    case ROT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
      }
      if (!taster[KNOPF].altZustand && taster[KNOPF].aktZustand)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
    case ZEIT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
        timer.start();
      }
      if (!taster[KNOPF].aktZustand)
      {
        einmal = true;
        schritt = WARTEN;
      }
      if (timer(drueckzeit))
      {
        einmal = true;
        schritt = GRUEN;
      }
      break;
    case GRUEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, HIGH);
        digitalWrite(Zuendung, HIGH);
        digitalWrite(Start, HIGH);
      }
      if (!taster[KNOPF].aktZustand)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
  }
}

Chapeau! Funktioniert gut und fühlt sich auch gut an :)

Möglicherweise könnte ich mich daran gewöhnen :D
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Timbonade

Hallo, ich habe das Programm gerade ausprobiert auf einem kleinen Steckbrett.
Das Programm hat leider nichts gemacht.
Keine Led an oder sonst was. Müssen die eingänge mit 5 volt oder höher angesteuert werden? zudem hatte ich den Arduino über ein 12 volt netzteil angeschlossen und gleichzeitig an den usb, mit ein mal ist der pc ausgegangen und der Arduino macht jetzt gar nichts mehr. Wohl abgeraucht.

Muss ich zu dem programm  noch was auspielen`? oder habe ich vergessen was dazu zu  schreiben?

agmue

#23
Jun 29, 2019, 10:34 pm Last Edit: Jun 29, 2019, 10:35 pm by agmue
Hallo, ich habe das Programm gerade ausprobiert auf einem kleinen Steckbrett.
Welches meinst Du?

Das Programm hat leider nichts gemacht.
Wenn Du meine aus #9 und #21 meinst, so habe ich sie getestet, allerdings enthalten sie nicht die komplette Funktionalität.

Müssen die eingänge mit 5 volt oder höher angesteuert werden?
Die IOs vertragen nur 0 bis 5 V, keinesfalls mehr. Eingänge mit INPUT_PULLUP haben eingebaute PullUp-Widerstände und werden nach GND geschaltet.

Wohl abgeraucht.
Hast Du Ersatz?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Timbonade

Hallo

Welches meinst Du?
Ich meine den hier.
Code: [Select]


Combie::Timer::SimpleTimer timer; // timer Instanz anlegen
using Combie::Timer::EntprellTimer;
EntprellTimer entprellenLadung(30);
EntprellTimer entprellenKnopf(30);
EntprellTimer entprellenBremse(30);

const byte Ladung = 2;
const byte Knopf = 3;
const byte Bremse = 4;
const byte Rot = 9;
const byte Gruen = 10;
const byte Zuendung = 11;
const byte Start = 12;
const uint32_t drueckzeit = 3000;
byte schritt;
bool aktLadung, altLadung, aktKnopf, altKnopf, aktBremse, altBremse, einmal;
enum {WARTEN, ROT, ZEIT, GRUEN};

void setup() {
  pinMode(Ladung, INPUT_PULLUP);
  pinMode(Knopf, INPUT_PULLUP);
  pinMode(Bremse, INPUT_PULLUP);
  pinMode(Rot, OUTPUT);
  pinMode(Gruen, OUTPUT);
  pinMode(Zuendung, OUTPUT);
  pinMode(Start, OUTPUT);
}

void loop()
{
  altLadung = aktLadung;
  aktLadung = entprellenLadung(!digitalRead(Ladung)); // invers, wg. pullup
  altKnopf = aktKnopf;
  aktKnopf = entprellenKnopf(!digitalRead(Knopf)); // invers, wg. pullup
  altBremse = aktBremse;
  aktBremse = entprellenBremse(!digitalRead(Bremse)); // invers, wg. pullup

  switch (schritt)
  {
    case WARTEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, LOW);
        digitalWrite(Start, LOW);
      }
      if (aktBremse)
      {
        if (!altKnopf && aktKnopf)
        {
          einmal = true;
          schritt = ZEIT;
        }
      } else {
        if (!altKnopf && aktKnopf)
        {
          einmal = true;
          schritt = ROT;
        }
      }
      break;
    case ROT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
      }
      if (!altKnopf && aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
    case ZEIT:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, HIGH);
        digitalWrite(Gruen, LOW);
        digitalWrite(Zuendung, HIGH);
        timer.start();
      }
      if (!aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      if (timer(drueckzeit))
      {
        einmal = true;
        schritt = GRUEN;
      }
      break;
    case GRUEN:
      if (einmal) {
        einmal = false;
        digitalWrite(Rot, LOW);
        digitalWrite(Gruen, HIGH);
        digitalWrite(Zuendung, HIGH);
        digitalWrite(Start, HIGH);
      }
      if (!aktKnopf)
      {
        einmal = true;
        schritt = WARTEN;
      }
      break;
  }
}



Was fehlt den da noch?

Die IOs vertragen nur 0 bis 5 V, keinesfalls mehr. Eingänge mit INPUT_PULLUP haben eingebaute PullUp-Widerstände und werden nach GND geschaltet.

Also wenn ich den 5 Volt pin den Arduino zum knopf führe und dann zu einem der eingänge müsste das funktionieren oder nicht?

Ersatz habe ich mir bestellt. Eine später fürs im auto und eine zum testen auf dem steck Board.

agmue

Was fehlt den da noch?
"Ladung" ist gänzlich unberücksichtigt und ob der Rest genau das tut, was Du Dir vorstellst, wage ich zu bezweifeln. Ich wollte Dir nur eine Anregung geben, welche Richtung Du einschlagen könntest.

Also wenn ich den 5 Volt pin den Arduino zum knopf führe und dann zu einem der eingänge müsste das funktionieren oder nicht?
Nee, besser GND - Knopf - Eingang

Durch die Invertierung im Programm ist ein gedrückter Knopf dann HIGH in der Variablen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Timbonade

Hallo.

"Ladung" ist gänzlich unberücksichtigt und ob der Rest genau das tut, was Du Dir vorstellst, wage ich zu bezweifeln. Ich wollte Dir nur eine Anregung geben, welche Richtung Du einschlagen könntest.
Ok, schade. ich dachte das wäre jetzt schon das fertige Programm. Wie gesagt ich verstehe mal wieder nur einen Teil und irgend wann verliere ich den überblick.

Nee, besser GND - Knopf - Eingang

Durch die Invertierung im Programm ist ein gedrückter Knopf dann HIGH in der Variablen.

Soll heißen der Knopf schlißt auf GND, aber im Program wird im so gesehen vorgegaukelt das es HIGH geht?
habe ich das richtig verstanden?

Ich weiß das ich mir das eigentlich selber erarbeiten müsste, aber würdest du mir das Fertige Programm schreiben? Das wäre echt super. Solltest du das machen, werde ich mir den code auch genau durch lesen um ihn Hoffentlich (Vielleicht) zu verstehen.

Ach ja gibt es eigentlich ein Tool dass ich am Pc laufen lassen kann um zu sehen was der Arduino gerade macht  ? Irgend wie etwas das mir an zeigt an welcher Dtelle er sich gerade im Programm befindet?
mfg

Tommy56

Da brauchst Du kein extra Tool. Du schreibst einfach serielle Ausgaben in Dein Programm und schaust Dir diese im seriellen Monitor der IDE an.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

....
Ich weiß das ich mir das eigentlich selber erarbeiten müsste, aber würdest du mir das Fertige Programm schreiben? Das wäre echt super. Solltest du das machen, werde ich mir den code auch genau durch lesen um ihn Hoffentlich (Vielleicht) zu verstehen.
....
Sieh dir doch einfach mal die Beispiele (z.B. digital-Button) in der IDE an und arbeite mit denen.
Da kannst du schon sehr viel daraus lernen.
Gruß Dieter

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

beeblebrox

Ich finde das ja toll wie hier geholfen wird, aber mit so wenig Kenne etwas in ein Fahrzeug
einzubauen halte ich schon fast für grob fahrlässig.

Als Experiment im Trockendock zum Lernen OK. Aber bis zum Einbau ins Auto bitte noch 2 Jahre
lernen.

Ist nur meine Meinung.

Ulli

Go Up