INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 3 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino mit DS18B20 und MySQL
25.01.2014, 14:51 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2014 15:07 von Bitklopfer.)
Beitrag #25
RE: Arduino mit DS18B20 und MySQL
(23.01.2014 22:39)Fried22 schrieb:  So, nun mal ein kurzer Zwischenbericht!

Da habe ich ein wenig herumgespielt, mir alles durch den Kopf gehen lassen und was soll ich sagen? Nur als Temperaturlogger ist das für den Uno zu wenig.

Mittlerweile habe ich ein LCD-Display integriert (20/4) und so eingebunden, dass es beim Hochfahren den Ist-Zustand anzeigt. Also Anmelden, dann Sensoren suchen und erkannte Sensoren anzeigen. Anschließend werden die Sensordaten angezeigt. Anzeige der Datensendung an die Datenbank ist noch in Arbeit.

Was ist noch zu tun? Ricardo, das mit der Zeit nehme ich ernst. Da ich jetzt das Display im Betrieb habe, fällt der RTC-Chip natürlich raus. Wegen - mir gehen langsam die Pins aus. 7 Stück allein für das Display, 2 wegen des Serial Monitor, meine Sensoren und wenn ich die SD-Card mit einbinden möchte, sind nochmal 2 weg (wenn ich mich jetzt nicht verzählt habe).
Also gibt es 2 Möglichkeiten. Entweder resette ich regelmässig oder ich nehme die Uhrzeit per UDP (alle 1-2 Tage).
Für UDP habe ich mich nun entschieden. Ist gar nicht so einfach, wie ich feststellen musste. Ich bin Anfänger, sollte man nicht vergessen, aber ich arbeite daran. Blush
UDP hat, gegenüber des resetten, den Vorteil die Uhrzeit mit in das Display zu nehmen.
Also noch ein wenig Arbeit an der "Software".Sad

Die Webseite ist in Arbeit, da geht es voran. Dank großer Hilfe eines Bekannten.
Big Grin:DDa wäre ich aber völlig überfordert.

Die Hardware ist auch noch nicht komplett. Meine Lieferanten lassen mich im Stich. So ist es nun mal, wenn man günstig einkaufen geht. Und ich habe nicht alles in Übersee gekauft. Angry Kabel müssen auch noch verlegt werden, Platinen und Sensoren verlötet werden, Gehäuse gebaut .....

Grüße

Michael

Hallo Fried22,
ja das mit den Pin's ist das eine Problem, das andere ist der Programmspeicherplatz auf dem UNO Big Grin, da ich einen ähnlichen Datenlogger (Ethernet, LCD Keypad, SD-Card, Uhrzeit per NTP nur UNIX Zeit verwendet) auch schon programmiert habe kann ich dir jetzt schon sagen das dir da der Speicherplatz ausgeht....darum habe ich das ganze auf einen Mega2560 transferiert...dann haste wieder Luft...Shy
lg
bk

(25.01.2014 14:47)rkuehle schrieb:  ...

Hallo BK,
Zitat:und ordnet dann dauerhaft dem einzelnen Sensor seinen Messplatz in der Anlage zu ?
Wie meinst du das? Geht es in die Richtung: Sensor geht kaputt wird ausgetauscht und Sketch soll das erkennen und dann den neuen Sensor abfragen?

Grüße RK

Hallo Ricardo,
gut das mit dem austauschen von defekten Sensoren ist auch eine gute Frage, aber mir ging es erst mal um die Erstinbetriebnahme denn da hat sich bei mir diese Frage aufgeworfen nachdem ich euren Sketch gestartet habe und trotzdem das ich 21 DS18B20 angeschlossen hatte keinen Messwert gesehen hatte. Confused ....und auf dem Bauteil steht die Adresse ja nicht drauf...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2014, 15:13
Beitrag #26
RE: Arduino mit DS18B20 und MySQL
Hallo BK,

