[PYTHON] Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.

Environnement de développement

HD RaspberryPi B+
OS Debian GNU/Linux 7.8 (wheezy)
Python ver 2.7.3

_ * S'il n'y a pas de problème, les derniers Raspberry Pi2,3 et OS fonctionneront avec Jessie, vous n'avez donc pas à vous inquiéter trop. _

Matériel usagé

Nom Utiliser des applications
DHT11 Pour la mesure de la température et de l'humidité
Sauteur(Femme-Masculin) Pour la connexion GPIO

Nous vous recommandons d'acheter sur Akizuki ou Marutsu Parts. _

installer

Installez git.

Installez-le pour télécharger dht11.py, qui sortira plus tard.

sudo apt-get install git

Installez RPi.GPIO.

RPi.GPIO est un module qui peut contrôler les broches GPIO de Raspberry Pi en utilisant Python. Il est essentiel au fonctionnement du RaspberryPi et des appareils électroniques tels que les LED et les capteurs. Sans cela, même s'il y a une broche GPIO, ce sera un boîtier haut de gamme capable de fournir des tensions 5 (v) et 3.3 (v), alors introduisons-le.

De plus, il semble qu'il soit installé par défaut à partir de la sortie de Jessi. Il semble donc que vous puissiez l'utiliser immédiatement en important ce package au début du programme Python.

Site officiel 26e GPIO de contrôle de Raspberry Pi (Python)

Cependant, comme c'est un gros problème ici, je vais décrire la méthode d'installation pour ceux qui n'ont pas encore déménagé chez Jessi (comme moi).

Pour pip
sudo pip install rpi.gpio

apt-Oublier
sudo apt-get install python-rpi.gpio

Si vous pouvez l'introduire ici, veuillez faire L Chika par tous les moyens en regardant Table de correspondance des broches GPIO de Raspberry Pi comme une pratique. C'est la première étape parce que L-Chika se comporte comme un soi-disant «Bonjour le monde».

L-Chika utilisant le RPi.GPIO de Python sur Raspberry Pi

Installez twython.

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install twython

twython est un programme de bibliothèque Twitter écrit en Python. Quand il s'agit de ce que vous pouvez faire spécifiquement, le fonctionnaire le dit.

Twython is the premier Python library providing an easy (and up-to-date) way to access Twitter data. Actively maintained and featuring support for Python 2.6+ and Python 3. It's been battle tested by companies, educational institutions and individuals alike. Try it today!

Twython est la meilleure bibliothèque Python qui offre un moyen simple (et à jour) d'accéder aux données Twitter! En particulier, il prend principalement en charge Python 2.6+ et Python3. Twython est également activement testé par des entreprises, des établissements d'enseignement et des particuliers. Essayez-le!

Lors de la création d'un TwitterBot, ce Twython fait généralement le travail acharné dans les coulisses, nous pouvons donc facilement écrire un TwiiterBot en Python avec une clé API Twitter. Pratique.

Si vous voulez connaître le verso et l'utilisation détaillée, je vous recommande de lire le code source officiel.

Officiel: https://github.com/ryanmcgrath/twython

TwitterBot tweetant la température du processeur du Raspberry Pi Introduction et test de twython

Ceci termine la configuration approximative. Entrez ensuite la connexion du circuit matériel.

Connectez Raspberry Pi et DHT11.

Le schéma de connexion ressemble à ceci.

Raspberry_DHT11_ブレッドボード.png

La table de correspondance entre les broches DHT11 et GPIO est la suivante.

Raspberry_DHT11_回路図.png

RaspberryPi B+ DHT11
VDD 5.0(v)
DATA GPIO4
GND GND(PIN:6)

Selon le produit, la résistance est déjà connectée (this), mais les bases sont comme ça. Étant donné que la table de correspondance avec les broches GPIO diffère selon chaque Rasperry Pi, veuillez vous connecter en regardant la table de correspondance avec les broches GPIO. GPIO.png

Ceci termine la connexion côté matériel. Ensuite, mesurons la température ambiante et la température du DHT11 connecté et vérifions le fonctionnement.

Contrôle DHT11 avec Python.

Puisque le code pour contrôler DHT11 a déjà été écrit en Python, exécutons git clone tout en remerciant le créateur.

https://github.com/szazo/DHT11_Python

cd
git clone https://github.com/szazo/DHT11_Python.git

Allez dans le répertoire où vous git clone et vérifiez les fichiers. Notez les deux fichiers qu'il contient, dht11.py et dht11_examle.py.

dht11.py


import time
import RPi


class DHT11Result:
    'DHT11 sensor result returned by DHT11.read() method'

    ERR_NO_ERROR = 0
    ERR_MISSING_DATA = 1
    ERR_CRC = 2

    error_code = ERR_NO_ERROR
    temperature = -1
    humidity = -1

    def __init__(self, error_code, temperature, humidity):
        self.error_code = error_code
        self.temperature = temperature
        self.humidity = humidity

    def is_valid(self):
        return self.error_code == DHT11Result.ERR_NO_ERROR


class DHT11:
    'DHT11 sensor reader class for Raspberry'

    __pin = 0

    def __init__(self, pin):
        self.__pin = pin

    def read(self):
        RPi.GPIO.setup(self.__pin, RPi.GPIO.OUT)

        # send initial high
        self.__send_and_sleep(RPi.GPIO.HIGH, 0.05)

        # pull down to low
        self.__send_and_sleep(RPi.GPIO.LOW, 0.02)

        # change to input using pull up
        RPi.GPIO.setup(self.__pin, RPi.GPIO.IN, RPi.GPIO.PUD_UP)

        # collect data into an array
        data = self.__collect_input()

        # parse lengths of all data pull up periods
        pull_up_lengths = self.__parse_data_pull_up_lengths(data)

        # if bit count mismatch, return error (4 byte data + 1 byte checksum)
        if len(pull_up_lengths) != 40:
            return DHT11Result(DHT11Result.ERR_MISSING_DATA, 0, 0)

        # calculate bits from lengths of the pull up periods
        bits = self.__calculate_bits(pull_up_lengths)

        # we have the bits, calculate bytes
        the_bytes = self.__bits_to_bytes(bits)

        # calculate checksum and check
        checksum = self.__calculate_checksum(the_bytes)
        if the_bytes[4] != checksum:
            return DHT11Result(DHT11Result.ERR_CRC, 0, 0)

        # ok, we have valid data, return it
        return DHT11Result(DHT11Result.ERR_NO_ERROR, the_bytes[2], the_bytes[0])

    def __send_and_sleep(self, output, sleep):
        RPi.GPIO.output(self.__pin, output)
        time.sleep(sleep)

    def __collect_input(self):
        # collect the data while unchanged found
        unchanged_count = 0

        # this is used to determine where is the end of the data
        max_unchanged_count = 100

        last = -1
        data = []
        while True:
            current = RPi.GPIO.input(self.__pin)
            data.append(current)
            if last != current:
                unchanged_count = 0
                last = current
            else:
                unchanged_count += 1
                if unchanged_count > max_unchanged_count:
                    break

        return data

    def __parse_data_pull_up_lengths(self, data):
        STATE_INIT_PULL_DOWN = 1
        STATE_INIT_PULL_UP = 2
        STATE_DATA_FIRST_PULL_DOWN = 3
        STATE_DATA_PULL_UP = 4
        STATE_DATA_PULL_DOWN = 5

        state = STATE_INIT_PULL_DOWN

        lengths = [] # will contain the lengths of data pull up periods
        current_length = 0 # will contain the length of the previous period

        for i in range(len(data)):

            current = data[i]
            current_length += 1

            if state == STATE_INIT_PULL_DOWN:
                if current == RPi.GPIO.LOW:
                    # ok, we got the initial pull down
                    state = STATE_INIT_PULL_UP
                    continue
                else:
                    continue
            if state == STATE_INIT_PULL_UP:
                if current == RPi.GPIO.HIGH:
                    # ok, we got the initial pull up
                    state = STATE_DATA_FIRST_PULL_DOWN
                    continue
                else:
                    continue
            if state == STATE_DATA_FIRST_PULL_DOWN:
                if current == RPi.GPIO.LOW:
                    # we have the initial pull down, the next will be the data pull up
                    state = STATE_DATA_PULL_UP
                    continue
                else:
                    continue
            if state == STATE_DATA_PULL_UP:
                if current == RPi.GPIO.HIGH:
                    # data pulled up, the length of this pull up will determine whether it is 0 or 1
                    current_length = 0
                    state = STATE_DATA_PULL_DOWN
                    continue
                else:
                    continue
            if state == STATE_DATA_PULL_DOWN:
                if current == RPi.GPIO.LOW:
                    # pulled down, we store the length of the previous pull up period
                    lengths.append(current_length)
                    state = STATE_DATA_PULL_UP
                    continue
                else:
                    continue

        return lengths

    def __calculate_bits(self, pull_up_lengths):
        # find shortest and longest period
        shortest_pull_up = 1000
        longest_pull_up = 0

        for i in range(0, len(pull_up_lengths)):
            length = pull_up_lengths[i]
            if length < shortest_pull_up:
                shortest_pull_up = length
            if length > longest_pull_up:
                longest_pull_up = length

        # use the halfway to determine whether the period it is long or short
        halfway = shortest_pull_up + (longest_pull_up - shortest_pull_up) / 2
        bits = []

        for i in range(0, len(pull_up_lengths)):
            bit = False
            if pull_up_lengths[i] > halfway:
                bit = True
            bits.append(bit)

        return bits

    def __bits_to_bytes(self, bits):
        the_bytes = []
        byte = 0

        for i in range(0, len(bits)):
            byte = byte << 1
            if (bits[i]):
                byte = byte | 1
            else:
                byte = byte | 0
            if ((i + 1) % 8 == 0):
                the_bytes.append(byte)
                byte = 0

        return the_bytes

    def __calculate_checksum(self, the_bytes):
        return the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3] & 255

Ce code source est principalement obtenu à partir de DHT11 et est un fichier de classe qui traite les signaux numériques avec Python. Par conséquent, vous pouvez comprendre que vous pouvez facilement obtenir les valeurs mesurées d'humidité et de température en utilisant l'objet créé lors de la création de la classe de dht11.py. Voyons un exemple d'utilisation réelle d'une instance.

dht11_example.py(Avant correction)



import RPi.GPIO as GPIO
import dht11
import time
import datetime

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
instance = dht11.DHT11(pin=14)

while True:
    result = instance.read()
    if result.is_valid():
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)
        print("Humidity: %d %%" % result.humidity)

    time.sleep(1)

Veuillez noter que ʻinstance = dht11.DHT11 (pin = 14) est la valeur par défaut. Si vous êtes déjà connecté avec GPIO14, vous n'avez rien à faire ici, mais si vous avez sélectionné GPIO4` lors de la conception du circuit plus tôt, veuillez le corriger comme ceci.


import RPi.GPIO as GPIO
import dht11
import time
import datetime

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
-instance = dht11.DHT11(pin=14)
+instance = dht11.DHT11(pin=4)

while True:
    result = instance.read()
    if result.is_valid():
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)
        print("Humidity: %d %%" % result.humidity)

    time.sleep(1)

Ceci complète le code de mesure de la température et de l'humidité à partir du DHT11. Exécutons-le comme un contrôle d'opération.

sudo python dht11_example.py

_ * Assurez-vous de l'exécuter avec les privilèges root ou sudo!. Sinon, vous obtiendrez une erreur. _

Espérons que la ligne de commande affichera la température et l'humidité. Si vous pouvez confirmer ce qui précède, le contrôle de fonctionnement du DHT11 est terminé. Vive le bon travail.

Inscrivez-vous avec l'API Twitter pour créer un TweetBot.

Inscrivez-vous avec l'API Twitter pour créer un TweetBot.

De là, accédez à la page dédiée et appuyez sur Créer une nouvelle application pour vous inscrire. https://apps.twitter.com/

[Attention 1] Un numéro de téléphone est nécessaire pour enregistrer l'API Twitter et la langue doit être [anglais].

Un numéro de téléphone est requis pour s'inscrire à l'API Twitter. Sinon, vous vous fâcherez comme ça. error.png

J'enregistre donc mon numéro de téléphone et entre le numéro que j'ai reçu du message pour authentifier mon téléphone ... mais cela ne fonctionne toujours pas.

Que ce soit un bug ou une utilisation, ou si un ingénieur Twitter ne travaille pas ~~, je ne connais pas les détails, mais je changerai le paramètre de langue de Twitter de [japonais] à [anglais].

言語.png

Étant donné que l'authentification avec un téléphone mobile est requise pour utiliser l'API et les applications Twitter, comment s'authentifier.

Si vous effectuez à nouveau l'authentification téléphonique dans cet état, vous pouvez accéder en toute sécurité à la page d'inscription de l'API Twitter, alors enregistrez l'API.

[Attention 2] Vous ne pouvez pas continuer à publier le même message dans un court laps de temps.

Il n'est pas possible de tweeter le même message à la suite en utilisant l'API Twitter, probablement à cause de la prévention du spam, alors utilisons les horodatages pour pouvoir publier des tweets similaires dans un court laps de temps. Lors de l'affichage de la température et de la température ambiante comme cette heure, le même tweet peut être émis, il est donc recommandé de mettre intentionnellement un horodatage entre les deux.

Tweet de Raspberry Pi.

Après vous être enregistré auprès de l'API, vous aurez besoin des quatre clés API suivantes.

Ceux-ci correspondent aux numéros suivant les quatre éléments suivants sur la page API Twitter.

accsess3.png

Si vous pouvez confirmer les 4 clés ci-dessus, créons un bot Twitter et vérifions le fonctionnement.

tweet.py


#!/usr/bin/env python
#coding:utf-8

import os
from twython import Twython

#Twiiter API 
CONSUMER_KEY ='API_key1'
CONSUMER_SECRET ='API_key2'
ACCESS_KEY ='API_key3'
ACCESS_SECRET ='API_key4'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#time stamp
timestamp = 'date +%F_%H:%M:%S'
current_time=os.popen(timestamp).readline().strip()


api.update_status(status='[Test] L'heure actuelle est'+current_time+'est!')

Même si une erreur se produit, l'horodatage est inséré, vous pouvez donc publier en continu, afin que vous puissiez déboguer immédiatement. Si la publication réussit, l'heure actuelle doit être publiée sur votre TL. C'est la fin de la vérification des opérations avec l'API Twitter.

Exécutez dht11_tweet.py régulièrement avec crontab.

À ce stade, vous pouvez imaginer que vous pouvez publier la température et l'humidité sur Twitter en combinant le dht11_example.py que vous avez créé en premier et le tweet.py que vous venez de créer.

Enfin, terminons le dht11_tweet.py souhaité avec deux codes sources.

dht11_tweet.py


# -*- coding: utf-8 -*

import RPi.GPIO as GPIO
import dht11
import time
import datetime
import os
from twython import Twython

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=4)

#Twiiter API 
CONSUMER_KEY ='API_key1'
CONSUMER_SECRET ='API_key2'
ACCESS_KEY ='API_key3'
ACCESS_SECRET ='API_key4'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#time stamp
timestamp = 'date +%F_%H:%M:%S'
current_time=os.popen(timestamp).readline().strip()

while True:
    result = instance.read()
    if result.is_valid():
        api.update_status(status = '[Informations sur la température et l'humidité]'+'Heure actuelle'+current_time
            +'Température:'+str(result.temperature)+'C'est ℃.'+'Humidité:'+str(result.humidity)
            +'%est.')

        break

    time.sleep(1)

Comme vous pouvez le voir en exécutant plusieurs fois dht11_example.py, DHT11 (capteur de température et d'humidité) n'est pas aussi précis. Par conséquent, lors de l'exécution, la valeur mesurée n'est pas toujours renvoyée et il arrive souvent que les données ne puissent pas être lues. Dans ce cas, puisque «l'instance» elle-même n'est pas générée, «result.temperature» et «result.humidity» inclus dans «api.update_status» ne sont pas appelés, donc une erreur se produit et le message échoue. .. Pour cette raison

while True:
    result = instance.read()

Répétez jusqu'à ce que = __ [état où la température et la température ambiante peuvent être mesurées] __ où l'instance est générée par l'instruction while. De plus, comme la publication peut être la première fois que la génération de l'instance est réussie, mettez «break» à la fin de «api.update_status». En faisant cela, il est possible de tweeter une seule fois tout en mesurant de manière fiable la température et l'humidité.

Avec ce qui précède, le TweetBot qui marmonne la température et l'humidité approximatives est terminé. Cependant, c'est toujours une méthode manuelle, donc à la fin je l'enregistrerai dans crontab et marmonnerai régulièrement pour lui donner l'apparence d'un Bot.

L'explication de «crontab» est omise ici, mais le but est de le considérer comme un planificateur de tâches. Un programme qui exécute des commandes et des scripts à des moments précis.

[Résumé de l'utilisation de crontab. ](Http://bakunyo.hatenablog.com/entry/2013/06/20/crontab%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81% A8% E3% 82% 81% E3% 80% 82)

Tapez crrontab -e pour ouvrir crontab. Au fait, la sauvegarde d'écrasement est «Ctr + o» et la sortie est «Ctr + x». Gardez à l'esprit que ces deux commandes sont fréquemment utilisées.

Par exemple, si vous souhaitez publier depuis TweetBot toutes les 15 minutes, écrivez comme suit.

*/15 * * * * sudo python /home/pi/(....)/dht11_tweet.py

Si cela ne fonctionne pas correctement, veuillez déboguer en consultant le site suivant.

Trois points pour vérifier quand crontab ne fonctionne pas + α

Ceci complète le TweetBot, qui murmure la température et l'humidité toutes les 15 minutes. Vive le bon travail.

Puisque ce code est entièrement écrit en Python, par exemple, si vous affichez Graph ou atteignez la température spécifiée Je pense qu'il sera possible de faire retentir le buzzer, donc si vous êtes intéressé, essayez-le.

Recommended Posts

Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.
Obtenez la température et l'humidité avec DHT11 et Raspberry Pi
[Python + PHP] Créez un moniteur de température / humidité / pression avec Raspberry Pi
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
Production de système de contrôle de température avec tarte aux framboises et ESP32 (1)
Notez ce que vous voulez faire à l'avenir avec Razpai
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
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
Production d'un système de contrôle de température avec tarte aux framboises et ESP32 (2) Production d'un appareil de transmission
Raspberry + am2302 Mesure la température et l'humidité avec un capteur de température et d'humidité
Mesurer la température du processeur de Raspeye avec Python
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Supprimer les fichiers qui ont passé un certain temps avec Raspberry PI
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
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Mesurez et comparez les températures avec Raspberry Pi et générez automatiquement des graphiques
Fabriquez un thermomètre BLE et obtenez la température avec Pythonista3
Un programme qui reçoit la commande d'asservissement du contrôleur radio, interrompt la tarte aux râpes et l'enregistre.
Mesurez la température, l'humidité, etc. avec SensorTag et envoyez-le à Ambient via Raspberry Pi 3 pour le représenter graphiquement Partie 2
Faisons un ordinateur de vélo avec Raspberry Pi Zero (W, WH)
Fabriquez un incubateur à CO2 simple à l'aide de Raspberry PI et d'un capteur de CO2 (MH-Z14A)
Classique de Noël (?) Éclairage d'un arbre de Noël avec Raspberry Pi et Philips Hue
Notifier LINE de la température corporelle du thermomètre BLE avec la tarte à la râpe # 1
Avertir LINE de la température corporelle du thermomètre BLE avec la tarte à la râpe n ° 2
Affichage graphique de la consommation électrique des ménages avec 3GPI et Raspeye
J'ai fait un bot mou qui m'informe de la température
Utiliser une webcam avec Raspberry Pi
Introduction de "scikit-mobility", une bibliothèque qui vous permet d'analyser facilement les données de flux humain avec Python (Partie 1)
Comment mettre OpenCV dans Raspberry Pi et collecter facilement des images des résultats de détection de visage avec Python
Obtenez une liste des paramètres de caméra qui peuvent être définis avec cv2.VideoCapture et faites-en un type de dictionnaire
Créez un Discord Bot qui peut rechercher et coller des images
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
Créez DNN-CRF avec Chainer et reconnaissez la progression des accords de la musique
Surveillance des animaux avec Rekognition et Raspberry pi
[Raspberry Pi] Ajouter un thermomètre et un hygromètre
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Créez un compteur de voiture avec Raspberry Pi
J'ai créé un système avec Raspberry Pi qui mesure périodiquement l'indice d'inconfort de la pièce et envoie une notification LINE s'il s'agit d'une valeur dangereuse
Construction VPN simple de la passerelle IPsec avec Ubuntu 20.04 et Raspberry Pi ―― 1. StrongSwan introduit
J'ai tweeté l'éclairement de la pièce avec Raspberry Pi, Arduino et un capteur optique
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et construisez un serveur Web --2 introduction PHP
Compilation croisée de Raspberry Pi et création d'un environnement de développement de débogage à distance avec VS Code
Source compilez Apache2.4 + PHP7.4 avec Raspberry Pi et créez un serveur Web ―― 1. Introduction à Apache
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
Création d'un environnement distribué avec la série Raspberry PI (Partie 3: Installation et configuration de dnsmasq)
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
Une histoire sur l'obtention du champ Atom (télégramme XML) de l'Agence météorologique avec une tarte à la râpe et de le tweeter
Une histoire à laquelle j'ai pensé en essayant d'identifier les informations de plénitude du parking en utilisant l'image obtenue par la caméra Web et Razpai et le deep learning.
Vous pouvez facilement créer une interface graphique même avec Python
MQTT Radicon Car avec Arduino et Raspberry
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Grove - Capteur de température et d'humidité (DHT11) avec Raspberry Pi
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Rendre DHT11 disponible avec Raspeye + python (Remarque)