van Arduino+W5100 data naar webserver

Arduino shields
Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

van Arduino+W5100 data naar webserver

Berichtdoor MarcelK » 04 Jan 2015, 17:05

Hallo iedereen,

ik zit hier met een Uno en een W5100 Ethernetshield te stoeien, wat is mijn bedoeling:

Ik wil data van een meteostationnetje wat ik ook aan het maken ben versturen naar mijn gehoste webserver op Internet,
dus geen lokale webserver op mijn PC of op de W5100 een webserver laten draaien.

Om te kunnen testen heb ik een simpel script opgezocht voor Arduino en op de webserver heb ik php-scripts geplaatst om de ontvangen data in een MySql database te ploffen.
De php-scripts op de webserver zijn getest en in orde, als ik de scripts aanroep via een browser dan komt de data netjes in de database.

Echter: de data verzonden met de W5100 komt niet in de database.
In de serieele monitor krijg ik geen foutmeldingen dat ik geen verbinding heb ofzo.

Hieronder plaats ik de source, misschien dat iemand eens mee kan kijken wat ik fout doe ?

Code: Alles selecteren
/**
 * @file    Ethernet_to_server_test_UNO.ino
 * @author  Marcel Kuipers
 * @date    04-01-2015
 *
 * Test om data naar een webserver op Internet te sturen
 * Maakt gebruik van .php-scripts op de server
 * In de test worden fictieve data naar de server gestuurd
 * met een interval van 1 minuut
 * Rev.datum 04-01-2015
 */

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

byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; // RESERVED MAC ADDRESS
EthernetClient client;

long previousMillis = 0;
unsigned long currentMillis = 0;
long interval = 10*1000; // 10 seconden interva

float temp1 = 15.0;
float temp2 = 20.0;
float temp3 = 25.0;
long pressure = 1025;

void setup() {
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
  }

  delay(10000); // GIVE THE SENSOR SOME TIME TO START
}

void loop(){
  currentMillis = millis();
  if(currentMillis - previousMillis > interval) { // READ ONLY ONCE PER INTERVAL
    previousMillis = currentMillis;
    if (client.connect("www.mijnsite.nl",80)) { // REPLACE WITH YOUR SERVER ADDRESS
      client.println("GET /meteo_add.php");
      client.print("?p1=");
      client.print(pressure);
      client.print("&t1=");
      client.print(temp1);
      client.print("&t2=");
      client.print(temp2);
      client.print("&t3=");
      client.println(temp3);
      client.println("HTTP/1.1");
      client.println("Host: www.mijnsite.nl"); // SERVER ADDRESS HERE TOO
      client.println();
      Serial.print("Data verzonden..");
    }
    else
    {
      Serial.println("connection failed");
    }
    if (client.connected()) {
      client.stop();   // DISCONNECT FROM THE SERVER
    }
  }
}




Advertisement

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: van Arduino+W5100 data naar webserver

Berichtdoor MarcelK » 05 Jan 2015, 22:54

Bovenstaande source wou dus niet en ik ben dus met wat anders aan het spelen gegaan, namelijk een voorbeeldsketch welke standaard in de IDE zit.

Deze source (zie hieronder) werkt prima, maar als ik de intervaltijd langer zet dan 30 seconden dan raakt hij schijnbaar de verbinding kwijt met de (Apache) webserver.
Heeft iemand dit fenomeen al eens aan de hand gehad of ben ik hier de enigste persoon op dit forum die zijn gegevens naar een webserver wil sturen ?
Ik wil dus niet op een local server met b.v. Wamp ofzo gaan werken want dan moet ik hier thuis constant een pc aan laten staan waarop een local server staat te draaien.

En op de server van Arduino kan ik geen php en mysql draaien.

Hieronder de werkende voorbeeldsource van Arduino zelf met als opmerking dat de intervaltijd niet langer mag zijn dan 30 seconden.

Wie van alle Arduino-guru's hier heeft hier ervaring mee ?
Misschien Shooter of Nico Verduin ?

Code: Alles selecteren
/*
  Repeating Web client
 
 This sketch connects to a a web server and makes a request
 using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
 the Adafruit Ethernet shield, either one will work, as long as it's got
 a Wiznet Ethernet module on board.
 
 This example uses DNS, by assigning the Ethernet client with a MAC address,
 IP address, and DNS address.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 19 Apr 2012
 by Tom Igoe
 
 http://arduino.cc/en/Tutorial/WebClientRepeating
 This code is in the public domain.
 
 */

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

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,178,39);

// fill in your Domain Name Server address here:
IPAddress myDns(192,168,178,1);

// initialize the library instance:
EthernetClient client;

char server[] = "www.mijnwebsite.nl";

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 30*1000;  // delay between updates, in milliseconds
long pressure = 1035;
float tbmp = 21.0;
float temp1 = 10.0;
float temp2 = 11.0;
float temp3 = 12.0;

