Archiv für September 2012

Solarlogger aus einem Arduino

Nach dem Fieldday auf dem Kronsberg wollte ich eigentlich noch ein bisschen alleine ins Grüne fahren, einen endgespeisten Draht vom Vogelbeobachtungsturm abspannen und in Ruhe weiterfunken. Aber Klausurenzeit und Jahreszeiten kamen dazwischen, daher habe ich den Ausflug verschoben und stattdessen ein anderes Projekt vorangebracht: Eine Fern-Überwachung für meine Solaranlage.

Solarlogger 1.0 Die Strommessung funktioniert wie dort beschrieben. Allerdings habe ich den ACS714 für Ströme bis zu 30A verbaut, weil meine Module an guten Tagen bis zu 19A liefern.

Der ACS714 liefert laut Datenblatt maximal Vcc, hier also 5V, als Messwert. Ich vertraue dem aber nicht und greife den Messwert, um Spannungsspitzen abzufedern, an einem 1:1-Spannungsteiler ab. Statt einer Spannung zwischen 2.5V und 5V messe ich am AD-Wandler also eine Spannung zwischen 1.25 und 2.5V.

Um nicht noch ein Kabel unterbringen zu müssen, verwende ich das RedFly-Shield. Das Arduino muss nur messen und rechnen, dann weckt es kurz das WLAN-Shield, verschickt das Ergebnis und schaltet es wieder ab. Gespeichert und bei Bedarf aufbereitet werden die Messwerte von einem PHP-Skript direkt auf dem Webserver.

Hier der relevante Teil des Codes. Die Funktion „connectAndSend“ ist dem Beispiel „WebClient“ aus dem RedFly-Paket entnommen.

void setup() {
  pinMode(sensorPinCurrent, INPUT);
  analogReference(DEFAULT);
}

int sendValueToServer(char *sendValue){
  // RedFly-Shield aufwecken und Messwert ans PHP-Skript senden
  RedFly.enable();    
  int errorCode = connectAndSend(sendValue);

  // RedFly-Shield wieder schlafen legen
  client.stop();
  RedFly.disconnect();  
  RedFly.disable();  
  return errorCode;
}

void loop() {
  RedFly.disable();
  
  // Strom messen
  valueSensor = analogRead(sensorPinCurrent);
  valueCurrent = (float)(valueSensor-255) * 30 / 255;

  // Roh- und Ausgabewert formatieren
  String result = String(sensorValue)+“;“+String(sensorOutputBuffer);
  char resultChar[255];
  result.toCharArray(resultChar, 255);

  // PHP-Skript aufrufen, um Messwert auf Webserver zu speichern
  int errorCode = sendValueToServer(resultChar);

  if(errorCode == 0) {
     delay(600000); // Messwert  gespeichert -> 10 Minuten Pause
  } else {
     delay(5000); // WLAN-Problem -> gleich nochmal versuchen
  }
}