HC-SR04 Sensor fehlt da was?

Hi,
ich dachte schon " bin ich nun total verblödet"

ja diesen Fehler werde ich wohl nie mehr vergessen

der zweite Sensor geht auch, bin auch auf das 1Wire gestossen. Das ist super da kann ich ja mit den Adressen der Sensoren gleich mehrere an einem Pin auslesen. Das ist perfekt.
Jetzt baue ich gerade den Ultraschallsensor wieder auf.
Hoffe es war auch so ein dummer Fehler von mir.

Viele Grüße und vielen Dank für Eure Geduld

Jürgen

So, jetzt habe ich nochmal den HC-SR04 angeschlossen.
und mit diesem sketch probiert
(habe die Zeilen ausgetauscht die mir hier in diesem Thread empfohlen wurden)

#define trigPin 10
#define echoPin 9

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
   digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");

  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

wie zu sehen hängt der Trigger an 10 und Echo an 9

sind alle Anschlüsse verbunden also 5v, Trig, Ech, GND so erhalte ich
Out of Range (nach der Bedingung im Sketch)
entferne ich trig und echo kommen Entfernungen von 140-160cm

Ich vermute jetzt doch fast der Sensor hat vielleicht doch einen ganz tiefe Macke

Hallo!
Dein Code funktioniert nicht.
Lade diese Lib runter:

Und dann das Beispiel Ultrasonic Demo
Pin 12 Trigger und 13 Echo...geht sofort und schon recht genau von ca. 3cm bis 2 Meter.
zudem gibt die Lib gleich die Laufzeit und Distanz in cm und Inch aus.
Schmeiss zuvor die anderen Ultrasonic Libs raus, sonst gibts wieder Probleme...

mfg Martin

Wasjetzt:
Dein Code funktioniert nicht.

Was soll das denn?

Der Code funktioniert!
Habe es gerade nochmal selbst getestet.
Der Code in Reply #32 funktioniert und auch der Code im Ausgangsposting mit dem überlangen Trigger-Impuls funktioniert mit dem HC-SR04.

Aber: Wenn auf der einen Seite der Platine ein Bauteil (der Schwingquarz) fehlt, könnte es natürlich sein, dass auf der anderen Seite der Platine auch ein oder mehrere Bauteile fehlen. Auf der Seite, die bisher nicht als Foto gezeigt wurde, sitzen ja noch viel mehr Bauteile.

Vielleicht auch mal kontrollieren, ob auf der anderen Platinenseite alle Bauteile bestückt sind:
http://www.robodino.de/wp-content/gallery/arduino-sensoren/img_6517.jpg

Ok
habe es mit Deinem Vorschlag probiert und auch überprüft ob Bibliotheksleichen rumliegen

hier die Ausgabe...:frowning: ich glaub der Sensor ist wirklich hinüber. Wenn die dem schon in China den Quarz nicht aufgebaut haben, wer weiss was der noch alles hatte .
Gut in 2-3 Wochen sollte der neue da sein. Bis dahin habe ich hier eh viel zu schrauben
Ich bin schon heil froh das die anderen Teile und Sketche funktionieren. Ich hatte ja eh den Wurm am Anfang total drin.

MS: 33481, CM: 606.03, IN: 238.59
MS: 33158, CM: 600.18, IN: 236.29
MS: 32149, CM: 581.92, IN: 229.10
MS: 32146, CM: 581.86, IN: 229.08
MS: 32132, CM: 581.61, IN: 228.98
MS: 32173, CM: 582.35, IN: 229.27
MS: 32180, CM: 582.48, IN: 229.32
MS: 32129, CM: 581.56, IN: 228.96
MS: 32131, CM: 581.59, IN: 228.97
MS: 32157, CM: 582.06, IN: 229.16
MS: 32169, CM: 582.28, IN: 229.24
MS: 32117, CM: 581.34, IN: 228.87
MS: 32121, CM: 581.41, IN: 228.90
MS: 32176, CM: 582.41, IN: 229.29
MS: 32175, CM: 582.39, IN: 229.29
MS: 32138, CM: 581.72, IN: 229.02
MS: 32162, CM: 582.15, IN: 229.19
MS: 32162, CM: 582.15, IN: 229.19
MS: 32162, CM: 582.15, IN: 229.19
MS: 32127, CM: 581.52, IN: 228.94
MS: 32173, CM: 582.35, IN: 229.27
MS: 32165, CM: 582.21, IN: 229.22
MS: 32124, CM: 581.47, IN: 228.92

das gibt er aus... egal was ich mache auch wenn sich die Entfernung ändert.

Ps. Gleich noch eine Frage.

