3月 06

esp8266连接mqtt服务订阅消息、接收推送

raspberry pi上安装mqtt服务器。
apt-get update
apt-get install mosquitto
apt-get install mosquitto mosquitto-clients python-mosquitto
apt-get install python-mosquitto
启动mqtt服务
mosquitto
检查mqtt服务是否启动。默认1883端口。
netstat -antp
结果
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN 383/mosquitto

查看服务器详细信息命令
/etc/init.d/mosquitto status

esp8266源码

# -*- coding:utf-8 -*-
import network
from mqtt import MQTTClient 
import machine 
import time 

# 连接WIFi
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
#sta_if.scan()
sta_if.connect("SID", "密码")

while not sta_if.isconnected():  
    machine.idle()

# 根据订阅内容开关灯
def sub_cb(topic, msg): 
   if int(msg) == 0:
       machine.Pin(int(12), machine.Pin.OUT, value=0)
   elif int(msg) == 1:
       machine.Pin(int(12), machine.Pin.OUT, value=1)
   
# 连接mqtt服务器
client = MQTTClient(client_id="1", server="192.168.1.212", port=1883) 
client.set_callback(sub_cb) 
client.connect()
# 循环获取内容
while True:
    client.subscribe(topic="simonzhang/net")
    time.sleep(0.5)

esp8266的mqtt lib地址如下。将mqtt.py和主文件命名为main.py上传到esp8266。
https://github.com/simon-zzm/ESP8266-lib/blob/master/mqtt.py

重启esp8266,在raspberry pi上推送消息控制灯开关成功。
开灯
mosquitto_pub -t simonzhang/net -m “1”
关灯
mosquitto_pub -t simonzhang/net -m “0”

其它记录
命令行
mosquitto_sub -t simonzhang/net
-t 指定订阅主体(topic),主体不用提前设定,直接发布就行。

mosquitto_pub -t simonzhang/net -m “Hello, simonzhang!”
-m 为发送内容

订阅名称可以用 + 代替,例如:
simon/+/zhang/+
这样就可以推送,“simon/hello/zhang/led”的主体。
#号应用于主体的结尾,例如:
simon/hello/zhang/led#

需要研究的还有通讯加密,程序加密和耗能部分。

2月 01

raspberry python3 gy-39

买了一片GY-39,不小心短路了,mcu好像就烧坏了。不过传感器还是好的,就直接用传感器。

上面有两个传感器bme280测试温度、湿度、气压。max44009测试光照。
用i2c接口将数据线连接好,到raspberry pi上查看设备。
root@simonpi:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — 23 — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — 4a — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — 76 —

通过文档查看max4400用到的地址是1001 010x或1001 011x。
所以地址4a是MAX44009,地址76就是BME280。
可直接用pip3安装bme280的包,我为了方便直接提取了。
执行附件中的测试脚本测试通过
raspberry-esp280-max44009源码

1月 30

raspberry python3 PWM MG90S

因为python2马上就要不维护了,以后就用python3了。
apt-get install python3-pip
pip3 install RPi.GPIO

棕色线接地
红色线接5V
黄色线是信号线
信号线接在gpio23上,输入相应的角度后舵机会转动到相应角度。

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Revision:
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# -------------------------------
import RPi.GPIO as GPIO
import time

SERVO = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(SERVO, GPIO.OUT)
p = GPIO.PWM(SERVO, 2)
p.start(0)

try:
    while True:
        desc = input("0-100:")
        dc = float(desc)
        p.ChangeDutyCycle(dc)
except KeyboardInterrupt:
    p.stop()
    GPIO.cleanup()
p.stop()
GPIO.claeanup()
12月 27

cy-30在raspberry pi上的调试

使用raspi-config打开i2c接口。
安装i2c工具,
apt-get install i2c-tools

接线如图add管脚悬空。

使用
/dev/i2c-1

执行命令得到cy-30编号为23。
# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — 23 — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

#!/bin/env python
# -*- coding:utf-8 -*-
# Revision:
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# -------------------------------
# http://atceiling.blogspot.co.uk/2017/03/raspberry-pi-gy30.html
import smbus
import RPi.GPIO as GPIO
import time

bus = smbus.SMBus(1)
ONE_TIME_HIGH_RES_MODE_2 = 0x21

def convertToNumber(data):
    return ((data[1] + (256 * data[0])) / 1.2)

def readLight(addr):
    bus = smbus.SMBus(1)
    data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE_2)
    return convertToNumber(data)

def CY30Data():
    GPIO.setmode(GPIO.BOARD)
    # 初始化
    DEVICE     = 0x23 # Default device I2C address
    num = round(readLight(DEVICE), 2)
    # 输出
    print "%s lx" % num

def main():
    CY30Data()
 
if __name__ == '__main__':  
    main()

cy-30源码

12月 12

mth01-spi 在raspberry pi上的调试

使用raspberry pi 2B主板,python2.7.13,mth01-spi传感器(没有使用reset管脚)。

#!/bin/env python
# -*- coding:utf-8 -*-
# Revision:
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# -------------------------------
import RPi.GPIO as GPIO
import time


def MTH01Data():
    GPIO.setmode(GPIO.BCM)
    # 初始化
    GPIO.setup(16,GPIO.IN) # SDA
    GPIO.setup(20,GPIO.IN) # SCK
    GPIO.setup(21,GPIO.OUT) # SC
    # SC高电压,然后低电压输出数据
    GPIO.output(21,GPIO.HIGH)
    time.sleep(0.02)
    data = 0
    datatemp = 0
    GPIO.output(21, GPIO.LOW)
    # 获取数据
    for i in range (32):
        while GPIO.input(20) == 0:
            continue
        datatemp = GPIO.input(16)
        data = data<<1
        if datatemp == 1:
            data = 1+data
        while GPIO.input(20) == 1:
            continue
    # 拉高电压停止输出数据
    GPIO.output(21, GPIO.HIGH)
    GPIO.cleanup()
    # 处理数据 
    data = int(data)
    data16 = hex(data)
    tempTmp = int(data16[2:5], 16)
    humiTmp = int(data16[5:7], 16)
    temp = float(tempTmp-400)/10.0
    humi = humiTmp
    # 输出
    print time.strftime("%b %d %Y %H:%M:%S", time.gmtime(time.time()))
    print temp,'C'
    print humi,'%'
    print "=" * 10

def main():
    while True:
        MTH01Data()
        # 每10秒钟检测一次
        time.sleep(10)
 
if __name__ == '__main__':  
    main()

源码及资料