Arduino webserver pagina

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 91
Geregistreerd: 18 Sep 2015, 12:31

Arduino webserver pagina

Berichtdoor SpeedFM » 25 Mei 2017, 21:28

Hallo,

Ik heb een Arduino DUE en een ENC28J60 (Ethernet module).
Ik ben al een paar dagen bezig, om een pagina op te stellen via een SD Card.
Telkens als ik de code "StrContains" toevoeg aan mijn sketch, geeft hij de volgende melding:
exit status 1
'StrContains' was not declared in this scope

Ik heb zelf niet kunnen ontdekken hoe ik dit kan oplossen.
De code die ik hier voor gebruik:
Code: Alles selecteren
void loop() {
EthernetClient client = server.available();
if(client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while(client.connected()) {
if(client.available()) {
char c = client.read();
Serial.write(c);
delay(1);
if(c == '\n' && currentLineIsBlank) {
Serial.println("Print page...");
delay(1);
if(StrContains(HTTP_req, "GET /index.htm")) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
webFile = SD.open("index.htm");
} else if(StrContains(HTTP_req, "GET /sfm_logo.png")) {
webFile = SD.open("sfm_logo.png");
if(webFile) {
client.println("HTTP/1.1 200 OK");
client.println();
}
}
if(webFile) {
while(webFile.available()) {
client.write(webFile.read());
}
webFile.close();
}
break;
}

if(c == '\n') {
currentLineIsBlank = true;
} else if(c != '\r') {
currentLineIsBlank = false;
}

}
}
delay(1);
client.stop();
Serial.println("client disconnected");
}
}

Ik hoop dat iemand mij hier bij kan helpen.
Alvast bedankt voor alle hulp.

Mvg,
Marco
Beginner Arduino DUE.

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino webserver pagina

Berichtdoor Gij Kieken » 25 Mei 2017, 21:42

Declaraties ontbreken & Set-up ontbreekt

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

Re: Arduino webserver pagina

Berichtdoor nicoverduin » 25 Mei 2017, 22:21

En een keer de ctrl-t knop gebruiken kan ook een kwaad
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 91
Geregistreerd: 18 Sep 2015, 12:31

Re: Arduino webserver pagina

Berichtdoor SpeedFM » 26 Mei 2017, 06:30

Heb ctrl-t gebruikt.
Wist niet, dat dat automatisch opmaak is.
Hier de hele code:
cpp code
#include <SPI.h>
#include <SD.h>
#include <TFT.h>
#include <UIPEthernet.h>
#include <UIPServer.h>
#include <UIPClient.h>

#define cs 52
#define dc 9
#define rst 8
#define sd_cs 4

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192, 168, 0, 7);

EthernetServer server(80);

TFT screen = TFT(cs, dc, rst);

PImage logo;

File webFile;
char HTTP_req = {0};
char req_index = 0;

void setup() {
Serial.begin(9600);
SPI.begin();
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server run on IP ");
Serial.println(Ethernet.localIP());
screen.begin();
screen.background(255, 255, 255);
screen.stroke(0, 0, 0);
screen.setTextSize(2);
screen.text("Testing!", 10, 10);
Serial.print("Initializing SD card...");
if (!SD.begin(sd_cs)) {
Serial.println("failed!");
return;
}
Serial.println("OK!");
logo = screen.loadImage("logo.bmp");
if (!logo.isValid()) {
Serial.println("error while loading logo.bmp");
}
if (!SD.exists("page.php")) {
Serial.println("ERROR - Can't find page.php file!");
return;
}
Serial.println("SUCCESS - Found page.php file.");
}

void loop() {
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
delay(1);
if (c == '\n' && currentLineIsBlank) {
Serial.println("Print page...");
delay(1);
if (StrContains(HTTP_req, "GET /index.htm")) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
webFile = SD.open("index.htm");
} else if (StrContains(HTTP_req, "GET /sfm_logo.png")) {
webFile = SD.open("sfm_logo.png");
if (webFile) {
client.println("HTTP/1.1 200 OK");
client.println();
}
}
if (webFile) {
while (webFile.available()) {
client.write(webFile.read());
}
webFile.close();
}
break;
}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("client disconnected");
}
}
Beginner Arduino DUE.

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

Re: Arduino webserver pagina

Berichtdoor nicoverduin » 26 Mei 2017, 07:26

Ik weet niet waar je deze sketch vandaan hebt, maar er moet ook een functie zijn StrContains in beschreven zijn.
En als je even had gegoogled had je bijvoorbeeld deze volledig ongedocumenteerde variant kunnen vinden:
cpp code
// 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;
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 91
Geregistreerd: 18 Sep 2015, 12:31

