Error: "2" may not appear in macro parameter list

Mit diesen Fehler

"2" may not appear in macro parameter list

Kann ich nicht mit anfangen.

Kommt hier weg
#define sr(2, 8, 11, 12)                  // registers, latchPin, dataPin. clockPin 

Sei mir nicht böse wenn es noch zu viel Fehler gibt, es ist meine erste richtige Script, hab schon mal geklaute Sachen geändert.

Habe mir diesen Script gebaut, ist noch längst nicht fertig, wollte dies nun mal auf meine UNO spielen lassen.
Kommt später auf einen NodeMCU.

Kann jemand mir eben weiter helfen?

Die delay's werden noch nach millies Geändert.

Ich hoffe dass diesen Script bis jetzt deutlich ist, es kommt noch mehr Kommentare rein, will erst diesen Fehler klären.

//*******************  Diese werte darf ich änderen  *******************************
int abstand = 50;       // dies ist die detektionsabstand von 0 bis XX CM
int luxwert = 150;      // Helligkeit von der lichtsensor
int wartezeit = 2;      // wartezeit in sec.
//**********************************************************************************
#include <ShiftOut.h>
//**********************************************************************************
//Defenierung Ein- und Ausgange
//**********************************************************************************
int clockPin = 12;
int dataPin = 11;
int latchPin = 8;
#define sensorUnten_Pin 6
#define sensorOben_Pin 7
#define lichtSensor_Pin A0
#define trigPin1 2
#define echoPin1 3
#define trigPin2 4
#define echoPin2 5

//**********************************************************************************
//Algemein Einstellungen
//**********************************************************************************
#define sr(2, 8, 11, 12)                   // registers, latchPin, dataPin. clockPin                                                                               
boolean reihenfolgeNachOben = false;          //Reihenfolge bei start aus
boolean reihenfolgeNachUnten = false;         //Reihenfolge bei start aus
int anzahlStufen = 16;
int pause = 10000;
int val;
int sensor;
int ldrValue = 0;
int calibrationTime  = 40;  // wartezeit für sensor calibratie

//**********************************************************************************
// Start setup schleife
//**********************************************************************************
void setup()
{
  Serial.begin(115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(lichtSensor_Pin, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, OUTPUT);

  delay(calibrationTime);
}
//**********************************************************************************
// Start loop schleife
//**********************************************************************************
void loop ()
{
  //lichtsensor
  ldrValue = analogRead(lichtSensor_Pin);
  Serial.println(ldrValue);

  jemandNachObenPIR();
  jemandNachUntenPIR();
  jemandNachObenUltra();
  jemandNachUntenUltra()


}
//**********************************************************************************
//PIR sensor wenn jemand nach oben geht
//**********************************************************************************
void jemandNachObenPIR()
{
  if (ldrValue <= luxwert && sensorUnten_Pin == true)
  {
    Serial.begin("Jemand kommt nach oben");
    reihenfolgeNachOben = true;
  }
}
//**********************************************************************************
//PIR sensor wenn jemand nach unten geht
//**********************************************************************************
void jemandNachUntenPIR()
{
  if (ldrValue <= luxwert && sensorOben_Pin == true)
  {
    Serial.begin("Jemand kommt nach unten");
    reihenfolgeNachUnten = true;
  }
}

//**********************************************************************************
//Treppe auf ultrasensor ist OPTION
//**********************************************************************************
void jemandNachObenUltra()
{
  int duration1, distance1;
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1 / 2) / 29.1;
  Serial.begin(distance1);

  if (ldrValue <= luxwert && distance1 <= abstand)
    //if (distance1 <= abstand)
    reihenfolgeNachOben();
}

