Bonjour
Comme je suis de bonne humeur meme en ce ce lundi pluvieux
regarde donc simplement l'exemple webserver de la lib ethernet
çà fait exactement ce qu tu veux
au moins en ce qui concerne l'acquisition et le rafraichissement
Qu'il est bon ce artouste ^^
( dispo dans ton ide arduino dans les exemples )
Pour ce qui es de ta page web, utilise la méthode GET - FORM ( HTML ) pour ajouter des infos à l'URL et t'en servir pour afficher ce que tu veux sur la page web.
Un bouton FORM method GET ajoute ceci à l'URL : ?ta_variable=12&&ta_deuxieme_variable=57&&..." etc
Et donc à la réception de la requette après l'appui sur le bouton ( GET - FORM ) tu pourras lire dans la trame HTTP du client : http://nom_de_ta_page?ta_variable=12&&ta_deuxieme_variable=57&&.. et donc te servir des valeurs des variables pour savoir sur quel bouton on à appuyer et donc réagir en conséquence pour afficher ce que tu veux.
Tu n'y es surement pas encore mais pour modifier l’échantillonnage et ce que tu veux afficher comme résultat de campagne de relevé etc il va te falloir passer par la ^^
au moins en ce qui concerne l'acquisition et le rafraichissement
Euh je veux pas tellement que ca se rafraichisse hein :s parce que si on rafraichit la valeur précédente va etre effacée donc ca va pas !
J'ai donc bien regarder l'exemple de la lib ethernet ( qui est à 2-3 lignes de codes près la meme chose que l'exemple que j'avais trouvé sur un autre tuto), je l'ai testé, ca fonctionne, mais c'est pas ce que je veux parce que la valeur est effacée à chaque rafraichissement!
Pour ce qui es de ta page web, utilise la méthode GET - FORM ( HTML ) pour ajouter des infos à l'URL et t'en servir pour afficher ce que tu veux sur la page web.
Euh oui je veux bien, mais ca, je le fais a partir du programme arduino?
au moins en ce qui concerne l'acquisition et le rafraichissement
Euh je veux pas tellement que ca se rafraichisse hein :s parce que si on rafraichit la valeur précédente va etre effacée donc ca va pas !
J'ai donc bien regarder l'exemple de la lib ethernet ( qui est à 2-3 lignes de codes près la meme chose que l'exemple que j'avais trouvé sur un autre tuto), je l'ai testé, ca fonctionne, mais c'est pas ce que je veux parce que la valeur est effacée à chaque rafraichissement!
Alors il faut faire en sorte de ne pas effacer, mais de venir à la suite
et ça c'est géré au niveau HTML.
Ceci etant , tu va te retrouver avec des pages illisibles.
je croyais que tu voulais voir afficher la valeur active, eventuellement la rafraichir mais surtout de faire du log sur SD
avec la possibilité de recuperer le fichier log distant ?
Oui, dans ta page web ( le code est dans ton prog arduino ) tu intègre les boutons du styles démarrer une nouvelle campagne de relever l'arrêter, demander les résultats pour tel période etc, ( FORM GET ) et après coté traitement, c'est encore dans le arduino que ça ce passe, qu'ils sont fort ces arduinos
Alors il faut faire en sorte de ne pas effacer, mais de venir à la suite
et ça c'est géré au niveau HTML.
Ceci etant , tu va te retrouver avec des pages illisibles.
je croyais que tu voulais voir afficher la valeur active, eventuellement la rafraichir mais surtout de faire du log sur SD
avec la possibilité de recuperer le fichier log distant ?
Il faut que par nimporte quel moyen, on puisse consulter ( à la fin de la campagne de mesure), toutes les mesures effectuées pendant cette campagne, avec la période d'échantillonnage donnée. Que ce soit sur la page web, ou dans un fichier distant. Si c'est plus facile de balancer les données de la campagne de mesure dans un fichier distant, je prend cette option. J'ai parlé des sites Web parce que je savais pas si c'était possible de mettre les données directement dans un fichier dédié sur le serveur.
Oui, dans ta page web ( le code est dans ton prog arduino ) tu intègre les boutons du styles démarrer une nouvelle campagne de relever l'arrêter, demander les résultats pour tel période etc, ( FORM GET ) et après coté traitement, c'est encore dans le arduino que ça ce passe, qu'ils sont fort ces arduinos
Ok donc tout le code de la page web ( en HTML) va se trouver dans le programme arduino, la programmation des bouton démarrer, arreter, etc se fait sur le code de l'arduino c'est ca? J'étais pas sur de ca en fait, je pensais qu'il fallait faire un code arduino pour aller sur la page web, et de configurer cette page web via un autre programme ( je n'ai jamais, au grand jamais fait ce genre de choses auparavant donc je ne suis pas sur de ce que j'avance à chaque fois que je vous parle^^)
Mastaahh:
...
Il faut que par nimporte quel moyen, on puisse consulter ( à la fin de la campagne de mesure), toutes les mesures effectuées pendant cette campagne, avec la période d'échantillonnage donnée. Que ce soit sur la page web, ou dans un fichier distant.
...
pourquoi te limiter à une mise à disposition seulement en "fin de campagne" ?
il faut ici (ou là 8) ) au moins distinguer 2 process differents de "visualisation" :
-celui de pouvoir lire l'etats "actuel" des capteurs
-celui de pouvoir sur demande disposer de l'historique (les log)
etant evidemment assumé là qu'un "etat actuel " fera evidemment parti du log
Decoupe tes besoins en "briques", valide déjà chaque brique , et seulement apres tu essaie de construire "le mur" 8)
Te casse pas la tete , arrivé là tu devra aussi te preoccuper de la bonne qualité "de la colle" entre briques
Bah la première brique est bien solide du coup là j'arrive très bien a visualiser à un instant T ma valeur, j'arrive aussi a refresh la page et donc actualiser ma valeur automatiquement, maintenant je dois faire la brique sur l'historique et des logs. Et là, j'ai beau cherché je suis pommé quoi :s en plus j'arrive pas à me destresser je me dis que je vais jamais y arriver à temps du coup ca aide pas xD
Mastaahh:
Bah la première brique est bien solide du coup là j'arrive très bien a visualiser à un instant T ma valeur, j'arrive aussi a refresh la page et donc actualiser ma valeur automatiquement, maintenant je dois faire la brique sur l'historique et des logs. Et là, j'ai beau cherché je suis pommé quoi :s en plus j'arrive pas à me destresser je me dis que je vais jamais y arriver à temps du coup ca aide pas xD
Une foie que tu saura stocker sur la carte SD tes valeurs, il te restera plus qu'a faire les mécanisme web pour lié fonctionnalités voulue à un jolie bouton sur ta page ^^
Et panique pas, si tu était un pro tu aurais fait sa en 4 5h grand max donc tu devrais pouvoir le faire d'ici le 20juin hein
Skizo.
Ok Ok, merci beaucoup je vais donc étudier ligne par ligne ce code pour bien m'en imprégner et le comprendre a 100%!
Ouai mais j'ai pas que ce projet qui tourne en fait, j'ai aussi un projet sur un capteur air à terminer^^
Sur ce 2eme projet, je dois aussi acquérir les valeurs de pression en continu et les afficher sur une interface ( ils prefereraient LabView ) pour que des étudiants puissent faire des TP dessus. Donc j'ai du temps oui, mais bon pas non plus énormement
Mais déja, vous m'avez fait gagné 1 voir 2 bonnes semaines de recherches et je vous en suis vraiment très reconnaissant !!
C'est partout pareil, tu peut galérer 1 semaine pour comprendre tout seul ou demandé à celui qui sais et te le faire expliquer en 15 minutes, chacun fait comme y veut mais vaut mieux demander quand les gens savent ^^
Salut tout le monde!!
Alors je reviens après 1 semaine ou j'ai essayé de faire des trucs!
Bon j'ai pas enormement avancé parce qu'on est tombé en rupture de stock de carte micro SD du coup je ne pouvais pas faire de test! (Du coup j'ai avancé mon rapport de stage en attendant^^)
La j'ai enfin pu tester ce matin. Voila mon code et je vous explique après le problème :
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#define DEBUG_SD
#define DEBUG_ETHERNET
#define SS_SD_CARD 4
#define SS_ETHERNET 10
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x38, 0x18};
IPAddress ip(192, 168, 2, 235);
EthernetServer server(80);
Sd2Card card;
SdVolume volume;
SdFile root;
void setup() {
pinMode(SS_SD_CARD, OUTPUT);
pinMode(SS_ETHERNET, OUTPUT);
digitalWrite(SS_SD_CARD, HIGH);
digitalWrite(SS_ETHERNET, HIGH);
Serial.begin(9600);
SDCardCode_init();
ethernetCode_init();
}
void loop() {
ethernetCode();
SDCardCode();
}
void SDCardCode_init() {
digitalWrite(SS_SD_CARD, LOW);
#ifdef DEBUG_SD
Serial.print(F("Initialisation de la carte..."));
if (!card.init(SPI_HALF_SPEED, SS_SD_CARD)) {
Serial.println(F("Problème d'initialisation. Choses à vérifier :"));
Serial.println(F("* la carte est bien insérée?"));
Serial.println(F("* Votre branchement est-il correct?"));
return;
} else {
Serial.println(F("Le branchement est correct et la carte est présente."));
}
Serial.print("Type de carte: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println(F("SD1"));
break;
case SD_CARD_TYPE_SD2:
Serial.println(F("SD2"));
break;
case SD_CARD_TYPE_SDHC:
Serial.println(F("SDHC"));
break;
default:
Serial.println(F("inconnue"));
}
if (!volume.init(card)) {
Serial.println(F("N'a pas pu trouver de fichier FAT16/FAT32 .\nAssurez vous d'avoir bien formaté la carte"));
return;
}
uint32_t volumesize;
Serial.print(F("Le type du ficher est FAT"));
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster();
volumesize *= volume.clusterCount();
volumesize *= 512;
Serial.print(F("taille du fichier (octets): "));
Serial.println(volumesize);
Serial.print(F("taille du fichier (Koctets): "));
volumesize /= 1024;
Serial.println(volumesize);
Serial.print(F("taille du fichier (Moctets): "));
volumesize /= 1024;
Serial.println(volumesize);
Serial.println(F("\nFichiers trouvés sur la carte (nom, date et taille en octets): "));
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_SIZE);
#endif
if (!SD.begin(SS_SD_CARD)) {
Serial.println(F("carte non initialisée ou absente"));
return;
}
Serial.println(F("carte initialisée."));
digitalWrite(SS_SD_CARD, HIGH);
}
void SDCardCode() {
digitalWrite(SS_SD_CARD, LOW);
String dataString = "" ;
for (int analogPin=0; analogPin<1; analogPin++) {
int sensor = analogRead(analogPin)*0.00488;
dataString+= String(sensor);
File dataFile = SD.open("data.txt", FILE_WRITE);
delay(50);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString);
}
else {
Serial.println(F("error opening datalog.txt"));
}
digitalWrite(SS_SD_CARD, HIGH);
}
}
void ethernetCode_init() {
// ...
digitalWrite(SS_ETHERNET, LOW);
Ethernet.begin(mac, ip);
server.begin();
#ifdef DEBUG_ETHERNET
Serial.print(F("server is at "));
Serial.println(Ethernet.localIP());
#endif
digitalWrite(SS_ETHERNET, HIGH);
}
void ethernetCode() {
digitalWrite(SS_ETHERNET, LOW);
EthernetClient client = server.available();
if (client) {
Serial.println(F("new client"));
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F("Connection: close"));
client.println();
client.println(F("<!DOCTYPE HTML>"));
client.println(F("<html>"));
for (int analogChannel = 0; analogChannel < 1; analogChannel++) {
int sensorReading = analogRead(analogChannel)*0.00488;
client.print(F("analog input "));
client.print(analogChannel);
client.print(F(" is "));
client.print(sensorReading, 3);
client.println(F("
"));
}
client.println(F("</html>"));
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println(F("client disconnected"));
}
digitalWrite(SS_ETHERNET, HIGH);
}
Petit récapitulatif : les données s'écrivent bien sur la carte mémoire, le moniteur série affiche les bonnes valeurs, mais par contre j'arrive pas à programmer le fait de basculer les données de la carte vers ma page web!
Une idée? =)
Mastaahh:
Petit récapitulatif : les données s'écrivent bien sur la carte mémoire, le moniteur série affiche les bonnes valeurs, mais par contre j'arrive pas à programmer le fait de basculer les données de la carte vers ma page web!
Une idée? =)
Le plus simple.
Tu fais un tableau dans ta page web.
pour chaque ligne du tableau
tu lis une ligne de données sur la carte mémoire
tu écris les données dans la page web
jusqu'à avoir lu toute la carte mémoire.
Tout ca se programme dans l'arduino?
Pour les fonctions à insérer dans le code c'est quoi comme type? (désolé je suis vraiment pas formé sur ce genre de programmation donc je sais vraiment pas comment faire :s )
for (int analogChannel = 0; analogChannel < 1; analogChannel++) {
int sensorReading = analogRead(analogChannel)*0.00488;
client.print(F("analog input "));
client.print(analogChannel);
client.print(F(" is "));
client.print(sensorReading, 3);
client.println(F("
"));
}
à remplacer par : Lecture SD de ton fichier de relevé ligne par ligne => Apres chaque ligne lu tu affiche le résultat
( dans un tableau de préférence comme expliqué par fdufnews )
Pour le tableau la structure c'est :
Avant de commencer la lecture tu écris et la fin de la lecture tu écrit
A chaque ligne tu écrit : et fin de ligne
A chaque case tu écrit : et fin de case
Ce qui donne pour un tableau 3 lignes deux cases:
date
valeur
12/05/2014
154
13/05/2014
164
Voila, à toi de joué, après en fonction des boutons que tu ajoutera pour choisir le relevé tu pourrai choisir de lire tel ou tel fichier de ta SD pour afficher tel ou tel résultat, ça c'est la prochaine étape à coder
Sans parler de tableau ni rien pour l'instant ( car j'aimerai déja arriver à afficher mes données correctement), j'ai essayé de remplacer la partie que tu as mis et ca donne ca :
void ethernetCode()
{
// ...
/*digitalWrite(SS_ETHERNET, LOW); // Ethernet ACTIVE
digitalWrite(SS_SD_CARD, LOW);*/
// listen for incoming clients
EthernetClient client = server.available();
if (client)
{
Serial.println(F("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(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F("Connection: close")); // the connection will be closed after completion of the response
//client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println(F("<!DOCTYPE HTML>"));
client.println(F("<html>"));
// output the value of each analog input pin
File dataFile = SD.open("data.txt", FILE_READ);
if (dataFile)
{
while (dataFile.available())
{
client.println(dataFile.read());
}
dataFile.close();
}
else
{
Serial.println("error opening data.txt");
}
}
client.println(F("</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(F("client disconnected"));
}
/*digitalWrite(SS_SD_CARD, HIGH);
digitalWrite(SS_ETHERNET, HIGH); // Ethernet not active*/
}
Ca ne fonctionne pas, et je ne comprend pas pourquoi :s
Une idée ?
Ne pas perdre de vue que l'Ethernet et la carte SD partagent le bus SPI donc il y a quelques précautions à prendre.
Je serais surpris qu'il n'y ait pas des exemples par-ci par-là de programme hébergeant les pages html sur la carte SD. Ce qui revient à peu près au même dans la logique de gestion des accès.
A mon avis ça risque pas de marcher de faire un analogRead qui est dans un fichier texte et qu'on lit avec la lib SD...
Je pense qu'on ne peut mettre dans un fichier texte sur la SD que du code "passif" interprété par le navigateur.
Mais surement pas du code "actif" interprété par l'Arduino.
Est-ce que je me trompe?
Par ailleurs, peut-on avoir le code entier et le fichier situé sur la SD?
Il faut aussi changer: "client.println(dataFile.read());" par "client.write(dataFile.read());"