/********************************************************************************** * Allgemeine Deklaration **********************************************************************************/ #define NOTE1 40 #define NOTE2 30 #define NOTE3 20 // Lautsprecherausgang const byte Ton = 10; // Analog-Pins 0, 1, 2, 3, const int TP1A = 0; const int TP1B = 1; const int TP2A = 2; const int TP2B = 3; const int TP3A = 4; const int TP3B = 5; // Sensorwert // unten für die Abfrage des Sensorwerts nötig int sensorValue1 = 0; int sensorValue2 = 0; int sensorValue3 = 0; // Counter für die Lautstärkeregelung int counter1 = 0; int counter2 = 0; //Caryflags für Sensorlogik byte next = 0; byte wait = 0; byte play = 0; byte reset = 0; byte hupe1 = 0; byte hupe2 = 0; // Kalibration // die ersten 256 Messwerte werden summiert und mit Hilfe der letzten 50 Werte wird der Mittelwert bestimmt int Kalibrationarray1[256]; int Kalibration1 = 0; int Kalibrationarray2[256]; int Kalibration2 = 0; int Kalibrationarray3[256]; int Kalibration3 = 0; /********************************************************************************** * Hauptprogramm **********************************************************************************/ // Führt die Deklaration der Pins durch sowie die Kalibrierung der Sensorik void setup(void){ pinMode(Ton,OUTPUT); // Zuweisung der Pins für Sensorik pinMode(TP1A,OUTPUT); pinMode(TP1B,OUTPUT); pinMode(TP2A,OUTPUT); pinMode(TP2B,OUTPUT); pinMode(TP3A,OUTPUT); pinMode(TP3B,OUTPUT); // Alles entladen digitalWrite(TP1A, LOW); digitalWrite(TP1B, LOW); digitalWrite(TP2A, LOW); digitalWrite(TP2B, LOW); digitalWrite(TP3A, LOW); digitalWrite(TP3B, LOW); delayMicroseconds(5); Kalibrierung(); } void loop(){ digitalWrite(Ton,HIGH); delayMicroseconds(30); digitalWrite(Ton,LOW); delayMicroseconds(30); // Laed und entlaed die Kondensatoren stetig // und erzeugt eine konstante Spannung // deren Aenderung kann anschliessend gemessen werden Kapazitaet(); Kapazitaet(); // erkennt Spannungsaenderungen // leitet entsprechende Aktionen ein Sensorlogik(); } /********************************************************************************** * Kalibrierung **********************************************************************************/ void Kalibrierung(){ // 256 Messwerte werden summiert und anschließend die letzten 50 zur Bildung eines Mittelwerts benutzt for (int i=0; i<255; i++){ Kapazitaet(); Kapazitaet(); Kalibrationarray1[i] = analogRead(TP1A); Kalibrationarray2[i] = analogRead(TP2A); Kalibrationarray3[i] = analogRead(TP3A); delay(4); } for(int i=215; i<255; i++){ Kalibration1 = Kalibration1 + Kalibrationarray1[i]; Kalibration2 = Kalibration2 + Kalibrationarray2[i]; Kalibration3 = Kalibration3 + Kalibrationarray3[i]; } Kalibration1 = Kalibration1 / 40; Kalibration2 = Kalibration2 / 40; Kalibration3 = Kalibration3 / 40; } /********************************************************************************** * Kapazitive Schaltung **********************************************************************************/ void Kapazitaet(){ // damit keine Ladung abfliessen kann werden beide Als Input geschaltet pinMode(TP1A,INPUT); pinMode(TP1B,INPUT); digitalWrite(TP1A, LOW); digitalWrite(TP1B, LOW); pinMode(TP2A,INPUT); pinMode(TP2B,INPUT); digitalWrite(TP2A, LOW); digitalWrite(TP2B, LOW); pinMode(TP3A,INPUT); pinMode(TP3B,INPUT); digitalWrite(TP3A, LOW); digitalWrite(TP3B, LOW); delayMicroseconds(5); // C wird aufgeladen pinMode(TP1A,OUTPUT); digitalWrite(TP1A, HIGH); pinMode(TP2A,OUTPUT); digitalWrite(TP2A, HIGH); pinMode(TP3A,OUTPUT); digitalWrite(TP3A, HIGH); delayMicroseconds(5); pinMode(TP1A,INPUT); digitalWrite(TP1A, LOW); pinMode(TP2A,INPUT); digitalWrite(TP2A, LOW); pinMode(TP3A,INPUT); digitalWrite(TP3A, LOW); // Ladung aus C abfuehren auf GND pinMode(TP1B,OUTPUT); digitalWrite(TP1B, LOW); pinMode(TP2B,OUTPUT); digitalWrite(TP2B, LOW); pinMode(TP3B,OUTPUT); digitalWrite(TP3B, LOW); } /********************************************************************************** * Sensor Logik **********************************************************************************/ void Sensorlogik (){ // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2 sensorValue1 = analogRead(TP1A); sensorValue2 = analogRead(TP2A); sensorValue3 = analogRead(TP3A); if(sensorValue1 > Kalibration1 + 10 && sensorValue2 < Kalibration2 + 11 && sensorValue3 < Kalibration3 + 11){ Tone(40); } if(sensorValue2 > Kalibration2 + 10 && sensorValue2 < Kalibration1 + 11 && sensorValue3 < Kalibration3 + 11){ Tone(30); } if(sensorValue3 > Kalibration3 + 10 && sensorValue1 < Kalibration1 + 11 && sensorValue2 < Kalibration2 + 11){ Tone(20); } if(sensorValue1 > Kalibration1 + 10 && sensorValue2 > Kalibration2 + 11){ Tone(40); delay(100); Tone(30); delay(100); Tone(20); delay(100); } } void Tone (int Laenge){ digitalWrite(Ton,HIGH); delayMicroseconds(Laenge); digitalWrite(Ton,LOW); delayMicroseconds(Laenge); }