hier gibts eine Beschreibung wie man die Adressen auslesen kann. Steht insbesondere im Abschnitt "ROM Search Example"
http://www.maximintegrated.com/app-notes...mvp/id/162
Damit sollte man die Adressen ermitteln und vllt. dann per Anzeige und Tastatur/Buttons auf Variablen für Messplätze zuweisen können.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2014, 15:14 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2014 15:17 von Bitklopfer.)
Beitrag #27
RE: Arduino mit DS18B20 und MySQL
apropos I2C und LCD Display, den Wandler vom I2C auf das paralelle LCD Display gibt es für wenig Geld in der Bucht, z.B. hier:
I2C Interface
Gehe damit auch gerade Schwanger mir das Teil zu holen....andererseits habe ich noch Displays im Serieller Schnittstelle im Vorrat Big Grin

(25.01.2014 15:13)rkuehle schrieb:  Hallo BK,

hier gibts eine Beschreibung wie man die Adressen auslesen kann. Steht insbesondere im Abschnitt "ROM Search Example"
http://www.maximintegrated.com/app-notes...mvp/id/162
Damit sollte man die Adressen ermitteln und vllt. dann per Anzeige und Tastatur/Buttons auf Variablen für Messplätze zuweisen können.

Grüße RK
Danke dir,
einen Scanner habe ich am laufen der mir alle Sensoren anzeigt....es ging mir um die Vorgehensweise das dann in den zugeordneten Betrieb zu übernehmen und zwar ohne das ich von Hand die Adressen übertragen muß.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2014, 16:01
Beitrag #28
RE: Arduino mit DS18B20 und MySQL
Hallo Leute,

Punkt 1 - I2C-Display:
Das ist mir nun auch klar, dass ich dann Pins gespart hätte. Nur, ich bin Arduino Anfänger und habe mir vorab mal ne Grundausstattung besorgt. Ich wollte erst mal ein wenig rumspielen. Wie gesagt, programmieren, damit fange ich gerade erst an (4 Wochen erst). Der Datenlogger hat sich bei mir indieser Zeit entwickelt. Das Display habe ich für 7 Euronen (inkl. Versand) erstanden. Und nun wird es auch verbaut.

Mit der Pinbelegung ist jetzt aber nicht wirklich schlimm, wenn ich das mit dem UDP jemals hinkriege. Ricardo, danke für den Link. Ich werde mir das mal gut anschauen. Immo drehe mich ein wenig im Kreis. Schaun wir mal.

Dann kommt in diesem Zusammenhang der Einwurf mit dem Speicherplatz: Mit der LCD-Anzeige bin ich noch nicht ganz fertig, aber es kommt nicht mehr viel hinzu. Immo habe ich 22000 von 32000 belegt. Da sollte UDP doch noch reinpassen, oder nicht?Huh Was meint Ihr, sonst müsste ich das fallen lassen? Auf diese Frage könntet ihr mir vielleicht kurzfristig antworten? dann brauche ich mich nicht mehr Quälen.

Im entwickeln von Abläufen, also der Weg von Vorgabe bis zum Ziel, bin ich stark. Nur die Umsetzung in ein Programm ist meine Schwäche. Schaue ich mir einen eifachen Sketch an, verstehe ich ihn ja auch. Nur das Umsetzten in einen anderen gelingt mir nicht so gut. Ich hoffe, ich habe mich verständlich ausgedrückt.Blush

Punkt 2 - Digitaladressen auslesen: mache ich mit diesem Sketch:

Zitat:#include <OneWire.h>
 
OneWire ow(8); //Digitalpin 2 auslesen
 
void setup(void)
{
  Serial.begin(9600);
  lookUpSensors();
}
 