//**********************************************************************************
//Treppe ab ultrasensor ist OPTION
//**********************************************************************************
void jemandNachUntenUltra()
{
  int duration2, distance2;
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2 / 2) / 29.1;
  Serial.begin(distance2);

  if (ldrValue <= luxwert && distance2 <= abstand)
    //if (distance2 <= abstand)
    reihenfolgeNachUnten();
}
//**********************************************************************************
//Hier werten die LED's von unter nach oben eingeschaltet,
//unt nach eine pause von unten nach oben wieder ausgeschaltet
//**********************************************************************************
void reihenfolgeNachOben() {
  if (reihenfolgeNachOben == true && reihenfolgeNachUnten == false) {
    Serial.begin("Stufen nach oben AN");
    for (int i = 0; i < anzahlStufen; i++) {
      sr.set(i, HIGH);
      delay(250);
    }
    delay(pause);

    for (int i = 0; i < anzahlStufen; i++) {
      Serial.begin("Stufen nach oben AUS");
      sr.set(i, LOW);
      delay(250);
    }
    reihenfolgeNachOben = false;
  }
}

//**********************************************************************************
//Hier werten die LED's von oben nach unten eingeschaltet,
//unt nach eine pause von oben nach unten wieder ausgeschaltet
//**********************************************************************************
void reihenfolgeNachUnten() {

  if (reihenfolgeNachUnten == true && reihenfolgeNachOben == false) {
    Serial.begin("Stufen nach unten AN");
    for (int i = anzahlStufen; i >= 0; i--) {
      sr.set(i, HIGH);
      delay(250);
    }
    delay(pause);

    for (int i = anzahlStufen; i >= 0; i--) {
      Serial.begin("Stufen nach unten AUS");
      sr.set(i, LOW);
      delay(250);
    }
    reihenfolgeNachUnten = false;
  }

}

Syntax
#define constantName value

was willst du mit
#define sr(2, 8, 11, 12)

erreichen???

Selbst wenn du noch ein leerzeichen einfügst:
#define sr (2, 8, 11, 12)
erreichst du nur, dass der Compiler überall, wo du sr schreibst, ein (2, 8, 11, 12) einfügt.

Gunther,

Ich muss dass Programm erklären das ich 2 Registers haben usw

BTW Die "Serial.begin" sind Geändert in "Serial.println" doofe Fehler von mir :cold_sweat: :cold_sweat:

Wo kommt deiner ShiftOut Librarie her?
Ich habe gesucht und mehrere gefunden und bei keiner ist die Initialsierung der Klasse so gemacht wie in deinem Sketch. Schaue mal in der Quelle nach einem Beispiel.
Der #define ist so definitiv falsch
Wenn es eine Klasse erzeugt sollte es in etwa so aussehen

ShiftOut sr(2,8,11,12);

Nur ein Beispiel wie es aussehen sollte. Die Reichenfolge der Zahlen und Pins sollten aus der Quelle der Lib dokumentiert sein. Wie oben gesagt mach dein define aus der Zeile

sr.set(i,HIGH);
dies hier
sr(2, 8, 11, 12).set(i,HIGH);

Denn im Code wird ein "sr" genutzte das dann durch dein definiertes Geschreibsel ersetzte wird
Und das ist falsch..
Gruß
DerDani

Atwist:
Ich muss dass Programm erklären das ich 2 Registers haben usw

Das tut Dein Code aber nicht.Du definierst ein halbes Makro und versucht dabei, Zahlen als Argumentnamen zu verwenden.
Ich empfehle wenigstens mal ein grobes C++ tutorial, um die Idee von Syntax zu bekommen.
Pins würde ich übrigens auch immer mit

const uint_8 ledPin = 4

definieren.

int ledPin = 4

ist vom Datentyp her unsinnig und

#define ledPin 4

kann zu schwer interpretierbaren Fehlermeldungen führen, wenn man sonst was falsch gemacht hat.

