Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
veranstaltungen:hessen20162:arduino-workshop-notizen [03.10.2016 19:40] – ipsecguy | veranstaltungen:hessen20162:arduino-workshop-notizen [04.10.2016 11:01] (aktuell) – [Arduino Sketch (Programm):] ipsecguy | ||
---|---|---|---|
Zeile 47: | Zeile 47: | ||
Der steuernde Rechner kann damit einen Messvorgang auslösen und die Daten empfangen und weiterverarbeiten. | Der steuernde Rechner kann damit einen Messvorgang auslösen und die Daten empfangen und weiterverarbeiten. | ||
+ | |||
+ | <file text arduino-freifunk.ino> | ||
+ | #include < | ||
+ | OneWire | ||
+ | |||
+ | #include " | ||
+ | #define DHTPIN 2 // what digital pin we're connected to | ||
+ | #define DHTTYPE DHT11 // DHT 11 | ||
+ | //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 | ||
+ | //#define DHTTYPE DHT21 // DHT 21 (AM2301) | ||
+ | DHT dht(DHTPIN, DHTTYPE); | ||
+ | |||
+ | bool running = false; | ||
+ | |||
+ | void setup(void) { | ||
+ | pinMode(13, OUTPUT); | ||
+ | digitalWrite(13, | ||
+ | Serial.begin(9600); | ||
+ | Serial.setTimeout(1000); | ||
+ | dht.begin(); | ||
+ | digitalWrite(13, | ||
+ | } | ||
+ | |||
+ | void loop(void) { | ||
+ | byte i; | ||
+ | byte present = 0; | ||
+ | byte type_s; | ||
+ | byte data[12]; | ||
+ | byte addr[8]; | ||
+ | float celsius, fahrenheit; | ||
+ | float h,t; | ||
+ | |||
+ | if( !running ){ | ||
+ | digitalWrite(13, | ||
+ | Serial.flush(); | ||
+ | while(!Serial.available()){ | ||
+ | delay(500); | ||
+ | } | ||
+ | digitalWrite(13, | ||
+ | |||
+ | Serial.readString(); | ||
+ | Serial.flush(); | ||
+ | |||
+ | running = true; // start execution | ||
+ | } | ||
+ | |||
+ | if ( !ds.search(addr)) { | ||
+ | ds.reset_search(); | ||
+ | |||
+ | //DHT11 Code | ||
+ | h = dht.readHumidity(); | ||
+ | t = dht.readTemperature(); | ||
+ | if (!isnan(h) && !isnan(t)) { | ||
+ | Serial.print(" | ||
+ | Serial.print(t); | ||
+ | Serial.print(" | ||
+ | Serial.println(h); | ||
+ | } | ||
+ | Serial.println(" | ||
+ | |||
+ | running = false; // done with this cycle, wait again | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if (OneWire:: | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | // the first ROM byte indicates which chip | ||
+ | switch (addr[0]) { | ||
+ | case 0x10: | ||
+ | // Serial.println(" | ||
+ | type_s = 1; | ||
+ | break; | ||
+ | case 0x28: | ||
+ | // Serial.println(" | ||
+ | type_s = 0; | ||
+ | break; | ||
+ | case 0x22: | ||
+ | // Serial.println(" | ||
+ | type_s = 0; | ||
+ | break; | ||
+ | default: | ||
+ | // Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | ds.reset(); | ||
+ | ds.select(addr); | ||
+ | ds.write(0x44, | ||
+ | | ||
+ | } | ||
+ | |||
+ | </ | ||
Alternative: | Alternative: | ||
Zeile 71: | Zeile 166: | ||
Lua ist echt unterbelichtet in Bezug auf Timestamps und Sleeps, alles in Sekundenintervallen und dann noch Sleep per Shell ausführen. Und wenn man mehr will muss man Libraries laden, schönen Gruß an die Entwickler auch. Aber Hauptsache Code als Parameter übergeben können und Variablensätze als Rückgabewerte…. | Lua ist echt unterbelichtet in Bezug auf Timestamps und Sleeps, alles in Sekundenintervallen und dann noch Sleep per Shell ausführen. Und wenn man mehr will muss man Libraries laden, schönen Gruß an die Entwickler auch. Aber Hauptsache Code als Parameter übergeben können und Variablensätze als Rückgabewerte…. | ||
+ | |||
+ | <file lua arduino.lua> | ||
+ | hostname = os.getenv(" | ||
+ | if hostname==nil then hostname=" | ||
+ | interval = os.getenv(" | ||
+ | if interval==nil then interval=10 end | ||
+ | |||
+ | rserial=io.open("/ | ||
+ | wserial=io.open("/ | ||
+ | rserial: | ||
+ | |||
+ | while true do | ||
+ | wserial: | ||
+ | tstart = os.time() | ||
+ | repeat | ||
+ | line=rserial: | ||
+ | line=string.gsub(line," | ||
+ | |||
+ | temp = nil | ||
+ | humidity = nil | ||
+ | temp, humidity = string.match(line, | ||
+ | if temp ~= nil and humidity ~= nil then | ||
+ | print(" | ||
+ | print(" | ||
+ | line="" | ||
+ | end | ||
+ | |||
+ | romid = nil | ||
+ | temp = nil | ||
+ | romid, temp = string.match(line, | ||
+ | if romid ~= nil and temp ~= nil then | ||
+ | print(" | ||
+ | end | ||
+ | |||
+ | until line==" | ||
+ | |||
+ | towait = interval - os.difftime(os.time(), | ||
+ | if towait>0 then | ||
+ | os.execute(" | ||
+ | end | ||
+ | |||
+ | end | ||
+ | </ | ||
##Collectd als Sammelprogramm | ##Collectd als Sammelprogramm | ||
Zeile 76: | Zeile 214: | ||
Collectd sammelt Metriken auf Hosts und unterstützt über Plugins eine Vielzahl von Servierprogrammen und läßt sich über generische Plugins leicht erweitern. Das Plugin das ich hier verwende ist das „exec“ plugin, welches beliebige Shell Skripte ausführen kann. | Collectd sammelt Metriken auf Hosts und unterstützt über Plugins eine Vielzahl von Servierprogrammen und läßt sich über generische Plugins leicht erweitern. Das Plugin das ich hier verwende ist das „exec“ plugin, welches beliebige Shell Skripte ausführen kann. | ||
- | Collect Netz - ohne Verschlüsselung | + | <file text collectd.conf> |
+ | # | ||
+ | # | ||
+ | BaseDir "/ | ||
+ | #Include "/ | ||
+ | PIDFile "/ | ||
+ | PluginDir "/ | ||
+ | TypesDB "/ | ||
+ | # | ||
+ | # | ||
+ | |||
+ | LoadPlugin load | ||
+ | LoadPlugin cpu | ||
+ | LoadPlugin wireless | ||
+ | LoadPlugin network | ||
+ | |||
+ | <Plugin network> | ||
+ | MaxPacketSize 1024 | ||
+ | <Server " | ||
+ | Interface "br-client" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | LoadPlugin exec | ||
+ | <Plugin exec> | ||
+ | Exec " | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Collectd kann verschlüsseln | ||
+ | ** | ||
Caveat: das Skript muss unter einem anderen User als „root“ ausgeführt werden. Was auf einem großen Host sinnvoll ist macht auf einem Freifunk Router weniger Sinn. In unserem spezielle Fall müssten man z.B. einen neuen User anlegen und die ttyACM0 mit entsprechenden Rechten versehen. Oder die Schnittstelle für alle User verfügbar machen, beides am besten im Collectd Start Skript. | Caveat: das Skript muss unter einem anderen User als „root“ ausgeführt werden. Was auf einem großen Host sinnvoll ist macht auf einem Freifunk Router weniger Sinn. In unserem spezielle Fall müssten man z.B. einen neuen User anlegen und die ttyACM0 mit entsprechenden Rechten versehen. Oder die Schnittstelle für alle User verfügbar machen, beides am besten im Collectd Start Skript. |