Probleme connection réseau Arduino Uno

Bonjour à tous,

J'ai un programme qui fonctionne avec un Arduino Mega, pour des essais je dois utiliser un Arduino Uno.
Le soucis est que quand j'essais de me connecter au réseau, j'ai ce retour en boucle dans le moniteur série et du coup aucune connexion.

Retour moniteur série :

localIP: 192.168.0.47

subnetMask: 255.255.255.0

gatewayIP: 192.168.0.1 localIP: 192.168.0.47

subnetMask: 255.255.255.0

gatewayIP: 192.168.0.1�localIP: 192.168.0.47

subnetMask: 255.255.255.0

j'utilise pour accéder au réseau un module ENC28J60qui est branché comme suit :

_ CS -> 10
_ SI -> 11
_ SO -> 12
_SCK -> 13

J'utilise également un RTC DS3231branché :

_ SDA -> A4
_ SCL -< A5

Et voici le programme que j'ai simplifier pour l'adapter à la mémoire du Uno :

#include <Wire.h>
#include <simpleRTC.h>
#include <SPI.h>
#include <UIPEthernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
//#include <ConnexParams.h>

EthernetClient client;
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

unsigned long previousMillis2;
char insert_Sql_1[140];

char  Var2;         // déclaration de la variable Var2 de type char
IPAddress serverAddress(10, 10, 10, 10);


void setup () {
  Serial.begin(9600);
  Wire.begin(); // Initialisation de la communication I2C
  SPI.begin();
 
  
 uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
 IPAddress ip(192, 168, 0, 47);
  Ethernet.begin(mac,ip);

  Serial.print(F("localIP: "));
  Serial.println(Ethernet.localIP());
  Serial.print(F("subnetMask: "));
  Serial.println(Ethernet.subnetMask());
  Serial.print(F("gatewayIP: "));
  Serial.println(Ethernet.gatewayIP());
  Serial.print(F("dnsServerIP: "));
  Serial.println(Ethernet.dnsServerIP());

  Serial.print("Connecting to SQL...  ");
  if (conn.connect(serverAddress, 3306, "User_BDD", "MDP_BDD"))
    Serial.println(F("OK."));
  else
    Serial.println(F("FAILED."));

  // create MySQL cursor object
  cursor = new MySQL_Cursor(&conn);

}


void loop () {
uint8_t annee1,mois1,jour1,heure1,minute1,seconde1; 
int vitChaine = 124;
// Test de létat du bouton pour affecter la variable Var2

Var2 = 'A'; //la broche led passe au niveau haut
    
  
// Utilisation de millis pour gérer la cadence d'enregistrement
// 10000 = 10 seconde
static uint32_t ref = 0;
  if (millis() - ref >= 10000)
  {
    ref += 10000;
    if (true)// Actualisation du module RTC avant recuperation des données
    {
      // Affectation des variables date et heure avec le module RTC
      annee1   = 1;
      mois1    = 1;
      jour1    = 1;
      heure1   = 1;
      minute1  = 1;
      seconde1 = 1;

envoi(jour1, mois1, annee1, heure1, minute1, seconde1, vitChaine,Var2);

     
    }
    
  }
}

void envoi(int jour1, int mois1, int annee1, int heure1, int minute1, int seconde1, int Var1, char Var2) {

  int interv = 0;
  for (int i = 0; i < 3; i++) {
    unsigned long currentMillis2 = millis();
    if (currentMillis2 - previousMillis2 >= interv) {
      // save the last time you updated the DHT values
      previousMillis2 = currentMillis2;
      if (!conn.connected()) {
        if (conn.connect(serverAddress, 3306, "User_BDD", "MDP_BDD")) {
          Serial.println(F("connection OK."));
        } else {
          Serial.println(F("connection FAILED."));
           interv = 60000;
          return;
        }
      }
    }
  }


  
  sprintf(insert_Sql_1, "INSERT INTO u984373661_prem_db.chain_peint (jour,mois,annee,heure,minute,seconde,var_1,var_2) VALUES (%d,%d,%d,%d,%d,%d,%d,'%c')", jour1,mois1,annee1,heure1,minute1,seconde1,Var1,Var2);
 Serial.println(insert_Sql_1);
  cursor->execute(insert_Sql_1);

  if (conn.connected()) {
    conn.close();
  }
}

Je ne comprend pas pourquoi le programme boucle sur les print des IP réseau, j'en conclue, qu'il ne se connecte pas, mais je n'arrive pas à trouver pourquoi, surtout que le programme fonctionnait avec le Méga.

