I am trying to make a arduino webserver which shows me the values from 3 potentiometers (if i got it working then i change the hardware to sensors.
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 50
// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(46, 145, 3, 130); // IP address, may need to change depending on network 46.145.3.130
EthernetServer server(80); // create a server at port 80
File webFile; // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
void setup()
{
// disable Ethernet chip
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
Serial.begin(9600); // for debugging
// initialize SD card
Serial.println("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("ERROR - SD card initialization failed!");
return; // init failed
}
Serial.println("SUCCESS - SD card initialized.");
// check for index.htm file
if (!SD.exists("index.htm")) {
Serial.println("ERROR - Can't find index.htm file!");
return; // can't find index file
}
Serial.println("SUCCESS - Found index.htm file.");
pinMode(7, INPUT); // switch is attached to Arduino pin 7
pinMode(8, INPUT); // switch is attached to Arduino pin 8
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
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// 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("HTTP/1.1 200 OK");
// remainder of header follows below, depending on if
// web page or XML page is requested
// Ajax request - send XML file
if (StrContains(HTTP_req, "ajax_inputs")) {
// send rest of HTTP header
client.println("Content-Type: text/xml");
client.println("Connection: keep-alive");
client.println();
// send XML file containing input states
XML_response(client);
}
else { // web page request
// send rest of HTTP header
client.println("Content-Type: text/html");
client.println("Connection: keep-alive");
client.println();
// send web page
webFile = SD.open("index.htm"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
// display received HTTP request on serial port
Serial.print(HTTP_req);
// reset buffer index and all buffer elements to 0
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
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)
}
// send the XML file with switch statuses and analog value
void XML_response(EthernetClient cl)
{
int analog_val;
cl.print("<?xml version = \"1.0\" ?>");
cl.print("<inputs>");
cl.print("<button1>");
if (digitalRead(7)) {
cl.print("ON");
}
else {
cl.print("OFF");
}
cl.print("</button1>");
cl.print("<button2>");
if (digitalRead(8)) {
cl.print("ON");
}
else {
cl.print("OFF");
}
cl.print("</button2>");
// read analog pin A2
analog_val = analogRead(2);
cl.print("<analog1>");
cl.print(analog_val);
cl.print("</analog1>");
cl.print("</inputs>");
}
// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}
// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
char found = 0;
char index = 0;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;
}
index++;
}
return 0;
}
This is the code I use.
the problem is when i google ''whats my ip'' and type that ip address in i cant reach it from the brwoser by typing in the IP address. I get the error server takes to long to connect or i get acces denied. Am I using the wrong IP address?
Where it comes down to im am using this shield with the above code.
the problem is when i google ''whats my ip'' and type that ip address in i cant reach it from the brwoser by typing in the IP address.
The IP Address that you get back is the IP address of the router. Your router assigns a local IP address to the Arduino. THAT is the IP address that you need to use in your code.
Many internet service providers do not allow you to use port 80 for running a web server. Does yours?
Have you enabled port forwarding on the router, so that messages sent to port 80 on your external IP address get redirected to the Arduino?
i dont know if the provider allows that. I dont know that because im on an internship here and for the port forwarding i have no idea what i found on the internet and from tutorials i got that port 80 was a safe choice isnt that the case? What i just realised now is that the server is located elsewere im in the top of the netherlands and the server from the company is more at the bottom of my country (seen on whatsmyipaddress.com) does that make a diffrence?
I did go into the cmd from windows and typed in ipconfig i got the ipv4 address which was 10.10.3.173 changed the arduino address to 10.10.3.166 i tryd it in the browser and got that it takes to long to connect to the server.
About reserving an address in the router how do i acces the router, what do i need to change and what do i need to be aware of.
Juraj:
I would expect that such a network has a DHCP server. Check the cable and connections.
try ipconfig /all on a computer. it prints if DHCP server is used in that network
I type in the ipconfig /all and I see the dhcp server is located at 10.10.1.150 but then further down its says ''DHCP enabled --- no'' so i guess i need to enable that or ask the network admin to give me a static IP?
Im and intern and new to arduino as part of my educution i learn diffrent things about electronics and got in touch with arduino got basics to work (tutorials, I2C, EEPROm etc) but i find this kinda hard cause i dont know much about routers, IP addresses and that kind of stuff. Sorry for the bad english not my native language.
I got my static IP with subnet and gateway but when I type in the IP adres in the arduino sketch the sketch gives back server is at ..... then i surf to it via browser but cant connect then how come?
Note that because the W5500 and SD card share the SPI bus, only one at a time can be active. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the W5500, set digital pin 10 as a high output.
@Juraj: The Arduino store is wrong. I use the w5100 and the SD card in the same program. There are several users on the forum who have done the same with the w5500. Once the devices are initialized, the libraries handle the CS pins for each device.
I recommend disabling all SPI devices before initializing any of them. Not doing so will cause you great grief.
digitalWrte(4,HIGH);
digitalWrite(10,HIGH);
// now do your begin calls
SurferTim: @Juraj: The Arduino store is wrong. I use the w5100 and the SD card in the same program. There are several users on the forum who have done the same with the w5500. Once the devices are initialized, the libraries handle the CS pins for each device.
I recommend disabling all SPI devices before initializing any of them. Not doing so will cause you great grief.
digitalWrte(4,HIGH);
digitalWrite(10,HIGH);
// now do your begin calls
you are right. thank you.
I have an Ethernet 2 shield. I don't use it now, but I had no issues using it in my project as socket client, telnet server and rest server. But I didn't use SD so I disabled it with pin 4.
thx for al the reactions i got the webserver tutorial working but now i cant get my own sketch to work
#include <SPI.h>
#include <Ethernet2.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 50
// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 2, 143); // IP address, may need to change depending on network
EthernetServer server(80); // create a server at port 80
File webFile; // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
void setup()
{
/* disable Ethernet chip
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);*/
Serial.begin(9600); // for debugging
// initialize SD card
Serial.println("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("ERROR - SD card initialization failed!");
return; // init failed
}
Serial.println("SUCCESS - SD card initialized.");
// check for index.htm file
if (!SD.exists("index.htm")) {
Serial.println("ERROR - Can't find index.htm file!");
return; // can't find index file
}
Serial.println("SUCCESS - Found index.htm file.");
pinMode(7, INPUT); // switch is attached to Arduino pin 7
pinMode(8, INPUT); // switch is attached to Arduino pin 8
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
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// 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("HTTP/1.1 200 OK");
// remainder of header follows below, depending on if
// web page or XML page is requested
// Ajax request - send XML file
if (StrContains(HTTP_req, "ajax_inputs")) {
// send rest of HTTP header
client.println("Content-Type: text/xml");
client.println("Connection: keep-alive");
client.println();
// send XML file containing input states
XML_response(client);
}
else { // web page request
// send rest of HTTP header
client.println("Content-Type: text/html");
client.println("Connection: keep-alive");
client.println();
// send web page
webFile = SD.open("index.htm"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
// display received HTTP request on serial port
Serial.print(HTTP_req);
// reset buffer index and all buffer elements to 0
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
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)
}
// send the XML file with switch statuses and analog value
void XML_response(EthernetClient cl)
{
int analog_val;
cl.print("<?xml version = \"1.0\" ?>");
cl.print("<inputs>");
cl.print("<button1>");
if (digitalRead(7)) {
cl.print("ON");
}
else {
cl.print("OFF");
}
cl.print("</button1>");
cl.print("<button2>");
if (digitalRead(8)) {
cl.print("ON");
}
else {
cl.print("OFF");
}
cl.print("</button2>");
// read analog pin A2
analog_val = analogRead(2);
cl.print("<analog1>");
cl.print(analog_val);
cl.print("</analog1>");
cl.print("</inputs>");
}
// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}
// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
char found = 0;
char index = 0;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;
}
index++;
}
return 0;
}
i used the tutorial from
and changed the sd a bit so the webserver shows 3 analog values instead of one and 2 switch reads
<!DOCTYPE html>
<html>
<head>
<title>Analoge waardes van A1 A2 A3</title>
<script>
function GetArduinoInputs()
{
nocache = "&nocache=" + Math.random() * 1000000;
var request = new XMLHttpRequest();
request.onreadystatechange = function()
{
if (this.readyState == 4) {
if (this.status == 200) {
if (this.responseXML != null) {
// extract XML data from XML file (containing switch states and analog value)
document.getElementById("input1").innerHTML =
this.responseXML.getElementsByTagName('button1')[0].childNodes[0].nodeValue;
document.getElementById("input2").innerHTML =
this.responseXML.getElementsByTagName('button2')[0].childNodes[0].nodeValue;
document.getElementById("input3").innerHTML =
this.responseXML.getElementsByTagName('analog1')[0].childNodes[0].nodeValue;
}
}
}
}
request.open("GET", "ajax_inputs" + nocache, true);
request.send(null);
setTimeout('GetArduinoInputs()', 1000);
}
</script>
</head>
<body onload="GetArduinoInputs()">
<h1>Analoge waardes van A1 A2 A3</h1>
<p>Analog (A1): <span id="input1">...</span></p>
<p>Analog (A2): <span id="input3">...</span></p>
<p>Analog (A3): <span id="input2">...</span></p>
</body>
</html>
this is the code for the SD card what I get as return form the serial monitor is ''cant find index.htm file''
and i have no idea why the sketch cant find it, cant figure out if the fault is in the sketch or in de index.htm file (wrongly saved maybe?).
PaulS:
Use the examples in the SD library to make sure that you can actually read from the SD card, and to see what is on the SD card.
i tried the readwrite example and the list file example allready both worked fine. I have made the file for the SD card in notebook++ i saved the file in the following ways and with all of them the error occurs:
first try: saved the file normaly: File-->save as-->saved it as index.htm and saved it as hypertext markup.
second try: saved it diffrents: File-->save as-->saved it as index.htm and saved it as all files (.).