Ich habe hier ein Relay-Board für den Arduino, darüber werden später die u.a. Pumpen und Lampen geschaltet .
Mit den 5V vom Arduino habe ich es getetstet und die LED's auf dem Board zeigen mir das wohl versucht wird zu schalten.
habe gelesen das diese Boards um auch wirklich schalten zu können 12V brauchen und damit sie nicht so warm werden kann man sie auch mit 10V anfahren.

Da ich nun Spannung zu versorgen habe von 3,3V über 5V nun 10 V und für eine kleine Pumpe auch noch 12V.
Gibt es da eine Multi-Trafo der mir gleich mehrere Spannungen zur Verfügung stellt.
Ich möchte vermeiden das ich zum Schluss eine 10fach Steckdoese nur für diese Minitrafos benötige

Noch eine Frage:
Das mit den Tempfühlern und dem OneWire hat mich sehr beeindruckt.
Da ich in Aqua-becken die PH-Werte etc. messen muss habe ich für den Arduino ein PH-Shield. An dieses PH-Shield sollen nun 3 Sonden angeschlossen werden (diese Shields sind recht teuer deswegen 3 an eine Sonde).
Die Sonden müssen zwar kalibriert werden, ich werde also eine Mittelwert finden müssen da ja alle vom gleichen Shield bedient werden, aber kann man dann die Sonden nicht via OneWire abfragen (also Hardwareadresse ermitteln etc.)?

Bis dato wollte ich das über ein Schieberegister steuern.
In der Reihenfolge
Arduino <===> PH-Shield <===> Schieberegister <===> 3 PH-Sonden die am Schieberegister hängen und bei Bedarf an das Shield geschaltet werden

Grüße
Jürgen

Hallo!
Hab ich auch aus Post #32 aufgespielt und kriege Werte von 58 und 180 abwechselnd..zwischendurch auch mal ein "Out of Range"
Die Teile können doch nicht alle ein "Eigenleben" führen ?
..und warum schauts dann mit der Lib recht stimmig aus ?? (zumindest bei meinem Sensor).

mfg Martin

Hier mal die neuen Bilder Vorder und Rückseite.
Vielleicht habe ich ihn auch beim Auflöten des Quarz erst noch richtig zerstört.
Meine Lupe hatte ich in der Garage:(

selfmade:
Hier mal die neuen Bilder Vorder und Rückseite.

Das Layout Deiner Platine scheint etwas anders zu sein als bei dem Foto-Link, den ich gesendet hatte.

Aber trotzdem sollten sich beim angeschlossenen Schwingquarz zwei Kondensatoren befinden, auf dem von mir verlinkten Foto C6 und C7 direkt am Quarz angeschlossen und auf Deinem Foto C1 und (sieht aus wie) C5 in unmittelbarer Nähe. Dort sind auf Deinem Foto nur zwei leere Bestückungsplätze für die beiden Kondensatoren zu sehen.

Für mich sieht es auch auf der anderen Platinenseite unvollständig bestückt aus.

ja, ich glaube Du hast recht.
Ich vermute die haben in China nicht nur den Quarz vergessen, wahrscheinlich fehlt da noch einiges andere auch.

Eine andere Frage.
Ich bin ja absoluter Neueinsteiger in Arduino & Co.

Wie muss ich mir das Abspeichern der Sketche auf dem Arduino vorstellen.
Haben da mehrere Sketche Platz?
wieviel MG passen da drauf?
wenn ich einen Sketch nicht mehr brauche wie bring ich den wieder runter oder lösche diesen?
Aktuell teste ich viel, spiele also auch viel Mist auf das Arduino Board.
Wenn ich dann mal alles zusammen habe kann man dann das Arduino komplett säubern, formatieren wird ja nicht funktionieren.

Gibt das für diese grundlegenden Fragen irgendwo eine gute Einsteigerseite auf der sowas gut beschrieben ist?

selfmade:
Wie muss ich mir das Abspeichern der Sketche auf dem Arduino vorstellen.
Haben da mehrere Sketche Platz?

Nein. Beim "Upload" wird immer der vorhandene Sketch gelöscht und der neue Sketch hochgeladen.

selfmade:
wieviel MG passen da drauf?

Was soll MG bedeuten? Megabytes?
Ein Arduino UNO hat 32 KB Flash-Speicher, also 0,032 MB. Oder in Gigabytes ca. 0,000032 GB.

selfmade:
wenn ich einen Sketch nicht mehr brauche wie bring ich den wieder runter oder lösche diesen?

Der alte wird automatisch gelöscht, bevor der neue hochgeladen wird.

sorry hatte mich verschrieben
ja natürlich MB
habe gerade auf der arduino seite gesehen das der mega 256kb hat. für einen code sind zwar 32kb schon einiges was wahrscheinlich bei den meisten reicht.

Wenn auf dem Flash-Speicher kann also nur 1 Programm laufen... wow.
das bedeutet das alles was ich an das Arduino anschliessen in ein Programm packen muss. mmmhhh.

Gibt es da Lösungsansätze zur Programmierung?
Beispiel: in einer Schleife muss/will ich nur alle 10 Minuten was auslesen und eine Aktion ausführen. ZB. beim Temp-Sensor
in der anderen Schleife möchte ich 1 mal pro Std was ausführen z.B. PH messen usw usw.

irgendwie geht das aber bestimmt oder?

aber bestimmt

Eine Stunde sind 3600000L millis().
Schau dir das Tutorial BlinkWithoutDelay als Basis an.
Wenn du nicht rauskriegst, was das mit deiner Frage zu tun hat, melde dich wieder :wink:

32kB reicht für viele Programme aus. RAM ist eher ein Problem als Flash. Vor allem auf dem UNO. Flash wird erst problematisch wenn du zig Bibliotheken hast und vor allem bei TFTs mit mehreren Fonts.
Und selbst auf dem Mega kann es unter Umständen problematisch werden Programme größer als 64k oder 128k zu schreiben, da da im Hintergrund einige Tricks ablaufen, weil Zeiger auf einem 8 Bit Prozessor nur 16 Bit haben.

Um dein Programm zu strukturieren musst du die Aufgaben teilen und in getrennte Funktionen packen. Diese kann man dann in loop() aufrufen, bzw. Funktionen können wieder andere Funktionen aufrufen. Das ist aber im Prinzip auch nicht anders wie man Programme auf dem PC schreibt.

selfmade:
Gibt es da Lösungsansätze zur Programmierung?

Kooperatives Multitasking mit der loop-Funktion als Scheduler.

selfmade:
Beispiel: in einer Schleife muss/will ich nur alle 10 Minuten was auslesen und eine Aktion ausführen. ZB. beim Temp-Sensor
in der anderen Schleife möchte ich 1 mal pro Std was ausführen z.B. PH messen usw usw.

irgendwie geht das aber bestimmt oder?

Die Arduino-Software startet automatisch einen Timer, der Dir einen mit der Funktion "millis()" auslesbaren Millisekundentakt bereitstellt. Davon abgeleitet kannst Du Dir natürlich auch eigene Funktionen basteln, die nur alle 10 Minuten laufen. Alle 10 Minuten wäre also 10 * 60 Sekunden * 1000 Millisekunden = 600000. Also mußt Du immer, wenn millis() um 600000 weitergezählt hat, einmal Deine Funktion laufen lassen.

ok,
Danke für die Hinweise.
Da hab ich noch einiges an Arbeit vor.

Gibt es hier irgendwo ein umfangreiches Beispielprogramm was eben mit vielen Unterfunktionen etc. arbeitet was auch etwas dokumentiert ist.
Wenn ich den Aufbau und die Logik dahinter sehe komme ich schneller voran

Hallo!
Schau dir mal in Ruhe die LCDMenü Lib von Jomelo an.
http://forum.arduino.cc/index.php?topic=73816.0
Da kannst die Sketche in Funktionen packen, die du einfach aus dem Hauptmenü starten kannst...
Stabil und leicht zu adaptieren...perfekt...habe mit einem 2004 I2C LCD, einem Joystick und einem Megashield mit
RTC und SD die "perfekte" Basis für neue Projekte....

mfg Martin

Nichts gegen Jomelos Menu Library,
aber wenn dich das erstmal abschreckt, mach dir nichts draus.

"Beispiel" und "umfangreich" sind halt üblicherweise Gegensätze.

Aber hinter

jurs:
Kooperatives Multitasking mit der loop-Funktion als Scheduler.

steckt im Prinzip nur

// Kommentar ...

// Version ...

// Pinbelegung
const int FehlerLED=13;
..
void setup()
{
     pinMode (FehlerLED, OUTPUT);
     Serial.begin(115200);
     setup1();
     setup2();
      //  ...
}

void loop()
{
     ZustaendeNeuErfassen(); // das E von jurs/Serenifly's   Eva ;)
     Funktion1();
     Funktion2();
     FunktionXYZ();
     // ...
}

"kooperativ" deswegen, weil die Einzelfunktionen mitspielen müssen. Sie dürfen also nicht lange irgendwo hängen, sondern müssen in der Hoffnung auf baldigen Neuaufruf schnell zum Aufrufer zurückkehren.

Wenn man dann Funktionen, die nichts miteinander zu tun haben, in unterschiedliche Dateien legt, und globale Variablen -- soweit sinnvoll -- vermeidet, kann man evtl. den Überblick behalten :wink:

Wobei die Hardwarebelegung ( Beispiel FehlerLED ) hier gut aufgehoben ist...

Aber das ist alles Geschmackssache

selfmade:
Gibt es hier irgendwo ein umfangreiches Beispielprogramm was eben mit vielen Unterfunktionen etc. arbeitet was auch etwas dokumentiert ist.
Wenn ich den Aufbau und die Logik dahinter sehe komme ich schneller voran

Hier mal ein kurzes Beispielprogramm, das einmal pro Minute die Temperatur "mißt" (die Messung wird nur durch eine Zufallsfunktion simuliert) und alle 10 Minuten den PH-Wert.

Das Programm zeigt, wie ich an so etwas herangehe:

void setup() {
  Serial.begin(9600);
}

float temperatur;
#define TEMPINTERVALL 60*1000L // 60 Sekunden
float phWert;
#define PHINTERVALL 10*60*1000L // 10 Minuten

void eingabeTemperatur()
{
  static unsigned long letzteMessung=-TEMPINTERVALL;
  unsigned long now=millis();
  if (now-letzteMessung>TEMPINTERVALL)  // 1 Minute
  {
    temperatur=20+random(50)/10.0; // Test only: Zufallswert "messen"
    letzteMessung=now;
    Serial.println("Debug-Meldung: Temperatur gemessen");
  }
}

void eingabePH()
{
  static unsigned long letzteMessung=-PHINTERVALL;
  unsigned long now=millis();
  if (now-letzteMessung>PHINTERVALL)  // 60 Minuten
  {
    phWert=7+random(10)/10.0; // Test only: Zufallswert "messen"
    letzteMessung=now;
    Serial.println("Debug-Meldung: PH-Wert gemessen");
  }
}


void verarbeitung()
{
  // nichts
}

void ausgabe()
{ // einmal pro Sekunde den Wert in der Anzeige aktualisieren
  static unsigned long letzteAnzeige=0;
  unsigned long now=millis();
  if (now-letzteAnzeige>1000) // 1 Sekunde
  {
    Serial.print("Temp: ");Serial.print(temperatur);Serial.print('\t');
    Serial.print("PH: ");Serial.print(phWert);Serial.println();
    letzteAnzeige=now;
  }
}

void loop() {
  eingabeTemperatur();
  eingabePH();
  verarbeitung();
  ausgabe();
}

Jedes Programm wird in verschiedene "Tasks" (= Funktionen) aufgeteilt, die in der loop-Funktion reihum immer wieder abgearbeitet werden. Eine sinnvolle Aufteilung der Tasks erfolgt nach dem "EVA-Prinzip":

  • Eingabe
  • Verarbeitung
  • Ausgabe
    Die EVA-Trennung ist deshalb so sinnvoll, weil sie die spätere Wartbarkeit und Erweiterung des Programms sehr vereinfacht. So könnte man Eingaben von Tastaturbedienung auf Drehgeber umstellen. Oder auf Infrarot-Fernbedienung. Oder die Ausgabe erstmal für Serial programmieren und später ein LCD-Textdisplay umschreiben. Oder auf die Ausgabe per Netzwerk auf einem Webbrowser, der die Daten abruft.

Nur "Debug-Ausgaben" auf Serial, um sich während der Programmentwicklung zwischendurch mal etwas auf Serial ausgeben zu lassen, um den Stand von Variablen zu prüfen, sind außen vor, und können überall im Code eingestreut werden.

Der Trick dabei, dass scheinbar "alles gleichzeitig" abläuft, liegt darin:
a) Aufrufe der "delay" Funktion mit langen delay-Zeiten bei interaktiven Programmen stets vermeiden!
b) Jede Task-Funktion so programmieren, dass sie in kürzester Zeit abgearbeitet ist

So können dann die Schritte Eingabe-Verarbeitung-Ausgabe viele tausend mal pro Sekunde ablaufen und im Programm "passiert" tatsächlich eigentlich nur dann etwas, wenn die Zeit reif dafür ist, z.B. einmal pro Sekunde, einmal pro Minute oder einmal alle 10 Minuten.

im Programm "passiert" tatsächlich eigentlich nur dann etwas, wenn die Zeit reif dafür ist, z.B. einmal pro Sekunde, einmal pro Minute oder einmal alle 10 Minuten.

Sehr klare und schöne Erklärung, finde ich! Fehlt nur " ... oder wenn ein Ereignis eintritt, auf das reagiert werden soll: sei es ein Signal von aussen ( Taster, Alarm-Kontakt Änderung ), ein Serielles Eingabe-Kommando oder gar die Anfrage eines (Ethernet) Client "

Da loop sehr schnell ist, braucht man für solch spontane Ereignisse meist keine Interrupt-Behandlung.