J'avais le module de capteur AE-BME280 que j'utilisais auparavant, alors j'ai essayé de le rendre facile à consulter depuis le réseau.
・ Raspberry Pi 2 modèle B ・ Raspbian Jessie Lite Janvier 2017 ・ Apache 2.4.10 ・ PHP 5.6.29 ・ Python 2.7.9
Installez les packages requis.
$ sudo aptitude update
$ sudo apt-get install i2c-tools python-smbus apache2 php5
Au fait, pourquoi utiliser Apache et PHP au lieu de Python seul, je ne savais tout simplement pas comment héberger Web en Python. La sécurité est donc robuste. Notez s'il vous plaît. N'ouvrez pas le port car il est pour un usage local (commande)
http://deviceplus.jp/hobby/raspberrypi_entry_039/ Connectez-vous à Raspberry Pi en vous référant à ceci ↑ this ↓.
Je viens de modifier l'exemple de code dans l'URL ci-dessus. Python Wakarimasen
bme280.py
#coding: utf-8
import smbus
import time
bus_number = 1
i2c_address = 0x76
bus = smbus.SMBus(bus_number)
digT = []
digP = []
digH = []
t_fine = 0.0
def writeReg(reg_address, data):
bus.write_byte_data(i2c_address,reg_address,data)
def get_calib_param():
calib = []
for i in range (0x88,0x88+24):
calib.append(bus.read_byte_data(i2c_address,i))
calib.append(bus.read_byte_data(i2c_address,0xA1))
for i in range (0xE1,0xE1+7):
calib.append(bus.read_byte_data(i2c_address,i))
digT.append((calib[1] << 8) | calib[0])
digT.append((calib[3] << 8) | calib[2])
digT.append((calib[5] << 8) | calib[4])
digP.append((calib[7] << 8) | calib[6])
digP.append((calib[9] << 8) | calib[8])
digP.append((calib[11]<< 8) | calib[10])
digP.append((calib[13]<< 8) | calib[12])
digP.append((calib[15]<< 8) | calib[14])
digP.append((calib[17]<< 8) | calib[16])
digP.append((calib[19]<< 8) | calib[18])
digP.append((calib[21]<< 8) | calib[20])
digP.append((calib[23]<< 8) | calib[22])
digH.append( calib[24] )
digH.append((calib[26]<< 8) | calib[25])
digH.append( calib[27] )
digH.append((calib[28]<< 4) | (0x0F & calib[29]))
digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F))
digH.append( calib[31] )
for i in range(1,2):
if digT[i] & 0x8000:
digT[i] = (-digT[i] ^ 0xFFFF) + 1
for i in range(1,8):
if digP[i] & 0x8000:
digP[i] = (-digP[i] ^ 0xFFFF) + 1
for i in range(0,6):
if digH[i] & 0x8000:
digH[i] = (-digH[i] ^ 0xFFFF) + 1
def readData():
data = []
for i in range (0xF7, 0xF7+8):
data.append(bus.read_byte_data(i2c_address,i))
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
return [compensate_T(temp_raw), compensate_H(hum_raw), compensate_P(pres_raw)]
def compensate_P(adc_P):
global t_fine
pressure = 0.0
v1 = (t_fine / 2.0) - 64000.0
v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5]
v2 = v2 + ((v1 * digP[4]) * 2.0)
v2 = (v2 / 4.0) + (digP[3] * 65536.0)
v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((digP[1] * v1) / 2.0)) / 262144
v1 = ((32768 + v1) * digP[0]) / 32768
if v1 == 0:
return 0
pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125
if pressure < 0x80000000:
pressure = (pressure * 2.0) / v1
else:
pressure = (pressure / v1) * 2
v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
v2 = ((pressure / 4.0) * digP[7]) / 8192.0
pressure = pressure + ((v1 + v2 + digP[6]) / 16.0)
return pressure;
def compensate_T(adc_T):
global t_fine
v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1]
v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2]
t_fine = v1 + v2
temperature = t_fine / 5120.0
return temperature
def compensate_H(adc_H):
global t_fine
var_h = t_fine - 76800.0
if var_h != 0:
var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) * (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h)))
else:
return 0
var_h = var_h * (1.0 - digH[0] * var_h / 524288.0)
if var_h > 100.0:
var_h = 100.0
elif var_h < 0.0:
var_h = 0.0
return var_h
def setup():
osrs_t = 1 #Temperature oversampling x 1
osrs_p = 1 #Pressure oversampling x 1
osrs_h = 1 #Humidity oversampling x 1
mode = 3 #Normal mode
t_sb = 5 #Tstandby 1000ms
filter = 0 #Filter off
spi3w_en = 0 #3-wire SPI Disable
ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode
config_reg = (t_sb << 5) | (filter << 2) | spi3w_en
ctrl_hum_reg = osrs_h
writeReg(0xF2,ctrl_hum_reg)
writeReg(0xF4,ctrl_meas_reg)
writeReg(0xF5,config_reg)
now.py
# coding: utf_8
import bme280 as bme
bme.setup()
bme.get_calib_param()
data = bme.readData()
print str(data[0]) + "," + str(data[1]) + "," + str(data[2] / 100)
Pour la partie sortie de now.py, chaque valeur numérique est sortie séparée par des virgules (température, humidité, pression). De plus, comme la pression est sortie en Pa, elle est divisée par 100 pour produire du hPa.
Ce programme Python nécessite des privilèges sudo pour s'exécuter. Donc
Je lance sudo python now.py
, mais je ne peux pas utiliser sudo depuis l'exec () de PHP.
Alors changeons les sudoers. (Sécurité? Vous ne savez pas.)
Ajoutez la ligne suivante.
/etc/sudoers
www-data ALL=(root) NOPASSWD: ALL
Tout ce que vous avez à faire est d'appeler Python. Je l'ai conçu correctement.
index.php
<?php $data = explode(",", exec("sudo python now.py")); ?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Temp Monitor</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-4" align="center" style="padding: 20px 10px">
<h2><i class="fa fa-thermometer-three-quarters"></i></h2>
<span class="num-large"><?= substr($data[0], 0, 2) ?></span>
<span class="num-small"><?= substr($data[0], 2, 3) ?> ℃</span>
</div>
<div class="col-md-4" align="center" style="padding: 20px 10px">
<h2><i class="fa fa-tint"></i></h2>
<span class="num-large"><?= substr($data[1], 0, 2) ?></span>
<span class="num-small"><?= substr($data[1], 2, 3) ?> %</span>
</div>
<div class="col-md-4" align="center" style="padding: 20px 10px">
<h2><i class="fa fa-tachometer"></i></h2>
<span class="num-large"><?= substr($data[2], 0, 4) ?></span>
<span class="num-small"><?= substr($data[2], 4, 3) ?> hPa</span>
</div>
</div>
<br>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
css/style.css
body {
background-color: #272727;
color: #fff;
font-family: "Segoe UI Light", sans-serif;
}
.num-large {
font-size: 5em;
}
.num-small {
font-size: 3em;
}
C'est fondamentalement un gâchis. s'il te plait ne t'inquiète pas. Il existe de nombreuses meilleures façons d'écrire.
・ Obtenez la température, l'humidité et la pression à la fois avec la tarte aux framboises! Communication IC2 avec AE-BME280 | Device Plus --Devapla http://deviceplus.jp/hobby/raspberrypi_entry_039/
・ Font Awesome, la police emblématique et la boîte à outils CSS http://fontawesome.io/
· Bootstrap · Le framework front-end réactif et mobile le plus populaire au monde. http://getbootstrap.com/
Recommended Posts