Ultraschallsensor HC-SR04
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 41397
Der nächste Sensor, den ich mir angesehen habe, ist ein Sensor zur Messung von Entfernungen mit HIlfe von Ultraschall. Es ist ein kleines Board mit der Bezeichnung HC-SR04.
Der Prinzip der Messung ist recht einfach: Es wird ein Ultraschall-Signal gesendet (40 kHz Ultraschall, ein Burst von ca. 200 Mikrosekunden Dauer, ausgelöst durch ein HIGH (mindestens 10 Mikrosekunden) am 'Trigger'-Eingang). Danach geht der 'Echo'-Pin auf HIGH und nach dem Eintreffen eines Echos (falls es denn ankommt) wird wieder auf LOW geschaltet. Die Zeit wird gemessen, durch zwei geteilt (die Strecke muss der Schall in beide Richtungen passieren) und wieder geteilt durch 29 (Entfernung in cm, die Ultraschal in einer Mikrosekunde zurücklegt). Das Egebnis ist die ungefähre Entfernung in cm.
Die Genaugkeit soll ca. 0,3 cm betragen, der Messbereich liegt laut Dokumentation bei 2 bis 400-500 cm. Mein Exemplar schafft jedoch nur etwas über drei Meter, danach werden die Rückgabewerte instabil oder das Echo bleibt ganz aus. In letztem Fall geht der 'Echo'-Ausgang nach 200ms auch auf LOW und zeigt dadurch eine erfolglose Messung an. Nach der Messung benötigt der Sensor eine Pause von ca. 20 Mikrosekunden. Die besten Messergebnisse ergeben sich bei Reflektion an glatten, ebenen Flächen. Bei Distanzen bis 1m ist das Material der Fläche recht unkritisch. Der Winkel zum Objekt kann bei kurzen Distanzen von unter 1m bis etwa 45° betragen. Auch recht dünne Objekte werden zuverlässig erkannt.
Die Betriebsspannung beträgt 5V, die Stromaufnahme liegt bei ca. 15mA.
Im einfachsten Fall sieht die Ansteuerung etwa folgendermaßen aus:
int TrigPin = 11; int EchoPin = 10;
void setup() { Serial.begin(9600); pinMode(TrigPin,OUTPUT); pinMode(EchoPin,INPUT); }
void loop() { int distance, duration; digitalWrite(TrigPin,HIGH); delayMicroseconds(11); digitalWrite(TrigPin,LOW); duration = pulseIn(EchoPin, HIGH); // In cm umrechnen. Schalgeschwindigkeit ist 340 m/s oder 29 Microseconden per cm. duration = duration/29/2; Serial.print(duration); Serial.print("cm"); Serial.println(); delay(1000);
(s.a http://playground.arduino.cc/Main/UltrasonicSensor)
Bei der Suche nach Beispielen habe ich auch eine bessere Alternative zum 'alles selbst machen' gefunden. Unter http://code.google.com/p/arduino-new-ping/ kann eine bequemm zu benutzende Bibliothek heruntergeladen werden. Sie bietet u.a. die Möglichkeit, ein Durchschnittswert mehreren Messungen zu ermitteln. Dadurch werden kleine Abweichungen und Zufallsfehler weitgehens 'herausgerechnet'.
Auf dieser Basis habe ich ein Sketch für ein LCD-Entfernungsmesser entwickelt.
/* * Sonar_LCD * * Version 1.0 * Datum: 12.08.2013 * * Das Programm benutzt den Ultraschallmodull HC-SR04 um Entfernungen zu messen. * Die gemessene Entfernung wird auf einem per I2C angeschlossenen LCD angezeigt. * * Verdrahtung (UNO, Nano...) * * HC-SR04: * Sensor Trig pin an pin 11 * Sensor Echo pin an pin 10 * Sensor VDD pin an 5V * Sensor GND pin an GND * * LCD wird per I2C-Modul an I2C Bus (A4, A5) angeschlosen. * * Copyright (c) 2013 Alexander Schulz. All right reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include #include <LiquidCrystal_I2C.h> #include // Setup LCD-Shield LiquidCrystal_I2C lcd(0x20,16,2); // I2C Addresse: 0x20 LCD: 16x2 #define TRIGGER_PIN 11 // Arduino-Pin verbunden mit dem Trigger-Pin des Ultraschall-Sensors. #define ECHO_PIN 10 // Arduino-Pin verbunden mit dem Echo-Pin des Ultraschall-Sensors. #define MAX_DISTANCE 500 // Mxaimale beabsichtigte Entfernung (in cm). Der Sensor liefert max. ca. 400-500cm. // NewPing setup NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup void setup() { // Display initialisieren lcd.init(); lcd.backlight(); lcd.home(); lcd.print("Sonar v1.0"); lcd.setCursor(0,1); lcd.print("Initializing..."); delay(1000); lcd.clear(); } void loop() { // Ermittlung der Entfernung mittels Bildung eines Durchschnittswertes mehrerer Messungen unsigned int uS = sonar.ping_median(7); lcd.home(); lcd.print("Dist: "); lcd.print((float)uS / US_ROUNDTRIP_CM); // In cm umrechnen (0 steht für 'Entfernung zu weit') lcd.print(" cm "); delay(100); }
Umgebungslichtsensor BH1750
- Details
- Geschrieben von Alexander Schulz
- Kategorie: I²C
- Zugriffe: 72835
Es gibt verschiedene Möglichkeiten Lichtintensität zu erfassen. Den klassischen Weg der analogen Messung (Lichtwiderstand, Photodiode) habe ich von vornherein ausgeschlossen. Vor allem wegen der erforderlichen Kalibrierung. Zum Glück habe ich leicht einen digitalen (Kommunikation erfolgt über I2C Bus) Sensor finden können: BH1750FVI. Dieser kann Lichtintensität im Bereich von 1 bis 65535 lx (Lux) erfassen. Das ist schon ganz gut. Die Spezifikation besagt, dass der Sensor auch zur Erfassung von Werten von 0,11 bis max. 100000 lx umprogrammiert werden kann. Das ist sehr beeindruckend.
Ein paar Werte zum Vergleich (Wikipedia):
5 mW Laserpointer, grün (532 nm), 3 mm Strahldurchmesser | 427.000 lx |
5 mW Laserpointer, rot (635 nm), 3 mm Strahldurchmesser | 105.000 lx |
Heller Sonnentag | 100.000 lx |
Bedeckter Sommertag | 20.000 lx |
Im Schatten im Sommer | 10.000 lx |
Operationssaal | 10.000 lx |
Bedeckter Wintertag | 3.500 lx |
Fußballstadion | 1.400 lx |
Beleuchtung TV-Studio | 1.000 lx |
Büro-/Zimmerbeleuchtung | 500 lx |
Flurbeleuchtung | 100 lx |
Wohnzimmer | 50 lx |
Straßenbeleuchtung | 10 lx |
Kerze ca. 1 Meter entfernt | 1 lx |
Vollmondnacht | 0,25 lx |
Sternklarer Nachthimmel (Neumond) | 0,001 lx |
Bewölkter Nachthimmel ohne Mond und Fremdlichter | 0,00013 lx |
Natürlich ist die Empfindlichkeit und der Umfang in keinester Weise mit denen des menschlichen Auges vergleichbar. Dennoch ist 0,11 lx schon sehr dunkel und 100000 lx verdammt hell. Damit kann ich die Dämmerung, die Dunkelheit und die gleißende Sonne zuverlässig erkennen. Auch die Verleichbarkei zwischen mehreren Sensore ist gegeben. Es geht mir vor allem um die subjektive Wahrnemung, die Genauigkeit der Lux-Werte ist mir dagegen weniger wichtig.
Der nachte SMD-Chip ist viel zu unhandlich um seiner reiner Form verwendet zu werden. Glücklicherweise sind mehrere Breakout-Boards günstig verfügbar. Ich habe mir zwei davon angesehen.
Die erste Version ist sehr sinple aufgebaut. Ein 3,3V-Spannungsregler und PullUp-Widerstände. Dennoch kann dadurch dieses board gleich an ein Arduino angeschlossen werden. Solange sie allein an I2C Bus hängt, wird das ganz gut funktionieren. Bei mehreren Geräten muss man (wie immer) auf die verwendete Spannung und die Gesamtwerte der PullUps Acht geben.
Die Variante 2 ist etwas besser für die Verwendung mit 5V geeignet. Ein 3,3v-Regler ist wieder dabei. Die SDA-Leitung hat sogar einen einfachen Level-Shifter bekommen (MOSFET). Die SCL muss sich alledings mit einem PullUp (und einer Diode) begnügen.
Die Suche nach Code-Beispielen verlief eher enttäuschend. Das meiste, was zu finden war, waren einfache Direktezugriffe über I2C Bus. Ich wollte schon eine fertige Bibliothek. Und nach Möglichkeit nicht so 'low level'. Ich konnte nur eine Arduino Bibliothek für BH1750 finden: https://github.com/claws/BH1750. Sie war jedoch auch eine Enttäuschung. Die Werte im höchstaufgelösten Modus waren falchs berechnet (interessanterweise war ein fix bereits in einem Bransh vorhanden, ging aber bei Merge verloren). Es war auch keine Möglichkeit vorhanden, dem Sensor Werte außerhalb von 1 - 65535 zu entlocken.
Also habe ich Datasheet gelesen und beschlossen, eine eigene Bibliothek zu entwickeln. Rausgekommen ist etwas mit folgenden Eigenschaften:
-
Unterstützung beider möglichen I2C-Adressen des Sensors: Standardadresse: 0x23, Alternativadresse: 0x5C. Es sind entsprechende Konstanten definiert: BH1750_DEFAULT_I2CADDR und BH1750_SECOND_I2CADDR.
-
Alle Hardware-Auflösungsmodi:
- RESOLUTION_LOW: Physische Sensormodus mit 4 lx Auflösung. Messzeit ca. 16ms. Bereich 0-54612.
- RESOLUTION_NORMAL: Physische Sensormodus mit 1 lx Auflösung. Messzeit ca. 120ms. Bereich 0-54612.
- RESOLUTION_HIGH: Physische Sensormodus mit 0,5 lx Auflösung. Messzeit ca. 120ms. Bereich 0-54612.
-
Virtueller Modus:
- RESOLUTION_AUTO_HIGH: Die Werte im MTreg ('Measurement Time'-Register) werden je nach Helligkeit automatisch so angepasst, dass eine maximalmögliche Auflösung und Messbereich erziehlt werden. Die messbaren Werte fangen von 0,11 lx und gehen bis über 100000 lx. (ich weis nicht, wie genau die Werte in Grenzbereichen sind, besonders bei hohen Werte habe ich da meine Zweifel. Die Werte scheinen jedoch weitgehend linear mit der steigenden Helligkeit zu wachsen.) Auflösung im Unteren Bereich ca. 0,13 lx, im mittleren 0,5 lx, im oberen etwa 1-2 lx. Die Messzeiten verlängern sich durch mehrfache Messungen und die Änderungen von Measurement Time (MTreg) bis max. ca. 500 ms.
-
Methode zur Änderung von 'Measurement Time'-Registers. Damit kann die Empfindlichkeit beeinflusst werden.
-
'auto power down': Der Sensor wird nach der Messung in den Stromsparmodus versetzt. Das spätere Aufwecken wird ggf. automatisch vorgenommen, braucht jedoch geringfügig mehr Zeit.
Ich habe die Bibliotrhek unter LGPL veröffentlicht und hoffe, dass es jemandem nützlich sein wird ;-)
Das fertige Ergebniss ist bei GitHub zu finden: https://github.com/hexenmeister/AS_BH1750.
Die Verwendung ist recht einfach, folgendes Demo soll es verdeutlichen.
#include <Wire.h> #include <AS_BH1750.h> #include <LiquidCrystal.h> /* * LightMeter_LCD * * Version 1.2 * Datum: 05.08.2013 * * Das Programm benutzt den BH1750 (Umgebiungslichtsensor) * und zeigt die Werte in Lux auf einem 16x2-Symbol-LCD. * * Verdrahtung (UNO, Nano...) * * BH1750: * Sensor SCL pin an A5 * Sensor SDA pin an A4 * Sensor VDD pin an 5V * Sensor GND pin an GND * Sensor ADDR pin frei * * LCD in 4-Bit-Modus: * LCD RS pin an digital pin 8 * LCD RW pin an digital pin 13 * LCD Enable pin an digital pin 9 * LCD D4 pin an digital pin 4 * LCD D5 pin an digital pin 5 * LCD D6 pin an digital pin 6 * LCD D7 pin an digital pin 7 * * * Copyright (c) 2013 Alexander Schulz. All right reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ AS_BH1750 lightMeter; // Setup LCD-Shield LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { // Display initialisieren lcd.clear(); lcd.begin(16, 2); // 16x2 Zeichen lcd.setCursor(0,0); lcd.print("LightMeter v1.0"); lcd.setCursor(0,1); lcd.print("Initializing..."); delay(1000); lcd.clear(); if(!lightMeter.begin()){ // Prüfen, ob Sensor vorhanden ist lcd.clear(); lcd.setCursor(0,0); lcd.print("BH1750 not found"); lcd.setCursor(0,1); lcd.print("check wiring!"); while (1) { delay(1000); } } } void loop() { char clux[9]; // Werte auslesen und aufbereiten float lux = lightMeter.readLightLevel(); dtostrf(lux, 8, 1, clux); lcd.setCursor(0,0); lcd.print("Light level: "); lcd.setCursor(5,1); lcd.print(clux); lcd.print(" lx"); delay(500); }
Technische Informationen:
Description: http://www.rohm.com/web/global/products/-/product/BH1750FVI
Datasheet: http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf
RTC Module DS1307
- Details
- Geschrieben von Super User
- Kategorie: I²C
- Zugriffe: 29309
Diesmal habe ich mir ein Board mit dem RealTimeClock-Chip DS1307 besorgt und angesehen.
Darauf ist alles bereits enthalten, was für einen automomen Betrieb notwendig ist. Dank einer Lithiumbatterie bleibt die eingestellte Zeit nicht nur enthalten, sondern sie läuft auch weiter. Die Batterie wird nur angezapft, wenn keine reguläre Stromversorung anliegt. Damit stellt die Knopfzelle eine Art Notnagel dar und kann schon mal über die gesamte Nutzungsdauer ausreichen, denn der Chip in diesem Betriebsmodus extrem sparsam.
Im regulären Betrieb liefert dieser Chip die laufend aktualisierte Zeitangaben (incl. Kalenderdaten mit Schaltjahren bis 2100. alles im BCD Format) über den I2C Bus (Adresse 0x68), 56 Byte nutzbaren batteriegepufferten Speicher (NV RAM) und einen mit 1Hz getakteten Ausgang (SQ).
Ich plane dieses Modul in Verbindung mit der Datenlogging einsetzen, denn jede Sammlung der Umweltdaten ist nur in Verbindung mit ausreichend genauen Zeitangaben sinnvoll.
Wenn man sich die Platine genauer anschaut, wird man feststellen, dass noch ein weiteres Chip darauf enthalten ist: AT24C32. Es handelt sich um einen Serial EEPROM mit einer Kapazität von 32kBit (4 KB). Dieser ist über den I2C Bus ansprechbar (Adresse 0x50) und ist für den Betrieb der Uhr offensichtlich nicht notwendig. Man kann darauf Daten speichern und diese bleiben auch ohne Stromversorgung enthalten (Batterie wird dabei nicht auch gebraucht).
Warum die beiden Chips auf einer Platine zusammengebracht wurden, ist mir ein Rätsel. Noch spannender ist die vorhandene Möglichkeit, ein DS1820 Temperatursensor einzulöten. Dieser kann nicht per I2C, sonder über 1-wire Bus angesprochen werden und hat mit mit dem Rest des Platine gar nichts zu tun. So gesehen fällt nur noch ein Bügeleisenanschlüss ;-)
An dem EEPROM habe ich derzeit kein Interesse, zum Testen von RTC habe ich eine einfache Uhr mit diesem Modul implementiert.
Um nicht alles selbst programmieren zu müssen, habe ich nah einer passenden Bibliothek gesucht. Am Ende habe ich mich für ein Projekt namens ds1307new (http://code.google.com/p/ds1307new/) entschieden.
#include <Wire.h> #include <DS1307new.h> #include <LiquidCrystal.h> /* * Clock_LCD * * Version 1.1 * Datum: 21.07.2013 * * Das Programm benutzt den RTC DS1307 (RealTimeClock Modul) und * zeigt die Zeit auf einem 16x2-Symbol-LCD. * * Verdrahtung (UNO, Nano...) * * DS1307: * Sensor SCL pin an A5 * Sensor SDA pin an A4 * Sensor VDD pin an 5V * Sensor GND pin an GND * * LCD in 4-Bit-Modus: * LCD RS pin an digital pin 8 * LCD RW pin an digital pin 13 * LCD Enable pin an digital pin 9 * LCD D4 pin an digital pin 4 * LCD D5 pin an digital pin 5 * LCD D6 pin an digital pin 6 * LCD D7 pin an digital pin 7 * * Copyright (c) 2013 Alexander Schulz. All right reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // Setup LCD-Shield LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { // Display initialisieren lcd.clear(); lcd.begin(16, 2); // 16x2 Zeichen lcd.setCursor(0,0); lcd.print("Clock v1.1"); lcd.setCursor(0,1); lcd.print("Initializing..."); delay(1000); lcd.clear(); // Prüfen, ob RTC vorhanden ist if (RTC.isPresent() == 0) { lcd.clear(); lcd.setCursor(0,0); lcd.print("RTC not found"); lcd.setCursor(0,1); lcd.print("check wiring!"); while (1) { delay(1000); } } } void loop() { RTC.getTime(); lcd.setCursor(0,0); lcd.print("Date: "); printDate(RTC.year, RTC.month, RTC.day); lcd.setCursor(0,1); lcd.print("Time: "); printTime(RTC.hour, RTC.minute, RTC.second); delay(1000); } /* * Datumsausgabe in Format: DD.MM.YYYY */ void printDate(uint16_t year, uint8_t month, uint8_t day) { print2digit(day); lcd.print("."); print2digit(month); lcd.print("."); lcd.print(year, DEC); } /* * Ausgabe des Zeitstempels in Format HH:MM:SS */ void printTime(uint16_t hour, uint8_t minute, uint8_t second) { print2digit(hour); lcd.print(":"); print2digit(minute); lcd.print(":"); print2digit(second); } /* * Ausgabe von Zahlen mit 2 Ziffern. Ggf. wird eine Null voreingestellt. */ void print2digit(uint8_t value) { if ( value < 10 ) { lcd.print("0"); } lcd.print(value, DEC); }
Diagramme mit FHEM
- Details
- Geschrieben von Alexander Schulz
- Kategorie: FHEM
- Zugriffe: 84992
Wie visualisiert man mit FHEM eine Logdatei in Form eines Diagramms? Nun, am einfachsten nimmt man eine andere ähnliche Definition aus dem fhem.cfg, kopiert diese und passt sie an ;-)
Aber Spaß beiseite...
Für ein Diagram (Plot) mit FHEM wird zumindest ein Log-Objekt benötigt. Dieses ist normalerweise mit einem Aktor/Sensor-Objekt verbunden. Der Zustand dieses Objektes wird damit automatisch überwacht und in der Logdatei festgehalten. Als nächtes wird das Attribut 'logtype' notwendig. Dort wird der Plot-Art definiert. Zu jeder existierenden Art gehört eine .gplot-Datei in Verzeichnis fhem/www/gplot. So ist es möglich, die bestehenden Plot-Arten anzupassen oder auch seine eigene, neue zu erstellen.
Mit diesen Angaben kann FHEM zu dem Log-Objekt bereits eine Diagramm-Grafik generieren (Logobjekt auswählen und 'Plot'-Link klicken). Noch besser wird es mit einem Weblink. Dieser bietet zusätzliche Möglichkeiten (wie Änderung des Zeitabschnitts und der Vergrößerung) und kann als Diagramm in Räumen (s. room-Attribut) platziert werden. Der Weblink kann von FHEM automatisch erstellt werden ('Convert to weblink' erstellt entsprechende Einträge in fhem.cfg. Speichern ('Save config') nicht vergessen!), oder man gibt die Definition direkt in fhem.cfg an.
So könnte eine Definition aussehen (ein Dummy-Objekt, ein damit verbundener Log (%Y ist ein Platzhalter für das aktuelle Jahr) und ein Weblink):
... define Test dummy define FileLog_Test FileLog /var/InternerSpeicher/fhem/log/Test-%Y.log Test attr FileLog_Test logtype temp4:Plot,text attr FileLog_Test room Test define wlTest weblink fileplot FileLog_Test:temp4:CURRENT attr wlTest room Test ...
Auch fremde (nicht unter FHEM erfasste) Daten können als Diagramm angezeigt werden. Dazu wird ein fake-Log-Objekt definiert. Der korrekte Dateiname ist dabei natürlich wichtig. Der Rest geschieht wie oben beschrieben.
... define FileLog_extern FileLog /var/InternerSpeicher/fhem/log/Extern.log fakelog ...
Es ist auch möglich, mehrere Diagramme in einer Grafik darzustellen. Das muss entsprechend in der .gplot-Datei definiert werden. Die Daten können jedoch nur aus einer einzelnen Log-Datei stammen. Daher muss diese Daten für alle Diagrammlinien enthalten.
Weiter führende Informationen sind z.B. hier und hier zu finden.
Beispiele für verschiedene Diagramme:
... und noch Beispiele für die Datensätze in einer Logdatei:
Hier sind daten von drei 1-wire Temperatursensoren zusammengefasst (Quelle für die Grafik mit der Überschrift "Fernwärme/Heizung"):
... 2013-08-06_20:15:19 EG_HA_OWTS21.Fernwaerme_Vorlauf_Heizung T: 39.13 °C ▾ 2013-08-06_20:15:31 EG_HA_OWTS22.Fernwaerme_Vorlauf_Warmwasser T: 63.75 °C ▾ 2013-08-06_20:19:54 EG_HA_OWTS23.Fernwaerme_Rueckflauf T: 40.00 °C ▾ 2013-08-06_20:20:19 EG_HA_OWTS21.Fernwaerme_Vorlauf_Heizung T: 39.13 °C ▾ 2013-08-06_20:20:31 EG_HA_OWTS22.Fernwaerme_Vorlauf_Warmwasser T: 63.63 °C ▾ 2013-08-06_20:24:54 EG_HA_OWTS23.Fernwaerme_Rueckflauf T: 39.63 °C ▾ 2013-08-06_20:25:19 EG_HA_OWTS21.Fernwaerme_Vorlauf_Heizung T: 39.13 °C ▾ 2013-08-06_20:25:31 EG_HA_OWTS22.Fernwaerme_Vorlauf_Warmwasser T: 63.50 °C ▾ 2013-08-06_20:29:54 EG_HA_OWTS23.Fernwaerme_Rueckflauf T: 39.50 °C ▾ ...
Und so kommen Daten von einem HomeMatic Termostat:
... 2013-08-06_20:19:42 nn_th_1 T: 27.2 H: 55 2013-08-06_20:19:42 nn_th_1 measured-temp: 27.2 2013-08-06_20:19:42 nn_th_1 humidity: 55 2013-08-06_20:22:42 nn_th_1 T: 27.1 H: 55 2013-08-06_20:22:42 nn_th_1 measured-temp: 27.1 2013-08-06_20:22:42 nn_th_1 humidity: 55 2013-08-06_20:25:31 nn_th_1 T: 27.1 H: 55 2013-08-06_20:25:31 nn_th_1 measured-temp: 27.1 2013-08-06_20:25:31 nn_th_1 humidity: 55 ...
Der Format der Daten kann sehr unterschiedlich ausfallen, für eine Visualisierung muss natürlich die .gplot-Datei darauf abgestimmt sein.
Beispiel für .gplot Datei mit drei Linien:
# # Eigene Definition für 3 Temperaturlinien in einem Graph (Heizung) # set terminal png transparent size crop set output '.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set yrange [10:90] set y2range [10:90] set title 'Fernwaerme / Heizung' set y2label "Temperature in C" #FileLog 4:EG_HA_OWTS21.Fernwaerme_Vorlauf_Heizung:0: #FileLog 4:EG_HA_OWTS22.Fernwaerme_Vorlauf_Warmwasser:0: #FileLog 4:EG_HA_OWTS23.Fernwaerme_Rueckflauf:0: plot \ "< awk '/EG_HA_OWTS21\.Fernwaerme_Vorlauf_Heizung/ {print $1, $4}' "\ using 1:2 axes x1y2 title 'Vorlauf Heizung' with lines lw 2,\ "< awk '/EG_HA_OWTS22\.Fernwaerme_Vorlauf_Warmwasser/ {print $1, $4}' "\ using 1:2 axes x1y2 title 'Vorlauf Warmwasser' with lines lw 2,\ "< awk '/EG_HA_OWTS23\.Fernwaerme_Rueckflauf/ {print $1, $4}' "\ using 1:2 axes x1y2 title 'Rueckflauf' with lines lw 2\
Update:
Auf Nachfrage, hier die Definition für das Diagramm der Zirkulationspumpe:
fhem.cfg:
... define FileLog_EG_HA_SA01.Zirkulationspumpe FileLog /var/InternerSpeicher/fhem/log/EG_HA_SA01.Zirkulationspumpe-%Y.log EG_HA_SA01.Zirkulationspumpe
attr FileLog_EG_HA_SA01.Zirkulationspumpe group _Logs
attr FileLog_EG_HA_SA01.Zirkulationspumpe logtype mySwitch:Plot,text
attr FileLog_EG_HA_SA01.Zirkulationspumpe room 9.11_Heizung
define 0.wlA_Zirkulationspumpe SVG FileLog_EG_HA_SA01.Zirkulationspumpe:mySwitch:CURRENT
attr 0.wlA_Zirkulationspumpe room 9.11_Heizung ...
und die dazugehörende Plot-Datei (mySwitch.gplot, übernommen aus der entsprechender fs20-Plot-Definition):
############################ # Display the on and off values off
############################ set terminal png transparent size crop set output '.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set title '' set ytics ("Aus" 0, "An" 1) set y2tics ("Aus" 0, "An" 1) set yrange [-0.1:1.1] set y2range [-0.1:1.1] set ylabel "Status" set y2label "Status" #FileLog 3::0:$fld[2]=~"on"?1:0 plot "< awk '{print $1, $3~/on/? 1 : 0; }' "\ using 1:2 axes x1y2 notitle ls l8fill lw 2 with steps
Diese und andere meine Plot-Dateien bei GitHub: https://github.com/hexenmeister/MyFHEM/tree/master/www/gplot
Arduino Mega 2560
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Arduino / ATMEL
- Zugriffe: 27386
Arduino Mega ist (zur Zeit) die größte Arduino Board mit einem 8 Bit Microcontroller. Sie bietet viele weitere Anschlussmöglichkeiten im Vergleich zum Arduino Uno. Praktischerweise können die meisten von den für Uno designten Shields auch mit diesem Board verwendet werden.
Technische Daten:
Microcontroller | ATmega2560 |
Betriebsspannung | 5V |
empfohlene Spannung | 7-12V |
Spannung min/max | 6-20V |
Digitale I/O Pins | 54 (14 davon unterstützen PWM) |
UARTs (hardware serial ports) | 4 |
Analoge Pins | 16 |
max. Belastung pro I/O Pin | 40 mA |
max. Belastung pro 3,3V Pin | 50 mA |
Flash Memory | 256 KB (davon 8 KB belegt durch bootloader) |
SRAM | 8 KB |
EEPROM | 4 KB |
Taktfrequenz | 16 MHz |
Weitere Informationen sind bei http://arduino.cc/en/Main/ArduinoBoardMega2560 zu finden. Die Platine weicht von den dort dargestellten Versionen leicht ab, die Funktionalität scheint jedoch dieselbe zu sein. Mein Board ist ziemlich sicher ein Nachbau, warum dabei die Original Arduino Symbole verwendet wurden, ist mir nicht klar.
Was ich mit dem Board machen werde, habe ich noch nicht entschieden. Für meine derzeitige Vorhaben ist sie eher überdemensioniert. Ich fand sie jedoch coll und wollte haben ;-)
Zum Testen ist sie in jedem Fall ganz gut geeignet.
Seite 12 von 14