Dieser Artikel ist der Artikel zum 25. Tag von North Detail Adventskalender 2019.
Nachtrag 2020/04/02 Dieser Artikel wurde auch im NorthDetail-Blog veröffentlicht. https://www.northdetail.co.jp/blog/455/
Fröhliche Weihnachten! Der Adventskalender ist auch der letzte Weihnachtstag und Weihnachten ist eine Raspeltorte!
Am Ende des North Detail Adventskalenders 2019 möchte ich einen Mechanismus zur Steuerung der Lichter erstellen, die den Weihnachtsbaum mit Raspberry Pi beleuchten.
Klicken Sie hier, um das Video auf YouTube anzusehen.
Durch Schütteln des am Raspberry Pi angebrachten Sensors kann das Licht ein- und ausgeschaltet und die Helligkeit und der Farbton durch Kippen eingestellt werden.
Raspberry Pi
Es ist in Ordnung, wenn Sie etwas vorbereiten können, das eine Neigung usw. erkennen kann. Verwenden Sie dies diesmal.
Hue
Dieses Mal habe ich (endlich) das, was ich gekauft habe, als Set verwendet, als ich "Echo Show" gekauft habe.
Verwenden Sie eine Brücke, um Hue vom Raspberry Pi aus zu verbinden.
Da es sich bei der Bridge um einen Webserver handelt, können Sie die Kontrolle über Hue übernehmen, indem Sie eine HTTP-Anfrage vom Raspberry Pi an die Bridge senden.
Es ist eine übliche Vorsichtsmaßnahme für LED-Leuchten, unterscheidet sich jedoch hauptsächlich von Glühlampen in dem Teil, in dem Wärme vorhanden ist.
Glühlampen haben Wärme, die auf dem Filament des lichtemittierenden Teils zentriert ist, während LED-Lampen Wärme haben, die auf dem Sockelteil zentriert ist. Verwenden Sie daher bitte einen Ständer mit einer Struktur, die die Wärme um die Steckdose herum ordnungsgemäß ableitet.
Verwenden Sie zunächst die Smartphone-App, um das Licht auf der Brücke zu registrieren. Arbeiten Sie hier entsprechend der Verwendung der App.
Danach gehen wir davon aus, dass sich Bridge, Raspberry Pi und Work-PC alle im selben Netzwerk befinden.
Sie müssen die IP-Adresse kennen, da Sie HTTP-Anforderungen an die Bridge senden. Dies kann durch Zugriff auf die folgende Adresse erreicht werden, wenn die Brücke richtig eingestellt ist.
https://discovery.meethue.com/
[
{
id: "XXXXXXXXXXXXXXXX",
internalipaddress: "10.xxx.xxx.xxx"
}
]
Diese "interne IP-Adresse" ist die IP-Adresse des aktuell verbundenen Netzwerks. Machen wir uns eine Notiz.
Beim Betrieb von Raspberry Pi ist auf der Bridge eine eindeutige Benutzer-ID erforderlich. Wenn Sie nach dem Drücken der Schaltfläche (physisch) auf dem Bridge-Body eine HTTP-Anfrage in der folgenden Form stellen, wird "Benutzername" in die Antwort aufgenommen. Notieren Sie sich dies, da es in zukünftigen HTTP-Anforderungen verwendet wird.
Der Gerätetyp kann übrigens von Ihnen frei eingestellt werden.
POST http://`internalipaddress`/api
body: {"devicetype":"tacck_hue_app#raspi"}
response.json
[
{
"success": {
"username": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
}
]
Als nächstes erhalten Sie die ID des Lichts, das in der Brücke registriert ist, um das Licht zu betreiben.
GET http://`internalipaddress`/api/`username`/lights
response.json
{
"1":{"state":{"on":false,"bri":254,...}
}
Es werden viele Informationen zurückgegeben, aber die erste "1" ist die ID.
Werfen Sie die HTTP-Anfrage unten und das Licht sollte aufleuchten. (Wenn Sie "wahr" in "falsch" ändern, wird es ausgeschaltet.)
Ersetzen Sie "internalipaddress", "username" und "light_id" durch Ihre eigene.
PUT http://`internalipaddress`/api/`username`/lights/`light_id`/state
body: {"on":true}
Raspberry Pi
Als nächstes folgt die Einstellung auf der Raspberry Pi-Seite. Für Raspberry Pi wird davon ausgegangen, dass WLAN verfügbar ist, während Raspbian bereits ausgeführt wird. Außerdem wird davon ausgegangen, dass der Sensor (ADRSZGR) bereits mit dem Raspberry Pi-Hauptgerät verbunden ist.
Überprüfen Sie zunächst, ob Sie den Sensorwert erhalten können. Hier wird der Basisquellcode bereitgestellt, also verwenden wir ihn.
Basiscode https://github.com/bit-trade-one/RasPi-Zero-One-Series/tree/master/3rd/ADRSZGR_9-Axis_Gyro
Lassen Sie es uns auf dem Raspberry Pi ausführen.
$ git clone https://github.com/bit-trade-one/RasPi-Zero-One-Series.git
$ cd RasPi-Zero-One-Series/3rd/ADRSZGR_9-Axis_Gyro
$ python3 ADRSZGR_Sample.py
Bewegen Sie den Sensor 10 Sekunden lang nicht
1 Sekunde übrig
Kalibrierung beendet
X:-0.045608688186813184 Y:0.7310804429945055 Z:-4.547119140625
2.7179718017578125e-05,0.01416015625,0.0185546875,1.0087890625,-0.045608688186813184,-0.12341174450549453,-0.152587890625,-14.843956043956045,6.447374847374848,-1.6493284493284492,
0.05398225784301758,0.0126953125,0.01513671875,1.00927734375,0.13749678056318682,0.059693724244505475,-0.213623046875,-16.193406593406593,6.297435897435897,-0.8996336996336997,
(Da es unten weitergeht, Strg an einer geeigneten Stelle+Bei C. ausgesetzt)
Wenn der Wert so ausgegeben wird, ist er in Ordnung, da sich der Sensor bewegt.
Lassen Sie es uns nun implementieren, um die Sensorwerte zu verwenden, um die Lichter von Hue zu manipulieren.
Die Basis GYRO.py
steuert den gesamten Sensor, sodass Sie nur über die Verwendung der Werte nachdenken müssen.
Dieses Mal werden wir es mit einem Design implementieren, das sich beim Schütteln des Sensors ein- und ausschaltet und sich beim Neigen in Helligkeit und Farbton ändert.
Kopieren Sie die in der vorherigen Bestätigung verwendete ADRSZGR_Sample.py
als index.py
und verwenden Sie diese.
Da ich normalerweise kein Python schreibe, werde ich es implementieren und dabei auf das Einrückungstal achten [^ 1].
[^ 1]: Es ist mein geprägtes Wort. https://speakerdeck.com/tacck/phpergawen-kitaipythonfalseikutukafalsekoto-pycon-mini-sapporo-2019-number-pyconsap?slide=18
Ich nahm verschiedene Anpassungen vor und entschied mich für den folgenden Code.
.
├── GYRO.py
└── index.py
index.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import signal
import requests
import time
import GYRO
GYR_THRESHOLD = 200.0
HUE_BRI_MIN = 0
HUE_BRI_MAX = 254
HUE_BRI_HALF = round((HUE_BRI_MAX - HUE_BRI_MIN + 1) / 2)
HUE_CT_MIN = 153
HUE_CT_MAX = 454
HUE_CT_HALF = round((HUE_CT_MAX - HUE_CT_MIN + 1) / 2)
HUE_API = 'http://`internalipaddress`/api/`username`/lights'
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
gyro = GYRO.GYRO()
time.sleep(0.1)
gyro.sensor_calib()
#Beleuchtungszustand der Beleuchtung
light_on = False
prev_light_on = light_on
light_bri = HUE_BRI_MIN + HUE_BRI_HALF
light_ct = HUE_CT_MIN + HUE_CT_HALF
while True:
#Sensorwerte lesen und in erforderlichen Variablen speichern
values = gyro.get_sense_value()
axs_x = values[0]
axs_y = values[1]
# axs_z = values[2]
# print('{0:4.2f}'.format(axs_x), end=",")
# print('{0:4.2f}'.format(axs_y), end=",")
# print('{0:4.2f}'.format(axs_z), end=",")
# gyr_x = values[3]
# gyr_y = values[4]
gyr_z = values[5]
# print('{0:4.2f}'.format(gyr_x), end=",")
# print('{0:4.2f}'.format(gyr_y), end=",")
# print('{0:4.2f}'.format(gyr_z), end=",")
#Ändern Sie den Farbton von der Neigung der X-Achse
light_ct += axs_x * HUE_CT_HALF
if light_ct < HUE_CT_MIN:
light_ct = HUE_CT_MIN
if light_ct > HUE_CT_MAX:
light_ct = HUE_CT_MAX
#Ändern Sie die Helligkeit von der Neigung der Y-Achse
light_bri += axs_y * HUE_CT_HALF
if light_bri < HUE_BRI_MIN:
light_bri = HUE_BRI_MIN
if light_bri > HUE_BRI_MAX:
light_bri = HUE_BRI_MAX
#Schalten Sie die Beleuchtung ein, wenn die Winkelgeschwindigkeit in Z-Richtung den Schwellenwert überschreitet/Steuerung AUS
if gyr_z < -GYR_THRESHOLD:
light_on = not light_on
#Nach Hue werfen
if prev_light_on != light_on or light_on:
requests.put(HUE_API + '/`light_id`/state', json = {"on": light_on, "bri": round(light_bri), "ct": round(light_ct)})
# ON/AUS-Bestätigungsprotokoll
if prev_light_on != light_on:
print ('lignht_on:', light_on)
prev_light_on = light_on
time.sleep(0.10)
Das Ergebnis der Ausführung ist das Video am Anfang. In diesem Sinne schauen Sie bitte noch einmal.
Dieses Mal wird es alle 0,1 Sekunden ausgelöst, aber bitte übernehmen Sie die Verantwortung für die Belastung des Netzwerks und der Bridge.
Wenn Sie es auf verschiedene Arten kombinieren, können Sie die Beleuchtung im Raum frei steuern. Das Ausrichten der Hausbeleuchtung mit der Hue-Serie kann viel Spaß machen.