Dit experiment is een lichtorgel met 4 kanalen. De kanalen worden aangestuurd door een ATmega8 die via optocouplers en solid state relais de 220V aanbiedt op 4 contrastekkers. Dit lichtorgel kan dus lampen dimmen en aan- of uitschakelen. De maximum belasting per kanaal bedraagt 600W en de maximum totale belasting bedraagt 2200W, oftewel 10A.
De pennen D0 tot en met D3 worden gebruikt als uitgang van de microcontroller. Deze worden anders gebruikt voor de seriele poort, die in dit project toch niet wordt gebruikt.
Het grootste verschil met een simpel lichtorgel is dat dit project lampen ook kan dimmen. Dit project is bedoeld om de gehele tuinverlichting te sturen. De gebruiker heeft een standaard IR tv afstandsbediening nodig om de lampen te kunnen sturen. Met deze afstandsbediening kunnen er ook diverse programmas worden voorgeprogrammeerd. Deze programmas kunnen een sprookjesachtig effect maken door beperkt de dimming te varieeren.
Om een led of gelijkstroommotor te dimmen kan er met PWM worden gewerkt. Met 220V werkt het principe vergelijkbaar. Hier heet het dan faseaansnijding. Een oplossing hiervoor kan worden gevonden op piware.de. In dit geval meet de microcontroller de 220V curve en iedere keer als de 220V het nulpunt doorsnijdt op weg boven wordt het programma gestart. Vanaf dat moment gaat er een teller lopen die een triac voor een tijdje aanschakelt. Des te langer, des te helderder. Dit kan omdat de microcontroller op 16mHz loopt en 220V op 50Hz. De microcontroller kan dus ongeveer 320.000 instructies uitvoeren in 1 cycle van de 220V. Dit geeft ruim voldoende tijd om 6 uitgangen nauwkeurig aan te sturen. Het is echter wel noodzakelijk dat de uitgangen snel kunnen schakelen. Dit impliceert dat een solid state relais niet kan worden gebruikt omdat het te langzaam schakelt. Er moet een triac worden gebruikt.
De electronica bestaat uit 3 prints:
- Voedingsspanningverzorging en meetspanning
Op deze print is een transformator gemonteerd. De kant waar de tekst op geprint is, is de 220 Vac kant. De print bevat 4 aansluitingen:
- Aan de hoogspannings kant 220 Vac netspanning. Deze ingang komt binnen via een 220V schakelaar en een snelle smeltzekering van 1A. Alle verdere aansluitingen liggen aan de laagspanningskant.
- Een aansluiting voor een aan/uit led. Deze led wordt naar buiten gevoerd, zodat buiten te zien is of de schakeling spanning heeft.
- Een aansluiting voor de voedingsspanning van de microcontroller. Dit is 5Vdc, waarbij vermeldt dient te worden dat de stabilisatie niet geweldig is, maar wel voldoende voor dit project.
- Een 5Vac meetspanning. Deze spanning beweegt net als de netaansluiting, maar dan slechts op 5Vac. De microprocessor gebruikt deze spanning om te kijken of er reeds een nieuwe fase (nulpuntsdoorsnijding) kan worden opgestart.
- Futurelec controlboard met periferie
Op dit board zijn aangesloten:
- LCD-scherm van 16X1 karakters. Dit scherm wordt buiten gemonteerd. De backlit springt aan zodra er een toets op de afstandsbediening wordt ingedrukt. Zo heeft de gebruiker een visuele controle op de afstandsbediening. De LCD wordt buiten gemonteerd.
- Infrarood ontvanger voor de afstandsbediening. Hiermee kan de gebruiker lampen aan/uit schakelen en/of dimmen. Verder kunnen er voorgeprogrammeerde programmas mee worden bediend en geprogrammeerd. De IR-ontvanger wordt buiten gemonteerd.
- LDR die bepaalt hoe sterk het daglicht is buiten. Met behulp hiervan kunnen lampen automatisch worden aangeschakelt als het donker wordt, of uitgeschakelt als het licht wordt. De LDR wordt buiten gemonteerd.
- Een ultrasone bewegings sensor. Hiermee kunnen specifieke lampen worden aangeschakeld indien iemand de tuin betreedt van buiten af. Deze sensor wordt buiten gemonteerd en wel daar waar de tuiningang is.
- Een klok waarmee tijdschakeling kunnen worden uitgevoerd. Deze klok wordt binnen gemonteerd.
- 220 Vac uitgangen
Het lijkt er op dat de schakeling niet snel genoeg schakelt. Dit moet aan de vermogenskant liggen, want de AVR schakelt veel meer dan snel genoeg. Er bevinden zich aan de vermogenskant slechts 4 onderdelen, waarvan 2 weerstanden. De weerstanden lijken juist gedimensioneerd, want de schakeling schakelt wel, maar te langzaam. De voorgeschreven overblijvende onderdelen zijn een:
- MOC3023 Optocoupler
Gemonteerd is de K3023P. Dit lijkt het correcte type, maar de datasheet zegt niets over schakelsnelheden. Zoeken naar de originele datasheet levert echter een iets andere MOC3023 op, die echter ook niets zegt over schakelsnelheden.
- TIC225S Triac
De datasheet van de originele TIC225S. Volgens deze site maakt het ook niets uit of je het S of M type gebruikt, want ze hebben dezelfde datasheet. Het verschil blijkt te liggen in het voltage. De M kan 600 Vac hebben terwijl de S 700 Vac kan hebben. Voor de schakeltijden maakt het niets uit, die ligt typisch op 330 microseconden en max op 990 microseconden.
Bediening
Deze tuinverlichting werkt met 10 programmas, namelijk 0 tot en met 9. Indien de tuincomputer wordt aangezet dan start deze vanzelf programma 0 op. De programmas kunt u zelf programmeren met de bijbehorende afstandsbediening. Het is wel makkelijk om zicht te hebben op het beeldschermpje als u aan het programmeren slaat.
//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 ----------------------
?>