Ampelanlage für DC-Car System

Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Ampelanlage für DC-Car System

Beitrag von e69-fan »

Servus am kalten Nachmittag,
Bei grün ein oder bei grün aus?
Hmm ... Wenn der arduino neu startet sollte das Relais noch nicht schalten.

Bei Grün - EIN
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

Ach ja, da ist ja noch was. Bei welchem Grün. Als das Grüm von welcher Ampel :)

Danke, schönen Abend. :(V):
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Ampelanlage für DC-Car System

Beitrag von e69-fan »

Servus,

jede der 3 Ampeln bekommt ein eigenes Relais
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

OK
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

Sind an deinem Nano Pin 5,6,7 frei?? Wenn ja dann sollte das gehen. Habe es nicht ausprobiert. Sollte es nicht gehen, dann sage bescheid was nicht geht.
Pin.5 ist Relais grün Hauptampel
Pin.6 ist Relais grün Nebenampel
Pin.7 ist Relais grün Busampel

Franz

Code: Alles auswählen

/*
   https://www.stummiforum.de/t163493f21-Arduino-Zeitsteuerungen-ohne-Delay-ein-kleines-Tutorial-1.html
   Beitrag: 27
*/

// Ampelsteuerung an einer einspurigen Strasse mit Bushaltestelle
// Die Ampelphasen werden über eine Tabelle definiert

#include <MobaTools.h>

// Definition der Ausgangspins:

const byte hRotPin   = A0;  // Ampel an der Hauptstrasse, rechts
const byte hGelbPin  = A1;
const byte hGruenPin = A2;

const byte nRotPin   = A3;  // Ampel an der Hauptstrasse, links
const byte nGelbPin  = A4;
const byte nGruenPin = A5;

const byte BusRotPin   = 2;  // Ampel an der Bushaltestelle
const byte BusGelbPin  = 3;
const byte BusGruenPin = 4;
const int baudSerial = 9600;

// Tabelle für die Ampelzustände

// Ampelphase:                1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  10 |  11 |  12
// -------------------------------------------------------------------------------------------------------
// Tabellenindex:             0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  10 |  11
// -------------------------------------------------------------------------------------------------------
const byte zeitDauer  [] = { 30  ,  3  ,  3  ,  3  , 20  ,  3  ,  3  ,  3  ,  10 ,  3  ,  3  ,   3 };
// -------------------------------------------------------------------------------------------------------
const bool hauptRot   [] = { OFF , OFF ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON };
const bool hauptGelb  [] = { OFF ,  ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF ,  ON };
const bool hauptGruen [] = {  ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF };
const bool nebenRot   [] = {  ON ,  ON ,  ON ,  ON , OFF , OFF ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON };
const bool nebenGelb  [] = { OFF , OFF , OFF ,  ON , OFF ,  ON , OFF , OFF , OFF , OFF , OFF , OFF };
const bool nebenGruen [] = { OFF , OFF , OFF , OFF ,  ON , OFF , OFF , OFF , OFF , OFF , OFF , OFF };

const bool BusRot     [] = {  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON ,  ON , OFF , OFF ,  ON ,  ON };
const bool BusGelb    [] = { OFF , OFF , OFF , OFF , OFF , OFF , OFF ,  ON , OFF ,  ON , OFF , OFF };
const bool BusGruen   [] = { OFF , OFF , OFF , OFF , OFF , OFF , OFF , OFF ,  ON , OFF , OFF , OFF };

const byte tabMax = sizeof(zeitDauer) - 1; // Tabellenindex startet bei 0 ( deshalb die -1 für den höchsten Index )
byte ampelTabIx;   // läuft von 0 .. 7

// Einrichten der notwendigen MoBaTools Objekte:
MoToTimer AmpelTimer;
MoToSoftLed hRot;
MoToSoftLed hGelb;
MoToSoftLed hGruen;
MoToSoftLed nRot;
MoToSoftLed nGelb;
MoToSoftLed nGruen;
MoToSoftLed nBusRot;
MoToSoftLed nBusGelb;
MoToSoftLed nBusGruen;

