Hallo Leute,
ich bin relativer Neuling in diesem Bereich habe jedoch schon einige Grundkenntnisse...
Ich wollte mich jetzt an mein EIGENES Projekt wagen und arbeite jetzt schon seit Wochen daran. Jedoch bekomme ich es nicht genau so hin wie ich es möchte.
Folgendes Szenario:
Wenn ich Zentraltaster links und Gleis 1 gemeinsam drücke, sollen die Neopixels zu Blinken beginnen. gleichzeitig sollen sich die Weichen 6 und 5 nacheinander stellen.... wenn dies passiert ist und die Endlagen beider Weichen passen dann soll das blinken in Dauerlicht übergehen.... ich habe es jetzt schon mal geschafft, dass es halbwegs funktioniert, ABER es stellt sich zuerst die erste Weiche und dann irgendwann fängt es zu blinken an .... dann sind alle Weichen in der Endlage aber es dauert sehr lange bis das Dauerlicht kommt...... bin echt am Verzweifeln ... vielleicht kann mir jemand helfen.
//------------------------------------------ Steuerung Stellpult Mariazellerbahn --------------------------------------------------------------
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
int LEDs = 6; //Anschluss Led Streifen
int numPixels = 93; //Anzahl der Leds
int pixelFormat = NEO_GRB + NEO_KHZ800;
Adafruit_NeoPixel *pixels;
#define DELAYVAL 100
//--------------------------------------------Taster am Stellpult------------------------------------------------------------
int zentraltaster_links = 2; //zentraler Taster linke Seite an Pin A0 angeschlossen
int zentraltaster_rechts = 3; //zentraler Taster rechte Seite an Pin A6 angeschlossen
int taster_Gleis_1 = A0; //Taster Gleis 1, alle Weichen schalten MIT zugehörigem Zentraltaster von rechts oder links
int taster_Gleis_2 = A1; //Taster Gleis 2, alle Weichen schalten MIT zugehörigem Zentraltaster von rechts oder links
int taster_Gleis_3 = A2; //Taster Gleis 3, alle Weichen schalten MIT zugehörigem Zentraltaster von rechts oder links
int taster_Gleis_4 = A3; //Taster Gleis 4, alle Weichen schalten MIT zugehörigem Zentraltaster von rechts oder links
int taster_Gleis_5 = A4; //Taster Gleis 5, alle Weichen schalten MIT zugehörigem Zentraltaster von rechts oder links
//--------------------------------------------Weichen RECHTE SEITE-------------------------------------------------------------------
const int Weiche_1 = 22; //Relais (8fachModul) für Weiche 1 rechte Seite
const int Weiche_2 = 23; //Relais (8fachModul) für Weiche 2 rechte Seite
const int Weiche_3 = 24; //Relais (8fachModul) für Weiche 3 rechte Seite
const int Weiche_4 = 25; //Relais (8fachModul) für Weiche 4 rechte Seite
//--------------------------------------------Weichen LINKE SEITE---------------------------------------------------------------------
const int Weiche_5 = 50; //Relais (8fachModul) für Weiche 4 linke Seite
const int Weiche_6 = 51; //Relais (8fachModul) für Weiche 4 linke Seite
const int Weiche_7 = 52; //Relais (8fachModul) für Weiche 4 linke Seite
const int Weiche_8 = 53; //Relais (8fachModul) für Weiche 4 linke Seite
//--------------------------------------------Endlagen Weichen (Polarisiereungsanschlüsse am Motor)----------------------------------------
int Endlage_Weiche_1_links = 26; //wird wie Taster INPUT_PULLUP geschaltet (ist für Schalten der nächsten Weiche und wenn alle Weichen Endlage haben dann Leds)
int Endlage_Weiche_1_rechts = 27;
int Endlage_Weiche_2_links = 28;
int Endlage_Weiche_2_rechts = 29;
int Endlage_Weiche_3_links = 30;
int Endlage_Weiche_3_rechts = 31;
int Endlage_Weiche_4_links = 32;
int Endlage_Weiche_4_rechts = 33;
int Endlage_Weiche_5_links = 34;
int Endlage_Weiche_5_rechts = 35;
int Endlage_Weiche_6_links = 36;
int Endlage_Weiche_6_rechts = 37;
int Endlage_Weiche_7_links = 38;
int Endlage_Weiche_7_rechts = 39;
int Endlage_Weiche_8_links = 40;
int Endlage_Weiche_8_rechts = 41;
//-----------------------------------------------Zeitdefinition--------------------------------------------------------------------
unsigned long currentMillis;
unsigned long previousMillis;
unsigned long CycleMillis;
//-----------------------------------------------Farbdefinition--------------------------------------------------------------------
uint32_t schwarz = pixels->Color(0, 0, 0);
uint32_t gelb = pixels->Color(5, 2, 0);
uint32_t gelb_blink = pixels->Color(2, 1, 0);
uint32_t rot = pixels->Color(10,0,0);
//--------------------------------------Fahrstrassen rechts blinken (einlaufen)---------------------------------------------------
bool Gleis_1_rechts_blinken = false; //Ein Aus interner Schalter
bool Gleis_2_rechts_blinken = false;
bool Gleis_3_rechts_blinken = false;
bool Gleis_4_rechts_blinken = false;
bool Gleis_5_rechts_blinken = false;
//--------------------------------------Fahrstrassen rechts Dauerlicht-----------------------------------------------------------
bool Gleis_1_rechts_dauer = false;
bool Gleis_2_rechts_dauer = false;
bool Gleis_3_rechts_dauer = false;
bool Gleis_4_rechts_dauer = false;
bool Gleis_5_rechts_dauer = false;
//--------------------------------------Fahrstrassen links blinken (einlaufen)-----------------------------------------------------
bool Gleis_1_links_blinken = false;
bool Gleis_2_links_blinken = false;
bool Gleis_3_links_blinken = false;
bool Gleis_4_links_blinken = false;
bool Gleis_5_links_blinken = false;
//-------------------------------------Fahrstrassen links Dauerlicht--------------------------------------------------------------
bool Gleis_1_links_dauer = false;
bool Gleis_2_links_dauer = false;
bool Gleis_3_links_dauer = false;
bool Gleis_4_links_dauer = false;
bool Gleis_5_links_dauer = false;
//--------------------------------------Fahrstrassen links------------------------------------------------------------------------
bool Fahrstrasse_Gleis_1_links = false;
bool Fahrstrasse_Gleis_2_links = false;
bool Fahrstrasse_Gleis_3_links = false;
bool Fahrstrasse_Gleis_4_links = false;
bool Fahrstrasse_Gleis_5_links = false;
//---------------------------------------------------Besetztmelder----------------------------------------------------------------
int reed_Gleis_1_ein = A5;
int reed_Gleis_1_aus = A6;
int reed_Gleis_2_ein = A7;
int reed_Gleis_2_aus = A8;
int reed_Gleis_3_ein = A9;
int reed_Gleis_3_aus = A10;
int reed_Gleis_4_ein = A11;
int reed_Gleis_4_aus = A12;
int reed_Gleis_5_ein = A13;
int reed_Gleis_5_aus = A14;
bool Gleis_1_besetzt = false;
bool Gleis_2_besetzt = false;
bool Gleis_3_besetzt = false;
bool Gleis_4_besetzt = false;
bool Gleis_5_besetzt = false;
void setup() {
digitalWrite(Weiche_5, HIGH);
digitalWrite(Weiche_6, HIGH);
//--------------------------- Taster ----------------------------------------
pinMode(zentraltaster_links, INPUT_PULLUP);
pinMode(taster_Gleis_1, INPUT_PULLUP); //Taster ist immer HIGH und muss beim Drücken gegen GND gebrückt werden
pinMode(taster_Gleis_2, INPUT_PULLUP);
pinMode(taster_Gleis_3, INPUT_PULLUP);
pinMode(taster_Gleis_4, INPUT_PULLUP);
pinMode(taster_Gleis_5, INPUT_PULLUP);
pinMode(zentraltaster_rechts, INPUT_PULLUP);
//-------------------------- Relais Weichen ---------------------------------
pinMode(Weiche_1, OUTPUT);
pinMode(Weiche_2, OUTPUT);
pinMode(Weiche_3, OUTPUT);
pinMode(Weiche_4, OUTPUT);
pinMode(Weiche_5, OUTPUT);
pinMode(Weiche_6, OUTPUT);
pinMode(Weiche_7, OUTPUT);
pinMode(Weiche_8, OUTPUT);
//------Endlagen der Weichen zum Weiterschalten nächste Weiche und zum Schluss Ausleuchtung ------
pinMode(Endlage_Weiche_1_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_1_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_2_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_2_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_3_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_3_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_4_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_4_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_5_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_5_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_6_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_6_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_7_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_7_rechts, INPUT_PULLUP);
pinMode(Endlage_Weiche_8_links, INPUT_PULLUP);
pinMode(Endlage_Weiche_8_rechts, INPUT_PULLUP);
//---------------------------alle Weichen Grundstellung ----------------------
//--------------------------------Reed Kontakte------------------------------
pinMode(reed_Gleis_1_ein, INPUT_PULLUP);
pinMode(reed_Gleis_1_aus, INPUT_PULLUP);
pinMode(reed_Gleis_2_ein, INPUT_PULLUP);
pinMode(reed_Gleis_2_aus, INPUT_PULLUP);
pinMode(reed_Gleis_3_ein, INPUT_PULLUP);
pinMode(reed_Gleis_3_aus, INPUT_PULLUP);
pinMode(reed_Gleis_4_ein, INPUT_PULLUP);
pinMode(reed_Gleis_4_aus, INPUT_PULLUP);
pinMode(reed_Gleis_5_ein, INPUT_PULLUP);
pinMode(reed_Gleis_5_aus, INPUT_PULLUP);
//-----------------------------Neopixel Streifen im Stellpult----------------
pixels = new Adafruit_NeoPixel(numPixels, LEDs, pixelFormat);
pixels->begin();
}
void loop() {
//------------------------------Fahrstrasse Gl. 1 links----------------------------
if((digitalRead(zentraltaster_links) == LOW) && (digitalRead(taster_Gleis_1) == LOW))
{
Fahrstrasse_Gleis_1_links = true;
Fahrstrasse_Gleis_2_links = false;
}
if(Fahrstrasse_Gleis_1_links == true)
{
Gleis_1_links_blinken = true;
delay(2000);
digitalWrite(Weiche_6, LOW);
delay(2000);
digitalWrite(Weiche_5, LOW);
if((digitalRead(Endlage_Weiche_5_links) == LOW) && (digitalRead(Endlage_Weiche_6_links) == LOW))
{
Gleis_1_links_blinken = false;
Gleis_1_links_dauer = true;
Gleis_2_links_dauer = false;
Gleis_3_links_dauer = false;
Gleis_4_links_dauer = false;
Gleis_5_links_dauer = false;
}
}
if((Gleis_1_links_blinken == true) && (Gleis_1_besetzt == false))//---------nicht besetzt----------
{
for(int i=0; i<3; i++)
{
delay(750);
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 81, 2);
pixels->fill(gelb, 67, 12);
pixels->show();
delay(750);
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->fill(schwarz, 67, 12);
pixels->show();
}
}
if((Gleis_1_links_blinken == false) && (Gleis_1_besetzt == false))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->fill(schwarz, 67, 12);
pixels->show();
}
if((Gleis_1_links_blinken == true) && (Gleis_1_besetzt == true)) //-------besetzt---------
{
for(int i=0; i<5 ; i++)
{
delay(750);
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 81, 2);
pixels->show();
delay(750);
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->show();
}
}
if((Gleis_1_links_blinken == false) && (Gleis_1_besetzt == true))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->show();
}
if((Gleis_1_links_dauer == true) && (Gleis_1_besetzt == true)) //-------besetzt---------
{
for(int i=0; i<5; i+0)
{
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 81, 2);
pixels->show();
}
}
if((Gleis_1_links_dauer == false) && (Gleis_1_besetzt == true))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->show();
}
if((Gleis_1_links_dauer == true) && (Gleis_1_besetzt == false))
{
for(int i=0; i<5; i+0)
{
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 81, 2);
pixels->fill(gelb, 67, 12);
pixels->show();
}
}
if((Gleis_1_links_dauer == false) && (Gleis_1_besetzt ==false))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 81, 2);
pixels->fill(schwarz, 67, 12);
pixels->show();
}
//------------------------------Fahrstrasse Gl. 2 links----------------------------
if((digitalRead(zentraltaster_links) == LOW) && (digitalRead(taster_Gleis_2) == LOW))
{
Fahrstrasse_Gleis_2_links = true;
Fahrstrasse_Gleis_1_links = false;
}
if(Fahrstrasse_Gleis_2_links == true)
{
Gleis_2_links_blinken = true;
delay(2000);
digitalWrite(Weiche_7, HIGH);
if(digitalRead(Endlage_Weiche_7_links) == LOW)
{
delay(2000);
digitalWrite(Weiche_6, HIGH);
}
if(digitalRead(Endlage_Weiche_6_rechts) == LOW)
{
delay(2000);
digitalWrite(Weiche_5, LOW);
}
if((digitalRead(Endlage_Weiche_6_rechts) == LOW) && (digitalRead(Endlage_Weiche_5_links) == LOW) && (digitalRead(Endlage_Weiche_7_links) == LOW))
{
Gleis_1_links_dauer = false;
Gleis_2_links_dauer = true;
Gleis_3_links_dauer = false;
Gleis_4_links_dauer = false;
Gleis_5_links_dauer = false;
Gleis_2_links_blinken = false;
}
}
if((Gleis_2_links_blinken == true) && (Gleis_2_besetzt == false))//---------nicht besetzt----------
{
for(int i=0; i<numPixels; i++)
{
delay(750);
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 79, 4);
pixels->fill(gelb, 51, 12);
pixels->show();
delay(750);
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->fill(schwarz, 51, 12);
pixels->show();
}
}
if((Gleis_2_links_blinken == false) && (Gleis_2_besetzt == false))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->fill(schwarz, 51, 12);
pixels->show();
}
if((Gleis_2_links_blinken == true) && (Gleis_2_besetzt == true)) //-------besetzt---------
{
for(int i=0; i<numPixels; i++)
{
delay(750);
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 79, 4);
pixels->show();
delay(750);
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->show();
}
}
if((Gleis_2_links_blinken == false) && (Gleis_2_besetzt == true))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->show();
}
if((Gleis_2_links_dauer == true) && (Gleis_2_besetzt == true)) //-------besetzt---------
{
delay(750);
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 79, 4);
pixels->show();
}
if((Gleis_2_links_dauer == false) && (Gleis_2_besetzt == true))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->show();
}
if((Gleis_2_links_dauer == true) && (Gleis_2_besetzt == false))
{
pixels->fill(gelb, 90, 3);
pixels->fill(gelb, 79, 4);
pixels->fill(gelb, 51, 12);
pixels->show();
}
if((Gleis_2_links_dauer == false) && (Gleis_2_besetzt == false))
{
pixels->fill(schwarz, 90, 3);
pixels->fill(schwarz, 79, 4);
pixels->fill(schwarz, 51, 12);
pixels->show();
}
}






