ENC28J60 WebClient: Zugriff im lokalen Netz

Hi Leute!

Ich bau grad eine Wetterstation und wollte dass alle 15 Minuten die Werte auf meinem mySQL Server gespeichert werden. Die Werte werden ohne Probleme ausgelesen und ich muss sie nur noch auf dem Server speichern. Das wollte ich über eine Webseite die auf dem Server liegt machen, indem ich die Werte per GET an die Datei schicke.
Das Problem: Ich habe das Ethernet Modul ENC28J60 und ich bin im Netzwerk online, aber ich kann nicht auf eine interne Webseite zugreifen.
Ein weiteres Problem ist, dass ich keinen Slash in der URL eingeben kann, weil ich dann immer den Fehler “400 Bad Request” bekomme.

// 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,0x31 };

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

const char website[] PROGMEM = "192.168.3.100/wetter/update.php?brightness=1.2";

// 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 setup () {
  Serial.begin(57600);
  Serial.println(F("\n[webClient]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("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 () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

Ich hoffe ihr könnt mir helfen. :slight_smile:
MfG

Dies ist die Definition von browseUrl:

void EtherCard::browseUrl (prog_char *urlbuf, const char *urlbuf_varpart, prog_char *hoststr,void (*callback)(byte,word,word)) {

Du rufst es so auf:

ether.browseUrl(PSTR("/foo/"), "bar", "192.168.3.100/wetter/update.php?brightness=1.2", my_callback);

Daraus folgt eine URL

http://192.168.3.100/wetter/update.php?brightness=1.2/foo/bar

wobei “192.168.3.100/wetter/update.php?brightness=1.2” der Hostname sein soll. Ich bin nicht erstaunt, dass der Arduino damit nicht wirklich viel anfangen kann.

Versuch’s mal mit:

const char server[] PROGMEM = "192.168.3.100";
// ...
ether.browseUrl(PSTR("/wetter/update.php?"), "brightness=1.2", server, my_callback);

(ersetze nur diese zwei Zeilen, der Rest bleibt gleich)

Wenn das funktioniert, kannst Du mal versuchen, den zweiten Parameter (wird nicht aus dem Flash gelesen) selbst zu konstruieren.

Okay. Ich habe es mit einem anderen Code geschafft, aber es entstand ein anderer Fehler:
Wenn ich den LuftdruckSensor BMP085 weg lasse, funktioniert alles einwandfrei, aber wenn ich den in den Sketch einfüge, ist die “void Setup” Funktion in der Dauerschleife, bis zu dem Punkt “Ethernet.begin(mac);”. Wie kann ich das lösen? Ich finde, dass der Luftdruck wichtig für die Wettervorhersage ist und man das auch mitloggen sollte. Kurz gesagt: Ich will darauf nicht verzichten. :smiley:

#include <UIPEthernet.h> // Used for Ethernet
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };     
EthernetClient client;
char server[] = "192.168.3.100"; // IP Adres (or name) of server to dump data to

#include <DHT.h>
DHT dht_station;
DHT dht_heater_input;
DHT dht_heater_output;
int dht_station_pin = 2;  
int dht_heater_input_pin = 3;  
int dht_heater_output_pin = 4;  

int brightness_pin = A0;  

#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;

int  interval = 5000; // Wait between dumps

void setup() {
  Serial.begin(9600);
  Serial.println("Setup started");
  

  Ethernet.begin(mac);

  Serial.println("Wetterstation - v2.1");
  Serial.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
  Serial.print("IP Address        : ");
  Serial.println(Ethernet.localIP());
  Serial.print("Subnet Mask       : ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Default Gateway IP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server IP     : ");
  Serial.println(Ethernet.dnsServerIP());
  
  dht_station.setup(dht_station_pin);
  dht_heater_input.setup(dht_heater_input_pin);
  dht_heater_output.setup(dht_heater_output_pin);
  
  Serial.println("Setup finished");
}

void loop() {
  if (client.connect(server, 80)) {
    Serial.println();
    Serial.println("Verbunden");
    Serial.println();
    
    client.print( "GET /wetter/update.php?");
      
    client.print("temp=");
    client.print( dht_station.getTemperature());
      
    Serial.print("Temperatur (*C): ");
    Serial.println(dht_station.getTemperature());
    
    client.print("&");
    client.print("e_temp=");
    client.print( dht_heater_input.getTemperature() );
      
    Serial.print("Temperatur Heizungslufteinlass (*C): ");
    Serial.println(dht_heater_input.getTemperature());
    
    client.print("&");
    client.print("a_temp=");
    client.print( dht_heater_output.getTemperature() );
      
    Serial.print("Temperatur Heizungsluftauslass (*C): ");
    Serial.println(dht_heater_output.getTemperature());
    
    client.print("&");
    client.print("humidity=");
    client.print( dht_station.getHumidity() );
      
    Serial.print("rel. Feuchtigkeit (%): ");
    Serial.println(dht_station.getHumidity());
    
    client.print("&");
    client.print("brightness=");
    client.print( 50 / (analogRead(brightness_pin) * (5.0 / 1023.0)) );
      
    Serial.print("Helligkeit (lx): ");
    Serial.println(50 / (analogRead(brightness_pin) * (5.0 / 1023.0)));
    
    client.print("&");
    client.print("pressure=");
    client.print( (bmp.readPressure() / 100) + (200 / 8.4) );
      
    Serial.print("Luftdruck (hPa): ");
    Serial.println((bmp.readPressure() / 100) + (200 / 8.4));  //Umrechung von dem realen Luftdruck zum Luftdruck auf Meereshöhe
    
    client.print("&key=4fded1464736e77865df232cbcb4cd19");
    client.println( " HTTP/1.1");
    client.print( "Host: " );
    client.println(server);
    client.println( "Connection: close" );
    client.println();
    client.println();
    client.stop();
  }
  else {
    Serial.println("--> connection failed/n");
  }
}

Das tönt für mich nach einem Hardware-Fehler. Wahrscheinlich wird der Arduino geresettet, bevor er weiter kommt, anders kann ich mir bei dem Code einen Endlos-Schleife vor dem Ethernet.begin() nicht vorstellen.

Poste das Schema des Hardware-Aufbaus!