Page à compléter
en cours…
Matériel utilisé : carte arduino duemilanove (ceci doit aussi fonctionner avec la Uno) ainsi qu'un shield ethernet que l'on peut trouver, par exemple, ici : http://shop.snootlab.com/ (magasin basé à Toulouse).
Connecter la carte au port USB et lancer l'IDE Arduino. Via le menu Tools/Board, s'assurer que le bon modèle de carte est sélectionné.
Indications ici : http://www.arduino.cc/playground/Code/TwitterLibrary
Voici comment faire un serveur web qui renvoie les valeurs des pins analogiques. On peut y mettre différents capteurs, des thermistances, photoresistances…
On arrive ainsi à une page web qui affiche ceci :
/*
Web Server
A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.
created 18 Dec 2009
by David A. Mellis
modified 4 Sep 2010
by Tom Igoe
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x3D, 0x0A };
byte ip[] = { 192,168,0, 100 };
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);
void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
// listen for incoming clients
Client client = server.available();
if (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();
// output the value of each analog input pin
client.print("<b>Serveur Arduino</b><br /> ");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print("La valeur de l'analog input ");
client.print(analogChannel);
client.print(" est ");
client.print(analogRead(analogChannel));
client.println("<br />");
}
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();
}
}
Un excellent tutoriel ici : http://www.jlectronique.org/jlectronique/Ethernet_Shield.htm
Pour les tests, par exemple, si vous accédez à Internet via le wifi avec une IP en 192.168.0.X, il suffit de donner à votre interface réseau filaire (eth0) une adresse en 192.168.1.Y et affecter à la carte Arduino une adresse dans le même réseau.
On se base sur le projet précédent pour la structure du serveur web.
On utilise une CTN 4,7Kohm. Ce sont des composants dont la résistance diminue lorsque la température augmente. Courbe de variation logarithmique. La linéarisation de cette courbe s'obtient en ajoutant une résistance de même valeur que la CTN pour faire ce que l'on appelle un “pont diviseur” (toute information supplémentaire là dessus bienvenue). Le schéma est le suivant :
http://www.planete-sciences.org/rhone/IMG/pdf/Mesure_temperature_ballon.pdf
On se base sur le projet précédent pour la structure du serveur web.
On utilise ici un capteur de température LM35. La datasheet est disponible ici http://www.national.com/mpf/LM/LM35.html
Le LM35 est calibré en usine en degrés Celsius. Il délivre une tension proportionnelle à la température : 10.0 mV/°C. On peut travailler entre −55° et +150°C mais la carte Arduino ne peut pas mesurer des tensions négatives… Il y a une astuce avec une diode pour cela. Ce composant a beaucoup d’inertie thermique, il n'est donc pas adapté pour des mesures rapides mais très bien pour une station météo où justement on veut éviter des fluctuations non significatives.
Voici le code qui renvoie une page web, réactualisée chaque seconde, affichant la température mesurée par le LM35DZ.
/*
Web Server Température avec LM35DZ
basé sur code du 18 Dec 2009 de David A. Mellis
modifié 4 Sep 2010 par Tom Igoe
et le 18 dec 2011 par linuxedu
*/
#include <SPI.h>
#include <Ethernet.h>
// Définir l'adresse MAC et l'IP de la carte
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x3D, 0x0A };
byte ip[] = { 192,168,0,100 };
// Initialisation de la bibliothèque Ethernet server
// avec l4IP définie et le port (80 par défaut en HTTP)
Server server(80);
void setup()
{
// démarrage de la connection Ethernet connection et du serveur:
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
// attente de clients (un navigateur web par exemple)
Client client = server.available();
if (client) {
// une demande HTTP se termine par une ligne vide
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) {
// Header HTTP usuel
//
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// renvoie la valeur de la tension de la pin analogique 0
// et fait la conversion en celsius
// le tout dans une page HTML5 !
client.print("<!doctype html><html><head><meta charset='utf-8'/><title>Serveur de température Arduino</title>");
// script qui réactualise la page toutes les 1000 mSec
client.print("<script type='text/javascript'>function reFresh() { location.reload(true) } window.setInterval('reFresh()',1000); </script>");
client.print("</head><body><html>");
client.print("<h1 style='font-family:verdana;'>Serveur de Température - Arduino</h1>");
int analogChannel = 0; // On connecte la patte du milieu du LM35 sur la pin analogique 0
float valeur = analogRead(analogChannel);
float tension = valeur * 5.0 / 1024.0; // calcul de la tension. Arduino échantillone en 1024 les 5V.
float temperature = tension * 100 ; // LM35 : 10mV par degré
client.print("<p style='font-family:arial;color:red;font-size:20px;'>La temperature relevée sur l'entrée ");
client.print(analogChannel);
client.print(" est de : ");
client.print(temperature);
client.println(" °C.</p></body></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;
}
}
}
// on laisse du temps au navigateur web de recevoir les données
delay(1);
// close the connection:
client.stop();
}
}
Le montage :
L'affichage sur le navigateur qui est réactualisé chaque seconde :
Prochaine étape : enregistrer les relevés sur une journée entière (sur la carte SD) et les afficher sur la page web.