Schrittkette mit Arduino realisieren

Hi, ich bin relativ Neu was Arduino angeht habe aber ein bisschen Erfahrung mit Siemens. Ich wollte eine Steuerung mit schrittkette realisieren um sicherzugehen das sich Zustände und Signale im Ablauf nicht überschneiden das hier ist mein erster Test.

int taster1 = 1;
int taster2 = 2;
int led1 = 3;
int led2 = 4;
int merker0 = HIGH;
int merker1 = LOW;
int merker2 = LOW;


void setup()
{   
    pinMode(taster1, INPUT);
    pinMode(taster2, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    
}

void loop()
{
    while(merker0 == HIGH && taster1 == HIGH)
    {
    digitalWrite(led1 = HIGH);
    merker1 = HIGH;
    merker0 = LOW;
    }
    
    while(merker1 == HIGH && taster2 == HIGH);
    {
        digitalWrite(led2 = HIGH);
        merker2 = HIGH;
        merker1 = LOW;
    }
    
    while(merker2 == HIGH && taster1 == LOW && taster2 == LOW)
    {
        digitalWrite(led1 = LOW);
        digitalWrite(led2 = LOW);
        merker0 = HIGH;
        merker2 = LOW;
    }
}

Das funktioniert so auch ganz gut allerdings habe ich die Befürchtung wenn ich mehr Schritte einbaue das ich irgendwann nicht mehr genug Speicherplatz für die Merker variablen habe. Ich benutze einen Arduino mega für das projekt, weiß jemand vielleicht wie ich das effizienter gestalten könnte mit weniger Merker?

Vielen Dank schonmal :slight_smile:

NiclasMilz:
… weiß jemand vielleicht wie ich das effizienter gestalten könnte mit weniger Merker?

Bevor Du Dir Gedanken über die Anzahl der Variablen machst, solltest Du Dich erst mal über Variablentypen informieren. Nimm z. B. für einfache HIGH/LOW bzw. AN/AUS u. dgl. keine Integer. Schon das bringt Dir einiges an zusätzlichem Platz.

Siehe hier.

Gruß

Gregor

Okay das ist schonmal hilfreich danke. Hast du ne grobe Schätzung wie viele boolschen variablen der Arduino mega benutzen kann ich schätze das Programm was ich laufen lassen möchte auf ca. 40-50 Schritte denkst du dafür reicht der Speicherplatz?

Die 50 Byte Merker mit Sicherheit. Was da sonst noch passieren soll, wissen wir ja nicht.
Evtl. könnte man ja anstelle von einfachen boolschn Merkern auch Statusvariable nehmen, die mehr als 2 Zustände annehmen können.

Gruß Tommy

Der Arduino Mega hat 8kB RAM

Okay danke dann werde ich das erstmal so versuchen und wenn das nicht ausreicht Guck ich Mal ob ich das mit variablen hinbekomme die mehr als 2 Zustände haben danke an alle!

Ich rate mal, daß eine Schrittkette einem Automaten entspricht, der sich mit 1 Variablen (Zustand) programmieren läßt.

Und gewöhne Dich mal dran, digitalWrite() richtig aufzurufen :-]

Hi

Du kannst die Bits auch einzeln setzen.
Bei einer uint64_t hättest Du 64 Bit ‘Platz’ - klar, kostet 8 Byte Speicher.
Der Zugriff aka BitRead und BitWrite geht mittels Makros, kostet aber halt mehr Zeit, als wenn Du eine Boolean benutzt (Die für das eine Bit halt ein Byte belegt).
Wir reden hier nur über ‘mehr Zeit’ - nicht über wirkliche Unterschiede - sollte nur Mal gehört worden sein, falls Es doch Mal zeitkritischer wird.

Selber habe ich mir in irgend welchen Sketchen per enum Namen für die Bits erstellt und dann damit über BitRead/-Write auf meine Status-Variable zugegriffen.

MfG

//----------------------------------------------------------------------------------------
/*
  Funktionen zur Bitmanipulationen
  Quelle: https://github.com/cubetech/arduino.coffeehack aus der enthaltenen .ino
*/
// define some basics
#ifndef bitRead
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
#endif
//========================================================================================

Macros sind hier nicht nötig...

Bitfelder sind schon seit einiger Zeit in C und C++ eingebaut.
Da kann man so einige Tricks mit anstellen....

struct BitFeld
{
  bool testA :1;
  bool testB :1;
  int  testI :3;
}bitFeld;


void setup() 
{
 Serial.begin(9600);
 Serial.println("Start");
 Serial.print("sizeof(bitFeld) "); Serial.println(sizeof(bitFeld));
 
 Serial.print("testB: "); Serial.println(bitFeld.testB);

 bitFeld.testB = true;
 Serial.print("testB: "); Serial.println(bitFeld.testB);

 bitFeld.testB = false;
 Serial.print("testB: "); Serial.println(bitFeld.testB);
 
 
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 Serial.print("testI: "); Serial.println(bitFeld.testI);
 bitFeld.testI++;
 
}

void loop() 
{

}

Hi

Oha - Das macht die ganze Sache ja noch Mal einfacher - danke :slight_smile:

MfG