SD op ethernetshield kan ik niet benaderen

Hardware geleverd door Arduino
Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

SD op ethernetshield kan ik niet benaderen

Berichtdoor FonzieBonzo » 19 Jul 2016, 10:58

Hallo,


Ik heb de volgende (oude) dfrobot ethernet shield http://shieldlist.org/dfrobot/ethernet maar ik kan de SD poort niet benaderen (pin 2, 4 en 10 al geprobeerd).
Heeft iemand nog opties voor mij :


ps met onderstaande code krijg ik de volgende melding tijdens het compileren :
[code2=]
Sketch uses 22,922 bytes (71%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,439 bytes (70%) of dynamic memory, leaving 609 bytes for local variables. Maximum is 2,048 bytes.
[/code2]
is 71% of program storage / 70 dynamic memory niet een beetje veel voor zo'n klein projectje of komt het door de libraries die ik inlaad ?

cpp code
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

String NUMMER = "";
char SBUF0 = 0;
int U_TELLER = 0;
int LF_TELLER = 0;
int NUMMER_ID = 0;
bool U_IS_GEWEEST = false;
bool LF_IS_GEWEEST = false;

// Netwerkkaart
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 177);
IPAddress myDns(10, 0, 0, 137);
IPAddress gateway(10, 0, 0, 137);
IPAddress subnet(255, 255, 255, 0);
EthernetClient client;

// SD op netwerkkaart :
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
#define chipSelect 2
Sd2Card card;
SdVolume volume;
SdFile root;

SoftwareSerial SerialNaarFSKShield(6, 5); // RX, TX

void setup()
{
Serial.begin(9600);
SerialNaarFSKShield.begin(1200);

// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// initialize the Ethernet device not using DHCP:
Ethernet.begin(mac, ip, myDns, gateway, subnet);
}
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.print("IP adres: ");
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(".");
}
Serial.println();

// test of SD werkt
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("SD kaart :-(");
return;
} else {
Serial.println("SD kaart :-)");
}

}

void loop()
{
BehandelFSKShield();
}


void BehandelFSKShield()
{
if (SerialNaarFSKShield.available())
{
SBUF0 = SerialNaarFSKShield.read();
//Serial.write(SBUF0);

// kijken of er een reeks van 25 U's komen, kort hierna komt namelijk het telefoonnummer
if (U_IS_GEWEEST == false && SBUF0 == 'U' && U_TELLER <= 25) //U
{
U_TELLER = U_TELLER + 1;
if (U_TELLER >= 25)
{
U_TELLER = 0;
U_IS_GEWEEST = true;
return;
}
}

// U's zijn geweest nu wachten op een LF want daarna komt het telefoonummer
if (U_IS_GEWEEST == true )
{
if (SBUF0 == 0x0A ) // LF
{
LF_IS_GEWEEST = true;
return;
}
else
{
// Als er geen LF komt na 20 karakters dan is het een geheim nummer
LF_TELLER = LF_TELLER + 1;
}
}

if (LF_IS_GEWEEST == true || LF_TELLER >= 20)
{
// LF is geweest dus nu komen de nummers van het telefoonnummer
if (SBUF0 >= '0' and SBUF0 <= '9')
{
// een nummer van het telefoonummmer is gevonden

NUMMER=NUMMER+SBUF0;
}
else
{
// geen numeriek nummer meer dus het telefoonummer is klaar
NUMMER_ID=NUMMER_ID+1;
if (NUMMER=="") {NUMMER="0000000000";} //geheim nummer
Serial.println(String(NUMMER_ID) + "|" + NUMMER);
NUMMER="";
LF_TELLER = 0;
U_IS_GEWEEST = false;
LF_IS_GEWEEST = false;
}
}
} // if (mySerial.available())
}

Advertisement

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

Re: SD op ethernetshield kan ik niet benaderen

Berichtdoor nicoverduin » 19 Jul 2016, 11:05

Dan zou je al de assembly listing moeten bekijken hoe het geheugen gealloceerd wordt. SD werkt ook met buffers, Serial werkt met buffers. Al je strings en constante teksten in het programma vreten geheugen. Voor je het weet ben je erdoor heen

@edit: en voor jouw SD kaar zou ik dit eens lezen : http://forum.arduino.cc/index.php?topic=62255.0
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: SD op ethernetshield kan ik niet benaderen

Berichtdoor FonzieBonzo » 01 Aug 2016, 09:45

De geheugenkaart van de netwerkshield uitlezen is me nog niet gelukt. Ik heb je link gevolgd maar ik kreeg het niet voor elkaar ook met het netwerkgedeelte even uitgeschakeld.
Op zich is dit geen probleem omdat ik uiteindelijk het nummer van een beller direkt via een HTTP GET naar een SQLserver wil versturen, dus ik laat dit maar even voor wat het is.

Waar ik nog wel een beetje mee zit is dat je aangeeft dat er beter geen string gebruikt kunnen worden. Op dit moment werkt het goed maar het is de bedoeling dat het projectje jaren draait zonder omkijken.
Als ik een array of char moet gebruiken gaat het al wel een stuk omslachiger worden volgens mij. Ik moet dan steeds de positie van de array gaan onthouden en hoe geef ik een array of char mee terug met een functie?

Tot slot heb ik in mijn debug functie de volgende code
cpp code
if (LF_IS_GEWEEST == true) {
Serial.println("LF_IS_GEWEEST=true");
} else {
Serial.println("LF_IS_GEWEEST=false");
}

Kan ik deze code korter/mooien maken waarbij de waarde van LF_IS_GEWEEST gelijk naar de serial geprint kan worden ?


Gr,
Fonzie




cpp code
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet.h>
//#include <SD.h>

bool GO_DEBUG=false;

String NUMMER = "";
char SBUF0 = 0;
int U_TELLER = 0;
int LF_TELLER = 0;
int NUMMER_ID = 0;
bool U_IS_GEWEEST = false;
bool LF_IS_GEWEEST = false;

// Netwerkkaart
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 177);
IPAddress myDns(10, 0, 0, 137);
IPAddress gateway(10, 0, 0, 137);
IPAddress subnet(255, 255, 255, 0);
EthernetClient client;

// SD op netwerkkaart :
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// #define chipSelect 3
// Sd2Card card;
// SdVolume volume;
// SdFile root;

SoftwareSerial SerialNaarFSKShield(6, 5); // RX, TX

void setup()
{
Serial.begin(9600);
SerialNaarFSKShield.begin(1200);

// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// initialize the Ethernet device not using DHCP:
Ethernet.begin(mac, ip, myDns, gateway, subnet);
}
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.print("IP adres: ");
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(".");
}
Serial.println();

// pinMode(10, OUTPUT);
// digitalWrite(10, HIGH);
// test of SD werkt
// if (!card.init(SPI_HALF_SPEED, chipSelect)) {
// Serial.println("SD kaart :-(");
// return;
// } else {
// Serial.println("SD kaart :-)");
// }

}

void loop()
{
String EenNummer = BehandelFSKShield();
if (EenNummer != "")
{
NUMMER_ID = NUMMER_ID + 1;
Serial.println("|"+String(NUMMER_ID)+"|"+EenNummer);
}
}

void Debug()
{
if (GO_DEBUG == false) {
return;
}
Serial.println("- - - - - - - - - - - - - - - - - - - - - - - -");
Serial.println("U_TELLER=" + String(U_TELLER));
if (U_IS_GEWEEST == true) {
Serial.println("U_IS_GEWEEST=true");
} else {
Serial.println("U_IS_GEWEEST=false");
}
if (LF_IS_GEWEEST == true) {
Serial.println("LF_IS_GEWEEST=true");
} else {
Serial.println("LF_IS_GEWEEST=false");
}
Serial.println("LF_TELLER=" + String(LF_TELLER));
Serial.println("NUMMER='" + NUMMER + "'");
Serial.println("- - - - - - - - - - - - - - - - - - - - - - - -");
}

String BehandelFSKShield()
{
if (SerialNaarFSKShield.available())
{
SBUF0 = SerialNaarFSKShield.read();
//Serial.write(SBUF0);

// kijken of er een reeks van 25 U's komen, kort hierna komt namelijk het telefoonnummer
if (U_IS_GEWEEST == false && SBUF0 == 'U' && U_TELLER <= 25) //U
{
U_TELLER = U_TELLER + 1;
if (U_TELLER >= 25)
{
U_TELLER = 0;
U_IS_GEWEEST = true;
return ("");
}
Debug();
}

// U's zijn geweest nu wachten op een LF want daarna komt het telefoonummer
if (U_IS_GEWEEST == true )
{
if (SBUF0 == 0x0A ) // LF
{
LF_IS_GEWEEST = true;
Debug();
return ("");
}
else
{
// Als er geen LF komt na 20 karakters dan is het een geheim nummer
LF_TELLER = LF_TELLER + 1;
}
}

if (LF_IS_GEWEEST == true || LF_TELLER >= 20)
{
// LF is geweest dus nu komen de nummers van het telefoonnummer
// Als er geen LF na 20 caracters komt gaat het waarschijnlijk om een geheim nummer
if (SBUF0 >= '0' and SBUF0 <= '9')
{
// een nummer van het telefoonummmer is gevonden
NUMMER = NUMMER + SBUF0;
Debug();
}
else
{
// geen numeriek nummer meer dus het telefoonummer is klaar
if (NUMMER == "") {
NUMMER = "0000000000"; //geheim nummer
}
String LNUMMER = NUMMER;
NUMMER = "";
LF_TELLER = 0;
U_IS_GEWEEST = false;
LF_IS_GEWEEST = false;
Debug();
return (LNUMMER);
}
}
} // if (mySerial.available())
return ("");
}

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

Re: SD op ethernetshield kan ik niet benaderen

Berichtdoor nicoverduin » 01 Aug 2016, 13:21

cpp code
Serial.print(F("LF IS GEWEEST = "));
Serial.println(LF_IS_GEWEEST ? "true" : "false" );
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: SD op ethernetshield kan ik niet benaderen

Berichtdoor nicoverduin » 01 Aug 2016, 13:24

FonzieBonzo schreef:Waar ik nog wel een beetje mee zit is dat je aangeeft dat er beter geen string gebruikt kunnen worden. Op dit moment werkt het goed maar het is de bedoeling dat het projectje jaren draait zonder omkijken.
Als ik een array of char moet gebruiken gaat het al wel een stuk omslachiger worden volgens mij. Ik moet dan steeds de positie van de array gaan onthouden en hoe geef ik een array of char mee terug met een functie?

't is maar net wat je belangrijker vindt...... Omslachtig en goed programmeren en minder kans op verstoringen .... of een programma die er op het verkeerde moment eruit klapt ... Geheel jouw keuze....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: SD op ethernetshield kan ik niet benaderen

Berichtdoor FonzieBonzo » 01 Aug 2016, 19:20

Ok dank je wel. Ik heb het afdrukken van een boolean aangepast.

Wat betreft het gebruik van de string, ik ga kijken wat dit doet, het heeft nu 2 weken gedraait zonder storing maar als ik in de toekomst problemen ga krijgen zat ik over gaan op pointers.
Ik ga voorlopig dus voor de minder omslachtig maar meer kans op storingen oplossing :D


Gr,
Fonzie

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten