PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了树莓派+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]     #@L_696_6@ 取前不取后。即为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 ,登入数据库后,依次执行以下命令。 (切记要把命令后的分号也加上)@H_197_28@
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”

备注@H_197_28@: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]     #@L_696_6@ 取前不取后。即为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的数据。

博客

大佬总结

以上是大佬教程为你收集整理的树莓派+PHP+Mairadb数据库读取DHT11全部内容,希望文章能够帮你解决树莓派+PHP+Mairadb数据库读取DHT11所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: