Schneehöhensensor mit Arduino bauen

  • Der momentane Aufbau und Sketch ist noch sehr einfach gehalten. Jetzt warte ich erstmal auf neue Teile um die ganze Sache mit dem Internet zu verbinden.
    Ein Problem könnte noch bei sinkender Temperatur auftreten. Schall breitet sich bei niedrigen Temperaturen anders aus....das werde ich mal bei -25Grad im Froster meiner Lieblings Wirtschaft testen :D
    Ansonsten kostet der Spaß Später um die 30€ und das wäre mehr als klasse 8)


    Hier nochmal das Bild von dem Schaltplan und der Sketch:



  • HC-SR04 sind bestellt, die liegen hier nun nicht rum ... :)
    Der Rest ist ja vorhanden.
    Irgendeine Heizung ist bestimmt bei dem Außeneinsatz auch noch notwendig.
    Ich bin schon gespannt was für Varianten fertig gebastelt werden.
    Eventuell Saint Smart LCD Keypad nutzbar ? Dann bleibt alles schon kompakt mit wenig Verdrahtung.

    Grüße aus dem Süden von Dessau (Stadt Dessau-Roßlau)
    Dirk


    ..... nicht "meckern und motzen", sondern "machen und klotzen" .....

  • Die frage ist, ob nur der Sensor nach draußen kommt oder alles.
    Heizung ist wohl nicht nötig wenn das ethernetshild drauf kommt. Das soll nämlich etwas warm werden.
    Ich werde alles denke mit einem Arduino NANO verbauen. Momentan liegt der Stromverbrauch bei 70mAh mit LCD und 50mAh ohne LCD.
    Über ein Solarmodul denke ich auch noch nach.
    Klar würde das mit dem KeyPad gehen aber das ist Preislich auch höher angesetzt.
    Arduion UNO + KeyPad LCD etwa 20€
    Arduino NANO + 2x16 LCD etwa 10€


    Das Display könnte man auch weg lassen zum Stromsparen und die Höhe über den Serial Monitor ausgeben lassen.

  • Hallo Bastelfreunde,
    habe auch mal versucht etwas zustande zu bringen. Mit Beispielen aus dem Netz bin ich jetzt soweit gekommen,
    das ich 2 Temperatursensoren auslese, die Werte in eine MSQL Datenbank schreibe und dann auslesen kann.
    Anstelle der Temperatursensoren müsste jetzt der Ultraschallsensor genutz werden. Da ich kein großer Programmiere bin, komm ich da nicht weiter.
    Vielleicht bekommt ihr das hin. Hier mal der Sketch und die PHP Dateien.

  • Hier geht es weiter.
    Die PHP-Datei für die Verbindung zum MSQL Server:


    PHP
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>db.inc.php</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><?phpdefine('DB_SERVER',"z.B.rdbms.strato.de");define('DB_NAME',"DB181xxxx");define('DB_USER',"U181xxxx");define('DB_PASSWORD',"testexxx"); $conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);if(is_resource($conn)){ mysql_select_db(DB_NAME, $conn); mysql_query("SET NAMES 'utf8'", $conn); mysql_query("SET CHARACTER SET 'utf8'", $conn);}?></body></html>


    Die PHP-Datei arduino die vom Sketch aufgerufen wird:


    PHP
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>Arduino PHP</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><?phpinclude("db.inc.php");$conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);if(is_resource($conn)){ mysql_select_db(DB_NAME, $conn); mysql_query("SET NAMES 'utf8'", $conn); mysql_query("SET CHARACTER SET 'utf8'", $conn);}define("KEY","testexxx");if(isset($_GET['key'])){ if($_GET['key'] == KEY) { if(isset($_GET['T1']) && isset($_GET['T2'])) { $TEMP1 = mysql_real_escape_string($_GET['T1']); $TEMP2 = mysql_real_escape_string($_GET['T2']); $DATUM = date("Y-m-d H:i:s");  $result = mysql_query("INSERT INTO arduino_temperaturen (datumzeit, temp1, temp2) VALUES('".$DATUM."', '".$TEMP1."', '".$TEMP2."') ") or die(mysql_error());  if(mysql_affected_rows() == 1) { $result = "Temperaturwerte gespeichert"; } else $result = "Fehler beim speichern der Daten in der MySQL-Datenbank"; } else $result = "Keine Temperaturwerte übergeben"; } else $result = "Falscher Key";} else $result = "Kein Key übergeben"; print_r($result);?></body></html>


    Die PHP-Datei zur Abfrage:


    Grüsse Bernd

  • Hi Bernd,
    sehr interessant!
    Ich habe heute erst meine Ethernet-Shilds bekommen....ist aus China schon ein weiter Weg ;)
    Derzeit bin ich noch an einem anderen Projekt dran (Geigerzähler und UV Sensor)
    Ich werde denke alles über einen Arduino laufen lassen. Die Tage beschäftige ich mich mit der Materie und kann Dir dann bestimmt was passendes zu deinem Code Sagen ;)

  • Hallo,
    ich habe die Code`s jetzt soweit das es läuft.
    Muss nur noch hin bekommen, wie ich den Wert der Schneehöhe in meine Webseite reinbekomme.
    Falls es jemanden hilft, hier mal die funktionierenden Dateien:


    Sketch für Arduino

    Code
    1. #include <SPI.h>#include <Ethernet.h> // library for ethernet functions//ETHERNET-SETTINGSbyte mac[] = { 0x10, 0x90, 0x44, 0xDD, 0x1, 0x8, 0x0, 0xFD }; // MAC-Adresse des Arduinobyte ip[] = { 192, 168, 1, 18 }; // IP-Adresse des Arduinobyte gateway[] = { 192, 168, 1, 1 }; // Gatewaybyte subnet[] = { 255, 255, 255, 0 }; // SubNet//byte server[] = {81, 169, 145, 157 }; // IP-Adresse ursprungwetter.de bei StratoEthernetClient client;char host[] = "ursprungwetter.de"; // Domainchar url[] = "/ultraarduinodb.php"; // Pfad zur PHP-Dateichar key[] = "xxxxx"; // Kennwort aus PHP-Dateichar serverName[] = "www.ursprungwetter.de";char c; // Variable für Rückgabe des Serverslong Interval = 1; // Upload-Interval in Minutenint trigger=7;int echo=6;long dauer=0;long entfernung=0;void setup() {delay(1000); Serial.begin (9600);pinMode(trigger, OUTPUT);pinMode(echo, INPUT);Serial.println("Ethernet initialisieren...");Ethernet.begin(mac, ip);Interval = Interval * 1000 * 60; // Das in Minuten angegebene Interval in Millisekunden umrechnendelay(1000); // warten, bis Ethernet gestartet}void loop() {digitalWrite(trigger, LOW);delay(5);digitalWrite(trigger, HIGH);delay(10);digitalWrite(trigger, LOW);dauer = pulseIn(echo, HIGH);entfernung = (dauer/2) / 29.1;if (entfernung >= 500 || entfernung <= 0){Serial.println("Kein Messwert");}else{Serial.print(entfernung);Serial.println(" cm");}delay(5000);Daten_senden(entfernung); // Temperaturdaten an Server übertragendelay(5000);byte maxReads = 10; //Seconds while ((maxReads-- > 0) && client.connected()) // Antwort des Servers lesen { delay(1000); while (client.available()) { char response = client.read(); Serial.print(response); } } client.stop(); Serial.println("Done."); client.flush(); delay(Interval);}/****************************** * Daten an Server schickenn * ********************************/void Daten_senden(float entfernung){ if (client.connect(serverName, 80)) // Verbindung zum Server aufbauen { Serial.println("Verbunden, Sende Daten..."); client.print("GET " + String(url)); Serial.println("GET " + String(url)); client.print("?entfernung="); Serial.print("?entfernung="); client.print(entfernung); Serial.println(entfernung); client.print("&key=" + String(key)); Serial.print("&key=" + String(key)); client.println(" HTTP/1.1"); Serial.println(" HTTP/1.1"); client.print("Host: " + String(host)); Serial.print("Host: " + String(host)); client.println(); Serial.println(); client.println("User-Agent: Arduino"); Serial.println("User-Agent: Arduino"); client.println("Connection: close"); Serial.println("Connection: close"); client.println(); Serial.println(); } else { Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****"); }}


    Die PHP-Datei für die Verbindung zum MSQL Server


    SQL
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>ultradb.inc.php</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><?phpdefine('DB_SERVER',"rdbms.strato.de");define('DB_NAME',"DB18xxxx");define('DB_USER',"U182xxxx");define('DB_PASSWORD',"xxxxx"); $conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);if(is_resource($conn)){ mysql_select_db(DB_NAME, $conn); mysql_query("SET NAMES 'utf8'", $conn); mysql_query("SET CHARACTER SET 'utf8'", $conn);}?></body></html>


    Die PHP-Datei arduino die vom Sketch aufgerufen wird



    Geht weiter

  • Die PHP-Datei zur Abfrage



    Viel Spaß beim tüfteln.


    Bernd

  • Das mit dem Schnee und Ultraschall geht...der DWD macht es, an manchen Stationen nicht anders.
    Das Problem ist die Kälte. Bei tiefen Temperaturen breitet sich der Schall unterschiedlich schnell aus.
    Mein test im Froster steht noch aus aber ich denke bei einem Messraum um die 50cm sollte das nichts ausmachen.
    Mit den IR sensoren hab ich noch keine Erfahrung gemacht. Aber sind dies auch etwas schwieriger zu integrieren weil bei bestimmten Abständen der Pegel steigt oder sinkt.
    So genau sollen sie auch nicht sein...und störanfällig durch Sonnenlicht.


    Ich habe mir gerade eine Schaltung mit Schneehöhe und UV Sensor aufgebaut.
    Der Originale Davis UV Sensor ist ja übelst teuer und meiner macht es auch echt prima ;)


    Jetzt steht erstmal die ganze ethernetsache an :rolleyes:

  • Hallo,


    ich sage mal so, Sonne oben, Schnee unten. Der IR hat einen Filter und das Signal ist auch noch moduliert . Wenn es keine Direkte Einstrahlung ist, sollten auch keine Probleme auftreten. Die Genauigkeit ist gleich wenn nicht besser. (immer gut Mittelwert bilden, auch bei Deinem Code:) aus dem Buch oder?) Wie genau solls denn sein m/cm oder mm? Die Messung selber ist total einfach. An ADC legen und einfach sie Spannung umrechnen. Die Flanken steigen oder fallen sind für PWM oder Triggersignal gedacht, sollte hier aber nicht benötigt werden.


    Gruß Silvio

  • Soooo, Bernd und ich haben es nun gemeinsam geschafft einen funktionierenden Sketch zu schreiben.
    Hier ist das Ding 8)