Bien le bonjour à tous!
J'ai comme projet la réalisation d'un datalogger comme beaucoup ont déjà réalisé.
Ce dernier a la particularité d'utiliser un ADC 16 bits (AD7715) en SPI multiplexé par
un DG408 (clone d'un CD 4051 aPasCher). Je vous passerais les détails épiques de ce
p*t**n de AD7715 et de sa cohabitation avec le chip Ethernet et de la carte SD, mais
ça fonctionne!!!
La partie NTP est issue en l'état d'une newsletter de SkyWodd, le WebServer et la carte
SD des sketchs par défaut, et le DS1307 est en attente de câblage.
Donc tout va bien dans le meilleur des mondes... à ceci prêt qu'au bout d'un certain
moment, le serveur n'arrive plus à fournir les infos que j'ai préalablement loggées dans
la carte SD (bien que ces même infos "semblent" continuer de se logger normalement)
La cause me semble être une latence trop grande dans la réponse du serveur Web.
Un fichier log qui fait "planter" fait un peu plus de 400Ko (je pense que le serveur Web
plantait déjà bien en dessous...). Je viens de relancer un log tout neuf pour faire des
tests complémentaires... mais en l'état, un
time wget 192.168.1.x // adresse de mon Arduino
prends déjà un peu plus de 2 secondes pour 40 lignes de
1 TimeStamp + 8 n°voies + 8 valeurs ADC + 8 valeurs ADC% comme celle ci-dessous:
2013-02-09 07:09:00 UTC;1;1.00;0.00;2;1.00;0.00;3;1.00;0.00;4;28129.90;42.92;5;65535.00;100.00;6;65535.00;100.00;7;65535.00;100.00;8;28134.90;42.93
En gros, je ne sais pas trop quoi faire pour éviter ce genre de désagrément... Dans
l'absolu, je n'ai pas besoin de "Web'iser" l'intégralité des données, mais je ne vois pas
comment faire pour limiter le set de données à afficher, tout en sachant que la
totalité des données devra tout de même être contenue dans la carte SD...
J'ai pensé à une mémoire tournante, mais la quantité de RAM nécessaire pour 3 jours
serait de 26Ko pour une cadence de 10 mesures de 8 voies par heure...
Implémenter cette mémoire tournante à partir d'un fichier texte... trop usine à mon goût
Faire un fichier par jour... exploitation laborieuse
Mon code est peut-être foireux:
void listenForEthernetClients() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("Got a client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// 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("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// add a meta refresh tag, so the browser pulls again every 5 seconds:
//client.println("<meta http-equiv=\"refresh\" content=\"5\">");
client.println("TEST TEST TEST TEST");
client.println("
");
File dataFile = SD.open("test125.txt", FILE_READ);
char cc;
String buffer;
if (dataFile) {
while (dataFile.available()) {
cc = dataFile.read();
if(cc == 13){ // CR
dataFile.available();
dataFile.read(); // LF
client.print(buffer);
client.println("
");
buffer = "";
}
else{
buffer += cc;
}
}
dataFile.close();
client.println("</html>");
}
else {
client.println(F("Fichier NOK"));
}
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();
}
Des idées?
Bonne journée studieuse et pluvieuse!