Zeigt her eure geilen Projekte!

Und noch was:

/*Richtungsblinker mit Warnblinker über 3 Fernschalter steuern
*/

int blinkschalterrechtsPin = 2; // Schalter für rechten Blinker
int blinkschalterlinksPin  = 3; // Schalter für linken Blinker
int warnblinkschalterPin   = 4; // Schalter für Warnblinker
int blinkrechts = 0; //Signal für Blinker rechts
int blinklinks  = 0; //Signal für Blinker links
int warnblink   = 0; //Signal für Warnblinker
const int LED1 = 13;
const int LED2 = 12;
const int LED3 = 11;
void setup ()
{
  pinMode(blinkrechts, INPUT);
  pinMode(blinklinks,  INPUT);
  pinMode(warnblink,   INPUT);
  pinMode(LED1, OUTPUT); // nur über Opto und Transisitor
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
}
void loop()
{
  blinkrechts = digitalRead(blinkschalterrechtsPin);
  blinklinks  = digitalRead(blinkschalterlinksPin);
  warnblink   = digitalRead(warnblinkschalterPin);
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  {
  }
  if (blinkrechts == HIGH) {
    digitalWrite(LED1, HIGH);
    delay(240);
    digitalWrite(LED2, HIGH);
    delay(240);
    {
    }
  }
    else if (blinkrechts == LOW) {
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      delay (240);
      {
      }
      if  (blinklinks == HIGH) {
        digitalWrite(LED1, HIGH);
        digitalWrite(LED3, HIGH);
        delay(240);
        {
        }
      }
        else if (warnblink == HIGH) {
          digitalWrite(LED1, HIGH);
          digitalWrite(LED2, HIGH);
          digitalWrite(LED3, HIGH);
          delay(240);
        }
      }
    }

  
Der Richtungsblinker wird über einen Kanalmischer von der Lenkung gesteuert.Der Warnblinker wird seperat geschaltet.

Ok, Crazydiver.....ich frage also nochmal. Kannst du richtige Beschreibungen zu deinen Zeilen posten.
So sehe ich ich das nicht als Projekt und es kann keiner irgend einen Sinn darin sehen.

Also passt das hier nicht rein. Es ist kein Projekt.

Hi

Ich muß HotSystems recht geben.
Ich sehe die Sketche als eine Art 'Snipped' - also Code-Fragmente, Die man sich passend zusammen bauen kann.
Wobei Das hier auch nicht recht passt, da man kaum zwei der Sketche mischen kann - zumindest nicht, wenn man nicht recht genau weiß, was man da tut.

Auch sind die Hintergrund-Informationen zu den 'Projekten' arg dürftig.

MfG

Crazydiver:
Ein weiteres von mir:

/* Beleuchtungstester für Zugmaschine und Auflieger/Anhänger

über Fernsteuerung starten und beenden
*/

int schalterPin = 2; //startschalter für den test
int testschalter = 0; // signal für testschalter
const int LED1 =  13;
const int LED2 =   3; //Blinker rechts
const int LED3 =   4; // Blinker links
const int LED4 =   5; // Bremse
const int LED5 =   6; // Nebel
const int LED6 =   7; // Rückwärts
const int LED7 =   8; // Standlicht
const int LED8 =   9; // Ablendlicht
const int LED9 =  10; // Fernlicht
const int LED10 = 11; // Rundumwarnleuchte

void setup()
{
pinMode(testschalter, INPUT);
pinMode(LED1,  OUTPUT);  
pinMode(LED2,  OUTPUT); // alle LEDs nur über Opto und Transistor
pinMode(LED3,  OUTPUT);
pinMode(LED4,  OUTPUT);
pinMode(LED5,  OUTPUT);
pinMode(LED6,  OUTPUT);
pinMode(LED7,  OUTPUT);
pinMode(LED8,  OUTPUT);
pinMode(LED9,  OUTPUT);
pinMode(LED10, OUTPUT);
}

void loop() {
 
testschalter = digitalRead(schalterPin);
if (testschalter == HIGH){
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED2, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED3, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED3, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED4, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED4, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED5, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED5, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED6, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED6, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED7, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED7, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED8, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED8, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED9, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED9, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED10, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED10, LOW);
delay(1200); // Zeitstufe notfalls anpassen
}
else if (testschalter == LOW) {
 digitalWrite(LED1, HIGH);

}}




Zum testen der Beleuchtung am Modell welches über die Funke gestartet wird und auch angehalten werden kann