const byte relaisH = 5;
const byte relaisN = 6;
const byte relaisB = 7;

void setup() {
  // Softled Objekte initiieren

  hRot.attach( hRotPin );
  hRot.riseTime( 200 );
  hGelb.attach( hGelbPin );
  hGelb.riseTime( 200 );
  hGruen.attach( hGruenPin );
  hGruen.riseTime( 200 );
  // --------------------------------------------------------------------------
  nRot.attach( nRotPin );
  nRot.riseTime( 200 );
  nGelb.attach( nGelbPin );
  nGelb.riseTime( 200 );
  nGruen.attach( nGruenPin );
  nGruen.riseTime( 200 );
  // --------------------------------------------------------------------------
  nBusRot.attach( BusRotPin );
  nBusRot.riseTime( 200 );
  nBusGelb.attach( BusGelbPin );
  nBusGelb.riseTime( 200 );
  nBusGruen.attach( BusGruenPin );
  nBusGruen.riseTime( 200 );
  // --------------------------------------------------------------------------

  ampelTabIx = 2;  // Das System startet mit " alle Ampeln = ROT "

  //-------Relais einrichten ----------
  digitalWrite (relaisH, HIGH);
  pinMode(relaisH, OUTPUT);
  digitalWrite (relaisN, HIGH);
  pinMode(relaisN, OUTPUT);
  digitalWrite (relaisB, HIGH);
  pinMode(relaisB, OUTPUT);
  Serial.begin(baudSerial);
}

