Go Down

Topic: Millis Befehl, Steuerung Schattenbahnof.  (Read 2166 times) previous topic - next topic

kgbrus

Sep 22, 2020, 11:13 am Last Edit: Sep 28, 2020, 09:03 am by kgbrus
Hallo zusammen,

zunächst möchte ich mich kurz Vorstellen, mein Name ist Kay bin 53 Jahre alt und mache die ersten Gehversuche mit Arduino. Ich benutze den Arduino STM32F103.

2 Programme hab ich schon gemacht um meine Modellbahn zu steuern.

Ich verzweifle  immer an der Stelle, wenn ich den "delay" Befehl durch "Millis" ersetzen will. Mal klappt es mal nicht. Trotz mehrfaches ausprobieren der Nachtwächterschaltung und Blink without delay kapiere ich das einfach nicht.
Ev hilft es mir ja, wenn mir jemand von euch sagt, was an meinem Code falsch ist.

Code: [Select]
LSBG1State = digitalRead(LSBG1);  // Abfrage ob Zug auf Gleis 1 steht.
            if (LSBG1State == HIGH)
                  {
                    digitalWrite (W1G, HIGH);
                   RELAIS1G_timestore = millis();
                  }
               
                 if (millis() - RELAIS1G_timestore> 1000 ) //Schaltzeit Relais 1 Sek.
                   {
                      digitalWrite(W1G, LOW);
                      W1GState = LOW;
                   }

 

W1G ist der Ausgang für ein Relais, dieses soll für 1 Sekunde anziehen und dann wieder abfallen.

Das Relais zieht an, fällt aber nicht mehr ab. Ich verzweifel hier gerade..

Gruß

Kay

HotSystems

Hallo,

der STM32F103 ist doch sicher der Controller und als Arduino hat der bestimmt einen anderen Namen.

Poste einfach mal einen Link deines Boards, das ist dann verständlicher.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

#2
Sep 22, 2020, 11:22 am Last Edit: Sep 22, 2020, 11:24 am by combie
Quote
der STM32F103 ist doch sicher der Controller und als Arduino hat der bestimmt einen anderen Namen.
Es gibt keine Arduinos mit STM32F103

Der übliche Name ist "Blue Pill Board"
Suche mal danach, und du wirst erschlagen.
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

noiasca

#3
Sep 22, 2020, 11:24 am Last Edit: Sep 22, 2020, 11:33 am by noiasca
a) mit codeschnippseln tun wir uns schwer.
b) drücke mal STRG-T in deiner IDE und mach die Einrückungen schön
c) statte deinen Code halt mit Serial.print Ausgaben aus, und verfolge welche deine Bedingungen erfüllt ist und dann siehst du auch warum dein Code nicht macht was du dir vorstellst.

VERMUTLICH ist halt LSBG1State  noch immer High, daher ist die erste Bedingung wieder erfüllt und es schaltet ein.
Solche Sachen erkennst du aber schön mit Serial.print Ausgaben und kannst daher deine Logik anpassen.

add on: wenn das Weichenantriebe sind, dann würde ich da einen anderen Ansatz verfolgen...
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

HotSystems

Es gibt keine Arduinos mit STM32F103

Der übliche Name ist "Blue Pill Board"
Suche mal danach, und du wirst erschlagen.
Danke....dann lass ich es lieber. ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

kgbrus

Zunächst einmal vielen Dank für die Antworten und die Hilfe,

es handelt sich um dieses https://www.az-delivery.de/products/stm32f103c8t6?_pos=1&_sid=bbf5ca81a&_ss=r

Board und da ist doch ein STM32F103 drauf? Entschuldigt, wenn ich mich da falsch ausgedrückt habe.

Bei STRG& T rückt mir die IDE alles nach links, dann finde ich nix mehr :-)


Soll ich den kompletten code hier rein kopieren? incl setup? Meine Frage lautet, ob ich im Code einen Fehler gemacht habe, da der teil ab If (millis) wohl vom Programm ignoriert wird.


Gruß

Kay

Tommy56

Bei STRG& T rückt mir die IDE alles nach links, dann finde ich nix mehr :-)
So wie er jetzt ist, werden wohl mögliche Helfer nichts finden.

Soll ich den kompletten code hier rein kopieren? incl setup?
Ja.

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

HotSystems

Board und da ist doch ein STM32F103 drauf? Entschuldigt, wenn ich mich da falsch ausgedrückt habe.

Der Controller ist drauf, aber es ist kein Arduino.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

noiasca

Quote
Bei STRG& T rückt mir die IDE alles nach links, dann finde ich nix mehr :-)
dann hast sowieso einen Fehler oder das ist so eine IF-Wurst - die kann sowieso niemand mehr überblicken - nicht mal mehr du.

Da ist was faul.
Restlliches Post von mir hast auch gelesen?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Peter-CAD-HST

#9
Sep 22, 2020, 11:58 am Last Edit: Sep 22, 2020, 12:04 pm by Peter-CAD-HST
Moin
mit
Code: [Select]
LSBG1State = digitalRead(LSBG1);  // Abfrage ob Zug auf Gleis 1 steht.
if (LSBG1State == HIGH)
{
  digitalWrite (W1G, HIGH);
  RELAIS1G_timestore = millis();
}

wird die millis()-Eieruhr immer wieder neu aufgezogen, solange ein Zug auf Gleis 1 steht.
Probier mal die folgende Verriegelung aus * ungetestet *
Code: [Select]
LSBG1State = digitalRead(LSBG1); 
if (LSBG1State == HIGH &&  digitalRead(LSBG1) == LOW) 
{
  digitalWrite ( digitalRead(LSBG1), HIGH);
  RELAIS1G_timestore = millis();
}

