Temat: Power Switch - najtańszy sterownik ON/OFF
Witam!
Chciałem podzielić się informacja na temat małego, ale myśle że bardzo przydatnego urządzenia jakim jest "Power switch"
Możliwe że niektórzy to znają ale nie znalazłem nic o tym na tym jak i innych forach o podobnej tematyce.
Przekopując internet szukałem czegoś do sterowania przekaźnikami z USB i prawde mówiąc znalazłem za - 60zł dwu przekaźnikowy. Zdzierstwo
Ale na szczęście jest coś takiego jak V-USB które okazuje sie zbawienne.
Nie będę się rozpisywał na temat samej biblioteki o czym można poczytać na tej stronie, ale opisze urządzenie które o nią się opiera a jest nim wspomniany "Power Switch" który dysponuje aż 8-oma portami.
Układ jest banalnie prosty i poradził sobie znim nawet taki laik jak ja
a składa się z procesora Attiny2313 oraz kilku rezystorów, kondensatorów oraz kwarcu.
Koszt całości nie przekracza 10zł
Switch został wykonany na podstawie schematu z tej strony, można tam też znaleźć pliki źródłowe, gotowy wsad dla Attiny2313 jak i program sterujący, dzięki wielkiej uprzejmości Cezarego który skompilował go pod Openwrt mogłem przetestować owe urządzenie.
wersja dla OpenWrt Backfire -> powerSwitch - po pobraniu ustawić chmod 755
Zdjęcie Oryginalnego Switcha:
A to moja wersja:
Brakuje tu jedynie przekaźników ale myślę że to nie problem z ich podłączeniem
Działa bez problemu nie wymaga specjalnych sterowników a jedynie biblioteki "libusb" która jest dostępna dla Openwrt oraz w/w programu.
Procesor zapamiętuje ostatnie ustawienia nawet przy braku prądu, co jest ważne dla podłączonych urządzeń, więc restart routera nie wpływa na stan przekaźnika.
Sterowanie odbywa się za pomoca prostych komend:
powerSwitch on 3 - włącza port 3
powerSwitch off 3 - wyłącza port 3
power Switch status - wyświetla info o stanie portu 0...7
sam program wrzucamy bez instalacji do katalogu np /tmp
a polecenie wydajemy w ten sposób:
/tmp/powerSwitch status
Dzięki temu rozwiązaniu zyskujemy możliwość włączania lub wyłączania z USB dowolnych urządzeń za pomocą np: Crona
I najlepsze jest to że nie musimy dłubać lutownicą na płycie routera aby podpiąć się pod GPIO a co za tym idzie zmniejszamy ryzyko uszkodzenia naszej zabawki.
--------------------------------------------------------------------------------------------------------------------------------------
Mała aktualizacja w postaci obsługi przez przeglądarkę
Proponuję zrobić według opisu to będzie mniej zmian odnośnie ścieżek do plików.
A więc:
tworzymy katalog /dodatki/powersw/ a w nim pliki power1.sh ... power8.sh z taką zawartością:
#!/bin/sh
status=$(/dodatki/powersw/power status | grep 0 | sed 's/port.0..//')
if [ "$status" == "on" ] ; then
/dodatki/powersw/power off 0
else
/dodatki/powersw/power on 0
fi
echo "$status"
gdzie w każdym pliku wstawiamy zamiast 0 nr switcha licząc od 0 do 7
teraz w tym samym katalogu tworzymy plik powerst.sh z taką zawartością:
#!/bin/sh
/dodatki/powersw/power status
teraz pobieramy stąd program sterujący do katalogu /dodatki/powersw/ i zmieniamy jego nazwę na power
Mamy potrzebne skrypty do sterowania "Switchem" i nadajemy im prawa chmod 755
Teraz zajmiemy się stroną:
w katalogu /www tworzymy sobie plik o nazwie switch.sh z takim wpisem;
#!/usr/bin/haserl
<?
echo "Content-type: text/html"
echo ""
?>
<html>
<head>
<script src="js/jquery.min.js"></script> <!-- Trzeba pobrać: http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js -->
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan1.sh',function(data) {
$('#buttona').attr('src',"iconsw/"+data+".png");
$('#buttona').attr('power',data); });},7500);
$('#buttona').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power1.sh',{action:power},function(data) {
$('#buttona').attr('src',"iconsw/"+data+".png");
$('#buttona').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan2.sh',function(data) {
$('#buttonb').attr('src',"iconsw/"+data+".png");
$('#buttonb').attr('power',data); });},7500);
$('#buttonb').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power2.sh',{action:power},function(data) {
$('#buttonb').attr('src',"iconsw/"+data+".png");
$('#buttonb').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan3.sh',function(data) {
$('#buttonc').attr('src',"iconsw/"+data+".png");
$('#buttonc').attr('power',data); });},7500);
$('#buttonc').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power3.sh',{action:power},function(data) {
$('#buttonc').attr('src',"iconsw/"+data+".png");
$('#buttonc').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan4.sh',function(data) {
$('#buttond').attr('src',"iconsw/"+data+".png");
$('#buttond').attr('power',data); });},7500);
$('#buttond').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power4.sh',{action:power},function(data) {
$('#buttond').attr('src',"iconsw/"+data+".png");
$('#buttond').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan5.sh',function(data) {
$('#buttone').attr('src',"iconsw/"+data+".png");
$('#buttone').attr('power',data); });},7500);
$('#buttone').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power5.sh',{action:power},function(data) {
$('#buttone').attr('src',"iconsw/"+data+".png");
$('#buttone').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan6.sh',function(data) {
$('#buttonf').attr('src',"iconsw/"+data+".png");
$('#buttonf').attr('power',data); });},7500);
$('#buttonf').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power6.sh',{action:power},function(data) {
$('#buttonf').attr('src',"iconsw/"+data+".png");
$('#buttonf').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan7.sh',function(data) {
$('#buttong').attr('src',"iconsw/"+data+".png");
$('#buttong').attr('power',data); });},7500);
$('#buttong').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power7.sh',{action:power},function(data) {
$('#buttong').attr('src',"iconsw/"+data+".png");
$('#buttong').attr('power',data);
});
});
});
</script>
<script>
$(document).ready(function(){
setInterval(function (){
$.get('cgi-bin/powersw/stan8.sh',function(data) {
$('#buttonh').attr('src',"iconsw/"+data+".png");
$('#buttonh').attr('power',data); });},7500);
$('#buttonh').click(function(){
var power=$(this).attr('power');
if(power=='on'){
power='off'
}else{
power='on';
}
$.get('cgi-bin/powersw/power8.sh',{action:power},function(data) {
$('#buttonh').attr('src',"iconsw/"+data+".png");
$('#buttonh').attr('power',data);
});
});
});
</script>
</head>
<body>
<div style="position: absolute; top: 100px; left: 50px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-1</font>
</td>
</tr>
<tr align="center">
<td>
<img id="buttona" src="<?
status1=$(/dodatki/powersw/power status | grep 0 | sed 's/port.0..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 200px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-2</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttonb" src="<?
status1=$(/dodatki/powersw/power status | grep 1 | sed 's/port.1..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 350px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-3</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttonc" src="<?
status1=$(/dodatki/powersw/power status | grep 2 | sed 's/port.2..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 500px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-4</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttond" src="<?
status1=$(/dodatki/powersw/power status | grep 3 | sed 's/port.3..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 650px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-5</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttone" src="<?
status1=$(/dodatki/powersw/power status | grep 4 | sed 's/port.4..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 800px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-6</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttonf" src="<?
status1=$(/dodatki/powersw/power status | grep 5 | sed 's/port.5..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 950px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-7</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttong" src="<?
status1=$(/dodatki/powersw/power status | grep 6 | sed 's/port.6..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
<div style="position: absolute; top: 100px; left: 1100px">
<table border="2" bordercolor="black" width="100" height="140px" >
<tr align="center">
<td>
<font size="4" color="blue">SW-8</font>
</td>
</tr>
<tr align="center"><td>
<img id="buttonh" src="<?
status1=$(/dodatki/powersw/power status | grep 7 | sed 's/port.7..//')
echo -n "iconsw/$status1.png"
?>" power="<?
echo -n "$status1"
?>" width="50" height="50" >
</td>
</tr>
</table>
</div>
</body>
</html>
Tworzymy katalog /www/cgi-bin/powersw/
a wnim znowu pliki power1.sh ... power8.sh tym razem z taką zawartością:
#!/usr/bin/haserl
<?
echo "Content-type: text/html"
echo ""
status=$(/dodatki/powersw/power status | grep 0 | sed 's/port.0..//')
if [ "$status" == "on" ] ; then
/dodatki/powersw/power off 0
else
/dodatki/powersw/power on 0
fi
status0=$(/dodatki/powersw/power status | grep 0 | sed 's/port.0..//')
echo "$status0"
?>
i pliki od stan1.sh do stan8.sh :
#!/usr/bin/haserl
<?
echo "Content-type: text/plain"
echo ""
status1=$(/dodatki/powersw/power status | grep 0 | sed 's/port.0..//')
echo "$status1"
?>
I analogicznie jak wyżej zamieniamy dla każdego pliku każde 0 na nr switcha licząc od 0 do 7 i nadajemy im prawa wykonywalności chmod 755
Dwa razy jest odczyt stanu ze względu na to iż obrazki pokazuą się odwrotnie bez tego.
pozostało nam jeszcze utworzyć katalog /www/iconsw/ gdzie będą dwie ikonki o nazwie on.png i off.png
tutaj nie będę podawał źródła strony bo chyba każdy sobie poradzi ze znalezieniem ikonek
Stan w jakim jest Switch sprawdzany jest co 7,5 sek. co pozwoli kontrolować jego stan w kilku przeglądarkach na raz bez odświeżania strony jeżeli jest więcej użytkowników.
Jeżeli są jakieś uwagi co można poprawić to prosze pisać
Pozdrawiam.
Raspberry Pi + HDMI-VGA + Lcd Controller + Lcd z laptopa = Pogodynka