[Python + PHP] Créez un moniteur de température / humidité / pression avec Raspberry Pi

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.

Environnement de vérification

・ Raspberry Pi 2 modèle B ・ Raspbian Jessie Lite Janvier 2017 ・ Apache 2.4.10 ・ PHP 5.6.29 ・ Python 2.7.9

Préparation

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)

Connexion du capteur

http://deviceplus.jp/hobby/raspberrypi_entry_039/ Connectez-vous à Raspberry Pi en vous référant à ceci ↑ this ↓.

Côté Python

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.

mur sudo

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

Côté PHP

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;
}

en conclusion

C'est fondamentalement un gâchis. s'il te plait ne t'inquiète pas. Il existe de nombreuses meilleures façons d'écrire.

Lien

・ 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

[Python + PHP] Créez un moniteur de température / humidité / pression avec Raspberry Pi
Utilisez le capteur de température / humidité / pression BME280 de Python avec Raspberry Pi 2
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
Obtenez la température et l'humidité avec DHT11 et Raspberry Pi
Mesurer la température du processeur de Raspeye avec Python
Création d'un système de contrôle de température avec tarte aux framboises et ESP32 (3) Réception d'un fichier Python
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Mesurez la température et l'humidité avec Raspberry Pi3 et visualisez avec Ambient
Faites une loterie avec Python
Utilisez python sur Raspberry Pi 3 pour détecter la "température (en utilisant un convertisseur A / N)"!
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
getrpimodel: Reconnaître le modèle Raspberry Pi (A, B, B +, B2, B3, etc.) avec python
Utilisez vl53l0x avec RaspberryPi (python)
Faisons une interface graphique avec python.
Créer un système de recommandation avec python
Faisons un graphe avec python! !!
Utiliser une webcam avec Raspberry Pi
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Faisons un ordinateur de vélo avec Raspberry Pi Zero (W, WH)
Créez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 4
Faire une boussole d'affichage kanji avec Raspberry Pi et Sense Hat
[Remarque] Utilisation d'un écran LCD à 16 caractères à 2 chiffres (1602A) de Python avec Raspeye
Comment télécharger des fichiers sur Cloud Storage à l'aide de Python [Créer une caméra à point fixe avec Raspberry PI # 1]
Faisons un jeu de shiritori avec Python
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Faisons la voix lentement avec Python
Créez un framework Web avec Python! (1)
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Détectez la température à l'aide de python sur Raspberry Pi 3!
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un compteur de voiture avec Raspberry Pi
Créez un framework Web avec Python! (2)
Travailler avec le GPS en Python pour Raspberry Pi 3
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Discord bot raspberry pi zéro avec python [Note]
Créer un bot Twitter Trend avec heroku + Python
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et construisez un serveur Web --2 introduction PHP
Je veux faire un jeu avec Python
J'ai essayé L-Chika avec Razpai 4 (édition Python)
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et créez un serveur Web ―― 1. Introduction à Apache
Essayez de créer un code de "décryptage" en Python
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Rendre DHT11 disponible avec Raspeye + python (Remarque)
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
Raspberry + am2302 Mesure la température et l'humidité avec un capteur de température et d'humidité
Utilisation du capteur de température numérique à 1 fil DS18B20 avec Raspberry Pi de Python
Connectez-vous à MySQL avec Python sur Raspberry Pi
Construire un environnement de développement Python sur Raspberry Pi
Suivi GPS avec Raspeye 4B + BU-353S4 (Python)
Compilez Apache2.4 + PHP7.4 avec Raspberry Pi et construisez un serveur Web --3. Utilisez MySQL
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Faisons un outil de veille de commande avec python
Surveiller la température à l'aide de la plate-forme IoT cloud Raspberry Pi + Alibaba