[PYTHON] Faire une minuterie de lavage-séchage avec Raspberry Pi

Faire une minuterie de lavage-séchage avec Raspberry Pi

Introduction (but de la production)

AuseParce que je travaille pour une entreprise, je suis souvent absent la journée et je ne peux pas emporter le linge lorsqu'il pleut. Pour cette raison, le linge est essentiellement séché à l'intérieur. ――Cependant, la lumière du soleil dans la salle de séchage est mauvaise et le séchage ne se déroule pas comme prévu en hiver, de sorte que le moment de l'absorption peut être manqué, et le linge est dans un cercle vicieux de collecte dans un style dalma de neige. ―― Afin de briser ce cercle vicieux (?), Nous avons créé un mécanisme pour calculer le temps de séchage du linge et le notifier au smartphone.

Quoi préparer

(1) Ce qui est nécessaire pour créer l'environnement du côté de l'appareil. Il peut être acheté chez Akizuki Electronics. http://akizukidenshi.com/catalog/top.aspx

(2) Nécessaire pour créer l'environnement côté serveur. Vous avez besoin d'un compte AWS et Slack. AWS: https://aws.amazon.com/jp/ Slack: https://slack.com/intl/ja-jp/

Nom du produit quantité Utilisation
① RaspberryPi ZeroWH 1 Contrôle du micro-ordinateur
① Planche à pain 1 Pour la construction de circuits
① DHT11 1 Capteur de température et d'humidité
① Résistance (4.7kΩ) 2
① Résistance (1kΩ) 1
① Interrupteur Tact 1 Interrupteur marche / arrêt
① LED 1 S'allume au démarrage (pour confirmation visuelle)
② AWS IoT Core Mettez fin à la communication avec le terminal. Le rôle du courtier MQTT.
② AWS Lambda Backend IoT Core. Assurer la communication avec Slack.
② Slack Utilisé pour la notification aux smartphones

Présentation du système

RaspberryPi --- AWS IoT Core --- AWS Lambda --- Slack --- Smartphone

Construction de l'environnement (serveur)

AWS IoT Core

Créer un certificat

Créez le certificat X.509 requis pour authentifier la connexion avec AWS IoT Core. En tant que procédure de création, créez d'abord une stratégie (informations d'autorisation pour les ressources AWS), puis associez la stratégie au certificat.

--Sélectionnez le service AWS IoT Core sur l'AWS Management Console et créez une stratégie à partir de "Sécurité" -> "Stratégies". Définissez une valeur quelconque pour le nom de la stratégie. Créez une stratégie avec n'importe quel nom, avec l'action "iot: " et l'ARN de ressource "".

--Créez un certificat à partir de "Sécurité" -> "Certificat". 1-Cliquez sur Créer un certificat dans le menu de création de certificat et téléchargez «Certificat de cette chose» et «Clé privée» sur votre PC. Vous aurez besoin de ce certificat et de la clé privée plus tard dans la configuration du kit SDK AWS IoT. En outre, pour le certificat de l'autorité de certification racine requis, accédez à ici à RSA 2048. Enregistrez le contenu de la clé de bit dans un éditeur de texte pour le créer.

Enregistrement de l'appareil (chose)

Enregistrez l'appareil qui se connecte à AWS IoT Core.

--Sélectionnez le service AWS IoT Core dans AWS Management Console, sélectionnez «Management» -> «Things» -> «Create» -> «Create a single thing» et suivez les instructions à l'écran pour enregistrer l'appareil (objet). .. Vous serez invité à créer un nouveau certificat, mais puisque vous utiliserez le certificat que vous avez créé précédemment, sélectionnez «Créer un objet sans certificat». --Cliquez sur "Joindre une chose" dans le sous-menu en haut à droite de la carte de certificat créée précédemment dans "Sécurité" -> "Certificat" pour attacher le périphérique (chose) créé précédemment au certificat.

Ceci complète les paramètres requis pour se connecter à AWS IoT Core.

Créer des règles

Ensuite, configurez les paramètres de transfert des données reçues par AWS IoT Core vers AWS Lambda.

--Sélectionnez le service AWS IoT Core dans AWS Management Console, sélectionnez "ACT" -> "Rules" -> "Create Rule" et suivez les instructions à l'écran pour créer une règle de transfert. --Dans l'instruction de requête de règle, spécifiez les conditions d'application de l'action au message MQTT reçu dans SQL. Dans ce cas, la fonction Lambda est appelée sous la condition de topic name = "condition" et notice = 1, donc (SELECT * FROM'condition 'WHERE notice = 1).

AWS Lambda Dans AWS Management Console, sélectionnez le service Lambda et définissez la fonction Lambda qui sera appelée depuis AWS IoT Core. Les notifications à Slack seront POSTÉES sur l'URL du Webhook entrant en créant des données texte au format "payload =" + json.dumps (send_data)).

import json
import urllib.request

def lambda_handler(event, context):

    d = json.dumps(event)
    post_slack(event)
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def post_slack(event):
    
    t = event["remaining_time"]
    
    #Composition du message
    if t < 0:
        message = "Le linge est sec!"
    else:
        message = "après%-Le linge sèche en 2i minutes." % t
    
    send_data = {
        "username" : "dry_notice",
        "text" : message,
    }
    
    send_text = "payload=" + json.dumps(send_data)
    
    #Notification à slack
    request = urllib.request.Request(
        "URL du Webhook en cours de lancement de Slack", 
        data=send_text.encode('utf-8'), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')
    

Slack Créez un compte dans Slack et ajoutez n'importe quelle chaîne. Après cela, enregistrez le Webhook entrant pour le canal ajouté.

Ceci termine la construction de l'environnement côté serveur.

Construction de l'environnement (appareil)

Conception matérielle

--Utilisez une maquette pour câbler le Raspberry Pi et chaque partie de ①. Pour la disposition des broches de RaspberryPi, ici est organisé d'une manière facile à comprendre pour votre référence.

kairozu.PNG

Conception de logiciels

Le flux de traitement global est le suivant.

#!/usr/bin/python3
# coding: UTF-8

# Import SDK packages
import RPi.GPIO as GPIO
import dht11 #· · · 1
import time
import datetime
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient,AWSIoTMQTTClient
from AWSIoTPythonSDK.exception import AWSIoTExceptions
import json
import logging

# Init logging
logging.basicConfig(filename="Chemin du fichier journal",level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Init AWSIoTMQTTClient #・ ・ ・ 2
myAWSIoTMQTTClient = None
myAWSIoTMQTTClient = AWSIoTMQTTClient("Nom de l'objet AWS IoT Core")
myAWSIoTMQTTClient.configureEndpoint("URL du point de terminaison AWS IoT Core", 8883)
myAWSIoTMQTTClient.configureCredentials("Chemin du certificat racine", "Chemin de la clé privée", "Chemin du certificat client")

# AWSIoTMQTTClient connection configuration
myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1)  # Infinite offline Publish queueing
myAWSIoTMQTTClient.configureDrainingFrequency(2)  # Draining: 2 Hz
myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10)  # 10 sec
myAWSIoTMQTTClient.configureMQTTOperationTimeout(5)  # 5 sec

# Connect to AWS IoT
myAWSIoTMQTTClient.connect()
logging.info('connect to AWS IoT')

# MQTT topic #・ ・ ・ 3
topic_1 = "condition"
topic_2 = "monitermode"

# Variable
modeState = False # Operating state(True:ON False:OFF)
v = 3000 # Laundry weight
delta_v = 0 # Delta of Laundry weight
notice = 0 # Notification to Slack
flg_1 = True
flg_2 = True
starttime = datetime.datetime.now()
lasttime = starttime

# Init GPIO
LED = 23
SWITCH = 24
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
GPIO.setup(SWITCH,GPIO.IN)

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

# Action when switch is pressed
def switch_on(self):

    # When it is running
    if modeState:
        GPIO.output(LED,0)
        modeState = False
        logging.info("Stop drying monitor")
        payload = { "mode": 0}

    # When stopped
    else:
        GPIO.output(LED,1)
        modeState = True
        v = 3000
        delta_v = 0
        notice = 0
        flg_1 = True
        flg_2 = True
        starttime = datetime.datetime.now()
        lasttime = starttime
        logging.info("Start drying monitor")
        payload = { "mode": 1}

    myAWSIoTMQTTClient.publish(topic_2, json.dumps(payload), 1)

# GPIO event setting #・ ・ ・ 4
GPIO.add_event_detect(SWITCH,GPIO.RISING,callback=switch_on,bouncetime=200)


while True:
    try:
        # When it is running
        if modeState:
            result = instance.read()
            if result.is_valid():
                logging.info("Temperature: %-3.1f C" % result.temperature)
                logging.info("Humidity: %-3.1f %%" % result.humidity)

                now = datetime.datetime.now()
                delta = now - lasttime
                logging.info("delta_time: %-2i sec" % delta.seconds)
                lasttime = now

                #・ ・ ・ 5
                ps = 6.11 * 10 ** (7.5 * result.temperature / (result.temperature + 237.3))
                delta_v += (-0.45 * ps * (1-result.humidity / 100) + 0.25) * delta.seconds / 60
                logging.info("delta_v: %-3i g" % int(delta_v))

                elapsed_time = lasttime - starttime
                estimate_time = elapsed_time.seconds * v / (-1 * delta_v) / 60
                remaining_time = elapsed_time.seconds * (v / (-1 * delta_v) - 1) / 60
                logging.info("estimate_time: %-3.1f minutes" % estimate_time)
                logging.info("remaining_time: %-3.1f minutes" % remaining_time)

                #・ ・ ・ 6
                if remaining_time < 10:
                    if flg_1:
                        notice = 1
                        flg_1 = False
                    else:
                        notice = 0

                if remaining_time < 0:
                    if flg_2:
                        notice = 1
                        flg_2 = False
                        modeState = False
                    else:
                        notice = 0

                payload = { "time":str(datetime.datetime.now()),\
                            "temperature":round(result.temperature,1),\
                            "humidity":round(result.humidity,1),\
                            "estimate_time":round(estimate_time,1),\
                            "remaining_time":round(remaining_time,1),\
                            "notice":notice}

                myAWSIoTMQTTClient.publish(topic_1, json.dumps(payload), 1)
        
        # When stopped
        else:
            GPIO.output(LED,0)

        time.sleep(6)

    except KeyboardInterrupt:
        break

    except:
        pass

logging.warning("Exception detected. Finish application.")
GPIO.cleanup()
myAWSIoTMQTTClient.disconnect()
  1. dht11 est une bibliothèque qui acquiert les valeurs de température et d'humidité des capteurs. Il est disponible sur GitHub.

  2. Configuration du client MQTT pour se connecter à AWS IoT Core. Dans chaque cas, définissez le contenu référencé dans le menu AWS Iot Core. --Item name: nom de l'appareil enregistré dans "Management" → "Item" --Endpoint: URL affichée dans "Paramètres" → "Custom Endpoint" --Divers certificats: Téléchargez le certificat attaché à "chose" depuis "Sécurité" -> "Certificat" et stockez-le dans Raspberry Pi.

  3. Nom de la rubrique MQTT. topic_1 (condition) est une rubrique permettant de publier des valeurs de capteur telles que la température et l'humidité, et topic_2 (monitermode) est une rubrique permettant de publier l'état du moniteur.

  4. Paramètres de surveillance du GPIO24 auquel le commutateur tactile est connecté. Appuyer sur le commutateur (Lo → Hi) active la fonction switch_on. La fonction switch_on contrôle la LED et initialise les paramètres. L'état du moniteur est maintenu en modeState et l'état (OFF / ON) est modifié chaque fois que l'interrupteur est enfoncé.

  5. Une unité de traitement qui calcule le temps de séchage. La formule du temps de séchage est basée sur ce site. v est le poids lorsque le panier de lavage est rempli de linge (avant séchage-après séchage → poids de l'eau), et delta_v est le poids de l'eau séchée après avoir démarré avec le commutateur.

  6. Publiez sur le sujet_1 lorsque le temps restant (temps restant) est de (1) 10 minutes ou moins et (2) 0 minutes ou moins. Publiez les données suivantes sur le sujet_1.

nom de l'article Contenu
time Heure actuelle
temperature Température (℃)
humidity Humidité (%)
estimate_time Temps nécessaire pour terminer le séchage (minutes)
remaining_time Temps restant (minutes)
notice Indicateur de notification à Slack (1:Notifier 0:Ne pas notifier)

en conclusion

Si j'ai le temps, j'aimerais ajouter une fonction de contrôle du ventilateur pour raccourcir le temps de séchage en tant que fonction d'extension.

Recommended Posts

Faire une minuterie de lavage-séchage avec Raspberry Pi
Utiliser une webcam avec Raspberry Pi
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
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
GPGPU avec Raspberry Pi
DigitalSignage avec Raspberry Pi
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
[Python + PHP] Créez un moniteur de température / humidité / pression avec Raspberry Pi
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
Plantes Mutter avec Raspberry Pi
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Faites une loterie avec Python
Faire un rappel de parapluie avec Raspberry Pi Zero W
Un mémorandum lors de la réalisation d'une caméra de surveillance avec Raspeye
Faire un feu avec kdeplot
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Fabriquez un climatiseur intégré à un ordinateur personnel "airpi" avec Raspberry Pi 3!
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
J'ai fait une caméra de surveillance avec Raspberry PI pour la première fois.
[Raspberry Pi] Contrôle du moteur pas à pas avec Raspberry Pi
Utilisez vl53l0x avec RaspberryPi (python)
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Communication série avec Raspberry Pi + PySerial
Faisons une rupture de bloc avec wxPython
Configuration du système d'exploitation avec Raspberry Pi Imager
Construire un serveur VPN avec Raspberry Pie
Créer un filtre avec un modèle django
Essayez de déplacer 3 servos avec Raspeye
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Faire un joli graphique avec plotly
Notez ce que vous voulez faire à l'avenir avec Razpai
Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
J'ai créé un serveur Web avec Razpai pour regarder des anime
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
[Remarque] Utilisation d'un écran LCD à 16 caractères à 2 chiffres (1602A) de Python avec Raspeye
Faisons une chemise IoT avec Lambda, Kinesis, Raspberry Pi [Partie 1]
Comment télécharger des fichiers sur Cloud Storage à l'aide de Python [Créer une caméra à point fixe avec Raspberry PI # 1]
Mesurer la force du signal SIM avec Raspberry Pi
Surveillance des animaux avec Rekognition et Raspberry pi
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
[Raspberry Pi] Ajouter un thermomètre et un hygromètre
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Créez un simulateur de gacha rare avec Flask
Créez un pipeline de notebook avec Kedro + Papermill
Faire une figure partiellement zoomée avec matplotlib
Essayez de pêcher le Wakasagi avec Raspberry Pi
Programmation normale avec la programmation Node-RED avec Raspberry Pi 3