void setup() {
  // start serial port:
  Serial.begin(9600);
  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection using a fixed IP address and DNS server:
  Ethernet.begin(mac, ip, myDns);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    //Serial.print("lastConnectionTime:");
    //Serial.println(lastConnectionTime);
    //Serial.print("postingInterval:");
    //Serial.println(postingInterval);
   
    httpRequest();
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void httpRequest() {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
      client.print("GET /meteo_add.php?");
      client.print("p1=");
      client.print(pressure);
      client.print("&tbmp=");
      client.print(tbmp);
      client.print("&t1=");
      client.print(temp1);
      client.print("&t2=");
      client.print(temp2);
      client.print("&t3=");
      client.print(temp3);
      client.println(" HTTP/1.1");
      client.println("Host: www.mijnwebsite.nl"); // SERVER ADDRESS HERE TOO
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println("disconnecting.");
    client.stop();
  }
}





Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: van Arduino+W5100 data naar webserver

Berichtdoor nicoverduin » 06 Jan 2015, 10:08

MarcelK schreef:
Deze source (zie hieronder) werkt prima, maar als ik de intervaltijd langer zet dan 30 seconden dan raakt hij schijnbaar de verbinding kwijt met de (Apache) webserver.


Ik mag hopen dat de verbinding verbroken wordt. Anders zou je een webserver hebben die allemaal dooie sessies in stand houdt. Stel je bekijkt een website en je zet je PC uit... De webserver weet dat niet en zou die sessie open houden..... Stel een miljoen mensen doen dat..... Dan heb je bij wijze van spreken een eigen DDOS gecreëerd.... :mrgreen:
Dit zal ongetwijfeld een time-out zijn. daarnaast geef je al aan dat je een connection close uitgevoerd moet worden (en dat moet je ook) omdat je geen persistentie (constant in de lucht houden van de verbinding) op je server (vermoedelijk) hebt.

Wat je doet met de arduino is niet anders als een web pagina browsen.
- URL wordt verstuurd naar de server
- Server reageert
- Sluit de sessie (immers je weet niet of iemand nog wel terugkomt bij de server)
- time-out ctr start
- na 30 sec bijv. wordt alles opgeruimd.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: van Arduino+W5100 data naar webserver

Berichtdoor MarcelK » 08 Jan 2015, 22:11

Verbinding wordt verbroken Nico, maak je niet ongerust. Session wordt ook gesloten.

Heb ondertussen via grote vriend Google nog e.e.a. gevonden, schijnt in de Ethernetlib of Shield ofzo te liggen dat indien de verbinding langer dan 30 seconden niet gebruikt wordt dat dit probleem optreedt.

Ik laat de de sketch nu via de ethernetshield om de 30 seconden data versturen, op de server los ik het verder op met php.
Op de server komt de data binnen om de 30 seconden en wordt dan met mysqli in een (MySQL) tijdelijke tabel geploft, er loopt dan ook een tellertje mee.

Als tellertje de waarde 10 bereikt (na 5 minuten) wordt in php de gemiddelde waardes van de 10 metingen bepaald en die wordt dan in een andere tabel opgeslagen en de tijdelijke tabel wordt dan ge-truncate.
In de hoofdtabel heb ik dus iedere 5 minuten een nieuw record, precies wat ik wou hebben. en de database loopt niet vol met tijdelijke data welke nooit meer gebruikt wordt.

Nu heb ik het ethernetgedeelte in mijn meteostation erbij gezet, echter daar zit ook een nrf24L01 op aangesloten, nu gaat er bij jou wel een lampje branden denk ik..
Inderdaad, ethernet werkt niet meer met de standaard library's van ethernet en RF24.

Oplossing hiervoor ook gevonden, ben ik nu aan het doorlezen en als ik weer tijd/zin/puf heb komend weekend ofzo dan ga ik aan de slag met SoftSPI van Maniacbug, kwam jouw naam opok nog tegen op Github mbt SoftSPI ;)
Dus ik kan weer lekker verder met stoeien.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: van Arduino+W5100 data naar webserver

Berichtdoor nicoverduin » 08 Jan 2015, 23:34

Ik had ooit een update naar hem toegestuurd (pull request). Geen idee of hij die ooit overgenomen heeft. Hij is niet zo communiceerderig. Ook verder niet zo belangrijk. Als het werkt.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: van Arduino+W5100 data naar webserver

Berichtdoor MarcelK » 09 Jan 2015, 22:03

In jou artikeltje op https://github.com/nicoverduin/RF24/commit/d5b7aad77520e5cf987f5873a78142d12e3c1b91 geef je wat toevoegingen en verwijderingen van de libs RF24.H, RF24.cpp en RF24_config.h

Werkt daarna e.e.a. met de SoftSPI-lib van Maniacbug ?
En werkt mijn tft-schermpje dan ook nog welke ook gebruik maakt van SPI ?
Met andere woorden: kan ik de standaard SPI gebruiken samen met de SoftSPI of gaat dat elkaar bijten ?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: van Arduino+W5100 data naar webserver

Berichtdoor nicoverduin » 10 Jan 2015, 00:20

Geen idee? Probeer het eens uit zou ik zeggen en laat het weten.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten