veranstaltungen:hessen20162:arduino-workshop-notizen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
veranstaltungen:hessen20162:arduino-workshop-notizen [03.10.2016 19:44] ipsecguyveranstaltungen: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.h> 
 +OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary) 
 +
 +#include "DHT.h" 
 +#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, HIGH); 
 +  Serial.begin(9600); 
 +  Serial.setTimeout(1000); 
 +  dht.begin(); 
 +  digitalWrite(13, LOW); 
 +
 +
 +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, LOW); 
 +    Serial.flush(); //flush all previous received and transmitted data 
 +    while(!Serial.available()){ 
 +      delay(500); 
 +    } 
 +    digitalWrite(13, HIGH); 
 +
 +    Serial.readString(); 
 +    Serial.flush(); //flush all previous received and transmitted data 
 +
 +    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("DHT "); 
 +      Serial.print(t); 
 +      Serial.print(" "); 
 +      Serial.println(h); 
 +    } 
 +    Serial.println("EOF"); 
 +
 +    running = false; // done with this cycle, wait again 
 +    return; 
 +  } 
 +
 +  if (OneWire::crc8(addr, 7) != addr[7]) { 
 +      Serial.println("CRC is not valid!"); 
 +      return; 
 +  }
 +  
 +  // the first ROM byte indicates which chip 
 +  switch (addr[0]) { 
 +    case 0x10: 
 +//      Serial.println("  Chip = DS18S20");  // or old DS1820 
 +      type_s = 1; 
 +      break; 
 +    case 0x28: 
 +//      Serial.println("  Chip = DS18B20"); 
 +      type_s = 0; 
 +      break; 
 +    case 0x22: 
 +//      Serial.println("  Chip = DS1822"); 
 +      type_s = 0; 
 +      break; 
 +    default: 
 +//      Serial.println("Device is not a DS18x20 family device."); 
 +      return; 
 +  }
 +  
 +  ds.reset(); 
 +  ds.select(addr); 
 +  ds.write(0x44, 1); // start conversion, without parasite power 
 + Serial.println(celsius); 
 +
 +
 +</file>
  
 Alternative: der Arduino sammelt im Hintergrund regelmäßig die Messwerte und liefert auf Anfrage die jeweils neuesten aus. Alternative: der Arduino sammelt im Hintergrund regelmäßig die Messwerte und liefert auf Anfrage die jeweils neuesten aus.
Zeile 72: Zeile 167:
 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….
  
-<code>+<file lua arduino.lua>
 hostname = os.getenv("COLLECTD_HOSTNAME" hostname = os.getenv("COLLECTD_HOSTNAME"
 if hostname==nil then hostname="undefined-hostname" end  if hostname==nil then hostname="undefined-hostname" end 
Zeile 113: Zeile 208:
  
 end end
-</code>+</file>
  
 ##Collectd als Sammelprogramm ##Collectd als Sammelprogramm
Zeile 119: 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 und Authentisierung+<file text collectd.conf> 
 +#Hostname   "localhost" 
 +#FQDNLookup  true 
 +BaseDir "/var/run/collectd" 
 +#Include "/etc/collectd/conf.d" 
 +PIDFile "/var/run/collectd.pid" 
 +PluginDir "/usr/lib/collectd" 
 +TypesDB "/usr/share/collectd/types.db" 
 +#Interval    30 
 +#ReadThreads 2 
 + 
 +LoadPlugin load 
 +LoadPlugin cpu 
 +LoadPlugin wireless 
 +LoadPlugin network 
 + 
 +<Plugin network> 
 +  MaxPacketSize 1024 
 +  <Server "fddd:5d16:b5dd:0:dacb:8aff:fe00:2bdb" "25826"> 
 +    Interface "br-client" 
 +  </Server> 
 +</Plugin> 
 + 
 +LoadPlugin exec 
 +<Plugin exec> 
 +  Exec "nobody" "/root/arduino.sh" 
 +</Plugin> 
 + 
 +</file> 
 + 
 +Collectd kann verschlüsseln und/oder authentisieren. Dabei werden vom Clients die Pakete mit Benutzernamen und Passwort versehen und optional auch verschlüsselt. **Leider sind die openwrt collectd Pakete ohne die Crypto gebaut worden. 
 +**
  
 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.
  • veranstaltungen/hessen20162/arduino-workshop-notizen.1475523874.txt.gz
  • Zuletzt geändert: 03.10.2016 19:44
  • von ipsecguy