Problemes Arduino
Posté le 13/03/2014 22:26
Bon voila j'ai un soucis avec ma Arduino pour la lecture de carte SD via un shield Ethernet pour une mise en réseau des données
J'ai suivis le topic de
ladyada mais il ou elle avait du le faire avant la mise a jour de la librairie ... Donc avant de prendre l'ancienne version de la librairie, quelqu’un saurais t'il resoudre l'erreur de compilation dans la fonction ListFiles
Le code
Cliquer pour enrouler
#include <SdFat.h>
#include <SdFatUtil.h>
#include <Ethernet.h>
#include <SPI.h>
//%%**%%%%**%%%%**%%%%**%%%%**%%%%**%% ETHERNET STUFF %%**%%%%**%%%%**%%%%**%%%%**%%%%**%%/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
EthernetServer server(80);
//%%**%%%%**%%%%**%%%%**%%%%**%%%%**%% SDCARD STUFF %%**%%%%**%%%%**%%%%**%%%%**%%%%**%%/
Sd2Card card;
SdVolume volume;
SdFile root;
// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))
void error_P(const char* str) {
PgmPrint("error: ");
SerialPrintln_P(str);
if (card.errorCode()) {
PgmPrint("SD error: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
while(1);
}
void setup() {
Serial.begin(9600);
PgmPrint("Free RAM: ");
Serial.println(FreeRam());
// initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
// breadboards. use SPI_FULL_SPEED for better performance.
pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
digitalWrite(10, HIGH); // but turn off the W5100 chip!
if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
// initialize a FAT volume
if (!volume.init(&card)) error("vol.init failed!");
PgmPrint("Volume is FAT");
Serial.println(volume.fatType(),DEC);
Serial.println();
if (!root.openRoot(&volume)) error("openRoot failed");
// list file in root with date and size
PgmPrintln("Files found in root:");
root.ls(LS_DATE | LS_SIZE);
Serial.println();
// Recursive list of all directories
PgmPrintln("Files found in all dirs:");
root.ls(LS_R);
Serial.println();
PgmPrintln("Done");
// Debugging complete, we start the server!
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if we've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (c == '\n' && current_line_is_blank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// print all the files, use a helper to keep it clean
//ListFiles(client, 0);
client.println("<h2>Files:</h2>");
//ListFiles(client, 0);
break;
}
if (c == '\n') {
// we're starting a new line
current_line_is_blank = true;
} else if (c != '\r') {
// we've gotten a character on the current line
current_line_is_blank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}
}
void ListFiles(EthernetClient client, uint8_t flags) {
// This code is just copied from SdFile.cpp in the SDFat library
// and tweaked to print to the client output in html!
dir_t p;
root.rewind();
while (root.readDir(p) > 0) {
// done if past last used entry
if (p.name[0] == DIR_NAME_FREE) break;
// skip deleted entry and entries for . and ..
if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;
// only list subdirectories and files
if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
// print file name with possible blank fill
//root.printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0);
for (uint8_t i = 0; i < 11; i++) {
if (p.name[i] == ' ') continue;
if (i == 8) {
client.print('.');
}
client.print(p.name[i]);
}
if (DIR_IS_SUBDIR(&p)) {
client.print('/');
}
// print modify date/time if requested
if (flags & LS_DATE) {
root.printFatDate(p.lastWriteDate);
client.print(' ');
root.printFatTime(p.lastWriteTime);
}
// print size if requested
if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
client.print(' ');
client.print(p.fileSize);
}
client.println("<br>");
}
}
Le retour du compilateur
Cliquer pour enrouler
no matching function for call to 'SdFile::readDir(dir_t&)'
sketch_mar13a.ino: In function 'void ListFiles(EthernetClient, uint8_t)':
sketch_mar13a:116: error: no matching function for call to 'SdFile::readDir(dir_t&)'
C:\Documents and Settings\User\Bureau\User\Arduino\libraries\SdFat/SdBaseFile.h:325: note: candidates are: int8_t SdBaseFile::readDir(dir_t*)
Citer : Posté le 14/03/2014 18:46 | #
Ça dépend de la plateforme, mais si c'est une carte SD, il est probable que tu n'obtiennes qu'une liste des fichiers et dossiers du répertoire actuel, sans information quant au contenu des sous-dossiers.
Citer : Posté le 14/03/2014 18:50 | #
Si ca marche impec' dans l'exemple mais quand je l'utilise ca marche plus
Citer : Posté le 14/03/2014 18:51 | #
Non, je n'ai pas le contenu mais j'ai le code pour mon écran qui permet de lire des fichiers. Je pourrais l'adapter pour le Serial ou pour l'ethernet comme avec ton prog.
Citer : Posté le 16/03/2014 15:39 | #
C'est bon j'ai plus ou moins réussi mais je me demandait pourquoi si on recharge la page ça donne une page vide ...
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
const int chipSelect = 4;
File root;
EthernetServer server(80);
EthernetClient client;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("\nEn attente...");
while(Serial.read()<=0);
delay(1000);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Ethernet.begin(mac, ip);
server.begin();
Serial.print("Server is at ");
Serial.println(Ethernet.localIP());
delay(1000);
root = SD.open("/");
Serial.println(root);
}
void loop()
{
client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
// client.println("Refresh: 120"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
// client.println("<meta charset="utf-8" />");
client.println("<title>Arduino SD</title>");
client.println("</head>");
client.println("<body>");
client.println("<p><strong>Starting...</strong></p>");
client.println("<p><strong><em>Card OK</em></strong></p>");
// Affichage des fichiers
client.println("<h3>SD Files:</h3>");
printDirectoryClient(root, 0);
client.println("</body>");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
void printDirectoryClient(File dir, int numTabs) {
Serial.println("Je suis la !");
client.println("<ul>");
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
client.print("<li>");
for (uint8_t i=0; i<numTabs; i++) {
client.print(" ");
}
Serial.print(entry.name());
if (entry.isDirectory()) {
client.print(entry.name());
client.print("/");
client.println("</li>");
printDirectoryClient(entry, numTabs+1);
} else {
// files have sizes, directories do not
client.print("<a href=\"");
client.print(entry.name());
client.print("\">");
client.print(entry.name());
client.print("</a> ");
client.print(entry.size(), DEC);
client.println("</li>");
}
entry.close();
}
client.println("</ul>");
}
Ajouté le 16/03/2014 à 17:20 :
Et aussi quand j'ouvre un lien que j'ai fait avec le nom des fichiers, ça m'ouvre une page 192.168.1.177/fichier.txt . Vous sauriez comment faire pour que ça télécharge au lieu d'ouvrir un onglet ?
Citer : Posté le 11/12/2015 13:18 | #
Salut ! Je n'ai pas envie d'ouvrir un topic juste pour cela, alors je prends celui qui s'y rapproche le plus. Dites-moi si cela dérange. Avec vos histoires d'arnuino et depuis quelques temps, cela m'intéresse et j'aimerais bien m'y lancer. Je voulais donc vous demander ; quel équipement conseilleriez-vous pour un débutant qui a un budget pas génial ? (Et qui est intéressé par les relations sans fil de type infrarouge voire mieux) Merci d'avance !
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 11/12/2015 13:32 | #
Salut,
Tu peux commencer avec des kits de démarrage qui coûtent environ 40-50€, cherche Sainsmart sur amazon, j'en ai pris un comme ça pour démarrer, c'est une autre marque mais qui fonctionne exactement comme une arduino.
Celui que j'ai contient un récepteur infrarouge et une led infrarouge ainsi qu'une petite télécommande, si ça t'amuse. J'ai aussi trouvé deux émetteurs/récepteurs radios pour moins de 10€.
Franchement, même avec un petit budget tu peux trouver des trucs sympas. (cherche pas des FGPA comme ceux qu'on utilise en prépa, c'est plus dur et plus cher :P )
Citer : Posté le 11/12/2015 15:42 | #
J'ai commencé par ce que l'on m'a conseillé, c'est à dire ça : lien
Après, tu peux acheter ce pack, constitué d'une Mega et d'un écran LCD tactile : lien
Il faut savoir que les cartes Arduino sont open-hardware, ce qui fait que beaucoup de constructeurs en fabriquent indépendamment. Du coup ça aide à trouver des versions moins chères, et pourtant 99% identiques à l'originale. SainSmart fait partie de ces constructeurs.
Edit :
De ce que je sais, Lephe a aussi commencé avec ces deux packs, comme quoi, PC a une influence non-négligeable sur notre consommation
Citer : Posté le 11/12/2015 16:00 | #
Étrangement j'ai aussi ces deux packs
Citer : Posté le 11/12/2015 17:21 | #
De ce que je sais, Lephe a aussi commencé avec ces deux packs, comme quoi, PC a une influence non-négligeable sur notre consommation
Pack que tu m'as conseillé après l'avoir acheté parce que quelqu'un te l'avait conseillé, et que j'ai conseillé à plusieurs autres personnes, bref, je ne me sens pas particulièrement responsable
Citer : Posté le 11/12/2015 17:28 | #
C'est bien ce que je dis
C'est sur PC qu'on m'a conseillé ça
Citer : Posté le 11/12/2015 18:12 | #
Merci de vos réponses, je vais me renseigner et le père Noël aidera.
Pong400
PierrePaCiseaux (CP400)
Les Triangles
Menu
ASCII
Nombres premiers
Citer : Posté le 11/12/2015 18:44 | #
Je crois que l'écran tactile c'est partit de moi mais pour le pack, c'est un autre