/*
* Lokschuppen mit Servo und Blinkdioden
* 2020-03-16
* Wolfgang aka Running_Wolf
*/
#include <MobaTools.h>
//
// LED und Pins für Servo
//
const int rotPin1 = 12; // rotes Blinklicht über Tor1 sw/we
const int torservoPin = 10; // Anschluß für den Servo Links/Rechts
const int lichtPin3 = 9; // via Darlington LED Strip (gelb) noch offen
const int lichtPin2 = 8; // Hallenlicht Nebenhalle LED Strip (grün)
const int lichtPin4 = 7; // via Darlington (noch offen) evtl rt Draht
const int lichtPin1 = 2; // Hallenlicht Haupthalle LED Strip (grün)
//
// Parameter Zeitabfragen
//
unsigned long previousMillis_Tor1 = 0; // Merke Zeitpunkt Änderung
unsigned long previousMillis_Rot1 = 0; // Merke Zeitpunkt Änderung
unsigned long previousMillis_Halle1 = 0; // Merke Zeitpunkt Änderung
unsigned long previousMillis_Halle2 = 0; // Merke Zeitpunkt Änderung
unsigned long wann_Halle1[2] = { 30000,40000} ; // Startabstand, Laufzeit Hallenlicht 1
unsigned long wann_Halle2[2] = {310000,51000} ; // Startabstand, Laufzeit Hallenlicht 2
unsigned long wann_Tor1[2] = {300000,300000} ; // Startabstand, Laufzeit Hallentor 1
unsigned long wann_Rot1 = 200 ; // rotes Blinklicht über Tor
//
// Parameter Blitzlich (noch offen)
//
const int blitzPin1 = 11; // Blitzlicht LED (lila) (noch offen)
unsigned long blitzStartenB1 = 0 ;
unsigned long previousMillisB1 = 0; // Merke Zeitpunkt Änderung
const long blitzDauerB1 = 20000 ; // noch offen
long blitzOffB1 = 2000; // noch offen
const int blitzZeitB1 = 20 ; // Länge Blitzlicht
unsigned long wann_Blitz = 500 ; // Blitzfrequenz
int blitzStateB1 = LOW; // Status Blitzlicht
//
// Parameter Tor und Hallenlicht
//
int status_Halle1 = 0 ; // Licht Halle 1 aus
int status_Halle2 = 0 ; // Licht Halle 2 aus
int status_Tor1 = 0 ; // Tor 1 zu
int ziel_Tor1 = 0 ; // 0 = zu, 170 = auf
//
Servo8 torServo; // Servo ansprechen
//
// Eggtimer noch offen
//
// EggTimer Pause; // Timer für Pausen zwischen den Servobewegungen
// byte schritt = 0; // Zustand Schrittkette
//
// Tastenfunktionen
//
int Taste_1 = A0; // Steuertaste 1 Eingang
int Taste_2 = A1; // Steuertaste 2 Eingang
int Taste_3 = A2; // Drucktaste Tor Eingang
int Tasten_Wert[3] = {0, 0,0} ; // speichert Werte für Taste_1 bis Taste_3
const int ohne_Drueck = 500 ; // Analogwert unter 500: nichts gedrückt
const int klein_Drueck = 850 ; // Analogwert über 850: 470 Ohm gedrückt
const int gross_Drueck_u = 600 ; // Analogwert zw. 600 und 800: 4,7 K gedrückt
const int gross_Drueck_o = 800 ;
int entprellzeit = 500 ; // Tastenprellen abwarten
int test_Taste1 = 0 ; // Tastenwert für Test 1, 0 = nichts, 1 = zu, 2 = auf
//
//
void setup() {
// Serial.begin(9600);
torServo.attach(torservoPin, true); //Servo an Pin 10
torServo.setSpeed( 3 ); // Verfahrgeschwindigkeit einstellen Links/Rechts
pinMode(Taste_1, INPUT_PULLUP) ; // noch nicht benutzt
pinMode(Taste_2, INPUT_PULLUP) ; // noch nicht benutzt
pinMode(Taste_3, INPUT_PULLUP) ; // Drucktaste Tor nur eine Taste angeschlossen
pinMode(lichtPin1, OUTPUT); // D02 Hallenlicht Haupthalle LED Strip (grün)
pinMode(lichtPin2, OUTPUT); // D08 Hallenlicht Nebenhalle LED Strip (grün)
pinMode(lichtPin3, OUTPUT) ; // D09 via Darlington LED Strip (gelb) noch offen
pinMode(lichtPin4, OUTPUT) ; // D07 via Darlington LED Strip (gelb) noch offen
pinMode( rotPin1, OUTPUT); // D12 rotes Blinklicht über Tor1
pinMode(blitzPin1, OUTPUT); // D11 LED via 1K noch offen
digitalWrite(rotPin1, HIGH) ; // Licht aus
digitalWrite(lichtPin1, HIGH) ; // Hallenlicht Haupthalle aus
digitalWrite(lichtPin2, HIGH) ; // Hallenlicht Nebenhalle aus
digitalWrite(lichtPin3, HIGH) ; // D09 via Darlington aus
digitalWrite(lichtPin4, HIGH) ; // D07 via Darlington aus
digitalWrite(blitzPin1, HIGH) ; // D11 LED aus
}
//
void loop() {
unsigned long currentMillis = millis(); // merke Zeitpunkt
//
// Torstatus abfragen
//
if (torServo.read()> 160) {
status_Tor1 = 0; // Tor 1 zu
}
if (torServo.read()< 10) {
status_Tor1 = 1; // Tor 1 auf
}
//
// Hallenlicht Haupthalle 1
//
if (currentMillis - previousMillis_Halle1 >= wann_Halle1[status_Halle1]) {
previousMillis_Halle1 = currentMillis; // merke Zeitpunkt
digitalWrite(lichtPin1, !digitalRead(lichtPin1)); // ändere Zustand
status_Halle1 = 1-status_Halle1; // ändere Status
// 0 = Licht Halle 1 aus
wann_Halle1[1] = random(40000,120000) ; // Laufzeit Hallenlicht 1
}
//
// Ende Licht Haupthalle
//
//
// Tor Halle 1 automatisch betätigen
//
if (currentMillis - previousMillis_Tor1 >= wann_Tor1[status_Tor1]) {
previousMillis_Tor1 = currentMillis; // merke Zeitpunkt
torServo.write(170 * status_Tor1); // 0 macht zu, 170 macht auf
}
//
// Ende Tor Haupthalle
//
if (torServo.moving()) { // Licht an wenn Tor 1 bewegt
digitalWrite(lichtPin1, HIGH); // Hallenlicht Haupthalle an
previousMillis_Halle1 = currentMillis;} // merke Zeitpunkt
//
//
// Hallenlicht Halle 2
//
if (currentMillis - previousMillis_Halle2 >= wann_Halle2[status_Halle2]) {
previousMillis_Halle2 = currentMillis; // merke Zeitpunkt
digitalWrite(lichtPin2, !digitalRead(lichtPin2)); // ändere an / aus
status_Halle2 = 1-status_Halle2; // setze Lichtstatus
} // Ende IF Licht Halle 2
//
// Testtaste (noch offen)
//
test_Taste1 = 0 ; // Tastenwert für Test
// 0 = nichts, 1 = zu, 2 = auf
test_Taste1 = druck_2_Taste(Taste_1) ; // fragt Wert der Taste ab noch offen
//
// Drucktaste Taste_3 für Tor 1 abfragen
//
if (druck_1_Taste(Taste_3)==1) // 1 = Taste gedrückt
{
torServo.write(170 * status_Tor1); // 0 macht zu, 170 macht auf
}
//
// Servo Loop Anfang ----------------------------------------
//
if (digitalRead(lichtPin3)) // noch offen
{
// irgendwas mit lichtPin3 machen
}
if (digitalRead(lichtPin4)) // noch offen
{
// irgendwas mit lichtPin4 machen
} // lichtPin4
//
//
// Hier können jetzt weitere Aktionen ausgeführt werden.
//
// Loop Blink LED Tor 1
//
if (currentMillis - previousMillis_Rot1 >= wann_Rot1)
{
previousMillis_Rot1 = currentMillis; // merke Zeitpunkt
if (torServo.moving())
{
digitalWrite(rotPin1, !digitalRead(rotPin1)); // Blinke wenn Tor bewegt
}
else
{
digitalWrite(rotPin1, LOW); // aus, wenn Tor steht
}
}
//
// Loop Blink Ende
//
// Blitzer noch offen
//
currentMillis = millis(); // Zeitpunkt abfragen
// ----------------Beginn jetztTBlitzen--------------------------------------
// Anschalten
if ((currentMillis - previousMillisB1 >= blitzOffB1) && !(torServo.moving()))
{
blitzStateB1 = !blitzStateB1; // an/aus wechseln
digitalWrite(blitzPin1, blitzStateB1); // Pin schalten
previousMillisB1 = currentMillis; // Zeitpunkt merken
blitzOffB1 = random(1000, 3000); // Zeitpunkt zufällig setzen
}
//
// Ende jetztBlitzen --------------------------------------------
//
} // Loop Ende
//
// Funktionen
//
// ----------------------------Tastenabfrage -----------------------------
//
// Drucktasten abfragen, zwei Tasten an Analogpin
//
int druck_2_Taste(int dieseTaste) // Fragt 2 Tasten ab
{
Tasten_Wert[dieseTaste-14] = analogRead(dieseTaste); // Lese Tastennummer von Analog Port
delay (entprellzeit); // warte wegen Prellen
Tasten_Wert[dieseTaste-14] = analogRead(dieseTaste); // frag Taste noch einmal
if (Tasten_Wert[dieseTaste-14] < ohne_Drueck)
{
return 0; // keine Taste gedrückt
}
else if (Tasten_Wert[dieseTaste-14] > ohne_Drueck)
{
return 1; // Taste gedrückt
}
}
//
// Drucktaste abfragen, nur eine Taste an Analogpin
//
int druck_1_Taste(int dieseTaste) // Fragt 1 Taste ab
{
Tasten_Wert[dieseTaste-14] = analogRead(dieseTaste); // Lese Tastennummer von Analog Port
delay (entprellzeit); // warte wegen Prellen
Tasten_Wert[dieseTaste-14] = analogRead(dieseTaste); // Lese Tastennummer von Analog Port
if (Tasten_Wert[dieseTaste-14] < 100)
{
return 1; // die Taste gedrückt
}
else if (Tasten_Wert[dieseTaste-14] > 1000)
{
return 0; // keine Taste gedrückt
}
}
// --------------------------------------------------------------------------------