void lookUpSensors()
{
  byte address[8];
  int i=0;
  byte ok = 0, tmp = 0;
 
  Serial.println("--Suche gestartet--");
  while (ow.search(address))
  {
    tmp = 0;
    //0x10 = DS18S20
    if (address[0] == 0x10)
    {
      Serial.print("Device is a DS18S20 : ");
      tmp = 1;
    } 
    else
    {
      //0x28 = DS18B20
      if (address[0] == 0x28)
      {
        Serial.print("Device is a DS18B20 : ");
        tmp = 1;
      }
    }
    //display the address, if tmp is ok
    if (tmp == 1)
    {
      if (OneWire::crc8(address, 7) != address[7])
      {
        Serial.println("but it doesn't have a valid CRC!");
      } 
      else
      {
        //all is ok, display it
        for (i=0;i<8;i++)
        {
          if (address[i] < 9)
          {
            Serial.print("0");
          }
          Serial.print("0x");
          Serial.print(address[i],HEX);
          if (i<7)
          {
            Serial.print(", ");
          }
        }
        Serial.println("");
        ok = 1;
      }
    }//end if tmp
  }//end while
  if (ok == 0)
  {
    Serial.println("Keine Sensoren gefunden");
  }
  Serial.println("--Suche beendet--");
}
 
void loop(void)
{
  //do nothing Smile
}


Punkt 3 Defekter Sensor:

Wenn ein Sensor defekt ist, wird ja eine Temperatur ausgegeben. In meinem Fall -127°C. So kalt wird es bei mir an der Anlage nie, auch nicht außen. Somit weiß ich, welcher Sensor defekt ist. Ich habe jedem Sensor einen festen Platz im System gegeben (z.B.:DeviceAddress sensor1 = {0x28, 0xEB, 0x86, 0x3C, 0x5, 0x0, 0x0, 0xF7 }. Somit brauche ich den Sensor, der eine temp von -127° anzeigt, austauschen und im Sketch nur die neue Mac eintragen. Fertig ist das Gedöns.Big Grin

Normal können die 10 Sensoren ohne Vergabe der Mac angeschlossen werden. Nur, wenn ein Sensor defekt ist, kommt die ganze Reihenfolge der Sensoren durcheinander. Dann brauche ich auch nicht zu loggen. Deswegen die Zuordnung.

Wie oben schon gesagt, hat sich das mit dem Temploggen so ergeben. Nun soll so günstig wie möglich werden. Mein Ziel - deutlich unter 100 €. Das werde ich auch erreichen. Display - günstig, Arduino Uno - das teuerste, Ethernet-Shield - na ja geht so, 10 Stück Sensoren(wasserdicht) mit 2m Kabel - günstig (21 €). Noch ein paar Kleinteile - Ziel wird erreicht.

Ich hoffe, ich habe ein paar Fragen klären können.

Grüße
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2014, 16:33
Beitrag #29
RE: Arduino mit DS18B20 und MySQL
Hallo Michael,
Zitat:Immo habe ich 22000 von 32000 belegt.
Hier gibts ein paar Tipps wie man den Programmspeicher des Arduino gut ausnutzen kann: http://learn.adafruit.com/memories-of-an...izing-sram

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2014, 18:35
Beitrag #30
RE: Arduino mit DS18B20 und MySQL
ahja...wußt ichs doch das ich meinen Logger hier schon mal gepostet habe...schaut mal da rein:
Mega_Logger
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 14:14
Beitrag #31
RE: Arduino mit DS18B20 und MySQL
Danke erst mal für die letzten Links.

Ein kurzer Zwischenbericht: Die Webseite ist fast fertig und die Temperaturen meiner 10 Sensoren, werden auch in die Datenbank geschrieben.
Nur leider bricht die Unterhaltung Uno zur Datenbank, in unregelmäßigen Abständen zusammen. Mal nach 15 Minuten, mal nach 4-5 Stunden oder auch nach 2-3 Minuten.
Die Ursache ist mir schleierhaft. Der Arduino verbindet sich mit der Datenbank und während des Daten-Senden hängt er sich auf. Im Serial-Monitor zu beobachten(das Bild friert ein). Besser kann ich es nicht beschreiben. Hattet Ihr schon mal so ein Problem?

Nun stehe ich schon wieder auf dem Schlauch. Ich habe viel gelesen und auch auch ausprobiert.

Ich habe den UdpNtpClient in aus verschieden Sketchen getestet, hat auch meistens funktioniert. Nur verstanden habe ich nicht immer, warum und wieso es mal geht und auch mal nicht.

Jetzt habe ich die Udp-Zeit in meinem Sketch integriert. Hier mein Sketch:
Zitat://
//
/********************************************************************************​***************************
                                                                                                           *
-Dieser Sketch liest 10 Temperatursensoren, vom Typ "DS 18 B 20", aus.                                     *
                                                                                                           *
-Die Temperaturen werden an einen Webserver gesendet. Dort ist ein PHP-Skript abgelegt.                    *
 Dadurch werden die Werte an eine Datenbank weiter gereicht. So können diese Werte mit                     *
 Hilfe der Webseite weiter verarbeitet werden.                                                             *
                                                                                                           *
-Der Arduinoerkennt die Anzahl der angeschl. Sensoren. Sollten weniger Sensoren angeschlossen sein, oder   *
 ein Sensor defekt sein, wird der Temperaturwert mit -127°C weitergegeben. So wird sichergestellt, dass    *
 sofort ersichtlich ist, dass ein Sensor nicht funktioniert.                                               *
 Im "Serial Monitor" ist es möglich, jederzeit den momentanen Programmablauf zu überprüfen                 *
                                                                                                           *
-Im "unsignet long interval = 120000" ist Zeitabstand zwischen 2 Übertragungen angegeben in Millisekunden  *
                                                                                                           *
-Folgende Angaben sind anzupassen:                                                                         *
                                                                                                           *
 1. Die MAC-Adressen der Sensoren                                                                          *
 2. MAC-Adresse des Arduino                                                                                *
 3. IP-Adresse des Arduino                                                                                 *
 4. char host[] = "ihrewaesche.de"; // Domain                                                              *
 5. char url[] = "/ARDUINO/Temperatur/SaveTempToMySQL.php"; // Pfad zur PHP-Datei                          *
 6. char key[] = "MEINPASSWORT123"; // Kennwort aus PHP-Datei                                              *                              
 7. OneWire ds(7)  Digitalpin für Temperatursensoren                                                       *
                                                                                                           *
Sensor1:     0x28, 0x2D, 0xC2, 0x59, 0x5, 0x0, 0x0, 0x3D    T1 = Puffer oben                               *
Sensor2:     0x28, 0xC2, 0x42, 0x5A, 0x5, 0x0, 0x0, 0x73    T2 = Puffer unten                              *
Sensor3:     0x28, 0x9F, 0xFA, 0x59, 0x5, 0x0, 0x0, 0xEE    T3 = HygPuffer oben                            *
Sensor4:     0x28, 0xA, 0x2A, 0x5A, 0x5, 0x0, 0x0, 0x62     T4 = HygPuffer unten                           *
Sensor5:     0x28, 0x47, 0xFC, 0x59, 0x5, 0x0, 0x0, 0x17    T5 = HzVorlaufTemp                             *
Sensor6:     0x28, 0x12, 0x12, 0x5A, 0x5, 0x0, 0x0, 0x22    T6 = HzRücklaufTemp                            * 
Sensor7:     0x28, 0xCB, 0x0, 0x5A, 0x5, 0x0, 0x0, 0x8F     T7 = Kessel                                    *
Sensor8:     0x28, 0x9B, 0xE5, 0x59, 0x5, 0x0, 0x0, 0x21    T8 = Abgas                                     *
Sensor9:     0x28, 0xF0, 0xD0, 0x59, 0x5, 0x0, 0x0, 0x4C    T9 = Aussen                                    *
Sensor10:    0x28, 0xB9, 0xEF, 0x59, 0x5, 0x0, 0x0, 0x44    T10 =Laddomat/KesselVorlauf                    *
                                                                                                           *
********************************************************************************​****************************
*/
//
 #include <SPI.h>
 #include <Ethernet.h> // library für Internet - Funktionen
 #include <DallasTemperature.h> // library für Temperatursensoren
 #include <OneWire.h> // library für den OneWire Bus
 #include <EthernetUdp.h>
 
 OneWire ds(9); // pin für Temperatursensoren

 //DeviceAdressen der einzelnen ds1820 Temperatursensoren - Steckbrett
 DeviceAddress sensor1 = {
   0x28, 0x9D, 0x83, 0x3C, 0x5, 0x0, 0x0, 0xF };
 DeviceAddress sensor2 = {
   0x28, 0xEB, 0x86, 0x3C, 0x5, 0x0, 0x0, 0xF7 };
 DeviceAddress sensor3 = {
   0x28, 0x32, 0x8D, 0x3C, 0x5, 0x0, 0x0, 0xD5 };
 DeviceAddress sensor4 = {
   0x28, 0xC8, 0x76, 0x3C, 0x5, 0x0, 0x0, 0xBE };  
 DeviceAddress sensor5 = {
   0x28, 0x1F, 0x81, 0x3C, 0x5, 0x0, 0x0, 0x8 };
 DeviceAddress sensor6 = {
   0x28, 0x19, 0x92, 0x3C, 0x5, 0x0, 0x0, 0x88 };  
 DeviceAddress sensor7 = {
   0x28, 0xB, 0x7C, 0x3C, 0x5, 0x0, 0x0, 0xC5 };
 DeviceAddress sensor8 = {
   0x28, 0x9C, 0x83, 0x3C, 0x5, 0x0, 0x0, 0x38 };
 DeviceAddress sensor9 = {
   0x28, 0xEB, 0x86, 0x3C, 0x5, 0x0, 0x0, 0xF7 };
 DeviceAddress sensor10 = {
   0x28, 0x9D, 0x83, 0x3C, 0x5, 0x0, 0x0, 0xF };
  
  /*
  
   //DeviceAdressen der einzelnen ds18b20 Temperatursensoren - Keller
 DeviceAddress sensor1 = {
   0x28, 0x2D, 0xC2, 0x59, 0x5, 0x0, 0x0, 0x3D };
 DeviceAddress sensor2 = {
   0x28, 0xC2, 0x42, 0x5A, 0x5, 0x0, 0x0, 0x73 };
 DeviceAddress sensor3 = {
   0x28, 0x9F, 0xFA, 0x59, 0x5, 0x0, 0x0, 0xEE };
 DeviceAddress sensor4 = {
   0x28, 0xA, 0x2A, 0x5A, 0x5, 0x0, 0x0, 0x62 };  
 DeviceAddress sensor5 = {
   0x28, 0x47, 0xFC, 0x59, 0x5, 0x0, 0x0, 0x17 };
 DeviceAddress sensor6 = {
   0x28, 0x12, 0x12, 0x5A, 0x5, 0x0, 0x0, 0x22 }; 
 DeviceAddress sensor7 = {
   0x28, 0xCB, 0x0, 0x5A, 0x5, 0x0, 0x0, 0x8F };
 DeviceAddress sensor8 = {
   0x28, 0x9B, 0xE5, 0x59, 0x5, 0x0, 0x0, 0x21 };
 DeviceAddress sensor9 = {
   0x28, 0xF0, 0xD0, 0x59, 0x5, 0x0, 0x0, 0x4C };
 DeviceAddress sensor10 = {
   0x28, 0xB9, 0xEF, 0x59, 0x5, 0x0, 0x0, 0x44 };
 */

 //ETHERNET-SETTINGS
 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC-Adresse des Arduino
 byte ip[] = { 192, 168, 178, 28 }; // IP-Adresse des Arduino
 byte gateway[] = { 192, 168, 178, 1 }; // Gateway
 byte subnet[] = { 255, 255, 255, 0 }; // SubNet
 byte server[] = {
   95, 128, 201, 67 }; // IP-Adresse des Servers


 unsigned long Interval = 120099; //*** Upload-Interval Millisekunden = 5 Minuten
 //*** Zeitpunkt zu dem die letzte Sendung an Server erfolgte.
 //*** Aber Achtung: millis() läuft nach 50 Tagen über und beginnt wieder bei 0 //*** wegen der max. Zahl eines long-Wertes. Abhilfe schafft hier nur Zeit holen //*** über UDP/NTP bzw. RTC-Chip.
 unsigned long Lastsend = 0;
 
 DallasTemperature sensors(&ds);
 int numSensors; // Variable zum speichern der Anzahl der Temperatur-Sensoren
 float temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9,temp10; // Temperaturwerte der Sensoren

 // NTP Funktion - Time-Server
 unsigned int localPort = 8888; // local port to listen for UDP packets
 //IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server
 IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov NTP server
 // IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov NTP server

 const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

 byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
 
 EthernetUDP Udp;

 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.");
     sensors.setResolution(sensor1, 10);
     sensors.setResolution(sensor2, 10);
     sensors.setResolution(sensor3, 10);
     sensors.setResolution(sensor4, 10);
     sensors.setResolution(sensor5, 10);
     sensors.setResolution(sensor6, 10);
     sensors.setResolution(sensor7, 10);
     sensors.setResolution(sensor8, 10);
     sensors.setResolution(sensor9, 10);
     sensors.setResolution(sensor10, 10);
   }
   else // Es wurde kein Sensor gefunden
   {
     Serial.println("Keine Temperatur-Sensoren gefunden.");
   }
   //*** Startzeit des Daten_Senden Timers
   Lastsend=millis();
   
   Udp.begin(localPort);
 }
 void loop()
 {
   sensors.requestTemperatures();
   temp1 = sensors.getTempC(sensor1);
   temp2 = sensors.getTempC(sensor2);
   temp3 = sensors.getTempC(sensor3);
   temp4 = sensors.getTempC(sensor4);
   temp5 = sensors.getTempC(sensor5);
   temp6 = sensors.getTempC(sensor6);
   temp7 = sensors.getTempC(sensor7);
   temp8 = sensors.getTempC(sensor8);
   temp9 = sensors.getTempC(sensor9);
   temp10 = sensors.getTempC(sensor10);
   if (temp1 == -127.00) Serial.print("Fehler Sensor1");
   else {
     Serial.print("Temp1: ");
     Serial.println(temp1);
   }
   if (temp2 == -127.00) Serial.print("Fehler Sensor2");
   else {
     Serial.print("Temp2: ");
     Serial.println(temp2);
     if (temp1 == -127.00) Serial.print("Fehler Sensor3");
     else {
       Serial.print("Temp3: ");
       Serial.println(temp3);
     }
     if (temp2 == -127.00) Serial.print("Fehler Sensor4");
     else {
       Serial.print("Temp4: ");
       Serial.println(temp4);
     }
     if (temp1 == -127.00) Serial.print("Fehler Sensor5");
     else {
       Serial.print("Temp5: ");
       Serial.println(temp5);
     }
     if (temp2 == -127.00) Serial.print("Fehler Sensor6");
     else {
       Serial.print("Temp6: ");
       Serial.println(temp6);
     }
     if (temp1 == -127.00) Serial.print("Fehler Sensor7");
     else {
       Serial.print("Temp7: ");
       Serial.println(temp7);
     }
     if (temp2 == -127.00) Serial.print("Fehler Sensor8");
     else {
       Serial.print("Temp8: ");
       Serial.println(temp8);
     }
     if (temp1 == -127.00) Serial.print("Fehler Sensor9");
     else {
       Serial.print("Temp9: ");
       Serial.println(temp9);
     }
     if (temp2 == -127.00) Serial.print("Fehler Sensor10");
     else {
       Serial.print("Temp10: ");
       Serial.println(temp10);
     }
     //*** Abfrage ob aktuelle Zeit > letzter Sendezeit + Interval -1 / ohne Abfrage des Status der Sensoren
     if (millis() > Lastsend + Interval -1)
     {
       //*** Wenn ja, letzte Sendezeit auf aktuelle Zeit
       Lastsend=millis();
       //*** und senden
       Daten_Senden(temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10); // 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();

       //*** mittels Lastsend und Interval ersetzt delay(Interval);
     }
   }
 } 
 /******************************
 *
 * Daten an Server schickenn *
 *
 *******************************/
 void Daten_Senden(float T1, float T2, float T3, float T4, float T5, float T6, float T7, float T8, float T9, float T10)
 {
   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("&T3=");
     Serial.print("&T3=");
     client.print(T3);
     Serial.println(T3);
     client.print("&T4=");
     Serial.print("&T4=");
     client.print(T4);
     Serial.println(T4);
     client.print("&T5=");
     Serial.print("&T5=");
     client.print(T5);
     Serial.println(T5);
     client.print("&T6=");
     Serial.print("&T6=");
     client.print(T6);
     Serial.println(T6);
     client.print("&T7=");
     Serial.print("&T7=");
     client.print(T7);
     Serial.println(T7);
     client.print("&T8=");
     Serial.print("&T8=");
     client.print(T8);
     Serial.println(T8);
     client.print("&T9=");
     Serial.print("&T9=");
     client.print(T9);
     Serial.println(T9);
     client.print("&T10=");
     Serial.print("&T10=");
     client.print(T10);
     Serial.println(T10);
     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 *****");
   }
   
   sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
  delay(1000);
  if ( Udp.parsePacket() ) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("Die UTC Zeit ist "); // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address 
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
  


