Offline
Newbie
Karma: 0
Posts: 11
|
 |
« on: January 18, 2013, 06:00:14 am » |
Salve a tutti, ho acquistato da poco una arduino ethernet rev3 con la quale mi sto assai divertendo  Sono incorso però in un problema ossia ho sviluppato un webserver tramite la libreria webduino per farmi dare al momento la temperatura dall'apposito sensore e comandare un led, il tutto o tramite browser oppure tramite un'app android appositamente sviluppata da me per l'occasione. Il problema è che ora vorrei usare la microsd per salvarmi magari una sorta di log o in futuro leggere dei dati da essa, ma non riesco assolutamente a scrivere su microsd. Ho provato uno sketch di esempio ed effettivamente quello funziona ma a quanto pare ci sono problemi se nello stesso sketch utilizzo la ethernet. Come posso fare per "switchare" tra la sd e la ethernet? Qualcuno di voi ha avuto questo problema? Grazie
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #1 on: January 18, 2013, 06:23:21 am » |
Presta attenzione al segnale di select dello spi.
Non so che versione arduino usi, ma so che in alcune versioni a seguito del comando begin che inizializza la rete viene lasciato il select della ethernet a livello basso(ovvero attivo), e non si riesce a comunicare con la SD.
Quindi se fosse questo problema, dopo l'istruzione di inizializzazione della rete (begin) fai un digitalWrite(10,HIGH) per disattivare il chip di rete, dopodichè la libreria della sd quando opportuno selezionerà tramite apposito pin (4) il CS della tua scheda.
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #2 on: January 18, 2013, 06:34:06 am » |
Grande, ci siamo quasi! La versione dell'sdk che leggo nel compilatore è la 1.0.3, non so se ti riferisci a quella. Allora ho fatto come hai detto tu, nel setup ho impostato il seguente codice void setup() { pinMode(LED, OUTPUT); pinMode(10, OUTPUT); Ethernet.begin(mac, ip); digitalWrite(10, HIGH); if (!SD.begin(4)) { sdAvailable = false; } ArduinoServer.addCommand("temp", &temp); ArduinoServer.addCommand("led", &led_command); ArduinoServer.addCommand("file", &file); ArduinoServer.begin(); delay(100); }
ora però quello che succede è che una volta scritto sul file la ethernet non risponde più ad altre richieste forse perchè "occupata" dalla sd. Come posso fare per "switchare" tra le 2 risorse?
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #3 on: January 18, 2013, 06:43:03 am » |
Posta tutto il codice. Solo da quel frammento non si capisce
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #4 on: January 18, 2013, 06:48:48 am » |
Ok, questo è tutto lo sketch #include <SPI.h> #include <Ethernet.h> #include <WebServer.h> #include <SD.h>
#define TEMP_SENSOR A1 #define LED 8
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; byte ip[] = {192, 10, 1, 166}; //byte ip[] = {10, 0, 0, 166}; WebServer ArduinoServer("", 1567); File logFile; String logFileName = "reslog.txt"; boolean sdAvailable = true;
void temp (WebServer &server, WebServer::ConnectionType type, char *param, bool param_complete) { if (type != WebServer::HEAD) { server.httpSuccess(); if (param_complete == true) { float temp = convertTemp(analogRead(TEMP_SENSOR)); char tempString[10]; dtostrf(temp, 1, 2, tempString); char json[50]; sprintf(json, "{temp: %s}", tempString); char logContent[50]; sprintf(logContent, "Temperatura ritornata: %s", tempString); server.print(json); saveToFile(logContent); } } else { server.httpFail(); } }
void led_command(WebServer &server, WebServer::ConnectionType type, char *param, bool param_complete) { if (type != WebServer::HEAD) { server.httpSuccess(); String s = ""; if (param_complete == true) { s = param; if (s == "on") { digitalWrite(LED, HIGH); if (digitalRead(LED) == HIGH) { server.print("{led: on_success}"); } else { server.print("{led: on_fail}"); } } else if (s == "off") { digitalWrite(LED, LOW); if (digitalRead(LED) == LOW) { server.print("{led: off_success}"); } else { server.print("{led: off_fail}"); } } else if (s == "status") { if (digitalRead(LED) == HIGH) { server.print("{led: on}"); } else { server.print("{led: off}"); } } else { server.httpFail(); } } } else { server.httpFail(); } }
void file(WebServer &server, WebServer::ConnectionType type, char *param, bool param_complete) { if (type != WebServer::HEAD) { server.httpSuccess(); if (sdAvailable) { logFile = SD.open("reslog.txt"); if (logFile) { while (logFile.available()) { server.print(logFile.read()); } logFile.close(); } else { server.println("Non sono riuscito ad aprire il file"); } } else { server.println("Scheda SD non disponibile"); } } else { server.httpFail(); } }
float convertTemp(float temp) { return (temp * 5.0 * 100.0) / 1024.0; }
void saveToFile(char data[]) { File fileLog = SD.open("request.log", FILE_WRITE); if (fileLog) { fileLog.println(data); fileLog.close(); } }
void activateLan() { Ethernet.begin(mac, ip); digitalWrite(10, HIGH); }
void activateSD() { if (!SD.begin(4)) { sdAvailable = false; } }
void setup() { pinMode(LED, OUTPUT); pinMode(10, OUTPUT); activateLan(); activateSD(); ArduinoServer.addCommand("temp", &temp); ArduinoServer.addCommand("led", &led_command); ArduinoServer.addCommand("file", &file); ArduinoServer.begin(); delay(100); }
void loop() { ArduinoServer.processConnection(); }
Quello che faccio al momento è richiamare da browser la funzione temp dove mi viene restituito un json e scrive una stringa nel file reslog.txt sulla sd (cosa che ora fa, prima creava solo il file che era vuoto), solo che successivamente arduino non risponde più alle richieste http
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #5 on: January 18, 2013, 08:03:33 am » |
Non conosco la libreria webduino, io uso la tiny (che di tiny ha rimasto poco perchè me la sono rivista quasi tutta). Ad occhio cosi non sembrerebbe esserci niente di strano, sei sicuro che accade esattamente cosa hai descritto? Comunque aggiungi un delay nel loop, anche di pochi millisecondi,e aggiungerei un delay anche tra server.print(json); // delay here saveToFile(logContent);
P.S. assicurati anche di aver impostato il Pin 4 come output e mettili entrambi a livello alto all'avvio.
|
|
|
|
« Last Edit: January 18, 2013, 08:05:54 am by niki77 »
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #6 on: January 18, 2013, 09:24:41 am » |
Si dopo che scrive la prima volta anche facendo aggiorna non risponde più. Almeno ora però scrive su file prima lo creava solo. Pro vero a mettere i delay come mi hai suggerito. P.S. assicurati anche di aver impostato il Pin 4 come output e mettili entrambi a livello alto all'avvio.
Scusa l'ignoranza, come dovrei fare?
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #7 on: January 18, 2013, 09:58:08 am » |
Scusa l'ignoranza, come dovrei fare?
pinMpinMode(4, OUTPUT); digitalWrite(4,HIGH); su setup dove già lo fai per il pin 10
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #8 on: January 18, 2013, 09:59:43 am » |
Ok appena ce l'ho di nuovo davanti provo così! Grazie mille!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #9 on: January 19, 2013, 09:14:03 am » |
Niente da fare, aggiungendo queste modifiche arduino manco mi risponde più via ethernet  Ma come diavolo è che è così complicato fare sta cosa? Eppure non credo di chiedere troppo 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #10 on: January 23, 2013, 10:24:52 am » |
Nessuna idea?  Nessun'altro ha avuto questo problema?
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #11 on: January 23, 2013, 06:54:02 pm » |
Io uso regolarmente insieme ethernet e sd e non ho alcun problema. Per il server ethernet uso la libreria tinywebserver, e per la sd quella compresa con Arduino. Magari la libreria che usi tu ha qualche problema,hai provato a vedere se hai l'ultima versione?
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #12 on: January 23, 2013, 06:56:03 pm » |
Stavo pensando anch'io alla libreria. Credo di avere l'ultima versione ma posso tranquillamente cambiare e provare con quella che usi tu. Alla fine basta che funziona
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2439
|
 |
« Reply #13 on: January 24, 2013, 05:15:19 am » |
I problemi della sd non sono sempre derivati dal software, ma anche dalla SD stessa e dalla formattazione che hai fatto, ad esempio se prendi una sd pincopallino di un cellulare e la metti in arduino, molto probabile che dia problemi. (almeno per me è stato così, di tutte non ne andava una come si deve) Il modello che preferisco in assoluto è la kingston, ormai le 2Gb non le trovi più, prendi una 8 o una 16gb e formattala in fat32 poi usa la lib SD.h che le legge e scrive benissimo i pin che ti interessano sono il 10 e il 4, ma quello già te lo hanno scritto nei post precedenti. Anche io la uso da un anno circa e funziona bene.
ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #14 on: January 24, 2013, 05:18:46 am » |
Ho acquistato una sandisk da 4gb appositamente e l'ho formattata in fat32. La libreria che uso per la sd è la sua e scrivendo uno sketch di prova funziona tutto regolarmente per questo i dubbi non sono andati sulla scheda sd.
|
|
|
|
|
Logged
|
|
|
|
|
|