树莓派 + 继电器模块 + Python web:实现手机控制电灯开关

目标:使用手机控制电灯开关

实现方案:
通过下图的 “继电器模块” 来切断、闭合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上就不用电阻了。

IMG_20140421_085402

简单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

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.