void loop() {
  // Tabellengesteuerte Ampel

  if ( !AmpelTimer.running() ) {
    // Zeit abgelaufen
    // Ampel schalten
    Serial.println(F("xxxxxxxxxxx"));
    hRot.write( hauptRot[ampelTabIx] );
    Serial.println(ampelTabIx);
    hGelb.write( hauptGelb[ampelTabIx] );
    hGruen.write( hauptGruen[ampelTabIx] );
    nRot.write( nebenRot[ampelTabIx] );
    nGelb.write( nebenGelb[ampelTabIx] );
    nGruen.write( nebenGruen[ampelTabIx] );
    nBusRot.write( BusRot[ampelTabIx] );
    nBusGelb.write( BusGelb[ampelTabIx] );
    nBusGruen.write( BusGruen[ampelTabIx] );
    
    // ----- Relais Grünschaltung steuern ----
    if (ampelTabIx == 0) {
      digitalWrite (relaisH, LOW);
    }
      else { digitalWrite (relaisH, HIGH);
    }
    if (ampelTabIx == 4) {
      digitalWrite (relaisN, LOW);
    }
      else { digitalWrite (relaisN, HIGH);
    }
    if (ampelTabIx == 8) {
      digitalWrite (relaisB, LOW);
    }
      else { digitalWrite (relaisB, HIGH);
    }

    // Zeit setzen ( da der Timer in ms rechnet, müssen die Tabellenwerte mit 1000 multipliziert werden )

    AmpelTimer.setTime( zeitDauer[ampelTabIx] * 1000 );

    // Merker weiterrückem
    if ( ampelTabIx >= tabMax ) {
      // Tabellenende erreicht
      ampelTabIx = 0;

    } else {

      ampelTabIx++;
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

Ich habe jetzt doch mal einen Testaufbau gemacht. Und es geht wie ich mir das vorstelle. Die Pin´s für die drei Relais, 5, 6, 7, kann man auf den Zeilen 60, 61, 62, anpassen.

Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Ampelanlage für DC-Car System

Beitrag von e69-fan »

Schritt 4 - finale Version

Hallo Franz,

:(V): vielen Dank für deine hilfsbereite Geduld.

Das Programm läuft genau wie ich mir vorgestellt habe. Alles - super.

Die
const int baudSerial = 9600; habe ich drin gelassen, ist ja informativ auf dem seriellen Monitor.

Meiner laienhafter Meinung nach ist das Programm durch die Kombination von "array" und "merker" sehr übersichtlich und erleichtert das eventuelle Feintuning.


Ich habe mal versucht mich über "merker" schlau zu machen, habe aber nur unverständliches Zeug gefunden. Da wäre mal eine Info, ähnlich wie es Du schon über die "millies" etc. gemacht hast, sehr hilfreich für uns Anfänger.

Also nochmals vielen Dank und Euch ein schönes Wochenende.
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

BaudSerial ist nur die Tacktrate für SerialPrint() das man zur Kontrolle benutzt um mal eben irgend welche Werte am PC sichtbar zu machen, wenn man das Programm erweitert, oder Fehler sucht. Ich habe damit einfach mal geschaut, welchen Wert ich zu Rate ziehe, für das Steuern der Relais.

Zu den Merkern. Das sind einfach mal Dinge die du dir im Programm merken musst. Die Drei Merker, die ich mir eingerichtet habe für die Relais brauchte ich dann aber gar nicht. Kann man also wieder rausschmeißen. Ich dachte ich muß da Werte auslesen und merken, was dann gar nicht nötig war.

Also die drei Merker:
const byte merkerH = 0;
const byte merkerN = 0;
const byte merkerB = 0;
kannst du rauschmeißen, die habe ich dann doch nicht benötigt. Sind also nur unnötiger Ballast.
Ich habe diese drei Zeilen oben im Programm noch rausgeschmissen, weil ich die vergessen habe zu löschen, bevor ich es hier reingesetzt haben.

Das sind keine vorgegebenen ProgrammCode. Die Dinger kann man nennen wie man will. Ich nenne sie gerne "merker" weil ich mir damit irgend was ausgelesenes merken will/muss. Z.B. wenn du einen Wert auslesen musst, und wenn du ihn ein paar Sekunden später wieder neu ausliest, kannst du ihn mit dem vorher ausgelesenen Wert vergleichen, ob und wie er sich verändert hat. So war das der merkerH für die Hauptampel, der merkerN für die Nebenampel und der merkerB für die Busampel. Kannst du aber wie gesagt nennen wie es dir gefällt. Man deklariert sie im oberen Programmteil, und dann kann man sie überall im Programm zum speichern, vergleich, auslesen, benutzen.
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ampelanlage für DC-Car System

Beitrag von Admin »

Hier ist mal der Merker im Einsatz. Da lese ich einen Messwert am Pin A1 aus. Dann vergleiche ich, ob der Wert im Vergleich zur vorhergehenden Messung höher oder niedriger geworden ist, und gebe das Ergebniss über die Serielle auf den PC aus.

Code: Alles auswählen

int sp1 = 0;      // Hier bestimme ich die Bezeichnung für die Messung
int merkSp1 = 0;  // Hier bestimme ich die Bezeichnung für den Merker
const byte sp1Eingang = A1; // Name für Pin A1 deklarieren
const int baudSerial = 9600; // Baudrate für SerialPrint deklarieren
//--------------Setup-----------------------------------------------
void setup() {
  pinMode(sp1Eingang, INPUT); // Pin A1 als Eingang aktivieren
  Serial.begin(baudSerial); // Serial Schnittstelle starten
}
//-------------LOOP-------------------------------------------------
void loop() {
  sp1 = analogRead(sp1Eingang); // Spannung an A1 auslesen und an "Sp1" übergeben
  // Aktuelle Spannungsmessung vergleich mit vorheriger Spannung
  if (sp1 > merksp1) {
    Serial.println(F("Spannung an A1 erhöht"));
    Serial.println(Sp1);
    merkSp1 = Sp1; // gemessene Spannung an den Merker übergeben
  }
  // Aktuelle Spannungsmessung vergleich mit vorheriger Spannung
  if (sp1 < merksp1) {
    Serial.println(F("Spannung an A1 niedriger"));
    Serial.println(Sp1);
    merkSp1 = Sp1; // gemessene Spannung an den Merker übergeben
  }
}
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 3 Gäste