目标:使用手机控制电灯开关
实现方案:
通过下图的 “继电器模块” 来切断、闭合220v交流电,使用树莓派的GPIO口向继电器 “IN” 口输入高低电频,控制继电器模块。手机和树莓派的通信使用HTTP请求,在树莓派端起一个简单的web服务程序,通过手机浏览器访问。
改进:
如果不是中央控制,每个继电器连接一个树莓派成本太高,而且不方便整合。更简洁的方案是使用51单片机,或者Ardunio + 蓝牙模块。Ardunio上把蓝牙作为一个串口操作,设置只需一行 “Serial.begin(9600);” 读数据一行 “val=Serial.read();” (整个程序才20行:https://github.com/hackwjfz/Arduino/blob/master/bluetooth.ino)
手机端可以用 ”蓝牙串口调试助手” 做调试控制,也可以使用Java (Android,使用BluetoothAdapter库,并需要在AndroidManifest.xml中添加BLUETOOTH和BLUETOOTH_ADMIN权限)写一个APP读写串口。
继电器连接图:
IN 接树莓派任意GPIO口,GND接树莓派GND(接地),VCC接树莓派v3v电源。
常开和公用端接交流电200v,这样IN置高电平是开关断开,置低电平时开关闭合。如果用常闭替换常开,结果相反。
开始我接的是5v电源到VCC口,开关总是闭合状态,加了一些电阻能工作了,最后放到3v上就不用电阻了。
简单Web服务:
这里没有使用HTTP GET/POST请求,而是对访问路径做了一个解析。访问 http://101.168.0.3/on 或 http://101.168.0.3/off ,树莓派会调用Python RPi库,把GPIO14置 “高” 或者 “低” 电平。
(备注:101.168.0.3为树莓派IP地址,我使用树莓派GPIO14连接继电器IN口,GPIO14编号为8)
(使用Shell、C控制GPIO可参考:http://amosk.info/blog/archives/914,Python相对更简便一些)
#!/usr/bin/python from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os, commands, socket import RPi.GPIO as GPIO class MyHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write("<html><body><br><br>") self.wfile.write("<br><br> <br><br><center><h1>") if "on" in self.path: self.wfile.write("<a href=/off><img src=http://imghost/on.png></a><br>") GPIO.setmode(GPIO.BOARD) GPIO.setup(8, GPIO.OUT) GPIO.output(8, GPIO.HIGH) elif "off" in self.path: self.wfile.write("<a href=/on><img src=http://imghost/off.png></a>") GPIO.setmode(GPIO.BOARD) GPIO.setup(8, GPIO.OUT) GPIO.output(8, GPIO.LOW) #os.system("bash set_led.sh 14 %s" % self.path[1:]) try: server = HTTPServer(('', 80), MyHandler) server.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server.serve_forever() except KeyboardInterrupt: server.socket.close()
演示视频(掩饰代码里,我添加了一个随机播放音乐的按钮,所以能听到音乐):
http://player.youku.com/player.php/sid/XNzAxNjM2MTEy/v.swf