Nun muss ja noch konfiguriert werden dass:
1. Der Intervall Daten-Senden alle 2 Minuten stattfindet. Immo wird der Intervall über die "unsigned long interval" gesteuert.
Ich habe leider keinen Plan, wie ich das bewerkstelligen soll. Was muss da wo in den Sketch geschrieben werden? Ich würde das gerne verstehen wollen.

2. Das der Uno den ZeitServer 1x am Tag abfragt.
Auch da habe ich keine Ahnung, wie ich das bewerkstelligen soll.
Auch das würde ich gerne verstehen.

@Bitklopfer: Dein Mega_Logger ist eine tolle Sache, jedoch ist der so groß, dass der für mich (als Anfänger) doch ein wenig unübersichtlich ist(da untertreibe ich noch).
Der Sketch ist so lang, dass ich schon beim scrollen die Übersicht verliere. Für den Sketch brauche ich noch ein paar Monate, leider.Confused

Ich wäre Euch sehr verbunden, wenn ihr mich weiter ünterstützen würdet.

Grüße
Michael
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2014, 19:34
Beitrag #32
RE: Arduino mit DS18B20 und MySQL
(29.01.2014 14:14)Fried22 schrieb:  Danke erst mal für die letzten Links.

Ein kurzer Zwischenbericht: Die Webseite ist fast fertig und die Temperaturen meiner 10 Sensoren, werden auch in die Datenbank geschrieben.
Nur leider bricht die Unterhaltung Uno zur Datenbank, in unregelmäßigen Abständen zusammen. Mal nach 15 Minuten, mal nach 4-5 Stunden oder auch nach 2-3 Minuten.
Die Ursache ist mir schleierhaft. Der Arduino verbindet sich mit der Datenbank und während des Daten-Senden hängt er sich auf. Im Serial-Monitor zu beobachten(das Bild friert ein). Besser kann ich es nicht beschreiben. Hattet Ihr schon mal so ein Problem?

