Soil Hygrometer Humidity Detection Module is de officiële naam van deze sensor bij de leverancier. Deze sensor kan op vele manieren worden gebruikt om de grondvochtigheid te meten. Deze methode wordt op dit moment getest (aug 2018 online grafiek).
Temperatuur afhankelijkheid |
Het blijkt dat de metingen sterk temperatuurafhankelijk zijn (linkergrafiek). Dit is natuurlijk niet vreemd en bovendien niet echt moeilijk te corrigeren. Ik doe gewoon de (minimale meting - temperatuur*5) en dat geeft een voldoende lineaire curve. |
De Spanningsdeler methode |
De sondes die wij voor deze proef gebruiken hebben geen ingebouwde elektronica. Dus voegen wij zelf een spanningsdeler toe. Bij 10k geeft de ingang bij kortsluiting 1021. Bij geen enkel contact geeft de sensor 1. In de grond een redelijk constante waarde van rond 320. Sensors van Jan geven een gemiddelde van rond de 410. Vervolgens water gegeven en de sensor vliegt naar 830. Kijk dat geeft hoop. Hetzelfde geldt voor de Banggood sensor die zelfs op 880 stabiliseert. Vervolgens een testprogramma aangezet om beide manieren op een iets langere termijn uit te testen (ino). Oeps, het bljkt geen goed idee om dat samen in 1 pot te doen. Ze beïnvloeden elkaar toch ernstig! Ja, maar anderzijds krijg ik een duidelijke relatie tussen grondvochtigheid en meetresultaat. Des te droger, des te lager. Over tijd worden de gemeten waardes dus kleiner.
|
De Sparkfun manier |
Sparkfun gebruikt een DIO pin die enkel wordt aangezet indien er een meting moet worden uitgevoerd. Op deze manier hopen ze de corrosie te voorkomen. Dit is als test opgenomen in het testprogramma (ino). Indien er geen sensor is aangesloten of als er wel een sensor is aangesloten maar die hangt in de lucht dan is de reading willekeurig ergens tussen de 340 en 780 in mijn schakeling. Als de sensor is kortgesloten dan is de reading 1023. Als ik metingen doe met het Sparkfun programma dan krijg ik in droge grond metingen van rond 1018. Dus dat laat te weinig ruimte om nog vochtigere grond te meten. Immers de maximale vochtigheid (volledig kortgesloten) bedraagt 1023. Als ik dezelfde proef doe met sondes van Jan dan krijg ik zelfs direct 1023 als antwoord, ondanks dat ik de probes op maximale afstand van elkaar in de pot heb neergezet. Waarschijnlijk komt dit doordat Sparkfun al een spanningsdeler heeft ingebouwd in zijn sensor.
|
Oxidatie sondes |
Bij onjuist gebruik zal de sensor binnen enkele dagen zwaar geoxideerd zijn. De eerste testen maakten in 3 dagen korte metten van dit type sensors (afbeelding). Er zijn wel een aantal zaken die we kunnen ondernemen om de slijtage binnen de perken te houden:
Wissel na iedere meting de voeding en de aarde.
Compared to TDR, FD sensors are cheaper to build and have a faster response time. However, because of the complex electrical field around the probe, the sensor needs to be calibrated for different soil types. Some commercial sensors have been able to remove the soil type sensitivity by using a high frequency.
Houdt de meetstroom zo klein mogelijk.
Minder stroom betekent minder oxidatie.
Koop betere sensors.
(1,32), since gold cannot oxidise: not preferred but it would help.
Doe minder metingen.
Not preferred but it would help
Gebruik enkel een spanning tijdens metingen.
Als er geen spanning loopt kunnen er ook geen redox reacties plaatsvinden.
|
Een module is overbodig, een sonde is genoeg. |
We only use the sensor. Forget about the brick or even try to obtain this sensor without the brick. Furthermore we need 2 resistors of 10kΩ each. And we need 2 analogue input pins on any type of Arduino. Now connect each of the 2 pins of the sensor to an analogue input. Polarity does not matter. Also connect each analogue input pin with a 10kΩ resistor to the ground. You are ready to run.
|
Andere projecten |
Gardenbot
De oplossing van gardenbot.org is niet interessant ten opzichte de Sparkfun oplossing. Om te beginnen staat er continu spanning op de pinnen en dat willen we niet vanwege corrosie gevaar. Het omdraaien van de spanning is wel beter dan bij Sparkfun.
|
Eerste test |
Met de multimeter geeft de Banggood sensor een weerstand van groter dan 2mΩ. Dat kan wel kloppen wat dat is de weerstand van de lucht tussen de poten van de sensor. Ondergedompeld in vochtige grond tot aan zijn meetdraden bedraagt de weerstand 400kΩ zodra de multimeter wordt aangesloten. Na ong. 10 seconden is de weerstand opgelopen tot een redelijk constante 950kΩ. Het lijkt er op alsof de grond kan worden opgeladen als een soort condensator. |
Vinduino |
Vinduino is een zelfbouwpakket. Heb ik dat en wil ik dat? Hier zou een programmavoorbeeld moeten zijn te vinden. maar ik kan niets hoogfrequents vinden.
DIY calibrated gypsum soil moisture sensors (Watermark SS200 is also supported)
Hand held sensor reader (soil moisture, soil/water salinity, water pressure)
Solar powered remote sensor platform (Vinduino R3), available on Tindie.com Options include: 4 electrically separated inputs for soil moisture sensors Wifi (ESP8266) or Globalsat LM-210 LoRa module for long range (6 miles) Irrigation valve control, optional pressure sensor for valve operation feedback several options for temperature/humidity sensors
Built in solar battery charger
Built in real time clock for precise irrigation timing
Gateway to connect multiple LoRa end nodes to the Internet via Wifi (Vinduino Gateway)
Vinduino.
|
//This is an include, so no parsing needed
$qry2 = ("SELECT onderdelen.*,
soortonderdeel.id
FROM onderdelen
JOIN soortonderdeel ON onderdelen.idsrtodd = soortonderdeel.id
WHERE onderdelen.partid = $idpart
;");
$result2 = pg_query($con1, $qry2);
$row4 = pg_fetch_array($result2); //Make the fields accesible
foreach( $row4 AS $key => $val ){
$$key = stripslashes( $val );
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$lastupdate = ("$jaar $maand $dag");
$prtsrttxt = get_txt($con1, 26, 1, $idsrtodd);
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
//GENERAL INFO FOR EVERY USER **************************************************
echo (" ");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo (" (edit)");
}
echo ("Algemene informatie test | ");
if ($codetext) { //Code like KY-026 or NA-41
echo ("");
$tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //Class for colour
}else{ //So you are not allowed to translate
echo $tmp; //Show screenname of this field in user language
} //End of If you want to translate this fieldname at screen
echo ("  | ");
if ($codelink) {
echo ("$codetext");
}else{
echo ("$codetext");
} //End of if ($pinoutlink)
echo (" | ");
} //End of if ($codetext)
$tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen
if ($prijseurinclbtw > 0){ //Show price indication
$prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.');
echo ("$tmp   | ");
echo ("");
if ($urlprijs){
echo ("€  $prijs_formatted");
}else{
echo ("€  $prijs_formatted");
} //End of if ($urlprijs > "")
echo (" | ");
} //End of if ($prijseurinclbtw > 0)
if ($sketchtext) { //Link to OWN SOFTWARE
$tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen
echo ("$tmp   | ");
if ($sketchlink) {
echo ("$sketchtext");
}else{
echo ("$sketchtext");
} //End of if ($sketchlink)
echo (" | ");
} //End of if ($sketchtext)
$tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen
if ($pinouttext) { //Pinout
echo ("$tmp   | ");
if ($pinoutlink) {
echo ("$pinouttext");
}else{
echo ("$pinouttext");
} //End of if ($pinoutlink)
echo (" | ");
}
$tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen
$tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language
echo ("$tmp   | "); //MENU GROUP
echo ("");
echo ("$tmp2 | ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE
if ($row4[26] == 1) {$imgname = "nederland.png";}
if ($row4[26] == 2) {$imgname = "deutschland.png";}
if ($row4[26] == 3) {$imgname = "uk.png";}
if ($row4[26] == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
$tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen
$statuskey = get_status_key($con1, $status);
$tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen
echo ("$tmp   | "); //STATUS
echo ("$status $tmp2 | ");
}
$tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen
echo ("$tmp   | "); //LAST CHANGED
$tmp = substr($changeddate, 0, 10);
echo ("$tmp | ");
echo (" ");
return;
////////////////////////////////////////////////////////////////////////////////
function get_status_key($con, $num){
$qry = ("SELECT id FROM status WHERE nr = $num ;");
$result = pg_query($con, $qry);
$row = pg_fetch_array($result);
return ("$row[0]");
}
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PART *****************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry2=("SELECT tblsystext.txtname
, software.urlmain
, software.sftname
, software.sftid
, software.controller
FROM software
LEFT JOIN tblsystext ON software.controller = tblsystext.recordid
WHERE position(' $idpart ' in software.prtlst) > 0
AND software.rstid = 2
AND tblsystext.lanid = $koekje[2]
AND tblsystext.txlid = 19
ORDER BY sftname ASC
, controller ASC
;");
$result = pg_query($con1, $qry2);
if (pg_num_rows($result)>0) { //Only if at least 1 program exists
echo (' ');
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" |
---|
");
while($col = pg_fetch_array($result)){
$col[0] = ("$col[0]");
echo (" ");
echo ("$col[2]   | ");
echo ("$col[0] | ");
if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("(Edit) | ");
}
echo (' ');
}
echo (' ');
}
?>
// LIST ALL ROBOTS THAT INCLUDE THIS PART ***********************************
// $idpart
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry_bpp=("SELECT farmbotversie.id
, farmbotversie.part_list
, tblsystext.txtname
FROM farmbotversie
LEFT JOIN tblsystext ON farmbotversie.id = tblsystext.recordid
WHERE tblsystext.txlid = 27
AND tblsystext.lanid = $koekje[2]
ORDER BY tblsystext.txtname ASC
;");
$result_bpp = pg_query($con1, $qry_bpp);
$header = 0;
while($colbpp = pg_fetch_array($result_bpp)){ //Only if at least 1 robot exists
if(substr_count($colbpp[1], " $idpart ") > 0){
if ($header == 0) {
echo ("");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" | ");
$header++;
} //End of if ($header == 0)
echo ("");
echo ("$colbpp[2]");
//Show software van deze bot
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $colbpp[0];");
$result = pg_query($con1, $qry);
$col = pg_fetch_array ($result ,0);
$dir1 = "/var/www/html/robotigs/software/$col[0]";
$arr1 = glob($dir1, GLOB_ONLYDIR);
if (isset($arr1[0])){
$folder = $arr1[0];
$countertmp = 0;
echo ("");
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo ("- ");
echo "$showname";
echo ("
");
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo ("");
} //End of if (isset($arr1[0]))
echo (" | ");
}
}
if ($header > 0){
echo (" ");
}
?>
Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128
Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128
| //Location:/robotigs/includes/ picts_show.php
// Requieres: $pict_list and several picture handling javascript routines
//*** FROM HERE ON THE PICTURE CORNER STARTS -----------------------------------
if ($pict_list){ //There are 1 or more pictures to be printed
echo ("");
$counter = 0;
$aantal = str_word_count($pict_list, 0, "0123456789");
$lijst = str_word_count($pict_list, 1, "0123456789");
while($counter < $aantal){
$pictkey = $lijst[$counter];
$qryy1 = ("SELECT *
FROM illustrations
WHERE ill_id = $pictkey
;");
$resulty1 = pg_query($con1, $qryy1);
while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$image = ("/robotigs/documentatie/plaatjes/$ill_name");
$pictfull = str_replace('_small', '', $image); //Pictfull=biggest version
$alt = ("Just wait till your 57....");
$txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles
echo ("");
echo (' ');
$nummer = $counter + 1;
$txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("$txtAfb $nummer: ");
echo ("$txtname");
echo (" ");
echo ("Ontkoppelen ");
if ($counter==0){
echo ("Up ");
}else{
echo ("Up ");
}
if ($nummer == $aantal){
echo ("Down");
}else{
echo ("Down");
}
}else{ //Else of if Meaning the current useer is logged in
echo ("$txtAfb $nummer: $txtname");
}
echo (''); //End of this picture
$counter++; //Prepair for next picture
}
echo (' | '); //All pictures are printed
} //End of if there are 1 or more pictures to be printed ----------------------
?>