树莓派+PHP+Mairadb数据库读取DHT11

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 读取数据)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值