Nun stehe ich schon wieder auf dem Schlauch. Ich habe viel gelesen und auch auch ausprobiert.

Ich habe den UdpNtpClient in aus verschieden Sketchen getestet, hat auch meistens funktioniert. Nur verstanden habe ich nicht immer, warum und wieso es mal geht und auch mal nicht.

Jetzt habe ich die Udp-Zeit in meinem Sketch integriert. Hier mein Sketch:
.......


Nun muss ja noch konfiguriert werden dass:
1. Der Intervall Daten-Senden alle 2 Minuten stattfindet. Immo wird der Intervall über die "unsigned long interval" gesteuert.
Ich habe leider keinen Plan, wie ich das bewerkstelligen soll. Was muss da wo in den Sketch geschrieben werden? Ich würde das gerne verstehen wollen.

2. Das der Uno den ZeitServer 1x am Tag abfragt.
Auch da habe ich keine Ahnung, wie ich das bewerkstelligen soll.
Auch das würde ich gerne verstehen.

@Bitklopfer: Dein Mega_Logger ist eine tolle Sache, jedoch ist der so groß, dass der für mich (als Anfänger) doch ein wenig unübersichtlich ist(da untertreibe ich noch).
Der Sketch ist so lang, dass ich schon beim scrollen die Übersicht verliere. Für den Sketch brauche ich noch ein paar Monate, leider.Confused

