Sensordaten in Datenbank schreiben (SIM 900)

Hallo liebe Arduinogemeinde!

Ich bin neu hier im Forum, deswegen stell ich mich mal kurz vor.

Mein name ist Marc und ich habe bereits während meinem Studium Erfahrung mit C++ und dem Arduino sammeln dürfen. Zurzeit engagiere ich mich für eine soziale Organisation für welche ich ein Problem mit dem Arduino lösen möchte.

Nun zur Aufgabe.

Ziel des Projektes ist es Sensordaten in einem abgelegen Bergdorf in Nepal zu sammeln und über einen nicht definierten Weg in eine Datenbank zu schreiben. Dabei geht es im Prinzip nur um die gemittelten Daten vom Sensor, welche Messstelle und Uhrzeit/Datum.

Meine Idee war es mittels einem SIM-Modul und einem Arduino die Daten über ein PHP-Skript in eine Datenbank zu schreiben. Die Datenbank und das PHP-Skript laufen. Dabei wird eine Webadresse aufgerufen (z.B. Beispiel Domain). Das PHP-Skript sucht sich die Werte von t und h und schreibt diese in die jeweilige Spalte der Datenbank. (EDIT: Zur Vereinfachung habe ich am Anfang nur den festen Wert t genommen und das PHP-Skript soweit abgeändert, das funktioniert & das Skript gibt mir Successful zurück und schreibt den Wert in die modifizierte Datenbank)

Nun habe ich ein Problem mit dem SIM 900 Modul. Das Modul ist wie folgt an den Arduino angeschlossen:

  • RXD (SIM 900) an Pin 8
  • TXD an Pin 7

Den Code habe ich mir aus dem Internet herausgefischt und komme nicht so recht weiter. Das Handbuch vom SIM 900 Modul hilft mir leider auch nicht weiter.

Es muss lediglich die Webadresse aufgerufen werden, jedoch erfolgt kein Eintrag in der Datenbank.

Der Code und die Ausgabe vom Seriellen Monitor ist angehängt.

Ich hoffe ihr könnt mir weiterhelfen. Ich bin langsam am verzweifeln!

Vielen Dank!

Gruß,

Marc

Test999.ino (2.58 KB)

Serieller_Monitor.txt (1.74 KB)

StillerMoench:
... Ausgabe vom Seriellen Monitor ist angehängt.

Die angehängte Datei ist scheinbar eine Datei im RTF-Format. Poste sie bitte noch einmal als reine ASCII-Datei.

Gruß

Gregor

Nun habe ich ein Problem mit dem SIM 900 Modul.

Ähm ja, aber was ist dein Problem? Außer das du im Sketch unheimlich viele und lange delays benutzt, verstehe ich das Problem nicht...

Setze bitte deinen Sketch und die Meldungen in Code-Tags, das kannst du auch nachträglich machen.

gregorss:
Die angehängte Datei ist scheinbar eine Datei im RTF-Format. Poste sie bitte noch einmal als reine ASCII-Datei.

Gruß

Gregor

Anbei die Date nochmal als ASCII

Serieller_Monitor.txt (1.74 KB)

wapjoe:
Ähm ja, aber was ist dein Problem? Außer das du im Sketch unheimlich viele und lange delays benutzt, verstehe ich das Problem nicht…

Setze bitte deinen Sketch und die Meldungen in Code-Tags, das kannst du auch nachträglich machen.

Vielleicht habe ich mich ein bisschen umständlich ausgedrückt :sweat_smile:

Mein Problem ist, dass einfach nicht die Webadresse aufgerufen wird. Ich denke eine Verbindung zum Internet besteht, aber ich bekomme einfach keinen Datenbankeintrag durch einen einfachen Aufruf der Webadresse. Mehr muss der Arduino nicht machen (wie gesagt das eintragen in die Datenbank und die Anmeldeinformationen erledigt das PHP-Skript).

Das PHP Skript ist nach diesem Schema aufgebaut.

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

$temp = $_GET["t"];
//$hum = $_GET["h"];

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 


$sql = "INSERT INTO database (Temp) VALUES ($temp)";
//$sql = "INSERT INTO database (Temp, Hum) VALUES ($temp, $hum)";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "
" . $conn->error;
}

$conn->close();
?>

StillerMoench:
Anbei die Date nochmal als ASCII

Nein, das sieht wieder nach RTF aus:

Gruß

Gregor

gregorss:
Nein, das sieht wieder nach RTF aus:

Gruß

Gregor

HTTP get method :
AT\r\nAT

OK
AT+SAPBR=3,1,"CONTYPE","GPRS"\r\nAT+SAPBR=3,1,"CONTYPE","GPRS"

OK
AT+SAPBR=3,1,"APN","internet.telekom"\r\nAT+SAPBR=3,1,"APN","internet.telekom"

OK
AT+SAPBR=1,1\r\nAT+SAPBR=1,1

+CME ERROR: operation not allowed
AT+SAPBR=2,1\r\nAT+SAPBR=2,1

+SAPBR: 1,1,"10.XXX.XXX.81"

OK
AT+HTTPINIT\r\nAT+HTTPINIT

+CME ERROR: operation not allowed
AT+HTTPPARA="CID",1\r\nAT+HTTPPARA="CID",1

OK
AT+HTTPPARA="URL","https://beispiel.de/write_data.php?t=9"\r\nAT+HTTPPARA="URL","https:/beispiel.de/write_data.php?t=9AT+HTTPACTION=0\r\nAT+HTTPACTION=0

OK

+HTTPACTION:0,603,0
AT+HTTPREAD\r\nAT+HTTPREAD

OK
AT+HTTPTERM\r\nAT+HTTPTERM

OK
AT+SAPBR=0,1\r\nAT+SAPBR=0,1

OK
HTTP get method :
AT\r\nAT

OK
AT+SAPBR=3,1,"CONTYPE","GPRS"\r\nAT+SAPBR=3,1,"CONTYPE","GPRS"

OK
AT+SAPBR=3,1,"APN","internet.telekom"\r\nAT+SAPBR=3,1,"APN","internet.telekom"

OK
AT+SAPBR=1,1\r\nAT+SAPBR=1,1

OK
AT+SAPBR=2,1\r\nAT+SAPBR=2,1

+SAPBR: 1,1,"10.XXX.XXX.10"

OK
AT+HTTPINIT\r\nAT+HTTPINIT

OK
AT+HTTPPARA="CID",1\r\nAT+HTTPPARA="CID",1

OK
AT+HTTPPARA="URL","https://beispiel.de/write_data.php?t=9"\r\nAT+HTTPPARA="URL","https://beispiel.de/write_data.php?t=9AT+HTTPACTION=0\r\nAT+HTTPACTION=0

OK

+HTTPACTION:0,603,0
AT+HTTPREAD\r\n

Und der Code

#include <SoftwareSerial.h>
/* Create object named SIM900 of the class SoftwareSerial */
SoftwareSerial SIM900(7, 8);
void setup() {
  SIM900.begin(19200);  /* Define baud rate for software serial communication */
  Serial.begin(19200); /* Define baud rate for serial communication */
}

void loop() {
  Serial.println("HTTP get method :");
  Serial.print("AT\\r\\n");
  SIM900.println("AT"); /* Check Communication */
  delay(5000);
  ShowSerialData(); /* Print response on the serial monitor */
  delay(5000);
  /* Configure bearer profile 1 */
  Serial.print("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\\r\\n");    
  SIM900.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");  /* Connection type GPRS */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+SAPBR=3,1,\"APN\",\"internet.telekom\"\\r\\n");  
  SIM900.println("AT+SAPBR=3,1,\"APN\",\"internet.telekom\"");  /* APN of the provider */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+SAPBR=1,1\\r\\n");
  SIM900.println("AT+SAPBR=1,1"); /* Open GPRS context */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+SAPBR=2,1\\r\\n");
  SIM900.println("AT+SAPBR=2,1"); /* Query the GPRS context */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+HTTPINIT\\r\\n");
  SIM900.println("AT+HTTPINIT"); /* Initialize HTTP service */
  delay(5000); 
  ShowSerialData();
  delay(5000);
  Serial.print("AT+HTTPPARA=\"CID\",1\\r\\n");
  SIM900.println("AT+HTTPPARA=\"CID\",1");  /* Set parameters for HTTP session */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+HTTPPARA=\"URL\",\"https://beispiel.de/write_data.php?t=9\"\\r\\n");
  SIM900.println("AT+HTTPPARA=\"URL\",\"https://beispiel.de/write_data.php?t=9\"");  /* Set parameters for HTTP session */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+HTTPACTION=0\\r\\n");
  SIM900.println("AT+HTTPACTION=0");  /* Start GET session */
  delay(10000);
  ShowSerialData();
  delay(10000);
  Serial.print("AT+HTTPREAD\\r\\n");
  SIM900.println("AT+HTTPREAD");  /* Read data from HTTP server */
  delay(8000);
  ShowSerialData();
  delay(8000);
  Serial.print("AT+HTTPTERM\\r\\n");  
  SIM900.println("AT+HTTPTERM");  /* Terminate HTTP service */
  delay(5000);
  ShowSerialData();
  delay(5000);
  Serial.print("AT+SAPBR=0,1\\r\\n");
  SIM900.println("AT+SAPBR=0,1"); /* Close GPRS context */
  delay(5000);
  ShowSerialData();
  delay(5000);
}

void ShowSerialData()
{
  while(SIM900.available()!=0)  /* If data is available on serial port */
  Serial.write(char (SIM900.read())); /* Print character received on to the serial monitor */
}

Hi

Denken ist zwar beim Programmieren ganz gut - zum Debuggen sollte man aber Wissen dem Meinen/Annehmen vorziehen.
Lasse Dir anzeigen, ob der Arduino 'online' ist - wie? Keine Ahnung :slight_smile:
Wenn die von Dir benutzte Lib dafür eine Methode bietet, wäre Das mein Weg.
Sonst müsste man herausfinden, Was anders ist, wenn der Arduino online ist zu Dem, wenn Er eben NICHT online ist.

Was der PHP-Skript macht oder wie Der aufgebaut ist, ist dem Arduino völlig wurscht - Der sagt nur 'Hallo Server, hast Du eine Antwort??' - Eine Rückmeldung des Skript wäre wohl keine schlechte Idee, auch, ob der Ablauf funktioniert hat - dafür reicht ja einfach eine 1 statt einer 0, muß ja keine 20MB große Seite mit Erfolgs-Video werden.

MfG

PS: Wie Du gemerkt hast, ist Das ein rein theoretischer Lösungsansatz - zumindest auf Arduino-Seite wäre ich hier (noch?) nicht so weit und für PHP ist's eigentlich das falsche Forum.
Aber auf PHP-Seite sehe ich das Problem nicht - Da kann dem Arduino im Grunde selbst die Antwort (hat geklappt * freu *) egal sein - Er hat Seine Schuldigkeit getan und wenn am anderen Ende Keiner sitzt, Der die Anfrage bearbeitet, kann Das der Arduino eh nicht beheben.
(1x Reboot Internet, bitte :wink: )

PPS: Was sollen die stundenlangen delay() in loop() ??