Re: Arduino webserver pagina

Berichtdoor SpeedFM » 26 Mei 2017, 07:55

Ik heb hem via http://startingelectronics.org/tutorial ... ver-image/
Heb ook via Google gezocht naar StrContains.
Beginner Arduino DUE.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino webserver pagina

Berichtdoor Koepel » 26 Mei 2017, 08:12

@nicoverduin, kan dit ook ?
Code: Alles selecteren
boolean StrContains(char *str, char *sfind)
{
  return( strstr( str, sfind) != nullptr);
}


@SpeedFM, dat voorbeeld is misschien een werkend voorbeeld, maar je kunt niet zomaar allerlei regels weglaten. Vergelijk nog eens goed die code met wat jij hebt. Ik vind het niet een heel goed voorbeeld. Mijn voorkeur is deze: https://playground.arduino.cc/Code/WebServerST

Je controleert op het bestaan van "logo.bmp" en "page.php", maar vervolgens gebruik je "index.htm" en "sfm_logo.png".

Je hebt commentaar weggelaten, terwijl dat commentaar het beste onderdeel van dat voorbeeld is.

Jouw 'HTTP_req' is maar één byte groot, en je vult het niet met binnengekomen data. Dat voorbeeld heeft een buffer die wel gevuld wordt.

Wanneer je al een Arduino Due hebt, dan lijkt het me verstandig om de Arduino Ethernet Shield 2 te kopen.

Ook bij een png bestand is het beter om een content type toe te voegen.

Een lokaal IP adres met "192.168.0.7" vind ik vreemd. Voor zover ik weet is de instelling voor routers default "192.168.1.....".

Volgens mij heb ik https://startingelectronics.org/ vaker bekeken. De webserver gaat stapje voor stapje van eenvoudig naar ingewikkeld. Dat is heel leerzijn. Het lijkt echter alsof de code door één persoon is geschreven, die de Arduino eigenaardigheden niet volledig kent. Mijn stokpaardjes zijn millis() en I2C, en beide worden verkeerd gebruikt op die website.

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

Re: Arduino webserver pagina

Berichtdoor nicoverduin » 26 Mei 2017, 10:52

@koepel: Werkt als een tierelier. ff op een STM32 bordje gedraaid. Maar dat maakt niet uit
cpp code
#include "Arduino.h"

char tekstString[] = {"Dit is ff een testje met een zoekstring"};
char zoekArgumenten[5][50] = {
{"testje"},
{"met een zoeksting"},
{"ff een testjemet"},
{"ff een testje met"},
{"Dit is ff een testje met een zoekstring"}
};

void setup() {
Serial.begin(115200);
for (uint8_t i = 0; i < 5; i++) {
Serial.print("Argument : \"");
Serial.print(zoekArgumenten[i]);
Serial.print("\"");
if (!StrContains(tekstString, zoekArgumenten[i])) {
Serial.print(" niet");
}
Serial.print(" gevonden in string: \"");
Serial.print(tekstString);
Serial.println("\"");
}
}

// The loop function is called in an endless loop
void loop() {
}
/**
* StrContains
* @param str bron waarin gezocht wordt
* @param sfind Zoek argument
* @return true als aanwezig, false als niet
* Voorstel van Koepel
*/
bool StrContains(char *str, char *sfind)
{
return( strstr( str, sfind) != NULL); // bij STM32 nullptr vervangen voor NULL
}


192.168.0.x kan ook hoor. bekende ranges 10.0.x.x, 192.168.0.x, 192.168.1.x, 192.168.178.x. Eigenlijk maakt het geen bal uit. Is is gewoon een subdomein. Als je er meerdere zou hebben kun je bijv. meerdere ranges gebruiken. Soms doet de router dat zelf als er al een range gedefinieerd is. Netgear schakelt bij mij naar 10.0.0.x als 192.168.1.x in gebruik is.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 91
Geregistreerd: 18 Sep 2015, 12:31

Re: Arduino webserver pagina

Berichtdoor SpeedFM » 29 Mei 2017, 16:11

Ik heb de code ingevoerd, nu krijg ik steeds een foutmelding.
exit status 1
Fout bij het compileren van board Arduino Due (Programming Port)
Enig idee wat dit kan zijn?
Beginner Arduino DUE.

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

Re: Arduino webserver pagina

Berichtdoor nicoverduin » 29 Mei 2017, 16:24

Heb je wel de uitgebreide compileer en download berichten aangevinkt bij instellngen?
En dit al eens gelezen? https://www.arduino.cc/en/Guide/ArduinoDue
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten