/* * Caro BH * * Created: 16.06.2012 11:05:30 * Author: Administrator */ #include #include #define NOTE1 1047 #define NOTE2 2048 #define NOTE3 3056 // Sensorwert // unten für die Abfrage des Sensorwerts nötig uint16_t sensorValue1 = 0; uint16_t sensorValue2 = 0; uint16_t sensorValue3 = 0; // Counter für die Lautstärkeregelung uint16_t counter1 = 0; uint16_t counter2 = 0; // Caryflags für Sensorlogik unsigned next:1 = 0; unsigned wait:1 = 0; unsigned play:1 = 0; unsigned reset:1 = 0; unsigned hupe1:1 = 0; unsigned hupe2:1 = 0; // Kalibration // die ersten 256 Messwerte werden summiert und mit Hilfe der letzten 50 Werte wird der Mittelwert bestimmt uint16_t Kalibrationarray1[256]; uint16_t Kalibration1 = 0; uint16_t Kalibrationarray2[256]; uint16_t Kalibration2 = 0; uint16_t Kalibrationarray3[256]; uint16_t Kalibration3 = 0; int main(void) { // 0 = Output und 1 = Input DDRB = 0b00000001; // Alles entladen DDRA = 0b00111111; PORTA = 0b00000000; _delay_us(5); Kalibration(); while(1) { // 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(); } } void Kalibrierung(){ uint8_t j=0; // 256 Messwerte werden summiert und anschließend die letzten 50 zur Bildung eines Mittelwerts benutzt for (uint i=0; i<255; i++){ Kapazitaet(); Kapazitaet(); Kalibrationarray1[i] = readADC(0); Kalibrationarray2[i] = readADC(2); Kalibrationarray3[i] = readADC(4); _delay_ms(4); if(i>214){ Kalibration1 = Kalibration1 + Kalibrationarray1[i]; Kalibration2 = Kalibration2 + Kalibrationarray2[i]; Kalibration3 = Kalibration3 + Kalibrationarray3[i]; j++; } } Kalibration1 = Kalibration1 / j; Kalibration2 = Kalibration2 / j; Kalibration3 = Kalibration3 / j; } void Kapazitaet(){ // damit keine Ladung abfliessen kann werden beide Als Input geschaltet // 0 = Output und 1 = Input DDRA = 0b11111111; PORTA = 0b00000000; _delay_us(5); // C wird aufgeladen // Pin 0,2,4 werden zu OUTPUTS // Pin 0,2,4 werden High geschalten DDRA = 0b11101010; PORTA = 0b00010101; _delay_us(5); DDRA = 0b11111111; PORTA = 0b00000000; // Ladung aus C abfuehren auf GND // Pin 1,3,5 werden OUTPUT und LOW DDRA = 0b11010101; PORTA = 0b00000000; } uint16_t readADC(uint8_t channel) { uint8_t i; uint16_t result = 0; // ADEN wird 1 gesetzt = ADC aktivieren // ADPS2 = 1 und ADPS1 = 1 beduetet: // Teilungsfaktor ist = 64 // Quelle: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe#Messen_eines_Widerstandes ADCSRA = (1< 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_ms(100); Tone(30); _delay_ms(100); Tone(20); _delay_ms(100); } } void Tone (uint8_t Laenge){ PIN0 = 0b00000001; _delay_us(Laenge); digitalWrite(Ton,LOW); _delay_us(Laenge); }