#> RESTKHZ _

休止千鹤 | 我依旧是一名平凡的学生

Raspberry Pi B+ web物联网遥控灯初试折腾笔记

  休止千鹤  |    25/12/2020

本文算是老文章了(2016),当时还在用tk域名,为了搬迁使用markdown重新写(复制粘贴)了一遍. 因为2016年至今有一些东西可能已经发生变化,部分变化内容已经注明. 树莓派已经出了4, 今年PHP也出了8.
部分平台转载了这篇文章, 但是代码那边貌似有点问题.

另外,看自己中二病真的是一件羞耻的事.

缘起

暑假一段时间也是……闲的蛋疼。就拿出Raspberry准备折腾一番,结果被吐槽“两百多你不如买个二手手机而且性能不会比这个差”“控制灯?你用这个不如用Arduino”

哦,好吧。其实树莓派有GPIO,这个是一个和Arduino类似的东西。但是却有强于Arduino的性能。我们可以研究这个,并且结合起来,凸显它的优势。本文还是主要说明树莓派的web和简单的物联网控制。

动手

于是就动手了。后面发现GPIO用python的socket控制的话,十分麻烦。我不是说写socket麻烦,而是不容易跨平台控制,于是便有了用web的想法。可惜我web只是入门,python写不出,所以就用了稍稍会那么一点的php。当然我也是参考和引用了资料,资料地址如下(同时感谢乐于分享的人) :fb文,提到web控制灯,详细介绍pi的GPIO因为关于GPIO的介绍这里和百度很全了,所以我也就不再说哪个针脚是哪个。为了方便和安全,我这里没用继电器控制电灯。使用了LED灯组。同时我也<strong>不推荐像FB文使用强电。实验准则人身安全是第一位的。特别是还在调试阶段就更不应该使用强电。

你需要:
[ * ]树莓派B or B+ or 3 一个,并有套件且装好系统(A的话可能针脚有所不同不过没关系,源别瞎改)
[ * ]杜邦线若干(母对母)
[ * ]电脑一台,有良好的开发环境和putty之类的管理程序
[ * ]网络
[ * ]LED灯组(单个也没问题)
[ * ]你想做

因为本人新手又是不太熟悉linux和GPIO的人,所以不免绕了许多路。所以你可能还需要一些linux操作基础。

先连接硬件。LED灯组如果不喜欢就用单个LED,为了防止烧坏建议串联100欧姆的电阻,因为工作电流可能会很大(相对于LED额定电流)。因为二极管有单向导电性所以LED长腿是正极断腿负极。不要接错,接错没关系,检查以后接回来即可。 Tips:给那些没玩过太多电子电路无线电的朋p友y说粗略明下串联电阻是有必要的,如果没电阻也可以拆拆废电器,没有电烙铁可以用打火机加热的粗铜丝一头裹东西拿着去触碰焊点,可以有电烙铁一般的效果,轻松拆下元器件。电阻会有四个色环,按着金色或者银色是最后一个的顺序第一个是第一个数字第二个是第二个数字第三个环是倍数,十的幂次。金色和银色代表误差。按着 棕红橙黄绿蓝紫灰白黑表示1234567890 。比如[棕黑棕(金或银)]是100欧姆(棕1黑0棕x10^1),[棕黑红(金或银)]是1KΩ(1 0 x10^2)。这里100欧姆即可。太大电阻影响亮度。如果电阻腿够长,你可以尝试铰接。两条腿交错拧一块就行。

好的,一切都准备好,连接上pi然后先解决py问题
这个在新版的系统里已经默认安装好。

