Post Übermittlung auf Webserver

Hallo

Ich habe ein kleines Problem (bin immer noch Anfänger):
Ich habe ein Arduino Uno mit Ethernet-Shield und darüber den IO Shield.
Ich möchte jeweils ein HTML Post absetzen, wenn der Eingang 2 aktiviert wird. Das wird durch ein Senser impulsweise alle ca 3 Sekungen ausgelöst.

Mit meinem Code wird der Post nur das erste mal gesendet, danach nichts mehr.
Was habe ich falsch gemacht?

Hier mein Code:

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xC8, 0x0E };
byte ip[] = { 192,168,1,177};
byte gateway[] = { 192,168,1,2 };     

const int SensorPin = 2;
EthernetClient client;

String temp= "wert1=TestPost&Send=Eintragen";  

void setup()
{
Ethernet.begin(mac, ip, gateway);
pinMode(SensorPin, INPUT);  
}

void loop()  
{
 if (digitalRead(SensorPin) == HIGH) {     
   post();
  } 
}

void post()                                           
{  
if (client.connect("192.168.1.11",82))
{   
client.println("POST /input_save.php HTTP/1.1");                 
client.println("Host: 192.168.1.11");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.println("User-Agent: Arduino/1.0");
client.print("Content-Length: ");
client.println(temp.length());
client.println();
client.print(temp);
client.println();
}

}

Danke für jede Hilfe

Du sagst dem Client zwar: "Connection: close", aber davon bekommt dein Schild nix mit.
Vermutlich ist da noch ein client.stop(); nötig.

Genau das wars! Herzlichen Dank.
Komischerweise musste ich auch noch die Bedingung umkehren, so dass nur bei aktivem Sensor der Post abgeschickt wird:
if (digitalRead(SensorPin) == LOW)
Leucht mir zwar nicht ein wieso, aber es funktioniert.

Hier mein funktionierender Code:

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xC8, 0x0E };
byte ip[] = { 192,168,1,177};
byte gateway[] = { 192,168,1,2 };

const int SensorPin = 2;
EthernetClient client;

String temp= "wert1=TestPost&Send=Eintragen";

void setup()
{
Ethernet.begin(mac, ip, gateway);
pinMode(SensorPin, INPUT);

}

void loop()
{
if (digitalRead(SensorPin) == LOW) {
post();
delay(500);
}
}

void post()
{
if (client.connect("192.168.1.11",82))
{
client.println("POST /input_save.php HTTP/1.1");
client.println("Host: 192.168.1.11");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.println("User-Agent: Arduino/1.0");
client.print("Content-Length: ");
client.println(temp.length());
client.println();
client.print(temp);
client.println();
client.stop();
}

}

Welchen Sensor hast Du dran?

Das Signal kommt über einen Reedschalter (5V -> Reedschalter -> Input2).
Das Ganze über den IO Shield funktioniert nur wenn bei LOW. Ich habe testweise den Reedschalter direkt am Uno Board angeschlossen (5V -> Reedschalter -> Input2). Seltsam: Hier wird Input 2 pro Impuls gleich mehrmals aktiv.
Noch seltsamer: Stecke ich nur einen Steckdraht in Input 2 und das andere Ende ist in der Luft ist Input 2 aktiv und sendet HTML Posts. Muss ich hier evt einen Widerstand einbauen?

Klar, wenn Du nach Plus schaltest mach nen Pulldown Widerstand rein. 10k passt immer.
Sonst hängt der Eingan offen und macht komische Sachen ....
Oder Du schaltest nach GND und aktivierst die eingebauten Pullups. 1 Zeile mehr Code aber 1 Teil gespart.

ok, wieder was gelernt :slight_smile:

Meinst du mit dem integrierten Pullup das Argument im pinmode: pinMode(2,INPUT_PULLUP);
Das wäre nur ein Argument mehr statt einer Zeile. Oder meinst du was anderes?

Gibt es ein Schema für die Schaltung nach GND mit internem Pullup? Bei meiner Suche habe ich nur widersprüchliche Infos gefunden.

Danke für deine Hilfe

Bei meiner Suche habe ich nur widersprüchliche Infos gefunden.

Hmm...
Kann ich glauben.
Es ist viel Mist unterwegs.

Ja, den internen Pullup kann man nutzen.
Und ja, nur 1 Parameter mehr.
Den Schalter könntest dann zwischen Pin2 und GND machen.

Aber:
Bei einem Programmierfehler + Schalterbetätigung kann dir der UNO abrauchen.
Darum zwischen Pin2 und Schalter noch einen 1K Widerstand stecken/löten.

Das ist natürlich ein starkes Argument für den zusätzlichen Widerstand.
Wenn ich also zwischen Pin2 und Schalter einen 1K Widerstand löte, dann könnte ich auf INPUT_PULLUP verzichten?

Wenn man halbwegs weiß was man tut braucht's das nicht.
Der Pin muss natürlich auf Input gesetzt sein, damit's tatsächlich keinen Kurzen geben kann.
Und mit dem internen Pullup dreht sich natürlich die Logik um: Taster gedrückt = LOW

Ansonsten so wie im Anhang

Hmmm....
Warum einen externen Pulldown, wenn es doch einen internen Pullup gibt.
Dem INT0 ist das schnuppe, der kann auf beiden Flanken triggern.
Auch die Logik lässt sich im Programm leicht drehen.

Ich kann verstehen, wenn man den UNO in den Stromparmodus schicken will, dass ein externer Pullup/Pulldown Sinn macht.
Aber auf den (Pin2) Schutzwiderstand würde ich nicht verzichten. In einer endgültigen Schaltung evtl. ja, aber nicht in einer "Anfängerbastelstube".

Wenn ich also zwischen Pin2 und Schalter einen 1K Widerstand löte, dann könnte ich auf INPUT_PULLUP verzichten?

Pullupwiderstand und Schutzwiderstand sind 2 Paar Schuhe.
Da gibts wenig Beziehung zwischen den beiden Konzepten.

Ach ja, wer sich mit Schaltern und Tastern beschäftigt, sollte zwingend über "Entprellen" nachdenken.

Die meisten Anfänger-Beispiele verwenden leider Pulldowns, aus dem einfach Grund dass dann die Logik "stimmt". Man hat gedrückt HIGH und nicht gedrückt LOW.

Die internen Pullups sind aber einfacher. Man muss sich bei der Schaltung weniger merken und braucht keine Zusätzlichen Bauteile. Man muss halt nur LOW und HIGH im Code vertauschen.