Insgesamt sollte man Precompiler (#) Zeug lassen, wenn man nicht weiß, was man tut.

Willst du unbedingt 2 Schieberegister unabhängig voneinander betreiben, oder willst du sie hintereinander hängen?

michael_x:
Willst du unbedingt 2 Schieberegister unabhängig voneinander betreiben, oder willst du sie hintereinander hängen?

Die sollen hintereinander so dass ich einen lauflicht bekomme von stufe 1 nach 16 für nach oben und von 16 nach 1 für nach unten

Wo kommt deiner ShiftOut Librarie her?

Ich habe diesen bei github.com gefunden.

Aber durch eure Antworten ist mir schon klar dass ich noch ein paar große Fehler in mein Script habe.
und ich dachte dass es richtig gut aussah.

Atwist:
Ich habe diesen bei github.com gefunden.

Ist ungefähr habe ich bei google gefunden. Der genaue Link wäre besser dann kann auch besser geholfen werden.
Gruß
DerDani

... und

#define ledPin 4

kann zu schwer interpretierbaren Fehlermeldungen führen, wenn man sonst was falsch gemacht hat.
Insgesamt sollte man Precompiler (#) Zeug lassen, wenn man nicht weiß, was man tut.

#define-Zeug sollte man sich generell sparen, wann immer möglich. Das Problem bei diesen #define-Sachen ist, dass der Präprozessor lediglich eine simple Text-Ersetzung macht. Dadurch wird die Typprüfung des Compilers umgangen. Ich verwende stattdessen grundsätzlich Variablen, also statt

#define ledPin 4

zum Beispiel

byte ledPin=4;

Obendrein hat man so weniger zu tippen :slight_smile:

Gruß

Gregor

Ich muss dass Programm erklären das ich 2 Registers haben usw

Dieser Satz ist mir nicht verständlich.

Das Problem mit der Fehlermeldung ist die Fuktionalität von #define :

Syntax
#define constantName value

#define ersetzt den ersten Text "constantName" durch den zweiten Text "value" (also reines Ersetzen von Buchstaben durch andere). Dies wird beim Kompilieren als eines der ersten Dinge gemacht noch bevor der Sketch kompiliert wird (Preprozzessor)

#define sr(2, 8, 11, 12) entspricht dieser syntax nicht.
Das ist der Fehler.

Grüße Uwe

Atwist:
Ich habe diesen bei github.com gefunden.

Bitte link damit wir sie auch herunterladen können.
Grüße Uwe

volvodani:
Ist ungefähr habe ich bei google gefunden. Der genaue Link wäre besser dann kann auch besser geholfen werden.
Gruß
DerDani

Atwist:
arduino-waterer/ShiftOut.h at master · twsdwf/arduino-waterer · GitHub

Das ist kein Link, sondern nur eine URL.

HotSystems:
Das ist kein Link, sondern nur eine URL.

Aber dort steht es und die habe ich herunter geladen , das war glaube ich die frage.

Damit man was zum Klicken hat: arduino-waterer/ShiftOut.h at master · twsdwf/arduino-waterer · GitHub

Gruß

Gregor

gregorss:
Damit man was zum Klicken hat: arduino-waterer/ShiftOut.h at master · twsdwf/arduino-waterer · GitHub

Gruß

Gregor

Ja oke, ich habe es verstanden.

Atwist:
Aber dort steht es und die habe ich herunter geladen , das war glaube ich die frage.

Du weist scheinbar nicht, was ein Link ist.
Das ist eine abgewandelte URL, die man direkt durch einen Klick aufrufen kann.
Und damit du es auch verstehst, ein Klick macht es einfacher für mobile Gerätenutzer, die nur sehr umständlich eine URL kopieren und öffnen können.

Somit bekommst du durch einen Link oder besser Hyperlink auch mehr helfende User und bleibst mit deinem Problem nicht allein.

Um 16 Bit an zwei hintereinandergehängte 595 Schieberegister auszugeben, braucht man keine Bibliothek, sondern macht es wie hier Nick Gammon mit Hardware SPI, oder wie es in der Beschreibung zur bereits eingebauten shiftOut Funktion im zweiten Beispiel beschrieben ist.

Pin 9 (Q7') des ersten Schieberegisters kommt an den Eingaingspin 14 ( DS) des zweiten.
Clock und Latch kommen parallel an beide. Data an den DS des ersten, fertig.