Go Down

Topic: Anfänger verzweifelt langsam (Read 384 times) previous topic - next topic

Jul 27, 2014, 10:20 am Last Edit: Jul 27, 2014, 11:05 am by testperson Reason: 1
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.

tsaG

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)

#2
Jul 27, 2014, 12:25 pm Last Edit: Jul 27, 2014, 11:26 pm by uwefed Reason: 1
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: [Select]
/***************************************************************************************************************************          
 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;
}

Serenifly

#3
Jul 27, 2014, 12:33 pm Last Edit: Jul 27, 2014, 12:42 pm by Serenifly Reason: 1
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: [Select]

.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: [Select]
client.print("GET " + String(url));
einfach zwei Zeilen draus machen:
Code: [Select]

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 :)

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...

Serenifly

#5
Jul 27, 2014, 02:01 pm Last Edit: Jul 27, 2014, 02:15 pm by Serenifly Reason: 1
Hast du die Sensoren korrekt verdrahtet? 4,7k Pullup verwendet?


Bei mir geht das mit der verbesserten Lib (+OneWire2):
Code: [Select]

#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: [Select]

Serial.println(sensors.getTempCByIndex(0));

Dann ist aber die Zuordnung zu den individuellen Sensoren nicht mehr so einfach wenn der Bus umfangreicher wird.

SkobyMobil

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
die zweite Maus bekommt den Speck...

Go Up