1、在 /var/www/html新建DHT11.py,将以下程序复制到里面保存。
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO # 引入GPIO模块,重命名为GPIO
import time # 引入时间模块
channel = 4 # 设置端口号
j = 0 # 初始化计数器为0
data = [] # 初始化数据存储数组
GPIO.setmode(GPIO.BCM) # 设置gpio引脚编号模式,有两种编号模式可供选择,自己随意设置就好
time.sleep(1) # 程序暂停一秒钟
GPIO.setup(channel, GPIO.OUT) # 设置4号口为输出模式
GPIO.output(channel, GPIO.LOW) # 4号口输出低电平,即发送触发信号
time.sleep(0.02) # 低电平维持0.02秒
GPIO.output(channel, GPIO.HIGH) # 输出高电平,标志低电平结束
GPIO.setup(channel, GPIO.IN) # 设置端口模式为输入
while GPIO.input(channel) == GPIO.LOW: # 跳过初始状态的低电平
pass
while GPIO.input(channel) == GPIO.HIGH: # 跳过初始状态的高电平
pass
# 进入循环
while j < 40: # 仅仅存储40个数据
k = 0
while GPIO.input(channel) == GPIO.LOW: # 跳过低电平
continue
while GPIO.input(channel) == GPIO.HIGH: # 如果是高电平,则进入循环,高电平结束时停止
k += 1 # 计数器自增
if k > 100: # 如果高电平计数器大于100,则跳出循环,数据错误
break
if k < 8: # 如果计数器数值小于8次(即高电平持续8次),则认为值为0
data.append(0)
else: # 否则认为值为1
data.append(1)
j += 1 # 数据位数计数器加一
# 按位切割数据
humidity_bit = data[0:8] #python列表 取前不取后。即为0-7。
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): #python for循环 取前不取后。即0-7。
#将前面读取的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('数据正确')
print("温度: " + str(temperature) +"℃" + " , 湿度: " + str(humidity) +"%")
else:
print('数据错误')
print("温度: " + str(temperature) +"℃" + " , 湿度: " + str(humidity) +"%"+"\t" + "校验值: " + str(check) + " 检查值: " + str(tmp))
GPIO.cleanup()
2、使用以下命令安装python数据库包。
sudo apt-get install python-mysqldb
利用以下命令进入数据库。
mysql -u root -p
**(1)**若出现 ERROR 1698 (28000): Access denied for user ‘root’@’localhost’
错误,是因为: 数据库默认使用系统用户登录,需要修改为使用密码登录。则按照以下步骤更改:
sudo mysql -u root ,登入数据库后,依次执行以下命令。 (切记要把命令后的分号也加上)
use mysql #切换到mysql数据库
update user set plugin=‘mysql_native_password’; #修改plugin字段
flush privileges; #刷新权限
exit; #退出数据库
再次使用mysql -u root -p即可通过密码登录数据库,无需root权限执行。
**(2)**在本地MYSQL创建库“test”,表“dht”和三个列“dht_tem”,“dht_hum”,“dht_time”。
create database test; #创建数据库”test”
USE test ; #选择数据库”test”
create table dht #创建表“dht”(此句后无分号。因为数据库中创建表时,要求至少有一列)
(dht_tem DECIMAL(4,1), dht_hum DECIMAL(4,1),dht_time char(25)) ; #创建列“dht_tem”,“dht_hum”,“dht_time”
备注:DECIMAL(4,1)中的
4是(有效位数:可储存的最大十进位数总数,小数点左右两侧都包括在内。有效位数必须是 1 至最大有效位数 38 之间的值。预设有效位数是 18。)
1是 (小数位数:小数点右侧所能储存的最大十进位数。小数位数必须是从 0 到 4 的值。只有在指定了有效位数时,才能指定小数位数。预设小数位数是 0。)
完成以上操作后可通过 SHOW TABLES;
和 DESCRIBE dht;
命令查看列表是否已建成。
3、在上述新建的DHT11.py中打开,将以下语句加入(建议多开几个命令行窗口,上述数据库窗口建议不要退出,后面要用。):
import MySQLdb
conn = MySQLdb.connect(host='localhost',user='root',passwd='raspberry',db='test')
cur = conn.cursor()
value = [temperature,humidity,str(time.strftime('%A %X %Z',time.localtime(time.time())))]
cur.execute("insert into dht (dht_tem,dht_hum,dht_time) values(%s,%s,%s)",value)
conn.commit()
conn.rollback()
即源程序变为:
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO # 引入GPIO模块,重命名为GPIO
import time # 引入时间模块
import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='raspberry',db='test')
cur = conn.cursor()
channel = 4 # 设置端口号
j = 0 # 初始化计数器为0
data = [] # 初始化数据存储数组
GPIO.setmode(GPIO.BCM) # 设置gpio引脚编号模式,有两种编号模式可供选择,自己随意设置就好
time.sleep(1) # 程序暂停一秒钟
GPIO.setup(channel, GPIO.OUT) # 设置4号口为输出模式
GPIO.output(channel, GPIO.LOW) # 4号口输出低电平,即发送触发信号
time.sleep(0.02) # 低电平维持0.02秒
GPIO.output(channel, GPIO.HIGH) # 输出高电平,标志低电平结束
GPIO.setup(channel, GPIO.IN) # 设置端口模式为输入
while GPIO.input(channel) == GPIO.LOW: # 跳过初始状态的低电平
pass
while GPIO.input(channel) == GPIO.HIGH: # 跳过初始状态的高电平
pass
# 进入循环
while j < 40: # 仅仅存储40个数据
k = 0
while GPIO.input(channel) == GPIO.LOW: # 跳过低电平
continue
while GPIO.input(channel) == GPIO.HIGH: # 如果是高电平,则进入循环,高电平结束时停止
k += 1 # 计数器自增
if k > 100: # 如果高电平计数器大于100,则跳出循环,数据错误
break
if k < 8: # 如果计数器数值小于8次(即高电平持续8次),则认为值为0
data.append(0)
else: # 否则认为值为1
data.append(1)
j += 1 # 数据位数计数器加一
# 按位切割数据
humidity_bit = data[0:8] #python列表 取前不取后。即为0-7。
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): #python for循环 取前不取后。即0-7。
#将前面读取的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('数据正确')
print("温度: " + str(temperature) +"℃" + " , 湿度: " + str(humidity) +"%")
else:
print('数据错误')
print("温度: " + str(temperature) +"℃" + " , 湿度: " + str(humidity) +"%"+"\t" + "校验值: " + str(check) + " 检查值: " + str(tmp))
value = [temperature,humidity,str(time.strftime('%A %X %Z',time.localtime(time.time())))]
cur.execute("insert into dht (dht_tem,dht_hum,dht_time) values(%s,%s,%s)",value)
conn.commit()
conn.rollback()
GPIO.cleanup()
远行python程序 sudo python DHT11.py
,多运行几次。
返回到数据库窗口,使用 SELECT * FROM dht;
查看所读取的所有数据。
4、在 /var/www/html 中新建一个DHT11.php的文件,将以下程序输入到其中。
<?php
$servername = "localhost";
$username = "root";
$password = "raspberry";
$dbname = "test";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = "SELECT dht_tem, dht_hum, dht_time FROM dht";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "温度: " . $row["dht_tem"]. " 湿度: " . $row["dht_hum"]. "时间:"$
}
} else {
echo "0 结果";
}
$conn->close();
?>
在浏览器中输入: ***.***.***.***/DHT11.php,(***.***.***.***为你树莓派的地址。)则看在网页中看到读取DHT11的数据。
参考博客:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=927626 (树莓派第四课之DHT11湿温度传感器 )
https://maoyingdong.com/rapberry_pi_4b_install_php7.3_nginx_mysql/ (树莓派4B安装PHP7.3 + Nginx + MySQL 教程)
https://blog.csdn.net/qq_42712462/article/details/93756881 与
https://wenku.baidu.com/view/dc5718e5492fb4daa58da0116c175f0e7cd11982.html
都为 (基于树莓派的采集与存储)
https://blog.csdn.net/YJG7D314/article/details/103559637 (ERROR 1113 (42000): A table must have at least 1 column)
https://www.runoob.com/php/php-mysql-select.html (PHP MySQL 读取数据)