Jetzt hab ich das mit dem "delay" endlich kapiert!

Strg+T wird eh völlig überbewertet. Wer braucht sowas?

@Uwe kann man in diesem Forum gewisse Teilnehmer auf ignorieren einstellen?

Gruß Fips

Derfips:
@Uwe kann man in diesem Forum gewisse Teilnehmer auf ignorieren einstellen?

Ich bin zwar nicht Uwe, aber diese Möglichkeit habe ich auch schon einmal vermisst. Soweit ich weiß, ist das immer noch nicht möglich. Und ich bin mir inzwischen nicht sicher, ob das wirklich restlos gut wäre. Es gibt hier Leute, die einerseits manchmal ziemlich viel Stuss loslassen, die andererseits sehr kompetent sind, wenn es um bestimmte Sachen geht.

Halt's aus :slight_smile:

Gruß

Gregor

noiasca:
OT: ... und dennoch sind die Posts von Crazy hier in diesen Thread nutzlos und gehören (inkl. unserer Kommentare drauf) GELÖSCHT/ENTFERNT.

Da gebe ich dir Recht.

Also Uwe, bitte löschen.

Oder vielleicht in einen neuen Thread "Zeigt her eure delay-verseuchten Snippets" oder so verschieben?

Whandall:
Oder vielleicht in einen neuen Thread "Zeigt her eure delay-verseuchten Snippets" oder so verschieben?

Ich schlage vor, den Thread zu teilen: 1 x "Zeigt her ...", 1 x "Kommentare zu ..."

Vielleicht ergeben sich noch zwei weitere Threads. Ich vierteile so gerne ... gerade am Wochenende.

Gruß

Gregor

PS: „Kommentare zu den Kommentaren des bla-Threads" könnte Nummer 3 sein.

Hallo,
Ein Post vor einigen Tagen zum Thema Regelung hat mich dazu veranlasst mich selbst mal wieder mit dem Thema zu beschäftigen. Ich habe wärend meines Studiums vor 40 Jahren Regelungstechnik gemacht, allerdings damals mit Analogtechnik und meist dem LM741. Beruflich waren es dann GS-Antriebe später Servo, FU, Hydraulik, Heizung/Kühlung, Druck uund Mengenregelkreise im Maschinenbau.

Die Idee für diese Projekt war einen Simulator zu bauen mit dem an eine Regelstrecke mit einem PI Regler optimieren kann. Da viele einfache Regelstrecken eine Verzögerzng 2. Ordnung sehr ähnlich kommen habe ich also zwei PT1 Glieder hintereinander verwendet.

Der Sketch lässt sich über Befehle die man am Monitor eingibt steuern. Der Nennbereich für Eingaben ist für -100 bis 100 gedacht. Kann man also als Prozentwerte betrachten.

soll=xx.x Sollwert ändern (-100....+100)
T1=xx.x Verzögerung des ersten PT1 Glieds der Strecke
T2=xx.x Verzögerung des ersten PT2 Glieds der Strecke
KS=xx.x P-Verstärkung der Stecke
KP=xx.x P-Anteil des PI Reglers
TN=xx.x I-Anteil des PI Reglers Nachstellzeit s
CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
anz=xx Anzeige Interval in ms
start startet den Lauf neu
stop stopt den Lauf

Der Sketch läuft auf einem UNO ohne zusätzliche Hardware in Verbindung mit dem Monitor oder einem anderen Terminal-Program. Wenn man ihn mit den Voreinstellungen startet wird nach dem Befehl start die Sprungantwort der Strecke numerisch ausgegeben. Mit den Parametern KS, T1,T2 kann man das Verhalten der Strecke ändern oder die Eingangsgrösse Ue1 mit dem Sollwert ändern. Parameter können jederzeit eingegeben werden und sind sofort wirksam. Änderungen werden in der Ausgabe mit angegeben, damit lässt sich u.A. ein neuer Abschnitt leichter finden. Bei T =0 verhält sich das PT1-Glied wie ein P-Glied. Durch die Eingabe des Befehls stop wird der Vorgang angehalten es erfolgt keinee Berechnung neuer Werte mehr. In der letzten Zeile werden die aktuelle Parameter angezeigt. Mit der erneuten Eingabe von Start beginnt der Vorgang neu mit t=0.

