ich experementiere momentan mit dem hc sr04.
ich kann mit dem sketch (unten) die entfernung zwar messen, aber leider springt sie immer zwischen 2-4werten hin und her(um ein paar mm, vielleicht ein cm), obwohl sich die entfernung nicht ändert:
// HC-SR04
float echo = 0;
int ultraSoundSignal = 2; // Ultrasound signal pin
float ultrasoundValue = 0;
float x_old = 0;
float ping(){
pinMode(ultraSoundSignal, OUTPUT); // Switch signalpin to output
digitalWrite(ultraSoundSignal, LOW); // Send low pulse
delayMicroseconds(2); // Wait for 2 microseconds
digitalWrite(ultraSoundSignal, HIGH); // Send high pulse
delayMicroseconds(5); // Wait for 5 microseconds
digitalWrite(ultraSoundSignal, LOW); // Holdoff
pinMode(ultraSoundSignal, INPUT); // Switch signalpin to input
digitalWrite(ultraSoundSignal, HIGH); // Turn on pullup resistor
// please note that pulseIn has a 1sec timeout, which may
// not be desirable. Depending on your sensor specs, you
// can likely bound the time like this -- marcmerlin
// echo = pulseIn(ultraSoundSignal, HIGH, 38000)
echo = pulseIn(ultraSoundSignal, HIGH); //Listen for echo
ultrasoundValue = (echo / 58.138); //convert to cm
return ultrasoundValue;
}
void loop()
{
float x = ping();
// Anzeige nur ändern wenn neue Entfernung
if(x!=x_old)
{
Serial.print(x);
Serial.println("cm");
delay(1000); //delay
x_old = x; // letze Entfernung speichern
}
}
const int anzahlMessungen = 10; // Mittelwert wird aus 10 Werten gebildet
const int intervall = 10; // Messungen alle 10 mS, ggf. anpassen
int messungen[anzahlMessungen]; // Array fuer Messwerte
int zeiger = 0; // Zeiger des aktuellen Messwerts
int gesamtSumme = 0; // aktueller Gesamtwert
int durchschnitt = 0; // Mittelwert
int dieseMessung = 0; // aktueller Messwert
boolean status = 0; // Flag fuer ersten Durchlauf
const int sensorPin = A0; // Sensor an Pin 0 analog
void setup()
{
Serial.begin(9600); // starte serielle Kommunikation
while (!Serial) // warte auf Verbindung serieller Port, nur für Leonardo usw.
{
;
}
}
void loop()
{
gesamtSumme = gesamtSumme - messungen[zeiger]; // substrahiere letzte Messung
messungen[zeiger] = analogRead(sensorPin); // lese Sensor
gesamtSumme = gesamtSumme + messungen[zeiger]; // addiere Wert zur Summe
zeiger = zeiger + 1; // zur naechsten Position im Array
if (zeiger >= anzahlMessungen) // wenn Ende des Arrays erreicht ... zurueck zum Anfang
{
if (status == 1) // wenn Array erstmalig aufgefuellt ...
{
Serial.println(durchschnitt); // geglaettete Ausgabe auf serieller Konsole
}
status = 1; // erste 10 Werte eingelesen, Array ist gefüllt, Status geaendert
zeiger = 0; // und wieder von vorn
}
durchschnitt = gesamtSumme / anzahlMessungen; // berechne Mittelwert
delay(intervall); // zur Stabilisierung
}
Meines wissens hat der hc sr04 getrennte Anschlüsse für Trigger und Signal. hc sr05 hat eine Anschluß für beides.
Nicht alles was Du im Internet findest ist auch richtig und eien 4 statt eine 5 Schreiben geht schnell.
wenn das alles int sind, dann speichere da die Rohdaten, die du vom Sensor bekommst und mach nur die durchschnitt float und teile die dann so dass du cm oder mm bekommst.
Ich weiss jetzt nicht, in welcher Grössenordnung die Rohwerte sind, aber Vorsicht, dass dir int nicht überläuft, da es ja nicht mal unsigned int ist
also die anleitung bezog sich schon auf den hc sr04....
hat ja auch funktioniert, nur nicht genau bzw mit abweichung.
habe jetzt noch mal den sketch mit 2pins ausprobiert, aber selbes problem.....
allerdings lies sich das problem inzwischen lösen.......
alle werte ausser zeiger auf float gesetzt und nur iene nachkommastelle