Ich wäre Euch sehr verbunden, wenn ihr mich weiter ünterstützen würdet.

Grüße
Michael

Hallo Fried,
wenn sich dein Progi aufhängt, kann es denn dabei sei das der NTP Server dir keine Zeit mehr ansagt ? ...ich nehme mal an das du alle 2Min. da die Zeit abholst... das mögen die NTP Server nicht wenn du allzu oft unter der gleichen IP Adresse bei denen die Zeit abfrägst weshalb ich bei meinem Megalogger Progi nur per Hand auf Knopfdruck oder nach einem Reset die Zeit vom Server hole. Dazwischen benutze ich die millis() Funktion um die Sekunden mitzuzählen. Das Problem ist nur das dann alle paar Tage auch die long int Variable beim Millisekunden zählen überläuft.
..ich glaube das Problem war damit behoben
Code:
//  Messzyklus alle Sekunde
  if (millis() - lastReadingTime > 1000){
    lastReadingTime = millis();  // Zeitstempel updaten
    sekunden ++;  // Sekundenzaehler inkrement
und da sekunden auch eine unsigned long int ist hält die wie die UNIX Zeit auch über 100 Jahre durch...
Und die Variable Sekunden ist dann bei mir die Systemzeit nachdem sich alle Messintervalle richten.
Und wenn ich eine NTP Abfrage hatte stelle ich die sekunden nach der NTP Zeit:
Code:
//### lokaler Sekundenzaehler auf Unixzeit stellen
  sekunden = Unixtime;
Damit ist man das Problem los das der NTP Server einen aussperrt.

Ahja, mein Sketch heiß´t Megalogger weil auf dem UNO zu wenig Programmspeicherplatz war um alles unterzubringen bei den vielen und umfangreichen Lib's.

Falls du von meinem Code was verwenden magst kann ich dir das auch ein bischen nähers erklären was ich wo gehäckt habe...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino+Ethernet+RFID+MySQL RonSH 12 640 13.10.2016 22:32
Letzter Beitrag: Tommy56
Lightbulb LED Thermometer über WS2812b LED und Dallas DS18B20 Wampo 2 1.724 15.03.2015 17:45
Letzter Beitrag: Wampo
Star ATTINY85 mit DS18B20 Temperatursensor und echtem Analogausgang ardu_arne 0 4.130 07.01.2015 21:28
Letzter Beitrag: ardu_arne
  Arduino Neuling: Zugeklappten Laptop mit Arduino aufwecken + Kiste aufklappen? Ikearegal 2 2.512 02.02.2014 07:59
Letzter Beitrag: Ikearegal

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste