Pages: [1]   Go Down
Author Topic: Anfänger verzweifelt langsam  (Read 323 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo miteinander

Als Anfänger verzweifle ich langsam. Leider bin ich im Bereich Programmierung nicht auf dem laufenden. Nun hab ich mir ein Arduino UNO R3 und Ethernet Shield zugelegt und Arduino 1.05 und auch 023 installiert. So weit so gut. Um ein wenig zu experimentieren hab ich mir ein paar Sketches runtergeladen.
Jetzt komme ich zu den Problemen, teilweise laufen diese und teilweise gibt es Fehlermeldungen, die hier komplett aufzulisten würde den Rahmen sprengen. Fehlende Librarys sind das kleinste Problem. Nun hab ich mir endlich mal ein laufendes installiert, stammt von der Fluux Seite, mit Webserver. Hab auch alles hinbekommen, bis auf das ich 18B20 Sensoren habe und diese nicht korrekt anzeigen, aber erstmal egal. Tage später rufe ich den funktionierenden Sketch in der Sketchbook oder auch unter Beispiele wieder auf und er gibt mir Fehler beim Kompilieren raus, obwohl vorher alles lief. Ich kann das alles nicht nachvollziehen. Ist das Systen (Programm) so empfindlich? Wie kann es sein das auf Web Seiten angebotene Sketches mit der gleichen Hardware bei mir schon beim Kompilieren fehlerhaft sind?.
Ich hoffe das meine Angaben nicht zu Pauschal sind. Um mich da richtig einzuarbeiten fehlt mir im Moment einfach die Zeit, deshalb war ich auf der Suche nach ein fertigen Projekt für ein Temperaturlogger mit Webserver.

Hab jetzt mal 1.05 deinstalliert und 1.5.7 installiert, nun läuft der Sketch beim kompilieren ohne Fehlermeldung wieder. Ist mir alles ein wenig suspekt.
« Last Edit: July 27, 2014, 04:05:15 am by testperson » Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 137
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was genau funktioniert denn nicht und wie sieht die passende fehlermeldung aus?

So könnte ich nur meine Glaskugel benutzen, welche aber leider gerade in der Wartung ist (komischerweise immer wenn man sie denn mal braucht)
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was genau alles nicht funkioniert kann ich jetzt hier detailiert nicht aufführen. Ich weiß das ihr natürlich nicht wissen könnt welche Probleme ich genau habe.
Ich veröffentliche mal einfach den von mir ausgewählten Sketch von einer anderen Seite, dieser funktioniert wenigstens bis auf das meine Temperaturen nicht korrekt angezeigt werden. Habe Dallas 18B20, wenn ich das richtig verstanden habe, soll der Sketch für die Dallas 10S20 sein.  

Ansonsten bitte den Sketch löschen.


Code:
/***************************************************************************************************************************          
  PROJEKT: Temperaturlogger                                                                                                 *
  Beschreibung:  Temperaturwerte von 2 ds1820 Temperatursensoren werden an ein php-Script gesendet,                         *
  dass diese Daten in eine MySQL-Datenbank schreibt,                                                                        *
                                                                                                                            *
                                                                                                                            *
  Folgende Werte müssen angepasst werden                                                                                    *
  --------------------------------------------------------------------------------------------------------------------------*
  Intervall = Zeitraum in welchen Abständen die Temperaturdaten vom Arduino zur Datenbank übertragen werden sollen,         *
  mac[] = MAC-Adresse des Ethernet Shields                                                                                  *
  ip[] = IP-Adresse über die der Arduino erreichbar sein soll.                                                              *
  server[] = IP-Adresse des Servers auf den die Daten übertragen werden sollen. herauszufinden mit ping www.domain.de       *
  host[] = Name der Domain zu der die Verbindung aufgebaut werden soll                                                      *
  url[] = Pfad und Name der Datei die für den Upload der übergebenen Daten zur Datenbank zuständig ist.                     *
  key[] = Kennwort dass mit dem Kennwort in der php-Datei übereinstimmen muss (Sicherheitsaspekt)                           *
*****************************************************************************************************************************/
 
#include <SPI.h>
#include <Ethernet.h>             // library for ethernet functions
#include <DallasTemperature.h>    // library for temperature sensors
#include <OneWire.h>              // library for the onewire bus
 
OneWire  ds(7);                         // pin für Temperatursensoren
 
//DeviceAdressen der einzelnen ds1820 Temperatursensoren.
DeviceAddress sensor1 = { 0x10, 0x98, 0x46, 0x57, 0x2, 0x8, 0x0, 0xF9 };
DeviceAddress sensor2 = { 0x10, 0x59, 0x4B, 0xC0, 0x1, 0x8, 0x0, 0x3E };
 
//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x7C };    // MAC-Adresse des Arduino
//byte ip[]      = { 192, 168, 0, 99 };                     // IP-Adresse des Arduino
//byte gateway[] = { 192, 168, 178, 1 };                    // Gateway
//byte subnet[]  = { 255, 255, 255, 0 };                    // SubNet
byte server[]  = { 95, 143, 172, 134 };                     // IP-Adresse des Servers
 
EthernetClient client;
char host[]    = "ihrewaesche.de";                      // Domain
char url[]     = "/ARDUINO/Temperatur/SaveTempToMySQL.php"; // Pfad zur PHP-Datei
char key[]     = "MEINPASSWORT123";                     // Kennwort aus PHP-Datei
char c;                                                     // Variable für Rückgabe des Servers
 
long Interval  = 60;                                        // Upload-Interval in Minuten
DallasTemperature sensors(&ds);                              
int numSensors;                                             // Variable zum speichern der Anzahl der Temperatur-Sensoren
 
void setup()
{
  delay(1000);
 
  Serial.begin(9600);
  Serial.flush();
  delay(200);
 
  Serial.println("Arduino TemperaturLogger");
  Serial.println("Ethernet initialisieren...");
 
  Ethernet.begin(mac, ip);
  Interval = Interval * 1000 * 60;                            // Das in Minuten angegebene Interval in Millisekunden umrechnen
  delay(1000);                                                // warten, bis Ethernet gestartet
 
  //Sensoren abfragen
  sensors.begin();
  Serial.println("Temperatur-Sensoren ermitteln...");
 
  numSensors = sensors.getDeviceCount();                      // Anzahl der angeschlossenen Sensoren in numSensors speichern
 
  if(numSensors > 0)                                          // Es wurde mindestens 1 Sensor gefunden                                      
  {
    Serial.print(numSensors);
    Serial.println( " Temperatur-Sensoren gefunden.");
  }        
  else                                                        // Es wurde kein Sensor gefunden
  {
    Serial.println("Keine Temperatur-Sensoren gefunden.");
  }
}
 
void loop()
{
  float temp1 = getTemperature(sensor1);                      // Temperatur von Sensor 1 ermitteln
  float temp2 = getTemperature(sensor2);                      // Temperatur von Sensor 2 ermitteln
 
  Serial.print("Temp1: ");
  Serial.println(temp1);
  Serial.print("Temp2: ");
  Serial.println(temp2);
 
  Daten_senden(temp1, temp2);                                 // Temperaturdaten an Server übertragen
 
  delay(700);
 
  byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected())              // Antwort des Servers lesen
  {
    delay(1000);
    while (client.available())
    {
      char response = client.read();
      Serial.print(response);
    }
  }
  client.stop();
  Serial.println("Done.");
  client.flush();
 
  delay(Interval);
}
 
/******************************
                              *
  Daten an Server schickenn   *
                              *
*******************************/
void Daten_senden(float T1, float T2)
{
  if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
    Serial.println("Verbunden, Sende Daten...");
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print("?T1=");
    Serial.print("?T1=");
    client.print(T1);
    Serial.println(T1);
    client.print("&T2=");
    Serial.print("&T2=");
    client.print(T2);
    Serial.println(T2);
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(" HTTP/1.1");
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println("User-Agent: Arduino");
    client.println("Connection: close");
    Serial.println("Connection: close");
    client.println();
    Serial.println();
  }
  else
  {
    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}
 
/*************************************
                                     *
  Temperatur der Sensoren auslesen   *
                                     *
*************************************/
void writeTimeToScratchpad(byte* address)
{
  ds.reset();
  ds.select(address);
  ds.write(0x44,1);
  delay(1000);
}
 
void readTimeFromScratchpad(byte* address, byte* data)
{
  ds.reset();
  ds.select(address);
  ds.write(0xBE);
  for (byte i=0;i<9;i++)
  {
    data[i] = ds.read();
  }
}
 
float getTemperature(byte* address)
{
  int tr;
  byte data[12];
 
  writeTimeToScratchpad(address);
 
  readTimeFromScratchpad(address,data);
 
  tr = data[0];
 
  if (data[1] > 0x80)
  {
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }
 
   int cpc = data[7];
   int cr = data[6];
 
   tr = tr >> 1;
 
   return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
« Last Edit: July 27, 2014, 04:26:26 pm by uwefed » Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code bitte mit dem # Knopf in Code Tags packen


Du kannst mal eine andere Library dafür verwenden:
http://www.milesburton.com/Dallas_Temperature_Control_Library
Zusammen mit dieser OneWire Lib:
http://www.pjrc.com/teensy/td_libs_OneWire.html

Oder überhaupt eine. Du machst oben #include <DallasTemperature.h>, aber liest die Sensoren dann per Hand aus


Ansonsten zwei Tips:
1.) Überall wo du String Literale ("text") mit print() - sowohl Serial als auch Client - verwendest das F() Makro verwenden:
Code:
.print(F("String im Flash"));
Dann belegt der String kein RAM mehr. Gerade bei RAM-intensiven Libs wie Ethernet wird das sonst schnell knapp

2.) Die String Klasse rausschmeißen. Du hast da irrsinnige und unnötige Casts auf String Objekte drin.
Statt
Code:
client.print("GET " + String(url));
einfach zwei Zeilen draus machen:
Code:
client.print(F("GET ")); client.print(url);

Abhilfe schafft da auch die Streaming Lib:
http://arduiniana.org/libraries/streaming/
Damit hat man C++-artige Output Streams smiley
« Last Edit: July 27, 2014, 05:42:01 am by Serenifly » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Erstmal Danke für die Antwort.

Dein Link arduiniana.org geht zur Zeit nicht, schein ein Problem der Seite zu sein.

Wie gesagt das Sketch habe ich samt Webserver zum laufen bekommen, die hier noch IP Adressen etc hatte ich natürlich angepasst.. Die Librarys hatte ich auch schon benutzt, es wurden aber immer Temperaturen um 90-100° ausgegeben. Deine 2 Tipps in allen Ehren, übersteigen aber grad auf die schnelle meine Kompetenzen;-) Wäre froh wenn ich mal anstängie Temperaturen loggen könnte.


Ah, sehe grad die Seite geht wieder...
Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast du die Sensoren korrekt verdrahtet? 4,7k Pullup verwendet?


Bei mir geht das mit der verbesserten Lib (+OneWire2):
Code:
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress sensorList[] = {
{ 0x28,0x68,0x2A,0xA4,0x05,0x00,0x00,0xAB },
{ 0x28,0x82,0x38,0xA5,0x05,0x00,0x00,0x3D }
};

void setup(void)
{
  Serial.begin(9600);

  sensors.setResolution(9);
  sensors.begin();
}

void loop()
{
      sensors.requestTemperatures();

      float temp1 = sensors.getTempC(sensorList[0]);
      float temp2 = sensors.getTempC(sensorList[1]);

      Serial.println(temp1);
      Serial.println(temp2);

      delay(1000);
}

In einer etwas vereinfachten Version. Man kann die Sensoren auch noch auf andere Arten auslesen. Siehe Beispiele.


Quote
Deine 2 Tipps in allen Ehren, übersteigen aber grad auf die schnelle meine Kompetenzen
Die Streaming Lib brauchst du nicht unbedingt. Das ist nur eine angenehmere Schreibweise.

Aber was ist so schwer daran auf die String Klasse zu verzichten und statt + zweimal print() zu machen?



Nachtrag:
Hast du die Adressen der Sensoren korrekt eingetragen und nicht einfach nur die aus einem Beispiel Sketch genommen? Die Adressen kannst du dem mit "Tester" Sketch auslesen.

Alternativ kann man auch auf die Adressen verzichten und statt dessen das machen:
Code:
Serial.println(sensors.getTempCByIndex(0));
Dann ist aber die Zuordnung zu den individuellen Sensoren nicht mehr so einfach wenn der Bus umfangreicher wird.
« Last Edit: July 27, 2014, 07:15:49 am by Serenifly » Logged

Offline Offline
Edison Member
*
Karma: 16
Posts: 1037
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
"Wäre froh wenn ich mal anstängie Temperaturen loggen könnte."

Dann mache es doch erst einmal einfach- NUR den Sensor loggen.
Hier gibt es etwas für den "18B20"
http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
und dann eines nach dem anderem.
Gruß und Spaß
Andreas
Logged

die zweite Maus bekommt den Speck...

Pages: [1]   Go Up
Jump to: