Ich hatte das Sensormodul AE-BME280, das ich zuvor verwendet habe, und habe versucht, das Aufrufen innerhalb des Netzwerks zu vereinfachen.
・ Himbeer Pi 2 Modell B. ・ Raspbian Jessie Lite Januar 2017 ・ Apache 2.4.10 ・ PHP 5.6.29 ・ Python 2.7.9
Installieren Sie die erforderlichen Pakete.
$ sudo aptitude update
$ sudo apt-get install i2c-tools python-smbus apache2 php5
Übrigens, warum Apache und PHP anstelle von Python alleine verwenden, wusste ich einfach nicht, wie man Web-Hosting in Python. Die Sicherheit ist also robust. Bitte beachten Sie. Öffnen Sie den Port nicht für den lokalen Gebrauch (Gebot)
http://deviceplus.jp/hobby/raspberrypi_entry_039/ Stellen Sie eine Verbindung zu Raspberry Pi her, indem Sie sich auf dieses ↑ dieses ↓ beziehen.
Ich habe gerade den Beispielcode in der obigen URL optimiert. 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)
Für den Ausgabeteil von now.py wird jeder numerische Wert durch Kommas (Temperatur, Luftfeuchtigkeit, Druck) getrennt ausgegeben. Da der Druck in Pa ausgegeben wird, wird er durch 100 geteilt, um hPa zu erzeugen.
Für dieses Python-Programm sind Sudo-Berechtigungen erforderlich. Deshalb Ich führe "sudo python now.py" aus, aber ich kann sudo nicht von PHPs exec () verwenden. Also lasst uns die Sudoer wechseln. (Sicherheit? Sie wissen es nicht.) Fügen Sie die folgende Zeile hinzu.
/etc/sudoers
www-data ALL=(root) NOPASSWD: ALL
Sie müssen lediglich Python aufrufen. Ich habe es richtig entworfen.
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;
}
Es ist im Grunde ein Chaos. Bitte mach dir keine Sorgen. Es gibt viele bessere Möglichkeiten zu schreiben.
・ Holen Sie sich Temperatur, Luftfeuchtigkeit und Druck gleichzeitig mit Himbeerkuchen! IC2-Kommunikation mit AE-BME280 | Device Plus - Devapla http://deviceplus.jp/hobby/raspberrypi_entry_039/
・ Font Awesome, die ikonische Schriftart und das CSS-Toolkit http://fontawesome.io/
· Bootstrap · Das weltweit beliebteste Mobile-First- und Responsive-Front-End-Framework. http://getbootstrap.com/
Recommended Posts