Treppenlauflicht

Schönen guten Tag,
ich weiß das Thema kam schon ziemlich oft wie ich gesehen habe, jedoch komme ich mit der Arduino Programmierung nicht zurecht.

Mal von vorne:

Ich mache gerade mein Maschinenbautechniker, als Projektarbeit habe ich ein Autarkes Treppenlauflicht gewählt. Meine Anlage plus deren Komponenten stehen und die Beschaltung für das Treppenlauflicht auch, dabei hatte ich Unterstützung eines Dozenten der sich sehr gut damit auskennt.
Jedoch hatte ich Anfang des Jahres Hochwasser und meine ganze Anlage stand noch im Keller und war somit überschwemmt. Dadurch hatte ich zwei Monate Ausfall und konnte mich leider nicht genug mit dem Arduino auseinander setzen. Die Abgabe meines Projektes war zwar jetzt schon gewesen, doch möchte ich natürlich trotzdem das es Funktioniert, einmal für mich und bis zur Vorstellung des Projektes.

Zu meiner Beschaltung:
Arduino Leonardo
Ich verwende 2 PIR Sensoren, Treppenaufgang und Treppenabgang, diese sind komplett am Arduino angeschlossen (5V, GND und 2 Eingänge)
Nun habe ich noch 12 LEDs, diese laufen über 12V, sind auf einem Steckbord bereits angeschlossen (mit 1kOhm Widerstand und BC337 Transistoren) und an 12 Ausgängen am Arduino.

Ich versuche nun zwischen den ganzen Prüfungen und Nebenjob die ganze Zeit ein Sketch zu schreiben, doch da ich mich generell nicht mit Programmierung auskenne und mit Arduino noch weniger fällt mir das verdammt schwer und ich verzweifel daran. Ich habe auch schon alle möglichen Einträge darüber studiert, doch mir fällt das einfach zu schwer.

Kann mir da bitte jemand dabei helfen?

Ich danke euch schon mal im voraus.

Deinen Sketch zur Prüfung musst Du schon selbst schreiben.

Beim Ausbügeln von Fehlern helfen wir, ansonsten sind wir aber nicht der kostenlose Hasaufgaben- / Hausarbeitendienstleister.

Gruß Tommy

Vielen Dank für die schnelle Antwort, ich werde mich mal durch probieren versuchen und ein Sketch zu schreiben. Ich hoffe nur ich verstehe dann auch eure Hilfestellungen, da ich mich überhaupt nicht mit EDV auskenne.

Fange doch mal bei EVA (ohne Adam) an...

Was ist deine Eingabe?

Wie sollen diese Werte verarbeitet werden?

Was soll deine Ausgabe sein?

Manchmal macht es Sinn den zeitlichen Verlauf in einer Tabelle darzustellen, dann sieht man meist schon selbst wie man den Ablauf programmieren sollte- und auch mit diesen Skizzen kannst du dich schon an uns wenden...

Als Eingabe sollen die beiden Bewegungsmelder dienen.
Annahme einer der beiden Bewegungsmelder bekommt ein Signal, sollen die LEDs in Laufrichtung eingeschalten werden, nach erkennen des zweiten Sensors sollen diese die LEDs in gleicher reihenfolge wie beim einschalten auch wieder ausschalten.
Für mich stellt sich schon die Frage, wie benenne ich die LEDs im Sketch?
PIR würde ich so benennen:
#define PIR_TOP_PIN 2
#define PIR_BOTTOM_PIN 3

diese geben ja das Eingangssignal.

Nun kommen die 12 LED Stripes, diese geben das Ausgangssignal, muss ich da jede LED einzeln beschreiben oder werden alle mit einmal beschrieben? Vor allem kann ich ja nicht die gleichen Zahlen wie bei den PIR wieder verwenden. Wie müsste ich diese dann beschreiben?

JensBuder:
.....
Nun kommen die 12 LED Stripes, diese geben das Ausgangssignal, muss ich da jede LED einzeln beschreiben oder werden alle mit einmal beschrieben? Vor allem kann ich ja nicht die gleichen Zahlen wie bei den PIR wieder verwenden. Wie müsste ich diese dann beschreiben?

