Daten ins Internet senden mit enc28j60 Ethernetadapter

Hallo zusammen,

ich habe ein Beispiel, wie ich Daten in eine Datenbank im Internet senden kann, an meine Bedürfnisse angepasst. Siehe hier:

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x32 };

byte Ethernet::buffer[700];
static uint32_t timer;

char website[] PROGMEM = "www.meineDomain.de";

int sensorPin1 = A0;    // select the input pin for the potentiometer
int sensorValue1 = 0;  // variable to store the value coming from the sensor
int sensorPin2 = A1;    // select the input pin for the potentiometer
int sensorValue2 = 0;  // variable to store the value coming from the sensor

void setup () {
  Serial.begin(57600);
  Serial.println("\n[webClient]");

  if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  sensorValue1 = analogRead(sensorPin1);
  sensorValue2 = analogRead(sensorPin2);
  daten_an_web_senden(sensorValue1,sensorValue2,20000);
}

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void daten_an_web_senden (int T1, int T2, int Sek) {
  ether.packetLoop(ether.packetReceive());
  String web1 = "T1=";
  String web2 = "&T2=";
  String web3 = "&key=123";
  String webg = "";
  webg = web1 + T1 +web2 + T2 + web3;
  char charBuf[100];
  webg.toCharArray(charBuf, 100); 
  if (millis() > timer) {
    timer = millis() + Sek;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/db/senden.php?"), charBuf, website, my_callback);
  }
}

Funktioniert auch. Jetzt kommt das große ABER:
Die Funktion wird alle 20 Sek. aufgerufen, was ja auch richtig ist wegen:

  daten_an_web_senden(sensorValue1,sensorValue2,20000);

Ich möchte aber, dass die Funktin daten_an_web_senden immer nur einmal aufrufen wird, wenn ein bestimmtes Ereignis eintritt, z. B. wenn ein Eingang auf high ist oder so.
Mir gelingt es nicht, die Funktion entsprechend umzuschreiben.

In der Anlage ist die Libary.

Brauche Eure Hilfe!!!

ethercard_master.zip (81.8 KB)

Du musst deinen Eingang den du haben willst als Eingang definieren und die Sekundenabfrage aus deine Funktion rau schmeißen und dann dafür sorgen das nur einmal gesendet wird.

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 
  0x74,0x69,0x69,0x2D,0x30,0x32 };

byte Ethernet::buffer[700];
static uint32_t timer;

char website[] PROGMEM = "www.meineDomain.de";

int sensorPin1 = A0;    // select the input pin for the potentiometer
int sensorValue1 = 0;  // variable to store the value coming from the sensor
int sensorPin2 = A1;    // select the input pin for the potentiometer
int sensorValue2 = 0;  // variable to store the value coming from the sensor

// Hier die änderung
int ausloeseinput = 4; // Einfach mal eingang 4 genommen
boolean senden;
boolean istgesendet;

void setup () {
  Serial.begin(57600);
  Serial.println("\n[webClient]");
  pinMode(ausloeseinput,INPUT);
  if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");

  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  sensorValue1 = analogRead(sensorPin1);
  sensorValue2 = analogRead(sensorPin2);
  senden=digitalRead(ausloesepin);  // High bewirkt senden
  if (senden==true&&istgesendet==false){  //damit nur einemal gesendet wird
    daten_an_web_senden(sensorValue1,sensorValue2);
    istgesendet==true;
  }
  if (senden==false){  // Rücksetzten der istgesendet Variable bei Input LOW
    istgesendet=false;
  }
}
// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void daten_an_web_senden (int T1, int T2) {
  ether.packetLoop(ether.packetReceive());
  String web1 = "T1=";
  String web2 = "&T2=";
  String web3 = "&key=123";
  String webg = "";
  webg = web1 + T1 +web2 + T2 + web3;
  char charBuf[100];
  webg.toCharArray(charBuf, 100); 
  Serial.println();
  Serial.print("<<< REQ ");
  ether.browseUrl(PSTR("/db/senden.php?"), charBuf, website, my_callback);

}

Wenn das ein prellender Eingang (z.B. ein Taster ist) dann kann man muss man sich um entprellen kümmern oder z.B. sagen wenn der Eingang länger 20ms High dann senden.

Gruß
DerDani

Hallo DerDani,

vielen Dank für Deine Antwort. Leider funktioniert es nicht auf diese Weise. Das Problem ist, wenn ich die Sekundenabfrage weg lasse, dann sendet der Arduino keine Daten ins Netz. Mein Problem ist, dass der Aufruf der Funktion daten_an_web_senden eine Loop ist. Ohne die Sekundenabfrage geht es aus einem mir unbekannten Grund nicht.

Mit der Sekundenabfrage erhalte ich auf dem Monitor die folgende Antwort vom Webserver:

<<< REQ >>>
HTTP/1.1 200 OK
Date: Tue, 20 May 2014 16:39:07 GMT
Server: Apache
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=UTF-8

Temperaturwerte gespeichert...

Ohne die Sekundenabfrage nur diese Antwort:

<<< REQ

Wenn ich es richtig sehe, durchläuft er die Codezeile

ether.browseUrl(PSTR("/db/senden.php?"), charBuf, website, my_callback);

gar nicht erst.