Als nächstes kann man nun mittels dem Befehl CL=1 den offenen Regelkreis schliessen. Damit ist dann zunächst der P-Anteil des Regles wirksam, TN=0. durch ändern von KP kann der Regelkreis dann optimiert werden. Als letztes kann man dann mittes der Eingabe von TN>0 die Nachstellzeit und damit den I-Anteil eingeben. Durch mehrfaches änder des Sollwertes auf 0 und z.B 10 lässt sich das Regelverhalten numerisch aufzeichnen und durch stop und Erneutem start mit der Zeitachse beginnend mit Null ausgeben.

Die Anzeige auf dem Monitor kann man mit CTR C in die Zwischenablage kopieren und dann in eine Excel Tabelle einfügen. Damit man daraus ein XY Diagramm machen kann sollte man zunächst mittels Bearbeiten Suchen Ersetzen alle Decimalpunkte gegen ein Komma tauschen. Damit werden Inhalte der Zellen dann als Zahl erkannt. Als Beispiele im Anhang ein paar Grafiken dazu.

Viel Spass beim spielen :wink:

PS Sketch folgt

PI-Regler optimiert.png

PI-Regler schwingt.png

Strecke.png

Also hier der Sketch, passte nicht mehr

/*
  Autor Heinz Baumstark Sept. 2018
  Simuliert eine Regelstreke PT2 mit einem PI Regler.
  Der Recheninterval beträgt 100ms. Nennbereiche sind -100..+100
  Die Parameter können über die serielle Schnttstelle mit
  Befehlen eingestellt werden. Folgende Befehle stehen zur Verfügung:

   soll=xx.x  Sollwert ändern (-100....+100) 
   T1=xx.x    Verzögerung des ersten PT1 Glieds der Strecke
   T2=xx.x    Verzögerung des ersten PT2 Glieds der Strecke
   KS=xx.x    P-Verstärkung der Stecke
   KP=xx.x    P-Anteil des PI Reglers
   TN=xx.x    I-Anteil des PI Reglers Nachstellzeit  s
   CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
   anz=xx     Anzeige Interval in ms
   start      startet den Lauf neu
   stop       stopt den Lauf

   mit den voreingestellte Parametern wird die Srungantwort der
   Strecke ausgegeben mit der Eingangsgrösse 10% und die
   Streckenverstärkung KS=1 und den Zeiten T1=3s, T2=3s


   ----------------------------------------------------------
*/

int CL = 0;      // closed loop
float t, ex, tdiv; // allgem. Variablen
bool lauf = LOW;  // Status run / stop

// Strecke Parameter
float Ue1, Ua1; // E/A Grössen 1. PT1 Glied
float Ue2, Ua2; // E/A Grössen 2. PT1 Glied
float T1 = 3.0; // Parameter Verzägerung 1. PT1 Glied
float T2 = 3.0; // Parameter Verzögerung 2. PT1 Glied
float KS = 1.0; // Proportional Wert der Gesamtstrecke

//Regler Parameter
float Yp, Yi, Y; // Ausgang Regelanteile
float Soll = 10.0;// Sollwert
float Rd; // Regeldifferenz
float Ist; // Regler Istwert Rückführung
float KP = 1.0; // P-Anteil
float TI = 0.0; // I-Anteil Nachstellzeit

String eingabe = "";
unsigned long startzeit; // Anfangszeit der der Simulation
unsigned long altzeit, paltzeit; // Hilfswerte
unsigned long anzinterval = 500; // Anzeigeintervall

void setup() {
  Serial.begin(9600);
  startzeit = millis();
  // Ausgabe der voreingestellte Werte
  Serial.println("Startparameter");
  Serial.print ("Sollwert "); Serial.println(Soll);
  Serial.print ("Strecke 1. Verz. T1 (s)"); Serial.println(T1);
  Serial.print ("Strecke 2. Verz. T2 (s)"); Serial.println(T2);
  Serial.print ("P-Verst. Strecke KS    "); Serial.println(KS);
  Serial.print ("Regler    KP "); Serial.println(KP);
  Serial.print ("Regler TN (s)"); Serial.println(TI);
  Serial.print ("Closed Loop  "); Serial.println(CL);
  Serial.print ("Anzeige Interval (ms) "); Serial.println(anzinterval);
  Serial.println("Eingabebefehl start / stop");

}

void loop() {

  if (millis() - altzeit >= 100UL && lauf == true) { // 100 ms
    tdiv = (millis() - altzeit) / 1000.0; // Zeitintervall
    altzeit = millis();
    t = (millis() - startzeit) / 1000.0; // Laufzeit gesamt

    // Regler bearbeiten
    if (CL == 1) { // Istwer benutzen colsed loop
      Ist = Ua2;
    }
    else { // open loop
      Ist = 0;
    }

    Rd = Soll - Ist;// Regeldifferen bilden
    Yp = Rd * KP; // P-Anteil
    if (TI > 0) Yi = Yi + Rd  * tdiv / TI; else Yi = 0; // Integral bilden

    if (Yi > 100) Yi = 100 ;  // I Anteil begrenzen
    if (Yi < -100) Yi = -100;

    Y = Yp + Yi; // PI Regler // gesamt Regler bilden und begrenzen
    if (Y > 100) Y = 100 ;
    if (Y < -100) Y = -100;

    // Strecke bearbeiten
    Ue1 = Y * KS;// Eingang verbinden mit Reglerausgang
    // erstes PT1 Glied
    ex = T1 / tdiv;
    Ua1 = ((Ua1 * ex) + Ue1) / (ex + 1);

    // zweites PT1 Glied
    Ue2 = Ua1; // Eingang verbinden mit Ausgang Ua1
    ex = T2 / tdiv;
    Ua2 = ((Ua2 * ex) + Ue2) / (ex + 1);

    if (millis() - paltzeit >= anzinterval) { // AnzeigeInterval
      paltzeit = millis();
      anzeige();
    }
  }
  lesen(); // Benutzer Eingabe lesen
}

void anzeige () {
  Serial.print(t); Serial.print("\t");
  Serial.print(Soll); Serial.print("\t");
  Serial.print(Y); Serial.print("\t");
  Serial.print(Ua2);
  Serial.println();
}

void lesen() {
  while (Serial.available()) { // Wenn was angekommen ist

    char zeichen = char (Serial.read());
    eingabe += zeichen; // Eingabestring bilden
    if (zeichen == '\n') { // ende erkannt
      Serial.print(eingabe); // Kontroll-Ausgabe

      // auswerten
      if (eingabe.startsWith ("start") && !lauf) { // Status laüft
        lauf = true;
        startzeit = millis();
        altzeit = millis();
        Serial.println("t\t Soll\t Y \t Ist"); // Kopfzeile ausgeben

      }
      if (eingabe.startsWith("stop")) {  // Status stop
        lauf = false;
        Serial.print(" T1="); Serial.print(T1);
        Serial.print(" T2="); Serial.print(T2);
        Serial.print(" KS="); Serial.print(KS);
        Serial.print(" KP="); Serial.print(KP);
        Serial.print(" TN="); Serial.print(TI);
        Serial.print(" CL="); Serial.print(CL);
        Serial.println();
        Serial.println("------------------------");
      }

      if (eingabe.startsWith("anz=")) {  // Anzeigeinterval
        String s = eingabe.substring(4);
        anzinterval = s.toInt();
      }

      if (eingabe.startsWith("soll=")) {  // Sollwert einlesen
        String s = eingabe.substring(5);
        Soll = s.toFloat();
      }
      if (eingabe.startsWith("T1=")) {  // Verz. 1 Glied
        String s = eingabe.substring(3);
        T1 = s.toFloat();
      }
      if (eingabe.startsWith("T2=")) {  // Verz. 2. Glied
        String s = eingabe.substring(3);
        T2 = s.toFloat();
      }

      if (eingabe.startsWith("KS=")) {  // Streckenverstärkung
        String s = eingabe.substring(3);
        KS = s.toFloat();
      }

      if (eingabe.startsWith("KP=")) {   // P Anteil Regler
        String s = eingabe.substring(3);
        KP = s.toFloat();
      }

      if (eingabe.startsWith("TN=")) {  //I Anteil Regler
        String s = eingabe.substring(3);
        TI = s.toFloat();
      }

      if (eingabe.startsWith("CL=")) {  // Status colose Loop
        String s = eingabe.substring(3);
        CL = s.toInt();
      }
      zeichen = "";
      eingabe = "";
    }
  }
}

Laßt mich mal aus dem Urlaub zurückkommen, dann schaue ich mir morgen die Sache in Ruhe an.
Grüße aus Piran
Uwe

@ Rentner: Toll gemacht, ich wollte mich auch mal wieder mit dem Thema beschäftigen, habe über die Jahre viel zu viel vergessen... :confused:

Gruß

