Go Down

Topic: Probléme enregistrement SD et accès Internet simultanés avec shield Ethernet (Read 138 times) previous topic - next topic

mgnthe54

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 :

Code: [Select]


// 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 :
Code: [Select]
#define SECRET_CH_ID 1289244
#define SECRET_WRITE_APIKEY "3DA1I9STGL59NFLN"  

#define SECRET_MAC {0x90, 0xA2, 0xDA, 0x10, 0x40, 0x4F}// adresse mac Ardiuno mega
A+

mgnthe54

9000 caractères c'est peu!
Surtout avec le programme!
J'ai enlevé quelques commentaires en espérant ne rien avoir supprimé d'autres par erreur!
Merci encore
A+

J-M-L

Vous avez aussi posé la même question en Anglais et vous avez déjà été averti à ce sujet et m'avez même envoyé un eMail pour me dire que vous ne le referiez pas.

Si vous voulez vous faire virer du forum par le modérateur, continuez comme cela....

perso, je termine là ma contribution car pas assez de respect des membres du forum. débrouillez vous.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up