(搬迁时重写的注明:在2016年编写该脚本时使用的是Python2,系统也默认python是python2, 至于raspbian版本已经不记得了,现在是否默认带有Python2也不清楚,请记得改掉shebang这#!/usr/bin/python这句.)

#!/usr/bin/python

import sys
import RPi.GPIO as GPIO

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

args = sys.argv
Act = args[1]
pin = 17
GPIO.setup(pin,GPIO.OUT)

if(int(Act)==1):
    GPIO.output(pin,GPIO.HIGH)
    print "HIGH"

if(int(Act)==0):
    GPIO.output(pin,GPIO.LOW)
    print"LOW"

注意这里RPi.GPIO,是RPi!i是小写,当时我按了大写,怎么也不能引用……

setwarning(False)屏蔽一些错误和提示信息并强制执行

setmode是选择一种针脚编码方式,有BOARD和BCM两种,有兴趣可以看看。在上面链接里第二个有详细的介绍。我们这里就用BCM了

到了这个时候就可以保存你的py并且上传到你的pi上开始测试

python gpio.py 1      #输出高电平
python gpio.py 0      #输出低电平

这个时候你会发现你已经可以控制一个灯的开关。如果真的这样那么恭喜您。你可以考虑用web控制了。

我在这里也用的是lamp(m划掉,实际上这里没用到,后面也不提了)

提醒一下大家树莓派的源真心别瞎改,我当时改的,然后先是各种依赖不行,然后更恶心的是解决了依赖然后搞了个Debian的Apache2,连httpd.conf都没有,然后去mod里面软连。php又是各种问题,后面尝试nginx时cgi又有问题……最后改回来又花了很大劲……(搬迁归档注: 那个时候其实还弄不懂官方文档,有够蠢的.顺便提一下, 任何东西都是在更新的, 老的文章笔记很有可能可能会失效,一定要看文档手册!)

原生源安装特别方便:

(搬迁归档注:现在安装apache和php命令可不是这些,php8都出来了.)

sudo apt-get install apache2 php5

然后电脑浏览器打开即可。你会发现默认页面里还有个树莓LOGO。

/var/www/html里添加一个php测试一下<?php echo “test”; ?>

如果成功输出test那么安装成功,请继续往下看.

好了,这就行了。十分方便。我为此写了一个php+html(在下不是phper也不会前端所以要求不高,界面不美观。只是觉得那个FB的PHP有可以改进之处,水平问题,我只能尽量安全可靠,方便调试)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>The show start when the lights on</title>
</head>

<body>
<span class="STYLE1">Light Controller&nbsp;&gt;</span>
<form id="form1" name="form1" method="post" action="">
<label>The show start when the lights ON!</label>
<label>----------------------------------</label>
<label>Token:</label>

<input type="password" name="pwd" />

<input name="act" type="submit" value="ON" />
<input name="act" type="submit" value="OFF" />

</form>

</body>
</html>


<?php //php开始

function debug($r){ //调试函数,为了输出错误
if ($r=="") { //
echo "

Error: 
"; //
echo "<font color=\"red\">".file_get_contents("/var/www/html/l.txt")."</font>"; //错误在/var/www/html/l.txt可以自己定,这里显示错误方便调试
}
}

$p='wtf'; //令牌,自己改
$bool=false; //$bool控制Permission Denied显示

@$act=$_POST['act']; //获取post得到令牌和动作,@屏蔽刚刚打开时的提醒
@$pwd=$_POST['pwd']; //

$bool=isset($pwd)?true:false; //判断如果有pwd传入,赋值true显示permission Denied,这里为了防止一打开就看到

if ($p===$pwd) { //传入密码和定义的一样的话
if($act==='ON'){ //###开灯动作,把www-data加入soduer然后sudo,用visudo,具体网上有说的
$return=shell_exec("sudo python /var/www/gpio.py 1 2>/var/www/html/l.txt"); //运行shell,如果出错,错误信息重定向至显错文件/var/www/html/l.txt
echo 'Light ON!--->'; //输出开灯和箭头
echo "$return
"; //输出py运行结果
debug((string)$return); //执行调试函数
} //
elseif ($act==='OFF') { //判断关灯动作
$return=shell_exec("sudo python /var/www/gpio.py 0 2>/var/www/html/l.txt"); //###(接上shell_exec)因为会调用/dev/mem和/dev/gpiomem,需要root.关灯动作执行
echo 'Light OFF!--->'; //输出关灯和箭头
echo "$return
"; //
debug((string)$return); //
} //
else{ //
echo 'Error!'; //如果post的数据不是ON,不是OFF,那就丢出ERROR
} //
} //
else //
{ //
if($bool){echo "Permission Denied!";} //密码不对,或者只传入动作,输出这句
} //
?>

这里我已经把我的php注释的十分详细了吧=_=debug函数为了调试shell_exec()方便

“The show start when the lights ON——rustylake”

注意:www-data要sudo这个注释里面说了,重定向输出可以方便的检查出错,因为出错时输出不是标准输出所以返回为空。我为了方便检查,所以重定向错误到文件并输出。方便了很多。权限问题很重要,当时基本出错都是这个。比如文件无法访问问题,命令执行时可能还有问题。。还有/dev/mem的问题,这玩意错了还不回显所以只能自己附带函数调试。本代码移植性不一定好。所以可能自己需要改改。我已经做的尽量安全,美观了。并且附带调试函数。可以显示错误信息方便调试,避免走弯路。(当时被坑惨了)

虽然这里已经不直接调用post来进行shell_exec(),并且带上一个密码验证。安全性较FB文有所提升,但依然是实验而且本人php仅仅入门。所以能不能对外网开放请再三考量。效果图是视频做的,貌似图有问题不过还是附上:图已经丢失


Views:

 Comments


(no comments...maybe you can be the first?)