Floralabo is ook een robot voor de aansturing van een couveuse maar deze is in breadboard vorm. Daardoor kan hij ook voor allerlei experimenten worden gebruikt zoals grondvochtigheid. Floralabo wordt gestuurd door een robot.
- Bewatering
|
De irrigatie van de couveuses kan gemakkelijker met de hand worden uitgevoerd. Er verdampt namelijk bijna geen water doordat de zaaikasjes een deksel hebben. Bovendien heb ik nog geen betrouwbare manier gevonden om de grondvochtigheid te meten (Grondvochtigheid 2018).
|
- Software
|
- Couveuse1-01
Wifi snelheid opvoeren en 2 manieren van gebruik:
- Handy rechtstreeks, indien couveuse1 niet via wifi of met een kabel op het netwerk is aangesloten. Als je met je mobiel in de buurt bent dan kan je de data updaten.
- Inloggen op router. Couveuse1 bevindt zich in het gebied van een Wifirouter. In dat geval zal het systeem moeten kunnen inloggen. Als het systeem niet kan inloggen springt het vanzelf in bovenstaande modus.
- Couveuse1_2560_03_relayDS1892
De onderstaande configuratie wordt uitgebreid met 1 dubbel relais bedoeld voor de schakeling van de verlichting en de verwarming. Verder een DS1802 thermometer toegevoegd om de temperatuur te kunnen schakelen.
- Couveuse1_2560_02_lanSDwifiClock
De onderstaande configuratie wordt uitgebreid met Wifi en TWI. De klok I²C heeft geen optrekweerstanden nodig. De snelste bibliotheek voor wifi moet nog worden uitgezocht.
- Couveuse1_2560_01_lanSDtest
|
- Opmerkingen
|
- Opstarten
Indien de LAN connector met werkende internetaansluiting niet is geïnstalleerd dan zal het niet door het opstarten heen te komen. Indien het bordje wel is gemonteerd, maar geen kabel aangesloten dan zal op de monitor na een paar minuten een 0.0.0.0 aansluiting worden getoond. ook als het bordje helemaal niet is geïnstalleerd.
- Grondvochtigheid
Omdat hij toch continu aanstaat en omdat hij toch door de server wordt afgevraagd wordt de couveuse ook gebruikt om vochtigheids-sensors te testen. Nummer1 is rood (connector meest naar het midden van het breadboard). Nummer 2 is de blauwe Capac (aan de middelste connector). Nummer 3 is dan vanzelf groen en zit het meest naar de buitenkant van het breadboard. De groene sensor blikt rare resultaten te geven dus deze heb ik verwijderd. Tijd om weg te gooien denk ik.
|
- Hoofdstation vs substations
|
- Geschiedenis
In de allereerste opzet waren alle substations wifi apparaten en werden deze aangesloten via een LAN router op een server (basisstation). Deze server verzorgde dan de interface tussen de besturing (een mobiel) en het flora robot systeem. Hoewel dit makkelijk lijkt bleek al gauw in de praktijk dat de wifi radio frequenties overbezet zijn en dan af en toe ook nog vervuild zijn door extra wifi versterkers bij de buren. Verder zou dit bij een uitrol betekenen dat iedere gebruiker een server zou moeten inrichten om dit systeem te kunnen gebruiken. Dat kan natuurlijk beter.
- Verbeterd concept.
Het robotsysteem voor flora services bestaat uit 1 basisstation en (naar keuze) vele substations. De substations kunnen ook zelfstandig werken zonder basisstation. Onder deze link vindt u het plantengedeelte van Flora. De Flora robots zijn allemaal aangesloten op een lokaal netwerk. Daardoor kunnen deze robots op afstand worden bediend met Florabot.
In dit concept bestaat er 1 hoofdstation en minimaal 1 substation. Er bestaan verschillende soorten substations die allen zelfstandig kunnen werken zonder hoofdstation. U kunt dus al werken met 1 substation naar keuze, zonder hoofdstation.
- Hoofdstation
Een hoofdstation is dus niet noodzakelijk, maar biedt wel een aantal voordelen:
- Wereldwijd monitoren en instellen, versus lokaal blue-tooth afstand van het substation.
- Alle substations vanaf 1 centrale plaats kunnen monitoren, versus een wandeltocht langs substations.
- Communicatie via 433mHz, tot 8 km en geen belasting voor WiFi.
- Substations
Voor alle soorten substations geldt dat alle instellingen die nodig zijn om te kunnen functioneren worden in een eeprom opgeslagen. Daardoor blijven ze jarenlang bewaard, ook als de voeding wordt afgeschakeld. Ieder substation heeft een klok met Lithium accu. De klok blijft 1 jaar lopen zonder voeding. Lokale handbediening als override op ieder substation. 3-standen: Uit(0), Aan(I), Automatisch(II). Bangood
- Waterklok 4-kanaals
Met het waterklok 4-kanaals substation kunnen vier waterkranen worden bediend. De achterliggende gedachte dat een gebied verdeeld in 4 zones bewaterd kan worden. Afhankelijk van de temperatuur en de lichtsterkte krijgt iedere zone een aangepaste hoeveelheid water. In sommige situaties (temperatuur>30) ook 2 keer per dag nodig.
|
//SHOW ALL PARTS USED IN THIS ROBOT *****************************************
// Location:/robotigs/includes/ list_parts_per_bot.php
// This is an include, so no parsing needed
// DISPLAY $PART_LIST
if ($part_list){
$lijst = explode(" , ", $part_list);
$aantal = str_word_count($part_list, 0, " ") - 2; //Needed for positioning
$bedrag = 0;
$cntrlp = 0;
echo (" ");
echo ("");
echo ("Onderdelen van deze robot:");
echo (" | ");
echo (" ");
//*** SHOW PARTS IN STORED SEQUENCE ($parts_list) ---------------------------
while(isset($lijst[$cntrlp])){
$partkey = $lijst[$cntrlp];
$qrylp=("SELECT tblsystext.txtname
, onderdelen.prt_icon_link
, onderdelen.prijseurinclbtw
, onderdelen.idsrtodd
, onderdelen.lanid
FROM onderdelen INNER JOIN tblsystext ON onderdelen.partid = tblsystext.recordid
WHERE tblsystext.lanid = onderdelen.lanid
AND tblsystext.txlid = 19
AND onderdelen.partid = $partkey
;");
$resultlp = pg_query($con1, $qrylp);
$rowlp = pg_fetch_array($resultlp);
if ($rowlp[4] == 1) {$imgname = "nederland.gif";}
if ($rowlp[4] == 2) {$imgname = "deutschland.gif";}
if ($rowlp[4] == 3) {$imgname = "uk.gif";}
if ($rowlp[4] == 4) {$imgname = "france.gif";}
//*** SHOW RECORD
echo ("");
echo ("");
echo (" | ");
echo ("");
echo ("$rowlp[0] | ");
echo (""); //Show group
$prtsrttxt = get_prtsrt_name2($con1, $koekje[2], $rowlp[3]);
echo ("");
echo ("$prtsrttxt | "); //End of show group
if ($koekje[3]=="1") { //If this user wants to translate then
//echo (" ");
//echo ("");
//echo (" | ");
echo ("");
echo ("");
echo (" ");
if ($cntrlp==0){
echo (" ");
}else{
echo ("");
echo (" ");
}
if ($cntrlp == $aantal){
echo (" ");
}else{
echo ("");
echo ("");
}
echo (" | ");
}
echo (" ");
$bedrag = $bedrag + $rowlp[2]; //Calculate total robot price
$cntrlp++;
} //End of while displaying this mother part AND childparts
echo (" ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$bedrag_formatted = number_format($bedrag / 100, 0, ',', '.');
echo ("Project costs: € $bedrag_formatted");
}
} //End of if ($part_list) -----------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
function get_prtsrt_name2($conid, $lan, $recid){
$qry = ("SELECT * FROM tblsystext
WHERE txlid = 26
AND lanid = $lan
AND recordid = $recid
;");
$result = pg_query($conid, $qry);
$row = pg_fetch_array($result);
return ("$row[1]");
}
?>
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PLATFORM **************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $idbot;");
$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])){
echo (" ");
$folder = $arr1[0];
$countertmp = 0;
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
echo ("Software voor deze robot");
echo (" | ");
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo "$showname | ";
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo (" ");
} //End of if (isset($arr1[0]))
?>
//ONLY FOR SYS MANAGER ******************************************************
//*** ADD A PART TO THIS ROBOT -------------------------------------------------
//This is an include, so no parsing needed
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("Add a part to this robot ");
echo (" | ");
$qryap=("SELECT tblsystext.txtname
, tblsystext.recordid
FROM onderdelen
INNER JOIN tblsystext ON onderdelen.partid = tblsystext.recordid
WHERE txlid = 19
AND tblsystext.lanid = onderdelen.lanid
AND selectable = 0
AND '$part_list' NOT LIKE '% ' || tblsystext.recordid || ' %'
ORDER BY tblsystext.txtname
;");
$resultap = pg_query($con1, $qryap);
echo ("");
echo ("  ");
echo ("==> Add");
echo (' | ');
} //End of if ($koekje[0]>0) End of only for logged in users
//SPECIFIC INFO FOR SYS MANAGER *********************************************
//This is an include, so no parsing needed
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$qrydb=("SELECT farmbotversie.*
FROM farmbotversie
WHERE id = $idbot
;");
$resultdb = pg_query($con1, $qrydb);
while($row = pg_fetch_array($resultdb)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$last_stamp = ("$dag $maand $jaar");
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
echo ("");
echo ("");
echo ("");
echo ("General information ");
echo ("(");
echo ("edit)");
echo (" | ");
//*** LAST CHANGE MADE TO THIS ROBOT ----------------------------------------
echo ("Laatste wijziging   | ");
echo("$last_stamp | ");
//*** RECORD CREATED DATE ---------------------------------------------------
echo ("Aangemaakt   | ");
echo("$create_stamp | ");
// *** PART OWNER -----------------------------------------------------------
echo ("Eigenaar   | ");
//Needs botmaster from the file, tblsysuser.usrid
$name = get_person_name($con1, $bot_master, $koekje[2]);
echo("$name | ");
// *** VERSIENAAM -----------------------------------------------------------
echo ("Versienaam:   | ");
echo("$versienaam | ");
// *** FLESSENHALS -----------------------------------------------------------
echo ("Flessenhals:   | ");
echo("$flessenhals | ");
// *** RECORD STATUS --------------------------------------------------------
echo ("Record status   | ");
$statTxt = getStatTxt($con1, $status, $koekje[2]);
echo("$statTxt");
echo (" | ");
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 ($lanid == 1) {$imgname = "nederland.png";}
if ($lanid == 2) {$imgname = "deutschland.png";}
if ($lanid == 3) {$imgname = "uk.png";}
if ($lanid == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
}
echo (" ");
} //End of if ($koekje[0]>0)
| //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 ----------------------
?>