Danke für die Blumen
Ging mir bei vielem Theoretischen Kram in den letzten Tagen auch so,aber zum Glück gibt's ja Wikipedia , da ist man dann schnell wieder drin.
Viel Sachen macht man dann in der Praxis einfach jahrelang so weil man das immer so gemacht hat aber mit der Mathe dahinter beschäftigt man sich dann doch nicht mehr

Gruß Heinz

Rentner:
Viel Sachen macht man dann in der Praxis einfach jahrelang so weil man das immer so gemacht hat aber mit der Mathe dahinter beschäftigt man sich dann doch nicht mehr

Wie war! Da ist dieses Forum dann eine schöne Anregung, sich zumindest gedanklich damit mal wieder auseinanderzusetzen. Danke dafür!

Bei meinem Berufseinstieg hat mir ein altgedienter Facharbeiter die Regelung mit einer Toilettenspülung erklärt. Das war schön anschaulich.

@stoni99
geil, typisch deutsch
Alles schön übersichtlich und aufgeräumt.
So stelle ich mir ein finales Projekt vor.
Kein Pappkarton und kein Klebeband.
Respekt !!!

Halloween Gimmick mit Sound Effekten.

Features:
Android App / Bluetooth
10 Sounds
Bewegungsmelder
Konfigurierbare Led Helligkeit und Flackern bei Bewegung aktiv/inaktiv
Live Update mit CRC16 Check in Beide richtungen.
Onboard Stepup von 0,8-3V


Ich wünsche ...

Hardware:
EA-DOGM 162, Alps EM20B, MAX7221

Danke Dir für die Glückwünsche.

Frage: Was hast Du da für einen RotaryEncoder, der Leds mit zieht?

Gruß Tommy

Danke und ebenso ein frohes Fest^^

Frage: Was hast Du da für einen RotaryEncoder, der Leds mit zieht?

-->

Alps EM20B

Hast Du das Teil iwo ausgebaut oder wirklich so viel dafür hingeblättert? xD

Mit der Ansteuerung eines solchen Displays durfte ich mich letztens auch auseinandersetzen, hatte aber einen Controller mit integriertem Treiber. Sogar um Einiges günstiger.... die Preise sind in der Welt der Elektronik halt manchmal etwas seltsam

Hallo,

der Drehencoder ist der Alps EM20B mit LED-Ring. Datenblätter im Anhang.
Das "Led mitziehen" ist alles Software. :wink:
Gekauft habe ich den im Nachbarforum.
https://www.mikrocontroller.net/topic/433276
Bei Interesse Ronald einfach anschreiben.
Preise stehen im Thread 31.08.17 _ 20:05 Uhr.
Der Ledring ist aufgesteckt und arbeitet völlig unabhängig vom Encoder. Kann man verwenden, muss man nicht. Für die Ansteuerung habe ich dann einen MAX7221 verwendet und die Platine für alles angefertigt.
Der Encoder ist Verschleiß- und Prellfrei, weil magnetisch. Haptisch um Längen besser wie die billigen Alps EC11. Außer man mag die lauteren Klicks pro Rastung. Was mir am EC11 gar nicht gefällt ist der übelst straffe Tasterklick. Da drückt man jedesmal die halbe Wand mit durch. Geht beim EM20B leichter und leiser.
Pro volle Umdrehung hat er 40 Rastungen. Pro Rastung gibt er in voller genutzter Auflösung 4 Zählpulse raus. Ich teile das durch 4 sodass ich pro Rastung eine Zähleränderung erhalte.
Der einzigste kleine Nachteil vom EM20B ist die 4mm Achse, die Auswahl an schönen Drehknöpfen ist begrenzt.
Ronald nimmt Drehknöpfe von www.sibalco.de
Man könnte auch einen 4 auf 6mm Adapter verwenden und überdeckt den Ledring mehr. Wie man mag.
Sollte keine Werbung werden, aber ich bin echt begeistert von den Teilen.
Bei näheren Interesse kann ich meinen Schaltplan + Layout zur Verfügung stellen. Sind Target 3001 Dateien.

Edit: 6.01.2019
Im Paket.zip sind die benötigten Libs, Bsp. Sketche und Schaltplan enthalten

Edit: 11.01.2019
MAX7221 Lib überarbeitet, Auswahl zwischen Hardware und Software SPI hinzugefügt

Alsp EM20B_Led.pdf (174 KB)

Alps EM20B.pdf (1 MB)

Alps EM20B Series LED Ring Maße.pdf (388 KB)

Alps EM20B Series Information.pdf (90.6 KB)

Paket.zip (363 KB)