J'ai peut être loupé quelque chose quand j'ai simplifier mon programme, mais je ne vois pas quoi.

Si j'ai oublié quelque chose n'hesitez pas et merci d'avance.

sans doute que votre UNO reboot

essayez de mettre cela au début du setup

void setup () {
  Serial.begin(9600);

  Serial.println("\nDEBUT DU SETUP");
  Serial.flush();

  Wire.begin(); // Initialisation de la communication I2C
  SPI.begin();

 
  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  IPAddress ip(192, 168, 0, 47);
...

et regardez si ça vous dit en boucle DEBUT DU SETUP.

si vous rebootez c'est peut être dû à un souci de mémoire (la UNO n'en a pas beaucoup)

Bonjour J-M-L,

J'ai bien "DEBUT DU SETUP" en boucle.

Et pour la mémoire, je suis a 79% en memoire de stockage et 99% en mémoire dynamique.

Quand j'ai simplifié mon programme, il a fallu que je diminue la mémoire dynamique pour passer en dessous des 100%, mais là à l'heure actuelle, je ne vois plus trop comment le diminuer.

Message complet :

Le croquis utilise 25572 octets (79%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 2034 octets (99%) de mémoire dynamique, ce qui laisse 14 octets pour les variables locales. Le maximum est de 2048 octets.

Aurais tu une idée pour la diminuer encore ?

Salut.
Le moindre exemple de la librairie UIPEthernet utilise 50% de la RAM d'une UNO. Si l'on ajoute à cela MySQL et le reste, 99% n'est pas étonnant.
Une carte W5100 ou W5500 permettrait d'économiser 15%. Le ENC28J60 n'est pas un chip intelligent, il ne gère que la partie matérielle, ce qui n'est pas le cas du W5100/W5500, qui intègre la stack IP.
Autre solution : une carte MEGA.
Remarque : j'ai déjà vu des retours négatifs à propos de l'ENC28J60.

Ok merci hbachetti pour les infos.

Si je ne peux rien gratter, je ne voulais pas, mais je vais passer sur un ESP car je n'ai plus de Mega.

L'ENC28J60 fonctionne avec un ESP8266 ?

Je ne sais pas. D'après la doc, oui.

@hbachetti a tout dit :

Dans toute communication il y a deux parties distinctes :

  • la couche logicielle
  • la couche physique

L'ENC28J60 a été conçu pour fonctionner avec des PICs qui par construction gèrent la couche logicielle.
L'ENC28J60 ne gère donc que les signaux électriques

Les avr ne gèrent pas la couche logicielle, ils doivent la réaliser en programmation, c'est pour cela qu'il faut beaucoup de mémoire disponible.

Les ESP je ne me souviens pas avoir lu qu'ils gèrent la couche logicielle Ethernet.
Les ESP c'est plus Wifi et Bluetooth qu'Ethernet, mais je me garde bien d'affirmer quoi que ce soit.

Changer de micro ne modifiera pas le fonctionnement de l'ENC28J60, si le micro ne possède pas par construction la gestion de la couche physique il faudra l'ajouter au programme.

Avec probablement des obligations d'adaptation entre niveaux 3,3 V et 5 V.

C'est soit changer de micro, soit changer l'ENC28J60 pour un wizznet W5100 ou W5500.
Le dernier choix me semble plus raisonnable : quitte à ajouter un composant, autant que le composant libère le micro des tâches subalternes.

En supposant que le sketch présenté soit une ébauche qui risque d'évoluer, il serait sage tout de même d'adopter un processeur mieux doté en RAM, et de remplacer l'ENC28J60 par le W5100 ou W5500 pour la fiabilité bien sûr.

Oui fallait pas chercher plus loin…

Merci @68tjs pour les infos, je comprend mieux le fonctionnement de ce module ENC28J60.

Le sketch, n'a pas à évoluer, il doit juste me servir à vérifier que j'arrive à me connecter et envoyer des données à la base de données. une fois vérifier je vais téléverser le sketch complet sur le Mega. Car je ne peux pas faire ces test sur le Mega pour des raisons d'accessibilité.

C'est aussi pour cela que je voulais rester sur une carte la plus proche du Mega, donc le UNO.

Je n'ai pas de W5100 ou w5500, donc je vais faire un essais avec un ESP8266 et l'ENC28J60 puisque la bibliothèque à l'air d’être adapté à l'ESP au vu du lien donné par @hbachetti

Et si ça ne fonctionne pas, au pire j'utiliserai un ESP32 avec un LAN8720, mais là je change complétement ma configuration matériel !!
Et c'est ce que je voulais éviter au départ.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.