[PYTHON] Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi

Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi

Einleitung (Zweck der Produktion)

――Weil ich für ein Unternehmen arbeite, bin ich tagsüber oft abwesend und kann bei Regen keine Wäsche aufnehmen. Aus diesem Grund wird Wäsche grundsätzlich in Innenräumen getrocknet. ――Das Sonnenlicht im Trockenraum ist jedoch schlecht, und das Trocknen verläuft im Winter nicht wie erwartet, sodass der Zeitpunkt für die Aufnahme möglicherweise verfehlt wird und sich die Wäsche in einem Teufelskreis des Sammelns im Schneedalma-Stil befindet. ――Um diesen Teufelskreis zu durchbrechen (?), Haben wir einen Mechanismus erstellt, mit dem die Trocknungszeit der Wäsche berechnet und dem Smartphone mitgeteilt werden kann.

Was vorzubereiten?

(1) Was ist notwendig, um die Umgebung auf der Geräteseite aufzubauen? Es kann bei Akizuki Electronics erworben werden. http://akizukidenshi.com/catalog/top.aspx

(2) Notwendig zum Aufbau der Umgebung auf der Serverseite. Sie benötigen ein AWS- und Slack-Konto. AWS: https://aws.amazon.com/jp/ Slack: https://slack.com/intl/ja-jp/

Produktname Menge Verwenden
① RaspberryPi ZeroWH 1 Mikrocomputer steuern
① Brotbrett 1 Für den Schaltungsaufbau
① DHT11 1 Temperatur- und Feuchtigkeitssensor
① Widerstand (4.7kΩ) 2
① Widerstand (1 kΩ) 1
① Taktschalter 1 Start / Stopp-Schalter
① LED 1 Leuchtet beim Start auf (zur visuellen Bestätigung)
② AWS IoT Core Beenden Sie die Kommunikation mit dem Terminal. Die Rolle des MQTT-Brokers.
② AWS Lambda IoT Core Backend. Vermittlung der Kommunikation mit Slack.
② Slack Wird zur Benachrichtigung von Smartphones verwendet

Systemübersicht

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

Umgebungskonstruktion (Server)

AWS IoT Core

Zertifikat erstellen

Erstellen Sie das X.509-Zertifikat, das zur Authentifizierung der Verbindung mit AWS IoT Core erforderlich ist. Erstellen Sie als Erstellungsverfahren zunächst eine Richtlinie (Berechtigungsinformationen für AWS-Ressourcen) im Voraus und hängen Sie die Richtlinie dann an das Zertifikat an.

--Wählen Sie den AWS IoT Core-Service in der AWS Management Console aus und erstellen Sie eine Richtlinie unter "Sicherheit" -> "Richtlinien". Legen Sie einen beliebigen Wert für den Richtliniennamen fest. Erstellen Sie eine Richtlinie mit einem beliebigen Namen mit der Aktion "iot: " und der Ressourcen-ARN "".

--Erstellen Sie ein Zertifikat unter "Sicherheit" -> "Zertifikat". 1-Klicken Sie im Menü zum Erstellen von Zertifikaten auf Zertifikat erstellen und laden Sie "Zertifikat dieses Dings" und "Privater Schlüssel" auf Ihren PC herunter. Sie benötigen dieses Zertifikat und diesen privaten Schlüssel später in der AWS IoT SDK-Konfiguration. Das erforderliche Zertifikat für die Stammzertifizierungsstelle finden Sie unter hier unter RSA 2048. Speichern Sie den Inhalt des Bitschlüssels in einem Texteditor, um ihn zu erstellen.

Geräte- (Ding-) Registrierung

Registrieren Sie das Gerät, das eine Verbindung zu AWS IoT Core herstellt.

--Wählen Sie den AWS IoT Core-Dienst in der AWS Management Console aus, wählen Sie "Management" -> "Dinge" -> "Erstellen" -> "Einzelne Sache erstellen" und befolgen Sie die Anweisungen auf dem Bildschirm, um das Gerät (Ding) zu registrieren. .. Sie werden aufgefordert, ein neues Zertifikat zu erstellen. Da Sie jedoch das zuvor erstellte Zertifikat verwenden, wählen Sie "Objekt ohne Zertifikat erstellen". --Klicken Sie im Untermenü oben rechts auf der zuvor unter "Sicherheit" erstellten Zertifikatkarte auf "Objekt anhängen" -> "Zertifikat", um das zuvor erstellte Gerät (Objekt) an das Zertifikat anzuhängen.

