Projekt:Konferenzraumuhr: Unterschied zwischen den Versionen

Weitergemacht
(Anfang)
 
(Weitergemacht)
Zeile 40: Zeile 40:


== 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>: 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. Das passiert mehrfach. Mit einer Geradengleichung wird aus den kumulierten ADC-Werten ein Temperaturwert errechnet, der dann zu Thingspeak und Nyu gesendet wird und so. z.B. in unserem Telegram-Chat verfügbar ist..  
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>.  


= Ansprechpartner =
= Ansprechpartner =
Zeile 55: Zeile 55:


== Anzeige ==
== Anzeige ==
Ein LED-Strip mit 16 LEDs mit integrierten LEDs mit WS2812-Controller wird als Anzeige verwendet.
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 ==
== 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.


== 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.


== ZweckNetzWerk ==
== 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 erhält die Temperaturmessung per HTTP GET Request in der Form ''http://serveradresse/token?temperatur=messwert''


== TürAmp Interface ==
== 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.


= Finanzierung =
= Finanzierung =
Zeile 75: Zeile 86:
= Benötigte Teile =
= Benötigte Teile =


= To-do =
* 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" ?


= Projekttagebuch =
= Projekttagebuch =
= Quellcode =
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
mitglieder, vorstand
1.617

Bearbeitungen