Projekt:Konferenzraumuhr: Unterschied zwischen den Versionen

Aus Schaffenburg
Zur Navigation springen Zur Suche springen
(Weitergemacht)
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 4: Zeile 4:
|beschreibung = Zeigt die Zeit im Konferenzraum an
|beschreibung = Zeigt die Zeit im Konferenzraum an
|autor          = [[Benutzer:Dg3hda|Hendrik]]
|autor          = [[Benutzer:Dg3hda|Hendrik]]
|image          =  
|owner          = Dg3hda
|image          = Naked konfiuhr.jpg
|imagesize      =240
|imagesize      =240
}}  
}}  


'''Gesucht: Netter, freundlicher Frontplattengestalter! Bitte bei Ansprechpartnern melden!'''


= Übersicht =
= Übersicht =
Zeile 14: Zeile 16:
== Uhrzeitanzeige ==
== Uhrzeitanzeige ==
Die Uhrzeit wird durch einen LED-Strip dargestellt. Der hat einen Gesamtumfang von 16 LEDs, wovon die hintersten 14 für die BCD-Darstellung der aktuellen Uhrzeit genutzt werden.  
Die Uhrzeit wird durch einen LED-Strip dargestellt. Der hat einen Gesamtumfang von 16 LEDs, wovon die hintersten 14 für die BCD-Darstellung der aktuellen Uhrzeit genutzt werden.  
Gesetzte Bits leuchten weiß, nicht gesetzte grün.
Gesetzte Bits leuchten weiß, nicht gesetzte grün. Das Vorschaubild zeigt also '''21:21'''.
Die beiden ersten Bit, die bei der Darstellung der Stunden nicht benötigt werden, dienen anderen Zwecken - so sparsam sind wir. =) Die Uhrzeit wird aus dem Internet per NTP bezogen, wenn wir keinen kriegen (DSL-Ausfall oder so) zeigt es halt nix.  
Die beiden ersten Bit, die bei der Darstellung der Stunden nicht benötigt werden, dienen anderen Zwecken - so sparsam sind wir. =) Die Uhrzeit wird aus dem Internet per NTP bezogen, wenn wir keinen kriegen (DSL-Ausfall oder so) zeigt es halt nix.  
Die LEDs sind nur bei Spacestatus "offen" aktiv und werden bei verschlossenem Space abgeschaltet. Das passiert mit einer gewissen Latenz.
   
   
=== Ablesehilfe ===
=== Ablesehilfe ===
Die Anzeige ist in 4 Nibble aufgeteilt, mit dem höchsten Wert jeweils rechts. Die Lesefolge ist also HH:MM.
Pro Ziffer sind bei den weißen LEDs die im Feld "Wert" stehenden Zahlen zu addieren um den Wert der Ziffer zu erhalten.  
Pro Ziffer sind bei den weißen LEDs die im Feld "Wert" stehenden Zahlen zu addieren um den Wert der Ziffer zu erhalten.  


Zeile 35: Zeile 37:
|}
|}


== Türklingelweiterleitung ==
== Internet-Überwachung ==
 
Die Uhr ist ein Client im WLAN "Schaffenburg e.V." und sendet regelmäßig abfragen an einen Server außerhalb. Während der Abfrage leuchtet die 1. LED rot und wird grün, wenn die Abfrage beantwortet wird. So erkennt man am kurzen roten aufblitzen der LED ob sie läuft und wenns grün leuchtet das der Link zwischen WLAN und Internet steht. [[Benutzer:Panky9|Flo vom NOC]] bereitet gerade eine Nagios-Alarmierung vor so daß er eine Alarmierungsemail erhält wenn sich die Uhr nicht mehr meldet.
Die Türklingel ist im Konferenzraum nicht zu hören - darum sitz dort ein weiterer Controller der zwar grundsätzlich sein eigenes Ding macht, aber auch auf eine piepsende Türklingel reagieren soll (Geräuschschalter derzeit defekt.) Per WLAN wird bei Erkennung eines Klingelsignals eine Nachricht an die Konferenzraumuhr gesendet, bei deren Empfang sie weiß blinkt und in Morsetelegraphie ein "D" (—··)  - für Door piepst. Wenige Sekunden danach geht es wieder in den Regelbetrieb.  


