Ik ben Marcel en ben nu ongeveer een half jaar bezig met Anduino, en vindt het geweldig .
Inmiddels heb ik mijn eerste project af, een alarminstallatie. Maar nu wil ik hem gaan uitbreiden met een internetshield de W5100. Deze heb ik aangesloten op mij Aduino mega en de voorbeelden die hier van zijn doen het ook.
Dus als ik het goed begrijp:
a) Arduino Ethernet shield krijgt alarm signaal
b) deze stuurt een URL uit naar een IPAdres met evt aanvullende data
en klaar want de ontvanger doet de rest...
Gewoon een ethernet client inrichten. Zijn al meerdere voorbeelden van gemaakt. Ook waarbij bijvoorbeeld met Google gekoppelt wordt. Op het NL forum is als eens ziiets uitgewerkt in het verleden...
Ik krijg inderdaad een input op mijn Mega en wil dan een URL vesturen.
De ontvanger doet dan de rest, in dit geval de camera.
Ik ben met een voorbeeld van webclient bezig geweest maar ik krijg het niet voor elkaar
De camera ontvangt de URL niet. Wel krijg ik een IP adders van mijn router en kan de cleint contact maken met d server.
zie hieronder mijn code
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network.
// gateway and subnet are optional:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dnsServer(192,168,1, 1);
byte server[] = { 192, 168, 1, 15 };
EthernetClient client;
void setup() {
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 Â
 // start the Ethernet connection:
 Serial.println("Trying to get an IP address using DHCP");
 if (Ethernet.begin(mac) == 0) {
  Serial.println("Failed to configure Ethernet using DHCP");
  // initialize the ethernet device not using DHCP:
  Ethernet.begin(mac, ip, gateway, subnet);
 }
 // print your local IP address:
 Serial.print("My IP address: ");
 ip = Ethernet.localIP();
 for (byte thisByte = 0; thisByte < 4; thisByte++) {
  // print the value of each byte of the IP address:
  Serial.print(ip[thisByte], DEC);
  Serial.print(".");
 }
 Â
 if (client.connect(server, 2500)) {
  Serial.println("connected");
  client.println("http://192.168.1.15:2500/control/control?set§ion=actionhandler&ah1_arming=disable");
  client.println();
 } else {
  Serial.println("connection failed");
 }
 }
void loop() {
 }
Ik krijg inderdaad een input op mijn Mega en wil dan een URL vesturen.
De ontvanger doet dan de rest, in dit geval de camera.
Ik ben met een voorbeeld van webclient bezig geweest maar ik krijg het niet voor elkaar
De camera ontvangt de URL niet. Wel krijg ik een IP adders van mijn router en kan de cleint contact maken met d server.
Bedoel je met "wel krijg ik een IP adres" dat de arduino server een IP krijgt of bedoel je dat de camera er een krijgt ?
Weet je zeker dat de camera goed ingesteld is ?
Meestal moet je eerst de wifi-camera met UTP aan de netwerkkaart van de PC hangen om de camera te configureren.
Eerder kan de camera geen contact met het wifi-netwerk maken.
Ik dacht dat er juist geen GET voor moet omdat ik wat wil verzenden en niks meer wil ontvangen.
Maar ik kan het mis hebben, ga het morgen wel even testen.
Tja zou kunnen. Ben nooit een kei geweest in HTML calls. En volgens mij moet je wel iets terugkrijgen lijkt mij 200 OK boodschap.
Zou ook wel eens een PUT kunnen zijn : Sending a PUT request with an arduino - Stack Overflow
Als ik de sketch uitvoer met de IP en port aangepast aan mijn situatie krijg ik: connected
betekent dus connected met mijn IP camera.
Alleen kan mijn camera niets doen met het commando.
Ik zal eens proberen de handleiding van die camera te downloaden en zien of ik daar wijs uit kan.
Je zou misschien eens kunnen proberen dit in de loop te zetten en kijken wat de camera terugstuurt.
void loop()
{
 // if there are incoming bytes available
 // from the server, read them and print them:
 if (client.available()) {
  char c = client.read();
  Serial.print(c);
 }
 // if the server's disconnected, stop the client:
 if (!client.connected()) {
  Serial.println();
  Serial.println("disconnecting.");
  client.stop();
  // do nothing forevermore:
  while(true);
 }
}
edit:
mijn camera geeft als antwoord op jouw code:
Access Error: Page not found
Bad request type
In html in de monitor ziet het er zo uit:
HTTP/1.1 400 Page not found
Server: GoAhead-Webs
Date: Wed Dec 3 00:37:12 2014
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Document Error: Page not found
Access Error: Page not found
Bad request type
disconnecting.
Dus jouw camera zal ook wel iets terug te melden hebben.
Aan de hand daarvan kun je kijken wat er fout gaat.
Ik moest er wel GET van maken al weet ik niet zo goed waarom
Zo is de regel geworden: client.println("GET /control/control?set§ion=actionhandler&ah1_arming=disable HTTP/1.0");
Kan iemand ook uit leggen wat hier nu gebeurt, zo dat ik het ook begrijp
@cartoonist
Ook had ik de code in de loop gezet wat je zei, zo dat je ziet wat er gebeurd.
Dit was wat ik zag:
Trying to get an IP address using DHCP
My IP address: 192.168.1.40.connected
HTTP/1.0 200 OK
Content-type: text/plain; charset=utf-8
Cache-Control: no-cache
if (client.connect(server, 2500)) {}
server = 192.168.1.15 port = 2500
achteraf gezien logisch dat http://192.168.1.15:2500 dubbelop was in de request van arduino aan de camera.
Met de volgende code kun dat zelf checken in je monitor venster. Browser openen en een verzoek naar de arduino server sturen, de arduino toont in de monitor alles wat de browser verstuurt.
#include <SPI.h>
#include <Ethernet.h>
// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 177); // IP address, may need to change depending on network
EthernetServer server(2500);Â // create a server at port 80
void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip); // initialize Ethernet device
  server.begin();     // start to listen for clients
}
void loop()
{
  EthernetClient client = server.available(); // try to get client
  if (client) { // got client?
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) { // client data available to read
        char c = client.read(); // read 1 byte (character) from client
        Serial.print(c);
        // last line of client request is blank and ends with \n
        // respond to client only after last line received
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));
          client.println();
          // send web page
          client.println(F("<!DOCTYPE html>"));
          client.println(F("<html>"));
          client.println(F("<head>"));
          client.println(F("<title>Arduino Web Page</title>"));
          client.println(F("</head>"));
          client.println(F("<body>"));
          client.println(F("<h1>Here my code</h1>"));
          client.println(F("<p>A web page from the Arduino server</p>"));
          client.println(F("</body>"));
          client.println(F("</html>"));
          break;
        }
        // every line of text received from the client ends with \r\n
        if (c == '\n') {
          // last character on line of received text
          // starting new line with next character read
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // a text character was received from client
          currentLineIsBlank = false;
        }
      } // end if (client.available())
    } // end while (client.connected())
    delay(1);   // give the web browser time to receive the data
    client.stop(); // close the connection
  } // end if (client)
}
Ik heb nog een vraag over de volgende stukje code, wat aan het einde van mijn functie loop staat
void loop() {
 if (client.available()) {
  char c = client.read();
  Serial.print(c);
 }
 if (!client.connected()) {
  Serial.println();
  Serial.println("disconnecting.");
  client.stop();
  for(;;)
   ;
 }
 }
Nu weet ik dat dit het einde van mijn if opdracht is, zo dat hij dit niet gaat herhalen. Nu wil ik graag weten waarom er nu tussen de 2 haakjes ; staat en ook wat ze betekenen. Ik weet dat je de ; altijd achter een opdracht zet, maar dit kan ik even niet goed plaatsen.
Dat is een lege for loop.
Die staat hier beschreven.
Het is een complete for loop maar met helemaal niets er in.
In assembler (in ieder geval voor de 6510 van de commodore 64) is er een NOP commando om heel even niets te doen.
Dit lijkt daar op.
Geen idee of er een speciale truc is die hiermee uitgehaald word.
[edit]Ik vermoed overigens dat de IDE dit er tijdens het compileren uit sloopt omdat het niet veel meer dan ballast is.[/edit]
Vooral de delayMicroseconds(), die is zo praktisch als je een IR of RF code wil versturen, je datalijntje zoveel microseconde HIGH en dan weer zoveel microseconde LOW. noInterrupts() aan het begin van de routine en Interrupts() aan het einde.
Lang leve Delay(Microseconds)()
En iedereen die begint met de arduino begint met delay(). Er zijn volop toepassingen waarin het geen rol speelt dat je programma niet reageert op input en daar is een delay prima op zijn plaats. Het maakt code zo eenvoudig en overzichtelijk.
Maar ik vind ook dat als het de boel blokkeert dat het eruit moet. Niets is zo frustrerend als een toets indrukken die niet reageert omdat je programma ergens in een delay() zit.