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.
(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 |
RaspberryPi --- AWS IoT Core --- AWS Lambda --- Slack --- Smartphone
AWS IoT Core
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.
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.
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.
--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.
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()
dht11 est une bibliothèque qui acquiert les valeurs de température et d'humidité des capteurs. Il est disponible sur GitHub.
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.
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.
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é.
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.
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) |
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