== Raumtemperatur-Telemetrie ==
== Raumtemperatur-Telemetrie ==
Die Uhr misst periodisch die Raumtemperatur und sendet diese zu Nyu, unserem Telegram-Bot, [https://thingspeak.com/channels/315791/charts/2?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=60&title=Temperatursensor+in+Konferenzraum&type=line&xaxis=Zeit&yaxis=Temperatur+%5B%C2%B0C%5D Thingspeak] und hoffentlich bald zur Website. Der Sensor ist furchtbar improvisiert<small><sup>TM</sup></small>.  
Die Uhr misst periodisch die Raumtemperatur und sendet diese zu Nyu, unserem Telegram-Bot, [https://thingspeak.com/channels/315791/charts/2?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=60&title=Temperatursensor+in+Konferenzraum&type=line&xaxis=Zeit&yaxis=Temperatur+%5B%C2%B0C%5D Thingspeak] und hoffentlich bald zur Website. Der Sensor ist furchtbar improvisiert<small><sup>TM</sup></small>, besteht aus 2 BE-Strecken von Transistoren deren Vorwärtsspannung vom ADC des Controllers gemessen wird (Stromversorgung durch Vorwiderstand).  


= Ansprechpartner =
= Ansprechpartner =
* [[Benutzer:Dg3hda|Hendrik]]
* [[Benutzer:Dg3hda|Hendrik]]
* Paul
* [[Benutzer:VinRisen360|Paul]]


= Beschreibung =
= Beschreibung =


== Zentralrechner ==
== Zentralrechner ==
ESP8266
ESP8266, in unserem Fall auf AMICA-Board. '''Wichtig: Die serielle Datenleitung gleich am ESP8266-Modul mit einem Widerstand von 1k abschließen, das verringert EMV-Probleme!'''


== Stromversorgung ==
== Stromversorgung ==
Zeile 58: Zeile 59:


== Temperatursensor ==
== Temperatursensor ==
Zwei in Transistoren werden mit Ihren  Basis-Emitter-Strecken in Serie verschaltet und der temperaturabhängige Spannungsabfall über diese vom ADC gemessen, während über einen Vorwiderstand was von den 3.3V Versorgungsspannung abgeleitet ein Strom durchfließt. Normal würde einer reichen, aber mit zweien nutze ich den Arbeitsbereich des AD-Wandler besser aus. Pro BE-Strecke darf man ca. -1,4 mV pro Kelvin Spannungsänderung erwarten. Das messen passiert mehrfach. Mit einer Geradengleichung wird aus den kumulierten ADC-Werten ein Temperaturwert errechnet, die Funktion wurde ermittelt durch Messung der AD-Wandlerwerte bei zwei unterschiedlichen Temperaturen.  Der Meßwert der Temperatur wird dann zu Thingspeak und Nyu gesendet wird und so. z.B. in unserem Telegram-Chat verfügbar.  
Zwei in Transistoren werden mit Ihren  Basis-Emitter-Strecken in Serie verschaltet und der temperaturabhängige Spannungsabfall über diese vom ADC gemessen, während über einen Vorwiderstand was von den 3.3V Versorgungsspannung abgeleitet ein Strom durchfließt. Normal würde einer reichen, aber mit zweien nutze ich den Arbeitsbereich des AD-Wandler besser aus. Pro BE-Strecke darf man ca. -1,4 mV pro Kelvin Spannungsänderung erwarten. Das messen passiert mehrfach. Mit einer Geradengleichung wird aus den kumulierten ADC-Werten ein Temperaturwert errechnet, die Funktion wurde ermittelt durch Messung der AD-Wandlerwerte bei zwei unterschiedlichen Temperaturen.  Der Meßwert der Temperatur wird dann zu Thingspeak und Nyu gesendet wird und so. z.B. in unserem Telegram-Chat verfügbar.
 
Als Beispiel hier ein Diagramm der über den Jahreswechsel 2017/2018 geloggten Temperaturen:
[[:File:heizung.svg]]


== Audio ==
== Audio ==
Über einen GPIO-Pin kann man einen kleinen Lautsprecher tröten lassen. Dieser ist so ins Gehäuse integriert das er in eine Art Horn-Kanal reintrötet, wodurch er lauter wirkt. Wird derzeit nur genutzt um bei Türklingelmeldung ein Morse-D wiederzugeben.
Über einen GPIO-Pin kann man einen kleinen Lautsprecher tröten lassen. Dieser ist so ins Gehäuse integriert das er in eine Art Horn-Kanal reintrötet, wodurch er lauter wirkt. Derzeit ungenutztes feature
 
== ZweckNetzWerk ==
 
Die Uhr ist Teilnehmer eines für Sensoren und Aktoren reservierten WLAN und kein weiterer Zugriff vorgesehen. Hierüber wird beispielsweise die NTP-Uhrzeit abgefragt und per HTTP GET die Temperaturen zu den Abnehmern gepusht.


== Nyu push ==
== Nyu push ==
 
Der Telegram-Bot "Nyu" erhält die Temperaturmessung per HTTP GET Request . [[Benutzer:VinRisen360|Paul]] integrierte dort ein Kommando, das man durch Eingabe von "/howhotisit" im Chat die Temperatur mit Timestamp abrufen kann.
Der Telegram-Bot erhält die Temperaturmessung per HTTP GET Request in der Form ''http://serveradresse/token?temperatur=messwert''
 
== TürAmp Interface ==
Das blinken mit akustischer Ausgabe eines Morse-D, welches zur Signalisierung der Türklingel dienen soll, wird durch einen HTTP GET Request der Form "http://uhradresse/msg?kommando=wert" ausgeführt, der vom Türsensor-Controller an die Uhr gesendet wird.
Im Gegenzug sendet die Uhr in regelmäßigen einen anderen Request zum Türcontroller, den dieser mit der richtigen Meldung beantworten muss.
Bleibt diese Meldung aus wird von einem Kommunikationsverlust oder Absturz des Türcontroller ausgegangen und die erste LED im Strip schaltet auf rot. Stimmt die Antwort, ist die aus.
 


== Gehäuse ==
== Gehäuse ==
Besteht aus einer Grundplatte auf die ein paar Holzleisten geleimt sind. Es fehlt derzeit noch eine Frontplatte, die an den Positionen der LEDs durchscheinend oder durchsichtig sein muss.
Besteht aus einer Grundplatte auf die ein paar Holzleisten geleimt sind. Es fehlt derzeit noch eine Frontplatte, die an den Positionen der LEDs durchscheinend oder durchsichtig sein muss. Vorgesehen ist ein mit doppelseitigem Klebeband befestigtes einlaminiertes Papier.
 
 
= Finanzierung =
 


= Benötigte Teile =
= Benötigte Teile =
Zeile 89: Zeile 78:


* Code aufräumen. Timer-Wiederholrate derzeit 3 Sekunden/Aufruf statt 1. Portierung zu effizienterer Sprache? Helfer Willkommen!
* Code aufräumen. Timer-Wiederholrate derzeit 3 Sekunden/Aufruf statt 1. Portierung zu effizienterer Sprache? Helfer Willkommen!
* Statusmeldung verwenden um bei geschlossenem Space LEDs auszuschalten →Stromersparnis
* Andere Parameter messen - z.B. Anwesenheit trotz "Space closed" ?
* Andere Parameter messen - z.B. Anwesenheit trotz "Space closed" ?


= Projekttagebuch =
= Projekttagebuch =


 
= Quellcode =
= Quellcode =  
Würde öffnen.
 
msgbranch [message]
neo.stripcolor(0,13,0,0,5)
delay 7000
neo.stripcolor(0,13,0,0,0)
time.setup(2,1,"pool.ntp.org")
mytime=""
timercb 3000, [drawClock]
door=0
drawcount=59
wait
 
[message]
timercb 0, [drawClock]
pwmfreq 800
RetMsg = "0"
msgcmd=msgget("klingelkey")
if msgcmd="geheimnis" then
  for n=1 to 3
  neo.stripcolor(0,15,64,64,64) 
  gosub [morsed]
  neo.stripcolor(0,15,0,0,0)
  zeit=millis()
  do
  loop until millis()>(zeit+250)
  next
  door=30
  RetMsg="1"
  endif
timercb 3000, [drawClock]
MsgReturn RetMsg
wait
 
[drawClock]
timercb 0, [drawClock]
drawcount=drawcount+1
gosub [aquireandpost]
gosub [dotime]
gosub [drawm2]
gosub [drawm1]
gosub [drawh2]
gosub [drawh1]
gosub [drawflags]
if drawcount > 10 then
drawcount=0
gosub [minuteservice]
end if
timercb 1000, [drawClock]
wait
 
[drawh1]
my=myh1
if my="0" then
neo(12,0,5,0)
neo(13,0,5,0)
endif
if my="1" then
neo(12,20,20,20)
neo(13,0,5,0)
endif
if my="2" then
neo(12,0,5,0)
neo(13,20,20,20)
endif
return
 
[drawh2]
my=myh2
if my="0" then
neo(8,0,5,0)
neo(9,0,5,0)
neo(10,0,5,0)
neo(11,0,5,0)
endif
if my="1" then
neo(8,20,20,20)
neo(9,0,5,0)
neo(10,0,5,0)
neo(11,0,5,0)
endif
if my="2" then
neo(8,0,5,0)
neo(9,20,20,20)
neo(10,0,5,0)
neo(11,0,5,0)
endif
if my="3" then
neo(8,20,20,20)
neo(9,20,20,20)
neo(10,0,5,0)
neo(11,0,5,0)
endif
if my="4" then
neo(8,0,5,0)
neo(9,0,5,0)
neo(10,20,20,20)
neo(11,0,5,0)
endif
if my="5" then
neo(8,20,20,20)
neo(9,0,5,0)
neo(10,20,20,20)
neo(11,0,5,0)
endif
if my="6" then
neo(8,0,5,0)
neo(9,20,20,20)
neo(10,20,20,20)
neo(11,0,5,0)
endif
if my="7" then
neo(8,20,20,20)
neo(9,20,20,20)
neo(10,20,20,20)
neo(11,0,5,0)
endif
if my="8" then
neo(8,0,5,0)
neo(9,0,5,0)
neo(10,0,5,0)
neo(11,20,20,20)
endif
if my="9" then
neo(8,20,20,20)
neo(9,0,5,0)
neo(10,0,5,0)
neo(11,20,20,20)
endif
return
 
 
 
[drawm1]
my=mym1
if my="0" then
neo(4,0,5,0)
neo(5,0,5,0)
neo(6,0,5,0)
neo(7,0,5,0)
endif
if my="1" then
neo(4,20,20,20)
neo(5,0,5,0)
neo(6,0,5,0)
neo(7,0,5,0)
endif
if my="2" then
neo(4,0,5,0)
neo(5,20,20,20)
neo(6,0,5,0)
neo(7,0,5,0)
endif
if my="3" then
neo(4,20,20,20)
neo(5,20,20,20)
neo(6,0,5,0)
neo(7,0,5,0)
endif
if my="4" then
neo(4,0,5,0)
neo(5,0,5,0)
neo(6,20,20,20)
neo(7,0,5,0)
endif
if my="5" then
neo(4,20,20,20)
neo(5,0,5,0)
neo(6,20,20,20)
neo(7,0,5,0)
endif
if my="6" then
neo(4,0,5,0)
neo(5,20,20,20)
neo(6,20,20,20)
neo(7,0,5,0)
endif
if my="7" then
neo(4,20,20,20)
neo(5,20,20,20)
neo(6,20,20,20)
neo(7,0,5,0)
endif
if my="8" then
neo(4,0,5,0)
neo(5,0,5,0)
neo(6,0,5,0)
neo(7,20,20,20)
endif
if my="9" then
neo(4,20,20,20)
neo(5,0,5,0)
neo(6,0,5,0)
neo(7,20,20,20)
endif
return
 
 
[drawm2]
my=mym2
if my="0" then
neo(0,0,5,0)
neo(1,0,5,0)
neo(2,0,5,0)
neo(3,0,5,0)
endif
if my="1" then
neo(0,20,20,20)
neo(1,0,5,0)
neo(2,0,5,0)
neo(3,0,5,0)
endif
if my="2" then
neo(0,0,5,0)
neo(1,20,20,20)
neo(2,0,5,0)
neo(3,0,5,0)
endif
if my="3" then
neo(0,20,20,20)
neo(1,20,20,20)
neo(2,0,5,0)
neo(3,0,5,0)
endif
if my="4" then
neo(0,0,5,0)
neo(1,0,5,0)
neo(2,20,20,20)
neo(3,0,5,0)
endif
if my="5" then
neo(0,20,20,20)
neo(1,0,5,0)
neo(2,20,20,20)
neo(3,0,5,0)
endif
if my="6" then
neo(0,0,5,0)
neo(1,20,20,20)
neo(2,20,20,20)
neo(3,0,5,0)
endif
if my="7" then
neo(0,20,20,20)
neo(1,20,20,20)
neo(2,20,20,20)
neo(3,0,5,0)
endif
if my="8" then
neo(0,0,5,0)
neo(1,0,5,0)
neo(2,20,20,20)
neo(3,0,5,0)
endif
if my="9" then
neo(0,20,20,20)
neo(1,0,5,0)
neo(2,20,20,20)
neo(3,0,5,0)
endif
return
 
[dotime]
io(pwo,4,0)
mytime = time()
myh1 = mid(mytime,12,1)
myh2 = mid(mytime,13,1)
mym1 = mid(mytime,15,1)
mym2 = mid(mytime,16,1)
return
 
[drawflags]
end if
if alive<>"+" then
  neo(15,5,0,0)
end if
if alive="+" then
  neo(15,0,door,0)
endif
return
 
[morsed]
  io(pwo,4,256)
  zeit=millis()
  do
  loop until millis()>(zeit+300)
  io(pwo,4,0)
  zeit=millis()
  do
  loop until millis()>(zeit+100)
  io(pwo,4,256)
  zeit=millis()
  do
  loop until millis()>(zeit+100)
  io(pwo,4,0)
  zeit=millis()
  do
  loop until millis()>(zeit+100)
  io(pwo,4,256)
  zeit=millis()
  do
  loop until millis()>(zeit+100)
  io(pwo,4,0)
  zeit=millis()
  do
  loop until millis()>(zeit+300)
  return
 
[aquireandpost]
tempcount=tempcount+1
vt=io(ai) 
tempsum=tempsum+vt
if tempcount=60 then
tscount=tscount+1
tempsum=  -47/5120*tempsum + 1230537/5120
tempsum=tempsum-2
if tscount=1 then
io(po,16,0)
sendts("thingspeakkey","2",str(tempsum))
nyutemp=str(tempsum)
nyumessage = "adresse/service=" & nyutemp
nubsi=wget(nyumessage,80)
io(po,16,1)
tscount=0
end if
tempcount=0
tempsum=0
end if
return
 
[minuteservice]
wprint "m"
alive=wget("esp-doorbell/msg?")
wprint alive
nubsi=wget("status.schaffenburg.org/")
wprint nubsi
return

Aktuelle Version vom 6. Januar 2019, 17:06 Uhr

Crystal Clear action run.png
Konferenzraumuhr

Status: stable

Naked konfiuhr.jpg
Beschreibung Zeigt die Zeit im Konferenzraum an
Ansprechpartner Hendrik


Gesucht: Netter, freundlicher Frontplattengestalter! Bitte bei Ansprechpartnern melden!

Übersicht

Bei der Konferenzraumuhr handelt es sich selbstverständlich um eine Uhr für den Schaffenburg-Konferenzraum. Sie ist eine Ableitung der WLAN-nutzenden SchaffenUhr mit ein paar spacebezogenen Features.

Uhrzeitanzeige

Die Uhrzeit wird durch einen LED-Strip dargestellt. Der hat einen Gesamtumfang von 16 LEDs, wovon die hintersten 14 für die BCD-Darstellung der aktuellen Uhrzeit genutzt werden. Gesetzte Bits leuchten weiß, nicht gesetzte grün. Das Vorschaubild zeigt also 21:21. Die beiden ersten Bit, die bei der Darstellung der Stunden nicht benötigt werden, dienen anderen Zwecken - so sparsam sind wir. =) Die Uhrzeit wird aus dem Internet per NTP bezogen, wenn wir keinen kriegen (DSL-Ausfall oder so) zeigt es halt nix. Die LEDs sind nur bei Spacestatus "offen" aktiv und werden bei verschlossenem Space abgeschaltet. Das passiert mit einer gewissen Latenz.

Ablesehilfe

Pro Ziffer sind bei den weißen LEDs die im Feld "Wert" stehenden Zahlen zu addieren um den Wert der Ziffer zu erhalten.

Die folgende Tabelle hilft die LED-Zeile zu lesen:

LED Nr. 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Dezimalstelle 2 1 8 4 2 1 8 4 2 1 8 4 2 1
Element 1. Stelle Stunde 2. Stelle Stunde 1. Stelle Minute 2. Stelle Minute

Internet-Überwachung

Die Uhr ist ein Client im WLAN "Schaffenburg e.V." und sendet regelmäßig abfragen an einen Server außerhalb. Während der Abfrage leuchtet die 1. LED rot und wird grün, wenn die Abfrage beantwortet wird. So erkennt man am kurzen roten aufblitzen der LED ob sie läuft und wenns grün leuchtet das der Link zwischen WLAN und Internet steht. Flo vom NOC bereitet gerade eine Nagios-Alarmierung vor so daß er eine Alarmierungsemail erhält wenn sich die Uhr nicht mehr meldet.

Raumtemperatur-Telemetrie

Die Uhr misst periodisch die Raumtemperatur und sendet diese zu Nyu, unserem Telegram-Bot, Thingspeak und hoffentlich bald zur Website. Der Sensor ist furchtbar improvisiertTM, besteht aus 2 BE-Strecken von Transistoren deren Vorwärtsspannung vom ADC des Controllers gemessen wird (Stromversorgung durch Vorwiderstand).

Ansprechpartner

Beschreibung

Zentralrechner

ESP8266, in unserem Fall auf AMICA-Board. Wichtig: Die serielle Datenleitung gleich am ESP8266-Modul mit einem Widerstand von 1k abschließen, das verringert EMV-Probleme!

Stromversorgung

Versorgt wird das ganze ganz klassisch aus einem stinknormalen USB-Netzteil. Noch.

Anzeige

Ein LED-Strip mit 16 LEDs mit integrierten LEDs mit WS2812-Controller wird als Anzeige verwendet. Die braucht nur Stromversorgung und einen Datenpin des Zentralrechner über den als serielles Protokoll die Helligkeitswerte übertragen werden. Die LEDs sind insofern selbstorganisierend das sie jeweils "Ihr" Datenpaket abschneidet, wodurch danach nurnoch Daten für die jeweils folgenden LED da sind.

Temperatursensor

Zwei in Transistoren werden mit Ihren Basis-Emitter-Strecken in Serie verschaltet und der temperaturabhängige Spannungsabfall über diese vom ADC gemessen, während über einen Vorwiderstand was von den 3.3V Versorgungsspannung abgeleitet ein Strom durchfließt. Normal würde einer reichen, aber mit zweien nutze ich den Arbeitsbereich des AD-Wandler besser aus. Pro BE-Strecke darf man ca. -1,4 mV pro Kelvin Spannungsänderung erwarten. Das messen passiert mehrfach. Mit einer Geradengleichung wird aus den kumulierten ADC-Werten ein Temperaturwert errechnet, die Funktion wurde ermittelt durch Messung der AD-Wandlerwerte bei zwei unterschiedlichen Temperaturen. Der Meßwert der Temperatur wird dann zu Thingspeak und Nyu gesendet wird und so. z.B. in unserem Telegram-Chat verfügbar.

Als Beispiel hier ein Diagramm der über den Jahreswechsel 2017/2018 geloggten Temperaturen: File:heizung.svg

Audio

Über einen GPIO-Pin kann man einen kleinen Lautsprecher tröten lassen. Dieser ist so ins Gehäuse integriert das er in eine Art Horn-Kanal reintrötet, wodurch er lauter wirkt. Derzeit ungenutztes feature

Nyu push

Der Telegram-Bot "Nyu" erhält die Temperaturmessung per HTTP GET Request . Paul integrierte dort ein Kommando, das man durch Eingabe von "/howhotisit" im Chat die Temperatur mit Timestamp abrufen kann.

Gehäuse

Besteht aus einer Grundplatte auf die ein paar Holzleisten geleimt sind. Es fehlt derzeit noch eine Frontplatte, die an den Positionen der LEDs durchscheinend oder durchsichtig sein muss. Vorgesehen ist ein mit doppelseitigem Klebeband befestigtes einlaminiertes Papier.

Benötigte Teile

To-do

  • Code aufräumen. Timer-Wiederholrate derzeit 3 Sekunden/Aufruf statt 1. Portierung zu effizienterer Sprache? Helfer Willkommen!
  • Andere Parameter messen - z.B. Anwesenheit trotz "Space closed" ?

Projekttagebuch

Quellcode

Würde öffnen.