Bonjour à tous et à toutes, ceci est mon premier post cela s'arrose surement (enfin sauf que si je vais appel à vous c'est que je suis dans la panade…)
Alors commençons (j'espère avoir bien lu comment faire son premier post et ne rien oublier..)
Ce projet est à base d'un Arduino mega 2560, d'un bouclier Ethernet keystudio W5500. Et d'un capteur de température et hygrométrie DHT22 (Le tout de chez Aliexpress)
Je suis en train d'essayer de réaliser une acquisition de données sur une ruche et je souhaite stocker les données acquises dans la carte SD incorporée à mon shield Ethernet et en parallèle envoyer ces données sur le serveur ThingSpeak.
C'est là que les soucis commencent.
En effet je peux soit :
enregistrer correctement sur ma SD et l'adresse IP du bouclier devient folle (du genre 255.255.255.255.255)
soit envoyer les données au serveur ThingSpeak mais de copie de sauvegarde des données sur la SD.
Je développe un peu mon souci :
si au boot, il y a une carte SD dans le shield Ethernet je n'arrive pas à obtenir de ma Livebox une adresse IP, ni obtenir une adresse IP fixe la fonction Serial.print(Ethernet.localIP()) ; me renvoi dans ce cas-là des 255… et du coup les données sont sauvegardées sur la carte SD, mais pas sur le serveur (vu que je n'ai pas d'adresse IP valide)
Si j'enlève cette carte SD du lecteur, je récupère une adresse IP local ok et je réussis à mettre à jour le serveur mais comme il n'y a pas de carte dans le lecteur pas de sauvegarde..
J'ai essayé d'attribuer au lecteur SD la pin 4,10 ,53 comme suggéré dans d 'autres post sans différence.
J'ai aussi essayé la bibliothèque Ethernet2 (spécial Arduino Mega parait-il) en lieu et place de la biblio Ethernet sans plus de succès..
Bref je ne sais plus quoi faire si quelqu'un(s) peut éclairer ma lanterne pour moi permettre d'achever ce projet.
Milles merci
Bon je joint le code :
// on importe les bibliothèques
#include "SD.h"
#include "SPI.h"
#include <LiquidCrystal.h>
#include "DHT.h"
#include"Adafruit_Sensor.h"
#include "ThingSpeak.h"
#include <Ethernet2.h>
#include "secrets.h" //on inclue l'onglet secret. h qui contient vos variables
#define DHTPIN A0 // on affecte le pin A0 pour le DHT
#define DHTTYPE DHT22 // définition du type de capteur
DHT dht(DHTPIN, DHTTYPE); // création de l'objet capteur T° et hygro
LiquidCrystal monEcran(9,8,7,6,5,4); // création de l'objet monEcran
int pinCS = 53; // on reserve le Pin 4 pour le lecteur de SD si shield horloge si shield ethernet c'est la pin 10 sur Uno et 53 sur mega..
EthernetClient client;
unsigned long myChannelNumber = SECRET_CH_ID; //recopie le contenu de secret.h variable ChannelID du site thingspeak
const char * myWriteAPIKey = SECRET_WRITE_APIKEY; //recopie le contenu de secret.h variable WRITE aPI kEY du site thingspeak
byte mac[] = SECRET_MAC; // L'adresse MAC du shield
IPAddress ip(192,168,1,143); // L'adresse IP par défaut que prendra le shield si la box n'attribue pas une IP
float calibration_factor = -20600; // remplacer cette valeur precedente par votre propre facteur de //calibration au programme
float units; // variable de stockage du poids
File file; // Création de l'objet fichier nommé file
void setup()
{
pinMode(pinCS, OUTPUT); // Initisalisation le lecteur de carte SD en ecriture
Ethernet.init(10); // démarre la carte ethernet sur le pin 10
Serial.begin(9600); // on initialise le moniteur série a 9600 bauds
char erreur = 0;
erreur = Ethernet.begin(mac);// On tente de démarrer le shield Ethernet SANS adresse IP (donc donnée via DHCP de la box)
if (erreur == 0) {
Serial.println("Parametrage avec ip fixe..."); // si une erreur a eu lieu cela signifie que l'attribution DHCP ne fonctionne pas. On initialise donc en forçant une IP
Ethernet.begin(mac, ip); // forcage de l'adresse ip si pas acquise par box
Serial.println(Ethernet.localIP()); // affiche sur le moniteur série l'adress IP
}
Serial.println("Init...");
delay(1000); // Donne une seconde au shield pour s'initialiser
Serial.println(Ethernet.localIP());
//pinMode(pinCS, OUTPUT); // Initisalisation le lecteur de carte SD en ecriture
if (SD.begin(pinCS)) // si la SD est ok on fait ce qui suit
{
Serial.println("Carte SD prête à être utilisée."); // affichage du texte Carte SD... sur le moniteur série, PEUT-ETRE MASQUé UNE FOIS LA MISE AU POINT FINIE
} else
{
Serial.println("Echec de l'initialisation de la carte SD"); // affichage du texte Echec... sur le moniteur série, PEUT-ETRE MASQUé UNE FOIS LA MISE AU POINT FINIE
}
dht.begin(); // démarrage du capteur dht de T° & hygro
ThingSpeak.begin(client); // on intialise ThingSpeak
monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
}
void loop()
{
Serial.println("Lecture capteur en cours "); // uniquement pour suivi debug
// la lecture de la température et de l'humidité prend 250 millisecondes!
// Le capteur peut lire les valeurs toutes les 2 secondes
float h = dht.readHumidity(); // lit le taux d'humidité
float t = dht.readTemperature(); // lit la temperature en Celsius (par défaut)
if (isnan(h) || isnan(t)) { // Vérifie si la lecture est correcte (et recommence).
Serial.println("Impossible de lire le capteur!"); // signale sur le moniteur série que l'on arrive pas à lire le capteur de T° & Hygro
return; // sortie du test if
}
// fixe les champs de Thingspeak avec la données
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);
// eriture des champs dans ThingSpeak
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Mise à jours de ThingSpeak réussi.");
}
else{
Serial.println("Probléme de mise à jour de la chaine. code erreur HTTP " + String(x));
Serial.println(Ethernet.localIP()); //POUR CONTROLE CAR SI SD PRéSENTE CELA CHANGE L'ADRESSE IP
}
if (SD.begin(pinCS)) {
String NomFichier ="test.csv";
Serial.println(NomFichier); // uniquement pour suivi debug
file = SD.open( NomFichier, FILE_WRITE); //ouverture ou création si non existant du fichier
if (file) {
file.print(h,1); // stocke la valeur d'hygrométrie avec 1 chiffre derriere la virgule
file.print(","); // stocke une virgule de séparation
file.print(t,1); // stocke la température avec 1 chiffre derriere la virgule
file.print(","); // stocke une virgule de séparation
file.print(units); // stocke le poids avec 1 chiffre derriere la virgule
file.println(); // enregistrement à la ligne suivante
file.close(); //ferme le fichier
} else {
Serial.print("erreur d'ouverture du fichier : ");
}
}
else {
Serial.println("Pas de carte SD!");
Serial.print("Humidité: ");
Serial.print(h,1);
Serial.print("Température: ");
Serial.print(t,1);
monEcran.clear();
monEcran.print(t,1);
monEcran.print("C");
monEcran.setCursor(0,1);
monEcran.print(h,1);
delay(20000);
Voilà vous avez même mon accès à ThingSpeak si besoin...
Merci d'avance
Secrets.h :
#define SECRET_CH_ID 1289244
#define SECRET_WRITE_APIKEY "3DA1I9STGL59NFLN"
#define SECRET_MAC {0x90, 0xA2, 0xDA, 0x10, 0x40, 0x4F}// adresse mac Ardiuno mega