Hilfe bei code

Hallo Zusammen,

ich bin Neuling bei Arduino und da ich jetzt in Rente bin habe ich Zeit mich damit mal zu beschäftigen.
Nun ist gleich folgendes aufgetreten:
Ich habe einen Code für einen Servo (TorÖffnung mit Ampelanzeige) kreiert und alles funktionierte wunderbar. Servo läuft, Ampel ist stellungsentsprechend auf rot oder grün.
Nun habe ich noch eine gelbe LED für die Zeit der Bewegung des Servos über Tasterabfrage dazugeschrieben. funktioniert auch.
Nach einbinden der gelben LED läuft aber nun der Servo nicht mehr, was ich mir nicht erklären kann.
Könnt ihr mir bitte mal helfen und drüber schauen.
Zu letzt habe ich nur noch das Problem das der Servo zu schnell läuft, dh. die Torflügel würden auffliegen :slight_smile:
Danke für Eure Hilfe und Tips.

[code]
#include <Servo.h> // zugriff auf Servo Bibliothek

const int taster = 2; // Pushbutton Pin auf dem Board (2)
int LEDred = 6;
int LEDgreen = 7;
int LEDyellow = 8;
int val_1 = 0; // speichert den Zustand des Tasters
int old_val_1 = 0; // speichert den vorherigen wert von val
int state = 0; // 0 = Servo Position eins 1 = Servo Position zwei
int tasterstatus = 0;
Servo servo; // deklariert den Namen des ersten Servos

void setup() {
  pinMode(taster, INPUT);
  servo.attach(9); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
  servo.write(0); // gibt die Grundstellung des Servo beim start an
  pinMode(LEDred, OUTPUT);
  pinMode(LEDgreen, OUTPUT);
  pinMode(LEDyellow, OUTPUT);


}

void loop()
{ val_1 = digitalRead(taster); // liest den Input aus ob gedrückt
  if ((val_1 == LOW) && (old_val_1 == HIGH)) {
    state = 1 - state;
    delay(500);
  }

  old_val_1 = val_1; // aktueller val wird zu val alt

  if (state == 1) {
    servo.write(180); // Stelle servo auf 180 grad
    digitalWrite(LEDred, HIGH);
    digitalWrite(LEDgreen, LOW);
    delay(20);
  }


  else {
    servo.write(0); // stelle servo auf startposition
    digitalWrite(LEDred, LOW);
    digitalWrite(LEDgreen, HIGH);
  }


  tasterstatus = digitalRead(taster);
  if (tasterstatus == HIGH)
  {
    digitalWrite(LEDyellow, HIGH);
    delay (2000);
    digitalWrite(LEDyellow, LOW);
  }
  else
  {
    digitalWrite(LEDyellow, LOW);
  }

}

[/code]

Hallo,

was machen die 0,5s beim Taster einlesen?

Hauptproblem sind die 2s delay bei deiner gelben Led. delay blockiert die Abarbeitung. Du müßtest hier zwangsweise blockierfrei programmieren. Dafür verwendet man millis. Denke dabei an deine Armbanduhr, die ewig weiterlaufende Zeit.

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

Übrigens kann man eine bool Variable immer negieren mit state = !state

autonowe:
Hallo Zusammen,

ich bin Neuling bei Arduino und da ich jetzt in Rente bin habe ich Zeit mich damit mal zu beschäftigen.

Na dann herzlich willkommen.

Nun habe ich noch eine gelbe LED für die Zeit der Bewegung des Servos über Tasterabfrage dazugeschrieben. funktioniert auch.
Nach einbinden der gelben LED läuft aber nun der Servo nicht mehr, was ich mir nicht erklären kann.

int val_1 = 0; // speichert den Zustand des Tasters

int tasterstatus = 0;
Servo servo; // deklariert den Namen des ersten Servos

void setup() {
  pinMode(taster, INPUT);
}

