Bonjour à tous.
Je débute depuis sur Arduino. J'ai pour projet de faire un relevé de température et que ce relevé me soit envoyé par mail. J'ai acheté tout le matériel. A force de recherche j'ai enfin réussi à récupérer la valeur de la sonde et l'afficher dans le moniteur série.
Mais une fois que j'en suis là je ne sais comment me l'envoyer par mail. J'ai chercher du côté de Carriots mais je n'ai pas tout compris. Est ce que l'un d'entre vous aurais la solution pour que je puisse recevoir cette mesure?
Merci des réponses
Par le matériel j'entend sonde, résitance, shield ethernet et Arduino
je vais jeter un oeuil à ton lien Viproz
merci
Voici le code que j'ai pu en tirer
//Inclusion des librairies
#include <OneWire.h>
#include <SPI.h>
#include <Ethernet.h>
//Partie Réseau
//Attribution de la MAC Adress du Shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };
//Adressage du Shield
IPAddress ip(192,168,1,60);
IPAddress gateway(192,168,1,254);
IPAddress subnet(255,255,255,0);
//Serveur Mail
char server[] = "monserveur.com";
EthernetClient client;
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
Ethernet.begin(mac, ip, gateway, gateway, subnet);
delay(2000);
Serial.println(F("Ready. Press 'e' to send."));
}
// loop()
void loop() {
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
//Partie Mail
byte inChar;
inChar = Serial.read();
if(inChar == 'e')
{
if(sendEmail()) Serial.println(F("Email sent"));
else Serial.println(F("Email failed"));
}
}
byte sendEmail()
{
byte thisByte = 0;
byte respCode;
if(client.connect(server,25)) {
Serial.println(F("connected"));
} else {
Serial.println(F("connection failed"));
return 0;
}
if(!eRcv()) return 0;
Serial.println(F("Sending helo"));
// change to your public ip
client.println(F("helo 1.2.3.4"));
if(!eRcv()) return 0;
Serial.println(F("Sending From"));
// change to your email address (sender)
client.println(F("MAIL From: <me@mydomain.com>"));
if(!eRcv()) return 0;
// change to recipient address
Serial.println(F("Sending To"));
client.println(F("RCPT To: <you@yourdomain.com>"));
if(!eRcv()) return 0;
Serial.println(F("Sending DATA"));
client.println(F("DATA"));
if(!eRcv()) return 0;
Serial.println(F("Sending email"));
// change to recipient address
client.println(F("To: You <you@yourdomain.com>"));
// change to your address
client.println(F("From: Me <me@mydomain.com>"));
client.println(F("Subject: Arduino email test\r\n"));
client.println(F("This is from my Arduino!"));
client.println(F("."));
if(!eRcv()) return 0;
Serial.println(F("Sending QUIT"));
client.println(F("QUIT"));
if(!eRcv()) return 0;
client.stop();
Serial.println(F("disconnected"));
return 1;
}
byte eRcv()
{
byte respCode;
byte thisByte;
int loopCount = 0;
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
respCode = client.peek();
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
if(respCode >= '4')
{
efail();
return 0;
}
return 1;
}
void efail()
{
byte thisByte = 0;
int loopCount = 0;
client.println(F("QUIT"));
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return;
}
}
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
client.stop();
Serial.println(F("disconnected"));
}
}
Mais j'ai une erreur lors de la vérification: sendEmail was not declared in this scope
ta fonction "sendEmail" est placée dans ton code en dessous de la fonction loop dans laquelle elle est appelée. Donc quand le compilateur arrive sur l'appel de sendEmail il ne sais pas encore que la fonction sendEmail existe, puisqu'il ne l'a pas lue.
Donc soit tu la place au dessus dans ton code (avant loop() ), soit tu crées un fichier .h qui contient les déclarations de toutes tes fonctions.
le plus simple est de la placer au dessus dans le code !
Merci de la réponse. J'ai en fait rajouter un } qui manquait. Il n'y a plus d’erreur lors de la compilation, reste plus qu'a vérifier si ça fonctionne une fois charger dans l'Arduino mais pour le moment il faut que je me trouve je pense une alim externe car lorsque je branche le shield ethernet sur l'Arduino ma sonde n'a plus l'air d’être alimentée. Elle ne me retourne plus de valeur.
Je vais tester tout ça et vous donnerais le résultat.