[attachment=0]EasySound Maxi per Arduino.pdf[/attachment]In der Bedienungsanleitung des TAMS EasySound maxi ist beschrieben, wie die verschiedenen Geräusche abgerufen werden können.
Max. Anzahl der Sounddateien
• 253 im Digitalbetrieb
• 8 im manuellen Betrieb
Mit der hier beschriebenen Lösung wollte ich folgendes erreichen:
• Abrufen von 8 Geräuschen oberhalb der 8, die mit den Tastern direkt angesteuert werden können
• Automatische Auslösung dieser Geräusche per Programm im Hintergrund
• Auslösung dieser Geräusche per Taster (z.B. zu Testzwecken)
• Definition von Geräuschgruppen, die per Schalter vorgewählt werden können
• Bereitstellung von 4 Kanälen über ein Darlington Array an 12 V DC
• Bereitstellung von 4 Kanälen über Relais gegen Masse
Dazu musste das TAMS EasySound maxi mit einer Platine ergänzt werden, auf der folgende Baugruppen arrangiert wurden
• Dioden Matrix zur gleichzeitigen Ansteuerung von je zwei Eingängen des EasySound maxi
• Arduino nano
• Darlington Array ULN 2801A
• Vier Relais 12V DC einmal um (HJR-1402-L-12V)
• 8 Taster für Direktauslösung der Geräusche
• 6 Schalter zum Auswählen der aktiven Geräuschgruppe(n)
Die Anschlüsse zum TAMS EasySound maxi sowie zu den Ausgängen sind mit Klemmen erreichbar.
Das Programm für den Arduino ist in Bild 3 zu sehen. Dabei sind folgende Geräusche derzeit realisiert:
• Stundenläuten
• langes Kirchenläuten
• Blaskapelle
• Kuckuck
• Kuh
• Hahn
• Warnsignal der Rotte (Typhoon)
• Hundegebell
Die Abstände der Ereignisse reichen von 5 min (Hundegebell) bis 30 min (Blaskapelle). Für die Einschaltzeit wurden solche Primzahlen gewählt, durch die bei den Geräuschen keine Überlappungen auftreten. An die Darlingtonausgänge werden z.B. die LED Strips angeschlossen, die ich beim Bergwerk eingesetzt habe.
Die sechs Schalter werden im Program abgefragt, sodass nicht immer alle Geräusche ablaufen. So kann mit dem Schalter 1 die Blasmusik ausgeblendet werden.
Der Schaltplan ist als PDF angehängt.
Hier nun das Sketch für den Arduino.
class pinHandler
{
// Class Member Variables
// These are initialized at startup
int ledPin; // the number of the LED pin
long OnTime; // milliseconds of on-time
long OffTime; // milliseconds of off-time
// These maintain the current state
int ledState; // ledState used to set the LED
unsigned long previousMillis; // will store last time LED was updated
// Constructor - creates a pinHandler
// and initializes the member variables and state
public:
pinHandler(int pin, long on, long off)
{
ledPin = pin;
pinMode(ledPin, OUTPUT);
OnTime = on;
OffTime = off;
ledState = HIGH;
previousMillis = 0;
} // end of constructor pinHandler
void Update()
{
// check to see if it's time to change the state of the LED
unsigned long currentMillis = millis();
if((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
{
ledState = HIGH; // Turn it off, LOW for ON bei Sound
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
}
else if ((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
{
ledState = LOW; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
}
} // on of update in CLASS
}; // end of CLASS pinHandler
// Aktionen 1 - 6
int schaltDauer = 300;
pinHandler led1 (0, 55579, 55579) ; // Darlington E6
pinHandler led2 (1, 63743, 63743) ; // Darlington E5
pinHandler led3 (2, 63743, 63743) ; // Darlington E4 Relais 4 für 12 V AC
pinHandler led4 (3, 63743, 63743) ; // Darlington E3 Relais 3 für 12 V AC
pinHandler led5 (4, 63743, 63743) ; // Darlington E2 Relais 2 für 12 V AC
pinHandler led6 (5, 63743, 63743) ; // Darlington E1 Relais 1 für 12 V AC
// Töne 1 - 8
pinHandler led7 (6, 602111, schaltDauer) ; // U7 Stundenläuten
pinHandler led8 (7, 1854321, schaltDauer) ; // U8 langes Kirchenläuten
pinHandler led9 (8, 1600013, schaltDauer) ; // U6 Blaskapelle
pinHandler led10(9, 420543, schaltDauer) ; // U5 Kuckuck
pinHandler led11(10, 303007, schaltDauer) ; // U4 Kuh
pinHandler led12(11, 299993, schaltDauer) ; // U3 Hahn
pinHandler led13(12, 540061, schaltDauer) ; // U2 Typhoon
pinHandler led14(13, 120011, schaltDauer) ; // U1 Hund
pinHandler Analog6 (A6, 1000,1000) ; // Darlington E7
pinHandler Analog7 (A7, 1000,1000) ; // Darlington E8
int thisPin = 0;
// Analog Pins setzen
int switchPin1 = 0 ;
int switchPin2 = 1 ;
int switchPin3 = 2 ;
int switchPin4 = 3 ;
int switchPin5 = 4 ;
int switchPin6 = 5 ;
int prellenAbwarten = 150 ;
void setup()
{
for (thisPin = 0; thisPin < 14; thisPin++)
{
digitalWrite (thisPin, HIGH) ;
}
// Schaltereingänge setzen
pinMode (A0, INPUT) ; // S1: Analog Eingang A0
digitalWrite (A0, HIGH); // interner PullUp Widerstand ein
pinMode (A1, INPUT) ; // S2: Analog Eingang A1
digitalWrite (A1, HIGH); // interner PullUp Widerstand ein
pinMode (A2, INPUT) ; // S3: Analog Eingang A2
digitalWrite (A2, HIGH); // interner PullUp Widerstand ein
pinMode (A3, INPUT) ; // S4: Analog Eingang A3
digitalWrite (A3, HIGH); // interner PullUp Widerstand ein
pinMode (A4, INPUT) ; // S5: Analog Eingang A4
digitalWrite (A4, HIGH); // interner PullUp Widerstand ein
pinMode (A5, INPUT) ; // S6: Analog Eingang A5
digitalWrite (A5, HIGH); // interner PullUp Widerstand ein
// Analoge auf Ausgang setzen
pinMode (A6, OUTPUT) ; // Analog Ausgang geht auf Darlington E7
digitalWrite (A6, HIGH); // interner PullUp Widerstand ein
pinMode (A7, OUTPUT) ; // Analog Ausgang geht auf Darlington E8
digitalWrite (A7, HIGH); // interner PullUp Widerstand ein
}
void loop()
{
led1.Update(); // Darlington E6: Licht Bergwerk 12 V DC
led2.Update(); // Darlington E5: Licht Bergwerk 12 V DC
led3.Update(); // Relais 4: 12 V AC
if(readSwitch(switchPin4)) led4.Update(); // Relais 3: 12 V AC
if(readSwitch(switchPin4)) led5.Update(); // Relais 2: 12 V AC
if(readSwitch(switchPin4)) led6.Update(); // Relais 1: 12 V AC
if(readSwitch(switchPin5)) led7.Update(); // U7 Glockenschlag
if(readSwitch(switchPin5)) led8.Update(); // U8 langes Läuten
if(readSwitch(switchPin1)) led9.Update(); // U6 Blasmusik
if(readSwitch(switchPin2)) led10.Update(); // U5 Kuh
if(readSwitch(switchPin2)) led11.Update(); // U4 Kuckuck
if(readSwitch(switchPin2)) led12.Update(); // U3 Hahn
if(readSwitch(switchPin3)) led13.Update(); // U2 Typhoon
if(readSwitch(switchPin2)) led14.Update(); // U1 Hund
if(readSwitch(switchPin2)) Analog6.Update(); // Analog Ausgang geht auf Darlington E7
if(readSwitch(switchPin2)) Analog7.Update(); // Analog Ausgang geht auf Darlington E8
}
int readSwitch(int derSwitch) {
if (analogRead(derSwitch) < 500) { // Analogeingang abfragen
delay (prellenAbwarten);
if (analogRead(derSwitch) < 500) // nochmal fragen
return 1 ; // war geschaltet
}
return 0 ; // war nicht geschaltet
}