void loop()
{ val_1 = digitalRead(taster); // liest den Input aus ob gedrückt
  if ((val_1 == LOW) && (old_val_1 == HIGH)) {
    state = 1 - state;
    delay(500);
  }

Ich teils mal auf.
Du hast schon val_1. Da brauchst Du tasterstatus nicht mehr, da der später das selbe macht.
Dann initialisierst Du den Taster mit INPUT.
Hast Du das auf'm Steckbrett aufgebaut und dort einen Pullup nach +5V gelegt?
Ich würde für Taster immer den internen PULLUP benutzen.
Dann erschliesst sich mir das state = 1 - state nicht.

[Mit dem delay war Doc_Arduino schneller]

  tasterstatus = digitalRead(taster);
  if (tasterstatus == HIGH)
  {
    digitalWrite(LEDyellow, HIGH);
    delay (2000);
    digitalWrite(LEDyellow, LOW);
  }
  else
  {
    digitalWrite(LEDyellow, LOW);
  }
}

Während Du oben noch auf LOW prüfst, ob die Taste gedrückt ist, prüfst Du hier auf HIGH.
Das würde bedeuten, das die gesamte Zeit, wo die Taste nicht gedrückt ist das gelbe leuchtet.

Das mit dem delay() ist noch noch fataler.

Mach Dir mal mit einem Stift und einem Zettel einen PAP.
Zumindest, damit DU siehst, was bei welchem Tastendruck -loslassen passieren soll.

Das leuchten der gelben LED würde ich in jedem Fall mit der Zustandsänderung val_1 / oldval_1 versuchen zu lösen.

Hallo Zusammen,

habe mit millis() probiert, versucht zu lesen und zu verstehen, habe leider keine "Anleitung" gefunden.
Das ist mir noch ein Rätsel und das Inet verwirrt noch mehr und das Buch "Arduino Kompendium" und die Arduino Befehlsübersicht haben mich auch nicht weiter gebracht.

autonowe:
habe mit millis() probiert, versucht zu lesen und zu verstehen, habe leider keine "Anleitung" gefunden.

Schau mal in den Nachbarthread, da hab ich grad was abgekippt. :wink:

Das erklärt gleich mehrere Sachen auf einmal - unter anderem die millis()-rechnerei.
Wenn Fragen sind, frag.
Ein "Ich versteh's nicht" reicht nicht für Erläuterungen.

autonowe:
Zu letzt habe ich nur noch das Problem das der Servo zu schnell läuft, dh. die Torflügel würden auffliegen :slight_smile:

Da helfen die MobaTools, die Du mit der IDE installieren kannst, denn die kennen eine Geschwindigkeit des Servos:

#include <MobaTools.h> // zugriff auf Servo Bibliothek
MoToServo servo; // deklariert den Namen des ersten Servos

const byte taster = 2; // Taster gegen GND schaltend
const byte LEDred = 6;
const byte LEDgreen = 7;
const byte LEDyellow = 8;
bool tasterstatus = false; // speichert den aktuellen Zustand des Tasters
enum {ZU, OEFFNEN, AUF, SCHLIESSEN};
byte schritt = ZU;

void setup()
{
  pinMode(taster, INPUT_PULLUP);
  pinMode(LEDred, OUTPUT);
  pinMode(LEDgreen, OUTPUT);
  pinMode(LEDyellow, OUTPUT);
  digitalWrite(LEDred, HIGH);
  digitalWrite(LEDyellow, LOW);
  digitalWrite(LEDgreen, LOW);
  servo.attach(9); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
  servo.setSpeed(40, HIGHRES);
  servo.write(0); // gibt die Grundstellung des Servo beim start an
}

void loop()
{
  tasterstatus = !digitalRead(taster); // liest den Input aus ob gedrückt
  switch (schritt)
  {
    case ZU:
      if (tasterstatus)
      {
        servo.write(180); // Stelle Servo auf 180 Grad
        digitalWrite(LEDred, LOW);
        digitalWrite(LEDyellow, HIGH);
        digitalWrite(LEDgreen, LOW);
        schritt = OEFFNEN;
      }
      break;
    case OEFFNEN:
      if (!servo.moving())
      {
        digitalWrite(LEDred, LOW);
        digitalWrite(LEDyellow, LOW);
        digitalWrite(LEDgreen, HIGH);
        schritt = AUF;
      }
      break;
    case AUF:
      if (tasterstatus)
      {
        servo.write(0); // Stelle Servo auf 0 Grad
        digitalWrite(LEDred, LOW);
        digitalWrite(LEDyellow, HIGH);
        digitalWrite(LEDgreen, LOW);
        schritt = SCHLIESSEN;
      }
      break;
    case SCHLIESSEN:
      if (!servo.moving())
      {
        digitalWrite(LEDred, HIGH);
        digitalWrite(LEDyellow, LOW);
        digitalWrite(LEDgreen, LOW);
        schritt = ZU;
      }
      break;
  }
}

Super Dank an agmue. Nun werde ich die Programmierung generell nochmal von vorn durcharbeiten. Das Projekt war noch zu kompliziert für einen Elektroinstallateur, hatte bis jetzt nur mit 230V und mehr zu tun. ;-))

autonowe:
... für einen Elektroinstallateur ...

Solltest Du vorhaben, damit ein reales Tor zu steuern, dann mußt Du unbedingt an die Sicherheit denken! Für das, was Du baust, haftest Du zu 100 %!

Mein Programm stellt nur ein ausbaufähiges Grundgerüst dar, wo der Sicherheitsaspekt nicht berücksichtigt wurde.

Du weißt das natürlich, ich wollte es nur noch mal in Erinnerung rufen :slight_smile:

Nein nein ist nur für Modellbahn. :slight_smile:

Ich bin beruhigt :slight_smile:

Dann lohnt sich ein Blick in die Beschreibung der MobaTools ja auf jeden Fall!

Auf alle Fälle , nur so lernt und entdeckt man interessante Dinge .

Wenn Du irgendwann mal Deine Modellbahn vernetzen möchtest, hätte ich noch das Thema UNO - Mega - Teensy mittels CAN-Bus verbinden im Angebot.

Hallo an Alle,
es ist noch eine Frage aufgetaucht. Wie empfindlich sind die Arduino Nano Eingänge?
Ich habe alles auf eine Lochrasterplatine aufgebaut inkl. Abgabgsklemmen und einen Vorort-Minitaster. Der ist parallel zu den Tasterabgangsklemmen. Nun funzt alles wunderbar mit Vorort-Minitaster.
Aber sobald ich mit einem Draht an die Tasterabgangsklemme komme läuft der Servo los, wenn ich einen Draht anklemme (egal welchen Abgang D2 oder GND) läuft der Servo ununterbrochen.
Hat jemand ne Idee?
Leiterplatte habe ich schon geprüft, alles okay.
Danke Gruß Uwe

pinMode(taster, INPUT);

PullUp- oder PullDown-Widerstand vergessen?

Der Taster ist doch ein Input pullup? Muß da noch ein Widerstand rein?

autonowe:
Der Taster ist doch ein Input pullup?

Verstehe ich leider nicht, was meinst Du damit?

void setup()
{
pinMode(taster, INPUT_PULLUP)

So wird doch der interne Widerstand genutzt.?

Und?

autonowe:
void setup()
{
pinMode(taster, INPUT_PULLUP)

So wird doch der interne Widerstand genutzt.?

Richtig, der hat ca. 50 kΩ, den könntest Du mit 1 bis 10 kΩ unterstützen, ob es dann besser wird.

combie:
Und?

Die Frage:

autonowe:
Aber sobald ich mit einem Draht an die Tasterabgangsklemme komme läuft der Servo los, ...

Abgabgsklemmen und einen Vorort-Minitaster.

Wahrscheinlich bin ich zu alt um es zu wissen; Was ist ein Vorort-Minitaster?

Grüße Uwe