Go Down

Topic: Chipsmaschine (Read 734 times) previous topic - next topic

Rahmschnitzel

So sieht der Sketch momentan aus. Ist zwar sehr unübersichtlich, aber solange es funktionieren könnte (kann es noch nicht ausprobieren), ist mir das relativ egal.

Vllt. könntet ihr ja mal einen kurzen Blick drauf werfen und schauen, ob ich irgendwo Schund hingeschrieben habe.

Tommy56

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.


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

Rahmschnitzel

Code: [Select]

/*
  Tasten:

  A: Chips-Anzahl bestätigen.   !!!WICHTIG!!!
  B: Start des Programmes.
  C: Fehler Behoben. Programm startet wieder.
  D: Stop des Programmes.

*/

#include <Wire.h>

#include <Adafruit_MotorShield.h>

#include <AccelStepper.h>

#include <Keypad.h>

#include <LiquidCrystal.h>

#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

AccelStepper myStepper (1, 200, FORWARD);

AccelStepper myStepper2 (1, 200, FORWARD);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int UnterbrochenUnten = 0;
int UnterbrochenOben = 0; //Unter der Variablen "messwert" wird später der Messwert der Lichtschranke gespeichert. Lichtschranke Oben
long startTime; // millis-Wert beim ersten Drücken der Taste  Lichtschranke Oben
long duration;  // Variable für die Dauer. Lichtschranke Oben
const long wartezeit = 1;
long lastfree;
boolean schonerkannt;
int tatsachlicheAnzahl;
boolean allesOK;
boolean fehler;
boolean Stop;

int konstanteLSunten;

unsigned int e, z;
char bestTatse;
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
//Die Ziffern und Zeichen des Keypads werden eingegeben:
char hexaKeys[ROWS][COLS] = {
  {'D', '#', '0', '*'},
  {'C', '9', '8', '7'},
  {'B', '6', '5', '4'},
  {'A', '3', '2', '1'}
};

byte colPins[COLS] = {2, 3, 4, 5}; //Definition der Pins für die 4 Spalten
byte rowPins[ROWS] = {6, 7, 8, 9}; //Definition der Pins für die 4 Zeilen
unsigned int Anzahl;
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit myKeypad angesprochen werden     Eingabefeld


void setup() {

  AFMS.begin();

  myStepper.setMaxSpeed(200);
  myStepper.setSpeed(200);

  myStepper2.setMaxSpeed(200);
  myStepper2.setSpeed(200);


  lcd.begin(16, 2);

}


void loop()
{

  Stop = false;


  lcd.setCursor(0, 0);
  lcd.print("Zum Start 'B' "); //Beginn beim ersten Zeichen in der ersten Zeile mit dem Text „Oben".
  lcd.setCursor(4, 1);
  lcd.print("drücken!");

  if (Tastenfeld.getKey() == 'B') {
    allesOK = true;
    lcd.clear();
  }
  while (allesOK == true && Stop == false) {

    if (Tastenfeld.getKey() != 'D') {

      Stop = true;
    }

    UnterbrochenOben = digitalRead(8); //Die Signalausgabe der Lichtschranke wird ausgelesen und unter der Variable „messwert" gespeichert.
    //Wenn die Lichtschranke unterbrochen wird, speichert der Mikrocontroller den Wert "1", ansonsten "0". Lichtschranke Oben

    if (UnterbrochenOben == 0 && allesOK == true) {
      lastfree = millis();
      schonerkannt = false; //wenn die LS frei ist, kann Die noch nicht als 'lange genug geschlossen' erkannt worden sein
    }
    if (millis() - lastfree > wartezeit && schonerkannt == false && allesOK == true) {

      schonerkannt = true;
      myStepper.move(0);



    } else {

      myStepper.runSpeed();

    }
    if (Tastenfeld.getKey() != 'D') {

      Stop = true;
    }

    while (Tastenfeld.getKey() != 'A' && Stop == false) {
      z = Tastenfeld.getKey(); // Zehner
      e = Tastenfeld.getKey(); // Hunderter
    }
    Anzahl = z * 10 + e;

    // Eingabe und Ausgabe
    if (Tastenfeld.getKey() == 'A') { //Wenn eine Taste gedrückt wurde

      lcd.setCursor(0, 0);
      lcd.print("Anzahl Chips:"); //Beginn beim ersten Zeichen in der ersten Zeile mit dem Text „Oben".

      lcd.setCursor(8, 1);
      lcd.print(Anzahl); //Erneuter Beginn beim fünften Zeichen in der zweiten Zeile mit dem Text „Unten".

    }
    tatsachlicheAnzahl = 0;
    if (Tastenfeld.getKey() == 'A') {
      konstanteLSunten = 1;
      for ( int a = 1; a <= Anzahl; a++) {
        myStepper2.move(200);
        UnterbrochenUnten = digitalRead(9);   //Lichtschranke Unten
        if (UnterbrochenUnten == 1) {

          tatsachlicheAnzahl = tatsachlicheAnzahl + 1;
        }

      }
      if (tatsachlicheAnzahl != Anzahl) {

        allesOK = false;
        fehler = true;
        lcd.clear();

        lcd.setCursor(6, 0);
        lcd.print("Problem!!!!");


      } else {

        lcd.clear();

        lcd.setCursor(6, 9);
        lcd.print("Fertig");

        Anzahl = 0;
        z = 0;
        e = 0;

      }

    }

    if (Tastenfeld.getKey() != 'D') {

      Stop = true;
    }
  }

  while (fehler == true) {
    lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print("Problem behoben?");
    lcd.setCursor(3, 1);
    lcd.print("Dann drücke 'C'");

    if ( Tastenfeld.getKey() == 'C') {
      lcd.clear();

      fehler = false;
      allesOK = true;
      Anzahl = 0;
      z = 0;
      e = 0;
    }
  }
}

