/*******************************************************
 * Web-Telemetrie  www.Telmetrie.Center
 * 
 *  20.09.2016  DL8MA
 *  
 *  - Arudino   
 *  - Ethernet-Shield an LAN mit Internetzugang angeschlossen
 *  - Dallas (Maxim) Temperatursensoren DS 18x20 an 1-Wire-Bus 
 *  
 *  Visiualisierung der Messdaten:  http://telemetrie.center/messwerte.php?liste&c=testkanal
 *  
 */

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

int zaehler = 0;
int anzahlSensoren = 0;
int gestartet = 0;
String str = "";
String parameter="";

int maxSensorAnzahl = 5;                                  // wird momentan noch auf Telemetrie.Center auf 5 begrenzt


// Telemetrie.Center

String  url = "www.telemetrie.center";
char server[] = "www.Telemetrie.center";

String  kanal = "Testkanal";                              // Kanal-Name   muss auf Telemetrie.Center eingerichtet sein
String  token = "tc-token";                               // Token        muss auf Telemetrie.Center eingerichtet sein

unsigned long zeitStempel = 0;
unsigned long zeitSpanne = 60000;                         // zeitlicher Abstand zwischen den Messungen (in ms)
                                                          //  sollte > 15000 ms sein 


// 1-Wire:

#define ONE_WIRE_BUS 3                                    // Port für 1-Wire-Bus definieren

OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

// Ethernet:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 177);
EthernetClient client;


void setup() {
  Serial.begin(9600);
  sensors.begin();
  anzahlSensoren = dallasSensors();                                                               // Anzahl der Sensoren am 1-Wire-Bus holen
  sensors.setResolution(TEMP_12_BIT);
}

void loop() {
   
 if( ( ( millis() - zeitStempel ) >= zeitSpanne ) or gestartet == 0 ) {                          // für Zeitsteuerung
    gestartet = 1;   
    zeitStempel = millis();

    int i;
    parameter = "";
    for( i = 0; i < anzahlSensoren; i++ ) {                                                       // Schleife über die Sensoren 
      sensors.requestTemperatures();
  
      Serial.print( "Sensor " );                                                                  // Temperaturwert holen +
      Serial.print( i );                                                                          //  auf seriellem Monitor ausgeben  
      Serial.print( " " );
      Serial.print(sensors.getTempCByIndex( i ) );
      Serial.print(" Grad Celsius");
      Serial.println();  
      parameter += "&v" + String( i + 1 ) + "=" + String( sensors.getTempCByIndex( i ) );         // Parameterstring für Telemetrie.Center
    }
  
    if (Ethernet.begin(mac) == 0) {                                                               // Webverbindung aufbauen
      Serial.println("Failed to configure Ethernet using DHCP");
      Ethernet.begin(mac, ip);
    }
    delay(1000);
    Serial.println("connecting...");

    if (client.connect(server, 80)) {
      Serial.println("connected");
      str = "GET /api.php?u=" + kanal + "&t=" + token + parameter + " HTTP/1.1";
      client.println( str );
      Serial.println( str );
     
      str = "Host:" + url;
      client.println( str );
      client.println("Connection: close");
      client.println();
    } else {
      Serial.println("connection failed");
    }

    if (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
  
    Serial.println("disconnecting.");
    client.stop();     

    Serial.println();
  }
}



/********************************************************************
 *  Anzahl der Sensoren am 1-Wire-Bus ermitteln
 *  
 *  20.09.2016  DL8MA
 */
int dallasSensors(void) {
  byte i, zaehler=0;
  byte addr[8];

  while(ourWire.search(addr)) {
    zaehler++;
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      return( -1 );
    }
  }
  ourWire.reset_search();

  if( zaehler > maxSensorAnzahl )
    zaehler = 5;
  
  return( zaehler );
}