Viel Erfolg
Gruß Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

combie

#10
Sep 22, 2020, 12:01 pm Last Edit: Sep 22, 2020, 12:14 pm by combie
Quote
Bei STRG& T rückt mir die IDE alles nach links, dann finde ich nix mehr :-)
Der von Arduino benutzte Code Formatierer ist fein einstellbar.

In der C/C++ Welt haben sich 2 Formatierungsstile quasi durchgesetzt.
1. K&R
2. Allman

K&R ist die default Einstellung.
Du verwendest eher Allman


Suche die Datei formatter.conf, diese liegt bei mir in Laufwerk:\Programme\arduino\lib
Füge folgende Zeile hinzu
Code: [Select]
style=allman

Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

my_xy_projekt

Ich verzweifle  immer an der Stelle, wenn ich den "delay" Befehl durch "Millis" ersetzen will.

Ev hilft es mir ja, wenn mir jemand von euch sagt, was an meinem Code falsch ist.
Zum einrücken war schion gesagt ....
Dein Problem ist nicht millis().

Du musst Dir den Status des PIN merken und das der erst in den Ausgangszustand (LOW) muss, bevor wieder neu ausgelöst wird.
Code: [Select]

if (!LSBG1State && digitalRead (LSBG1)) // Abfrage ob Zug auf Gleis 1 steht.
{
  LSBG1State = HIGH;
  digitalWrite (W1G, HIGH);
  RELAIS1G_timestore = millis();
}
if (!digitalRead (LSBG1)  // Wenn kein Zug auf dem Gleis:
{
LSBG1State = LOW;  // Status zurücksetzen
}

if (millis() - RELAIS1G_timestore > 1000) //Schaltzeit Relais 1 Sek.
{
digitalWrite (W1G, LOW);
  W1GState = LOW;
}

my_xy_projekt

#12
Sep 22, 2020, 12:21 pm Last Edit: Sep 22, 2020, 12:23 pm by my_xy_projekt
Moin,
ungetestet
Code: [Select]
LSBG1State = digitalRead(LSBG1);  
if (LSBG1State == HIGH &&  digitalRead(LSBG1) == LOW)  

Das kann nicht.
Ich denke, Du wolltest W1G oder W1GState verwenden.
if (LSBG1State == HIGH &&  W1G == LOW)  

Ich habe das absichtlich nicht so gemacht, weil der Code nicht vollständig und nicht klar ist wo was zu welchem Zweck verwendet wird...

agmue

Der STM32F103 kann mittels Arduino-IDE programmiert werden, wird aber von STMicroelectronics hergestellt. Dieses Forum finanziert sich durch den Verkauf von Arduinos und thematisiert folglich diese, weshalb genau genommen Fragen zum STM32F103 hier fehl am Platze sind. Unser Moderator ist aber glücklicherweise großzügig und läßt auch Fragen zu Nicht-Arduinos zu. Damit er nicht aufgeschreckt wird, haben wir Dich schon mal über Deinen kleinen Irrtum aufgeklärt.

Deine Frage hat aber eigentlich mit Deiner Hardware nichts zu tun, auf einem UNO wäre das nicht anders.

Spekulativ hat Deine Frage auch nur am Rande mit millis zu tun, denn grundsätzlich sieht das bei Dir richtig aus. Eher geht es um die Auswertung von sich ändernden Zuständen, also Flankenerkennung.

Möglicherweise findest Du die Bibliothek MobaTools hilfreich.



Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

noiasca

#14
Sep 22, 2020, 12:57 pm Last Edit: Sep 22, 2020, 01:01 pm by noiasca
einen hab ich noch.
Imho ruft so ein Weichenantrieb regelrecht nach OOP oder will man die millis für jeden einzelne Weiche imm wieder manuell neu anlegen?

so zum Anfangen, mal nur die Weiche in OOP und die Gleisrückmeldung noch alt:

kompiliert, aber ungetestet
Code: [Select]

class Antrieb
{
  private:
    const byte pin;
    uint32_t previousMillis;

  public:
    Antrieb(byte pin) : pin(pin) {}
    void begin() {                      // einmal im Setup aufrufen
      pinMode(pin, OUTPUT);
    }
    void pulse()                        // wenn man schalten will
    {
      digitalWrite(pin, HIGH);
      previousMillis = millis();
    }
    void run()                          // laufend im loop aufrufen, damit sich der Magnetartikel auch wieder abschaltet
    {
      if (digitalRead(pin) == HIGH && millis() - previousMillis > 1000)
      {
        digitalWrite(pin, LOW);
      }
    }
};

//Weichen Antriebe anlegen und Pins zuordnen
Antrieb w1g(3);
Antrieb w1b(4);

// old style Gleisrückmeldungen:
const byte LSBG1 = 10;
byte previousLSBG1State;                         

void setup() {
  // put your setup code here, to run once:
  w1g.begin();
  w1b.begin();
}

void loop() {
  // Logik zum "Einschalten" ....

  // gleis schaltet von frei auf besetzt
 
  byte LSBG1State = digitalRead(LSBG1);
  if (LSBG1State == HIGH && previousLSBG1State == LOW)
  {
    w1g.pulse();
    previousLSBG1State == LSBG1State;
  }
  if (LSBG1State == LOW && previousLSBG1State == HIGH);
  {
    // beim Verlassen was anderes tun
    previousLSBG1State == LSBG1State;
  }
 
  //usw

  // alle Weichenantriebe aufrufen - vieleicht ist einer zum abschalten...
  w1g.run();
  w1b.run();
}



how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Go Up