Ich arbeite im Rahmen meiner Techniker-Facharbeit unter anderem an einem Projekt, welches mir den Abstand zu einem Sharp Infrarot-Sensor akkustisch durch immer kleiner werdende Intervalle wiedergeben soll.
Der Sketch steht auch soweit, ich habe nur das Problem, dass die Logik genau umgekehrt funktioniert. Das heißt, je weiter ich von dem Sensor entfernt bin, desto kleiner werden die Intervalle.
Ich sitze jetzt seit 3 Stunden an dem Skech und experimentiere, jedoch finde ich keine Lösung.
Ich wäre euch sehr dankbar, könntet ihr mir helfen.
Viele Grüße.
const int SensorPin = 0; //SensorPin als 0 gesetzt
int Piezo = 2; //Piezo als 2 gesetzt
long ZeitletzteMessung = 0; //ZeitletzteMessung als 0 gesetzt
void setup()
{
pinMode(Piezo, OUTPUT); //Piezo als Output gesetzt
Serial.begin(9600); //Initalisiert den seriellen Port mit der geforderten Übertragungsrate
}
void loop()
{
pinMode(SensorPin, INPUT); //SensorPin als Eingang gesetzt
int SensorWert=analogRead(0); //der Wert des analogen Eingangs wird der Variablen SensorWert übergeben
Serial.println(SensorWert); //Ausgabe des empfangenen Wertes an die serielle Schnittstelle
int Dauer = map(SensorWert, 0, 1023, 0, 5000); //Messwertskalierung/-umrechnung
unsigned long ZeitaktuelleMessung = millis(); //Zeit seit Start des Programms wird in der Variablen ZeitaktuelleMessung gespeichert
Aber habe mir mal 5 Minuten genommen und dein Programm mal etwas vereinfacht.
Wie währe es denn so???
---------------schnipp------------schnapp
const int SensorPin = 0; //SensorPin als 0 gesetzt
int Piezo = 2; //Piezo als 2 gesetzt
long ZeitletzteMessung = 0; //ZeitletzteMessung als 0 gesetzt
void setup()
{
pinMode(Piezo, OUTPUT); //Piezo als Output gesetzt
Serial.begin(9600); //Initalisiert den seriellen Port mit der geforderten Übertragungsrate
}
void loop()
{
int SensorWert=analogRead(SensorPin); //der Wert des analogen Eingangs wird der Variablen SensorWert übergeben
Serial.println(SensorWert); //Ausgabe des empfangenen Wertes an die serielle Schnittstelle
int Dauer = map(SensorWert, 0, 1023, 0, 500); //Messwertskalierung/-umrechnung
digitalWrite(Piezo, HIGH);
delayMicroseconds(150);
digitalWrite(Piezo, LOW);
delayMicroseconds(150);
delay(Dauer);
}
------------------schnipp ---------------schnapp------------------
Wenn dein Sensorwert groß ist, dann würde auch die Pause (Interval) auch groß und wenn dein Sensorwert klein ist dann ist auch die Pause klein.
Probiere ich aber mal aus wenn ich zuhause bin.
Mfg.
Klaus
PS: Bin zuhause und habe es ausprobiert. PASST!!!
PPS: Auch mal mit den getauschten Werten in dem Map Befehl probiert, passt auch andersrum.
Also ich habe einen Poti an den A0 Eingang geklemmt (um deinen Sensor zu siemulieren).
Ferner habe ich deinen Piezo Pin auf 13 geändert, sodas ich dein "Piep" als Blinken der LED sehe.
Als ich an dem Poti gedreht habe, hat sich die Blinkfrequenz geändert. Ferner habe ich auf dem Seriel Monitor mir noch den Wert von Dauer ausgeben lassen.
Was man noch sieht ist ja das, bedingt durch die Delay Funktion am Ende, auch die serielle Ausgabe nur in dem Takt des "Piep" erfolgt.
Habe eben noch damit gespielt (mit Piezo zusätzlich an Pin 13), und hat prima auf dem Uno gefunzt.
Was bekommst du den auf dem Seriellen Monitor zu sehen?
Spiegel den Augang 2 doch auch mal auf den Pin13, sodas du SIEHST ob das Sinal kommt.
Vieleicht zieht dein Piezo auch zu viel strom, oder muss länger mit einem HIGH Pegel versorgt werden.
Der Piezo bei mir hat auch nur sehr leise gepiept.
Mfg.
Klaus
PS: Fällt mir gerade noch ein. Wenn du eine Ausgabe auf dem seriellen Monitor bekommst, dann muss auch das Signal auf dem Pin 2, bzw.13, kommen, da ja der Loop durchlaufen wird. Und wie schon mal geschrieben, das Intervall in dem die serielle Ausgabe aktualiesiert wird ist auch das Intervall in dem der Ausgang HIGH und LOW gesetzt wird.
Keep on trying. Ich versuche es auf meinem MEGA und Duemillanove heute Nacht.
Ich habe das ganze mal mit einem Ultraschall Entfernungsmesser gebastelt, da ist es dann mit der Entfernungsangabe etwas kniffliger gewesen wg. der Echoauswertung.
Melde dann mal volzug wenn ich die Tests gemacht habe.
Ich habe deinen ersten Vorschlag mit der Invertierung nochmal beherzigt und die Werte in der map-Funktion gedreht. Ist ja auch vollkommen logisch, wenn mein Sensor falschrum arbeitet.
Zusätzlich habe ich den obersten Wert meines Einganges in der map-Funktion halbiert und die Einschaltgrenze in der if-Anweisung herabgesetzt.