postmaster-ino

Hi

Der halbe Code besteht aus Leerzeilen - gewöhne Dir Das schnellstmöglich wieder ab.
Leerzeilen zur optischen Trennung: ok
Leerzeilen, daß man auf 7 Din-A-4 Seiten kommt: pfui - wir sind hier nicht in der Schule!
Gleichmäßiges Einrücken geht in der IDE durch STRG+T.

Kommentare passen nicht zum Code - wo ist 'messwert' hin? -> Kommentar weg

Zeiten als unsigned long - der Kompiler sollte Dir zumindest eine Warnung geben, überall, wo millis() auf die signed-Typen trifft.
Wenn nciht: Warnungen einschalten: Voreinstellungen, 2x Haken bei vollständige Warnungen (oder so, habe die IDE nicht offen)
... oder erwartest Du Negativ-Zeiten? Dann hat int durchaus Seine Berechtigung ;)

int für Lichtschranke unten - gleiche Frage: negative Werte möglich? N -> unsigned int (bei >255, sonst reicht byte)

Sprechende Variablen-Namen ... wer ist e und was hat Er mit z am Hut?

Kein while in der loop() - Ausnahme: Du weißt, was Du tust.
loop() ist bereits Deine Schleife, in Der Du 'auf alles Mögliche' reagieren willst - ein while blockiert, der Rest von loop() geht leer aus.

Aaaah . Zehner und Einer sind z und e - obwohl dort 'Hunderter' als Kommentar steht.
Die Eingabe klappt so? ... hätte ich nicht wirklich drauf gewettet - man lernt nie aus

Wenn der Sketch so funktioniert, ist Er, laut Definition, ein guter Sketch.
Ob Du durch Diesen in zwei Wochen noch durchsteigst, ist aber eher fraglich, da weder durchgehend sprechende Namen benutzt wurden, noch die Kommentare zu Dem, was davor passiert, passen.
Schöner geht immer - Das aber auch z.B. bei uns - also nicht den Kopf aufgrund dieses Post in den Sand stecken.
Vll. bei Änderungen ebenfalls diese Baustellen im Auge behalten.

Egal, was Du machst - sichere Dir den funktionierenden Sketch - Nichts ist ärgerlicher, als mit stundenlangem Feintuning auch den letzten noch funktionierenden Ablauf kaputt zu bekommen.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Rahmschnitzel

Ja ich arbeite noch sehr viel mit Leerzeilen (hat man so in der Schule begebracht bekommen).  :D

Ja die Kommentare passen nicht immer und auch man Bezeichnungen sind unzutreffend gewählt, das liegt aber am vielem umschreiben des Codes.

Ob die Eingabe so funktioniert weiß ich noch nicht, denn ich kann es wie gesagt noch nicht ausprobieren, jedoch habe ich sie so ähnlich in einem anderen POst in diesem Forum gesehen.

Mein größtes Problem sind die beiden Steppermotoren. Ich lasse sie über ein MotorShield laufen und benutze die AccelStepper Lib. Jedoch bin ich mir nicht sicher ob ich das im Sketch richtig geacht habe und worauf ich achten muss. Als Pin-Vergabe habe ich im gesamten Sketch irgendwelche Pins genommen (nur falls ich darauf angesprochen werde).

Passt der Teil mit den beiden Steppern so, oder ist dort etwas falsch? Wenn ja, was genau?



arduarn

Passt der Teil mit den beiden Steppern so, oder ist dort etwas falsch? Wenn ja, was genau?
Adafruit Motor Shield Bibliotheke -> Beispiele -> Accel_MultiStepper

Rahmschnitzel

Leute ich habe nun ein letztes Problem.

Der untere Stepper bekommt durch ein Keypad eine Umdrehungsanzahl und soll diese dann machen und danach stoppen.


Wenn ich es mit move(Anzahl*Schritte); mache, hat der Motor einen Speed von gefühlt 1. Wie kann ich den Speed ändern oder ggf. etwas anderes anstatt move();

Vielen Dank ;D

arduarn

Schön, dass Du so viel weitergekommen bist. Post bitte Deinen aktuellen Sketch.

Go Up