Damit sind die Einstellungen abgeschlossen, die für die Verbindung mit AWS IoT Core erforderlich sind.

Regeln erstellen

Konfigurieren Sie als Nächstes die Einstellungen für die Übertragung der von AWS IoT Core empfangenen Daten an AWS Lambda.

--Wählen Sie den AWS IoT Core-Dienst in der AWS Management Console aus, wählen Sie "ACT" -> "Regeln" -> "Regel erstellen" und befolgen Sie die Anweisungen auf dem Bildschirm, um eine Übertragungsregel zu erstellen.

AWS Lambda Wählen Sie in der AWS Management Console den Lambda-Service aus und definieren Sie die Lambda-Funktion, die von AWS IoT Core aufgerufen wird. Benachrichtigungen an Slack erstellen Textdaten im Format "payload =" + json.dumps (send_data)) und senden sie an die URL des eingehenden Webhooks.

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"]
    
    #Nachrichtenzusammensetzung
    if t < 0:
        message = "Die Wäsche ist trocken!"
    else:
        message = "nach%-Die Wäsche trocknet in 2i Minuten." % t
    
    send_data = {
        "username" : "dry_notice",
        "text" : message,
    }
    
    send_text = "payload=" + json.dumps(send_data)
    
    #Benachrichtigung zum Nachlassen
    request = urllib.request.Request(
        "URL von Slack's Incomming Webhook", 
        data=send_text.encode('utf-8'), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')
    

Slack Erstellen Sie ein Konto in Slack und fügen Sie einen beliebigen Kanal hinzu. Registrieren Sie danach den Incoming Webhook für den hinzugefügten Kanal.

Damit ist der Umgebungsaufbau auf der Serverseite abgeschlossen.

Umgebungskonstruktion (Gerät)

Hardware-Design

--Verwenden Sie ein Steckbrett, um den Raspberry Pi und jeden Teil von ① zu verkabeln. Für das Pin-Layout von RaspberryPi ist hier als Referenz leicht verständlich organisiert.

kairozu.PNG

Software-Design

Der Gesamtverarbeitungsablauf ist wie folgt.

#!/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="Protokolldateipfad",level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Init AWSIoTMQTTClient #・ ・ ・ 2
myAWSIoTMQTTClient = None
myAWSIoTMQTTClient = AWSIoTMQTTClient("AWS IoT Core-Name")
myAWSIoTMQTTClient.configureEndpoint("AWS IoT Core-Endpunkt-URL", 8883)
myAWSIoTMQTTClient.configureCredentials("Stammzertifikatspfad", "Privater Schlüsselpfad", "Pfad des Client-Zertifikats")

# 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 ist eine Bibliothek, die Temperatur- und Feuchtigkeitswerte von Sensoren erfasst. Es ist bei [GitHub] erhältlich (https://github.com/szazo/DHT11_Python).

  2. Konfigurieren des MQTT-Clients für die Verbindung mit AWS IoT Core. Legen Sie in jedem Fall den Inhalt fest, auf den im AWS Iot Core-Menü verwiesen wird. --Artikelname: Gerätename, registriert unter "Management" → "Item"

  1. Name des MQTT-Themas. topic_1 (Bedingung) ist ein Thema zum Posten von Sensorwerten wie Temperatur und Luftfeuchtigkeit, und topic_2 (Monitermode) ist ein Thema zum Posten des Monitorstatus.
  2. Überwachungseinstellungen des GPIO24, an den der Taktschalter angeschlossen ist. Durch Drücken des Schalters (Lo → Hi) wird die Funktion switch_on aktiviert. Die Funktion switch_on steuert die LED und initialisiert die Parameter. Der Monitorstatus wird in modeState gehalten und der Status (OFF / ON) wird bei jedem Drücken des Schalters geändert.
  3. Eine Verarbeitungseinheit, die die Trocknungszeit berechnet. Die Formel für die Trocknungszeit basiert auf dieser Website. v ist das Gewicht, wenn der Waschkorb mit Wäsche gefüllt ist (vor dem Trocknen - nach dem Trocknen → Wassergewicht), und delta_v ist das Gewicht des nach dem Starten des Schalters getrockneten Wassers.
  4. Poste zu topic_1, wenn die verbleibende Zeit (verbleibende_Zeit) (1) 10 Minuten oder weniger und (2) 0 Minuten oder weniger beträgt. Veröffentlichen Sie die folgenden Daten in topic_1.
Artikelname Inhalt
time Aktuelle Uhrzeit
temperature Temperatur (℃)
humidity Feuchtigkeit (%)
estimate_time Zeitaufwand für die Trocknung (Minuten)
remaining_time Verbleibende Zeit (Minuten)
notice Benachrichtigungsflag für Slack (1:0 benachrichtigen:Nicht benachrichtigen)

abschließend

Wenn ich Zeit habe, möchte ich eine Funktion zur Steuerung des Lüfters hinzufügen, um die Trocknungszeit als Verlängerungsfunktion zu verkürzen.

Recommended Posts

Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Verwenden einer Webkamera mit Raspberry Pi
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Bedienen Sie das Oszilloskop mit dem Raspberry Pi
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Machen wir einen Fahrradcomputer mit Raspberry Pi Zero (W, WH)
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Erstellen Sie einen Kanji-Kompass mit Raspberry Pi und Sense Hat
GPGPU mit Raspberry Pi
DigitalSignage mit Raspberry Pi
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
[Python + PHP] Erstellen Sie mit Raspberry Pi einen Temperatur-, Feuchtigkeits- und Druckmonitor
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Mutter pflanzt mit Raspberry Pi
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Machen Sie eine Lotterie mit Python
Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.
Ein Memorandum bei der Herstellung einer Überwachungskamera mit Raspeye
Machen Sie ein Feuer mit kdeplot
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Machen Sie einen in die Klimaanlage integrierten Personal Computer "airpi" mit Raspberry Pi 3!
Ich habe einen Ressourcenmonitor für Raspberry Pi mit einer Tabelle erstellt
getrpimodel: Erkennen Sie das Himbeer-Pi-Modell (A, B, B +, B2, B3 usw.) mit Python
Ich habe zum ersten Mal eine Überwachungskamera mit Raspberry PI gemacht.
[Raspberry Pi] Schrittmotorsteuerung mit Raspberry Pi
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Serielle Kommunikation mit Raspberry Pi + PySerial
Machen wir einen Blockbruch mit wxPython
Betriebssystem-Setup mit Raspberry Pi Imager
Aufbau eines VPN-Servers mit Raspberry Pie
Machen Sie einen Filter mit einer Django-Vorlage
Versuchen Sie, 3 Servos mit Raspeye zu bewegen
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine schöne Grafik mit Plotly
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Erstellen Sie mit Raspberry Pi + DHT11 ganz einfach einen TweetBot, der Sie über Temperatur und Luftfeuchtigkeit informiert.
Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Steuern Sie den Motor mit einem Motortreiber mit Python auf Raspberry Pi 3!
Ich habe mit Razpai einen Webserver erstellt, um Anime zu schauen
Machen Sie einen einfachen CO2-Inkubator mit Raspberry PI und CO2-Sensor (MH-Z14A)
Weihnachtsklassiker (?) Einen Weihnachtsbaum mit Raspberry Pi und Philips Hue anzünden
[Hinweis] Verwenden eines 16x2-stelligen LCD-Zeichens (1602A) von Python mit Raspeye
Machen wir ein IoT-Shirt mit Lambda, Kinesis, Raspberry Pi [Teil 1]
So laden Sie Dateien mit Python in den Cloud-Speicher hoch [Erstellen Sie mit Raspberry PI # 1 eine Festkommakamera]
Messen Sie die SIM-Signalstärke mit Raspberry Pi
Haustierüberwachung mit Rekognition und Raspberry pi
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
[Raspberry Pi] Fügen Sie ein Thermometer und ein Feuchtigkeitsmessgerät hinzu
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Versuchen Sie, mit Raspberry Pi nach Wakasagi zu fischen
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3