系列文章目录
二、树莓派、MQTT。树莓派定时温湿度采集,图片采集(二)
三、树莓派、MQTT。MQTT数据收发(三)
四、树莓派、MQTT(四)
前言
进入主页查看系列文章
安装PC端MQTT服务器;树莓派mqtt服务;
编写DHT11驱动,RFID驱动
一、MQTT服务器
1.PC搭建MQTT服务器(Windows)
1、下载MQTT服务器,网址为:https://www.emqx.cn/downloads#broker,选择Windows版本的EMQ X Broker下载,该版本为开源版本;
2、安装MQTT服务器,将下载的zip压缩包直接解压到某一文件夹下即可;
3、进入命令行界面,默认打开的是C盘的路径,需要使用cd命令进入安装目录bin文件夹内:先输入盘· 符,如果上述的文件加压在G盘,则先输入G: <回车>,进入G盘盘符;然后使用cd指令进入到bin文件夹内,这里的cd后面的路径为bin文件夹所在路径。下图是G:\MQTT\emqx\bin。
4、使用命令:emqx start开启MQTT服务器:
5、用emqx stop命令关闭MQTT服务器。
6、在浏览器地址栏输入:http://127.0.0.1:18083/#/login,打开服务器的控制台,可以查看服务器的相关内容,如当前的订阅主题,连接的主机数量等;用户名为admin,密码为public。
2、树莓派安装MQTT服务
MQTT官网树莓派安装指导:
https://www.emqx.com/zh/blog/use-mqtt-with-raspberry-pi#%E5%AE%89%E8%A3%85-mqtt-%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%BA%93
二、MFRC522,DHT11准备
1.MFRC522
1、打开SPI接口
raspi-config
选择Interfacing Options
开启SPI
2、安装SPI接口支持库,MFRC522包
sudo apt-get install python-spidev python3-spidev
cd ~
git clone https://github.com/lthiery/SPI-Py.git
cd SPI-Py
git checkout 8cce26b9ee6e69eb041e9d5665944b88688fca68
sudo python setup.py install
sudo python3 setup.py install
cd ~
git clone https://github.com/mxgxw/MFRC522-python.git
git提交或克隆报错fatal: unable to access
git config --global --unset http.proxy//取消http代理
git config --global --unset https.proxy//取消https代理
3、引脚连接
SDA 24 GPIO8 `在这里插入代码片`
SCK 23 GPIO11
MOSI 19 GPIO10
MISO 21 GPIO9
IRQ None None
GND Any Any Ground
RST 22 GPIO25
3.3V 1 3V3
4、RFID_Read.py:
将安装的MFRC522-python里的MFRC522.c复制到同一个目录下。
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 24 21:14:53 2022
@author: 嗯哒
"""
import RPi.GPIO as GPIO
import signal
import time
import MFRC522
continue_reading = True
def end_read(signal, frame):
global continue_reading
print
"Ctrl+C captured, ending read."
continue_reading = False
GPIO.cleanup()
def RFID_Read():
# 连接信号
signal.signal(signal.SIGINT, end_read)
# 创建MFRC522类的对象
MIFAREReader = MFRC522.MFRC522()
# 这个循环一直在检查芯片。如果有一个在附近,它将获得UID并进行身份验证
while continue_reading:
# 扫描卡片
(status, TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# 如果找到一张卡
if status == MIFAREReader.MI_OK:
print ("Card detected")
# 获取卡的UID
(status, uid) = MIFAREReader.MFRC522_Anticoll()
flag = 1
# 如果我们有UID,继续
if status == MIFAREReader.MI_OK:
# 打印UID
print ("Card read UID: %s,%s,%s,%s %s" % (uid[0], uid[1], uid[2], uid[3], uid[4]))
# 这是身份验证的默认密钥
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# 选择扫描的标签
MIFAREReader.MFRC522_SelectTag(uid)
# 认证
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
# 检查是否已验证
if status == MIFAREReader.MI_OK:
MIFAREReader.MFRC522_Read(8)
MIFAREReader.MFRC522_StopCrypto1()
flag = 0
return True
else:
# 身份验证错误
print ("Authentication error")
return False
if __name__ =='__main__':
RFID_Read()
2.DHT11
Dht11.py:
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 2 14:06:23 2022
@author: 嗯哒
"""
import RPi.GPIO as GPIO
import time
def Dht11():
while True:
channel = 3
data = []
j = 0
GPIO.setmode(GPIO.BOARD) #bcm模式
time.sleep(1)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.OUT) #bcm模式下 gpio2 输出
GPIO.output(channel, GPIO.LOW) #bcm模式下 gpio2 输出低电平
time.sleep(0.02) #间隔
GPIO.output(channel, GPIO.HIGH) #gpio2 输出高电平
GPIO.setup(channel, GPIO.IN) #gpio2输入模式
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print("sensor is working.")
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7-i)
humidity_point += humidity_point_bit[i] * 2 ** (7-i)
temperature += temperature_bit[i] * 2 ** (7-i)
temperature_point += temperature_point_bit[i] * 2 ** (7-i)
check += check_bit[i] * 2 ** (7-i)
tmp = humidity + humidity_point + temperature + temperature_point
if check == tmp:
print("temperature :", temperature, "*C, humidity :", humidity, "%")
break
else:
print ("wrong")
#print ("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp)
time.sleep(1)
GPIO.cleanup()
return temperature,humidity
if __name__ == '__main__':
Dht11()