Sieh dir doch einfach mal die zahlreichen Beispiele in der IDE an, da kannst du sehr viel lernen und dir die notwendigen Grundlagen aneignen.

Und fasse mal alles ordentlich zusammen, dass die Informationen 1. komplett und 2. überschaubar und verständlich sind....

JensBuder:
Für mich stellt sich schon die Frage, wie benenne ich die LEDs im Sketch?
PIR würde ich so benennen:
#define PIR_TOP_PIN 2
#define PIR_BOTTOM_PIN 3

ich tendiere heute eher zu const bytes denn #defines ... also

const byte LED_1_PIN = 4;
const byte LED_2_PIN = 5;
const byte LED_3_PIN = 6;
...

und da du vermutlich mit Schleifen arbeiten wirst, vielleicht die PIN's in ein Array übernehmen

const byte LED[] ={LED_1_PIN; LED_2_PIN, LED_3_PIN, ....

bzw. weils bei der Größe eh wurscht ist und würde ich als Anfänger erst mit Index 1 anfangen, und daher bei 0 einen Dummy-Wert eintragen:

const byte LED[] ={0, LED_1_PIN; LED_2_PIN, LED_3_PIN, ....

vielleicht noch
const byte TOTAL_NO_LEDS = 12;

um in den Schleifen dann halt von 1 bis TOTAL_NO_LEDS iterieren zu können.

Also jemandem beizubiegen als Anfänger erst mal die Schleifen bei 1 beginnen zu lassen, halte ich für sehr grenzwertig.

Der gewöhnt sich das dann an und stolpert dann regelmäßig bei allen anderen Codes, wo mit 0 angefangen wird zu zählen. Ich denke man sollte sich gerade als Anfänger gleich an die allgemeinen Gepflogenheiten halten und bei 0 anfangen zu zählen.

Gruß Tommy

Ich hab da mal was geschrieben, jedoch leuchtet bei mir nur der vierte LED Streifen fur zehn Sekunden immer, dann geht er kurz aus und leuchtet wieder zehn Sekunden.

Hier mein Sketch, vielleicht kann mir da jemand helfen:

#include <SPI.h>

#define  PIR_TOP_PIN A1
#define  PIR_BOTTOM_PIN A2
int i = 1;
int LedAnPause = 100;

int richtung; 
int pirWert;
void setup() {
 // put your setup code here, to run once:
 pinMode(1,OUTPUT);
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
}

void loop() {
 // put your main code here, to run repeatedly:
 richtung = 0;
 pirWert = 0;
 pirWert = analogRead(PIR_TOP_PIN);
 if(pirWert > 500)// falls Katze kommt  
 {
   richtung = 1;
   LichtAn(richtung);
   delay(10000);
   LichtAus();
 }
 pirWert = analogRead(PIR_BOTTOM_PIN);
 if(pirWert > 500)// falls Katze kommt  
 {
   richtung = 2;
   LichtAn(richtung);
   delay(10000);
   LichtAus();
 }
}

void LichtAus()
{
 int i;
 for(i=0;i< 12;i++){
//    if(anrichtung = 1)
//    {
//      ledCounter++;
//    }
//    else
//    {
//      ledCounter--;
//    }
//    digitalWrite(ledCounter, LOW);
//    delay(LedAnPause);
   digitalWrite(i+1, LOW);
 }
 
}
void LichtAn(int anrichtung)
{
 int i;
 int ledCounter;
 if(anrichtung = 1)
 {
   ledCounter = 1;
 }
 if(anrichtung = 2)
 {
   ledCounter = 12;
 }
 for(i=0;i< 12;i++){
   if(anrichtung = 1)
   {
     ledCounter++;
   }
   else
   {
     ledCounter--;
   }
   digitalWrite(ledCounter, HIGH);
   delay(LedAnPause);
 }
   
}

pinMode(1,OUTPUT);

Vorsicht Pin 1 ist in der Regel von der Seriellen belegt.

Und ich stimme meinen Vorrednern in Grenzen zu.

Richtig ist:
Stecke die LEDs (ihre Pinnummern) in ein Array!
Fange bei 0 an zu zählen, wie es sich für anständige C++ Arrays gehört.

Keine #define verwenden.
Verwende const byte für die Definition.
Es gibt sinnvolle Einsätze für #define. Aber nicht hier

Das delay() kann man entfernen, wenn man unsere "Nachtwächter Erklärung" verstanden hat.

Ich würde zum Testen des Lauflichts auch nicht gleich den PIR mit reinnehmen, sondern einfach stumpf nur die LichtAn() Funktion in der loop testen.
Zerlege Dein Problem in Teilproblem und löse jedes einzeln, erst dann alles zusammensetzen.

z.B.

void loop() {

    richtung = 1;
    LichtAn(richtung);
    delay(5000);
    LichtAus();

    delay(2000);

    richtung = 2;
    LichtAn(richtung);
    delay(5000);
    LichtAus();

    delay(5000);
}

Außerdem würde ich für den Anfang in die einzelnen Programmteile einfache Debug-Ausgaben per "Serial.println()" einbauen. Damit kannst Du im seriellen Monitor schauen was Dein Programm gerade macht.

Mario.

Und überhaupt, warum verwendest du keine Code-Tags ?
Damit wird dein Sketch für alle besser lesbar.
Schaltfläche </> oben links im Editorfenster. Du kannst es auch nachträglich noch machen.

Vielen Dank, das mit den Lichtern werde ich mal versuchen, jedoch geht bei mir das Testen nicht so einfach, die Anlage ist bereits draußen verbaut und das ist es ein wenig aufwändiger und den computer kann ich da auch nicht mitnehmen.

Das mit dem const byte funktioniert irgendwie nicht, da kommt immer ein Fehler beim überprüfen, genauso wie bei der Array:

Arduino: 1.8.5 (Windows Store 1.8.10.0) (Windows 10), Board: "Arduino Leonardo"

Lauflicht:2: error: expected initializer before 'A1'

const byte  PIR_TOP_PIN A1

                        ^

C:\Users\Buder\Documents\Arduino\libraries\Lauflicht\Lauflicht.ino: In function 'void setup()':

Lauflicht:11: error: 'LED_0_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                     ^

Lauflicht:11: error: expected '}' before ';' token

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                              ^

Lauflicht:11: error: 'LED_1_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                ^

Lauflicht:11: error: 'LED_2_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                           ^

Lauflicht:11: error: 'LED_3_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                      ^

Lauflicht:11: error: 'LED_4_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                 ^

Lauflicht:11: error: 'LED_5_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                            ^

Lauflicht:11: error: 'LED_6_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                       ^

Lauflicht:11: error: 'LED_7_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                                  ^

Lauflicht:11: error: 'LED_8_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                                             ^

Lauflicht:11: error: 'LED_9_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                                                        ^

Lauflicht:11: error: 'LED_10_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                                                                   ^

Lauflicht:11: error: 'LED_11_PIN' was not declared in this scope

  const byte LED[] ={LED_0_PIN; LED_1_PIN, LED_2_PIN, LED_3_PIN, LED_4_PIN, LED_5_PIN, LED_6_PIN, LED_7_PIN, LED_8_PIN, LED_9_PIN, LED_10_PIN, LED_11_PIN)

                                                                                                                                               ^

C:\Users\Buder\Documents\Arduino\libraries\Lauflicht\Lauflicht.ino: In function 'void loop()':

Lauflicht:18: error: 'PIR_TOP_PIN' was not declared in this scope

  pirWert = analogRead(PIR_TOP_PIN);

                       ^

Lauflicht:22: error: 'LichtAn' was not declared in this scope

    LichtAn(richtung);

                    ^

Lauflicht:24: error: 'LichtAus' was not declared in this scope

    LichtAus();

             ^

Lauflicht:26: error: 'PIR_BOTTOM_PIN' was not declared in this scope

  pirWert = analogRead(PIR_BOTTOM_PIN);

                       ^

Lauflicht:30: error: 'LichtAn' was not declared in this scope

    LichtAn(richtung);

                    ^

Lauflicht:32: error: 'LichtAus' was not declared in this scope

    LichtAus();

             ^

exit status 1
expected initializer before 'A1'

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Zu dem Code-Tags: ich bin absoluter Anfänger und kenne mich überhaupt nicht damit aus, ich versuche wirklich mein bestes und werde auch versuchen diesen Tipp mit umzusetzen.

const byte PIR_TOP_PIN A1

const byte  PIR_TOP_PIN = A1;

Das funktioniert irgendwie immer noch nicht, mit #define ging es, warum ist dies aber wie ihr sagt falsch?

Es ist nicht falsch, aber die const Definition ist besser.

Leider sehe ich nicht was du falsch machst.
Denn du hältst sowohl Code als auch Fehlermeldung geheim.

Soll alle 10sec bzw. 20sec eine weitere LED leuchten????

Ich bleibe bei meiner Empfehlung erstmal in einer Tabelle zu visualisieren was überhaupt passieren soll...

Dafür benötigt man lediglich nen Stift, ein Lineal und ein Blatt Papier.

Und was das Testen angeht, kannst Du Dir ja einen Arduino nehmen und da einfach an Deine 10 Ausgänge jeweils eine LED (mit Vorwiderstand) anschliessen, damit Du siehst was passiert. Ob über den Ausgang jetzt eine LED geschaltet wird, oder das Licht einer Treppenstufe ist für den Sketch ja egal.

Code-Tags sind im Editor hier im Forum ganz oben Links die Zeichen "</>". Das erzeugt dann im Eingabefeld einen Bereich
[ code ] [ /code ]
und dazwischen kannst Du dann Deinen Code packen, dann zeigt ihn das Forum sinnvoll an.

So nun hab ich endlich wieder ein bisschen mehr Zeit. Prüfungen sind vorbei und nun kann ich mich wieder ein wenig mehr mit mein Projekt beschäftigen. Bzw. habe ich es geschafft mit ein bisschen Hilfe ein Sketch zu schreiben das wie meine Vorstellungen Funktioniert.
Ein Problem habe ich allerdings: Wenn der untere PIR (PIR_Bottom) reagiert, schaltet die in dem Falle erste LED nicht ein (PIN_13), wenn der obere PIR (PIR_TOP) geht sie schon an.
Erkennt jemand den Fehler woran das liegen könnte?

#include <SPI.h>

#define  PIR_TOP_PIN A1
#define  PIR_BOTTOM_PIN A2
int i = 1;
int LedAnPause = 100;
int zaehler;
int richtung; 
int pirWert;
void setup() {
  // put your setup code here, to run once:
  for(zaehler = 0;zaehler<13;zaehler++){
    pinMode(zaehler, OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  richtung = 0;
  pirWert = 0;
  pirWert = analogRead(PIR_TOP_PIN);
//  LichtAn(1);
//  delay(2000);
//  LichtAus();
//  delay(1000);
//  LichtAn(2);
//  delay(2000);
//  LichtAus();
  if(pirWert > 1022)// falls Katze kommt
  {
    richtung = 1;
    LichtAn(richtung);
    delay(10000);
    LichtAus();
  }
  pirWert = analogRead(PIR_BOTTOM_PIN);
  if(pirWert > 1022)// falls Katze kommt  
  {
    richtung = 2;
    LichtAn(richtung);
    delay(10000);
    LichtAus();
  }
}

void LichtAus()
{
  int i;
  for(i=0;i< 13;i++){
//    if(anrichtung = 1)
//    {
//      ledCounter++;
//    }
//    else
//    {
//      ledCounter--;
//    }
//    digitalWrite(ledCounter, LOW);
//    delay(LedAnPause);
    digitalWrite(i, LOW);
  }
  
}
void LichtAn(int anrichtung)
{
  int i;
  int ledCounter = 0;
   Serial.println(anrichtung); 
  if(anrichtung == 1)
  {
    ledCounter = 0;
  }
  if(anrichtung == 2)
  {
    ledCounter = 12;
  }
  for(i=0;i< 13;i++){
    if(anrichtung == 1)
    {
      ledCounter++;
    }
    else
    {
      ledCounter--;
    }
     Serial.println(ledCounter); 
    digitalWrite(ledCounter, HIGH);
    delay(LedAnPause);
  }
    
}