RAZ aléatoire de l'arduino

Salut salut les amis,

Je viens faire appel à vous car je suis embêté avec mon Arduino. Je vous explique je suis sur un petit système de domotique avec gestion de relais 220V, température, humidité... Le tout étant contrôlable via une interface web.

Ayant voulu rajouter un clavier matriciel pour une gestion "manuel" j'ai décidé d'utiliser un sktech de code Pin trouvé sur le net :

void setup()
{
lcd.begin(16,2); // Initialise le LCD avec 20 colonnes x 4 lignes 

delay(10); // pause rapide pour laisser temps initialisation

// Test du LCD

lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(1000); // pour laisser temps effacer écran
lcd.print("  Entrer PIN...");
}

void correctPIN() // faire si le pin est ok
{
  lcd.print("* Correct PIN *");
  delay(1000);
  lcd.clear();
  lcd.print("  Entrer PIN...");
}

void incorrectPIN() // faire si le code est incorrect
{
  lcd.print(" * Try again *");
  delay(1000);
  lcd.clear();
  lcd.print("  Entrer PIN...");
}

void checkPIN()
{
  int correct=0;
  for (int q=0; q<6; q++)
  {
    if (attempt[q]==PIN[q]) // on compare la saisie avec le code
    {
      correct++;
    }
  }
  if (correct==6) // si les 6 sont correctes
  {
    correctPIN();
  } else
  {
    incorrectPIN();
  }
  for (int zz=0; zz<6; zz++) // on vide
  {
    attempt[zz]=0;
  }
}

void readKeypad()
{
  char touche = clavier.getKey();
  if (touche != NO_KEY)
  {
    switch(touche)
    {
    case '*':
      z=0;
      break;
    case '#':
      delay(100); // for extra debounce
      lcd.clear();
      checkPIN();
      break;
    default:
      attempt[z]=touche;
      z++;
    }
  }
}

void loop()
{
  readKeypad();
}

Ce code fonctionne très bien (grand merci à celui (ou celle) qui nous à sorti ça) cependant j'ai voulu l’intégrer à mon système de domotique et l'Arduino RAZ de façon aléatoire, alors j'ai cherché si il avait des conflits, à savoir que j'utilise :

#include <SPI.h>
#include <Servo.h>
#include <math.h>

// --- librairies utilisées pour le module Ethernet ---
#include <Server.h>
#include <Client.h>
#include <Ethernet.h>
#include <EthernetDHCP.h>

// --- librairie pour le LCD ---
#include <LiquidCrystal.h>

// --- librairie pour stockage en mémoire flash programme ---
#include <Flash.h>

et que mon code ressemble à cela

void loop(){
switch (var) {
case 1:
readKeypad();
break;
case 2:
code de la page web
break;
}// fin switch
}//fin loop

Alors si quelqu'un à une idée que ce soit un soucis niveau lib, du code ou autre je suis preneur ...
Amicalement,
Trigger

Vu les librairies je dirais un problème de taille mémoire avec un grand nombre de chaines de caractères ?
Enfin faudrait voir ton code complet pour savoir.

Merci de la reponse vraiment rapide, la taille du code peut être un problème ?

Binary sketch size: 36006 bytes (of a 258048 byte maximum)

Je posterai bien mon code en entier mais il fait presque 900 lignes alors bon ^^

Plutôt la RAM qui serait saturé.
Un moyen d'être vite fixé:
http://www.arduino.cc/playground/Code/AvailableMemory

Maintenant voir ton code serait utile également pour t'aider, tu n'as pas un petit compte ftp ou rapidshare histoire d'y déposé un zip de ton pde ?

Salut,

osaka:
Plutôt la RAM qui serait saturé.

Je pencherai aussi pour cette éventualité, ou alors un débordement de tableau.

osaka:
Maintenant voir ton code serait utile également pour t'aider, tu n'as pas un petit compte ftp ou rapidshare histoire d'y déposé un zip de ton pde ?

Il y a aussi la fonction "Attach" dans "Additional Options..." sur le forum (max 1Mo) :wink:

Salut salut :slight_smile:
Merci pour vos réponses et voici les nouvelles infos :

Donc grâce à vous j'ai déjà pu écarter la RAM car cela ne semble pas venir de là.

je n'ai pas posté tout le code pour la simple et bonne raison que le problème survient seulement à la validation du code PIN ( voir sketch plus haut) donc à ce stade je penche pour une erreur matérielle voici donc ce que j'utilise (avec le pins correspondantes) :

  • Arduino Mega
  • Shield Ethernet officiel
  • clavier matriciel : 2,3,4,5,6,7,8,9
  • écran LCD : 22,24,26,28,30,32
  • 7 relais : 40,42,44,46,48,50,52
  • 2 servos : 34,36
  • LM35 : A15

Je sais que certaines broches sont réservée mais pensez vous que cela puisse venir de la ?

Amicalement,
trigger

Je vois déjà 50 et 52 réservé au spi utilisé par l'ethernet shield il me semble ?

il n'y a pas que la 53 ?

trigger:
il n'y a pas que la 53 ?

Cf : SPI - Arduino Reference

On the Arduino Mega, this is 50 (MISO), 51 (MOSI), 52 (SCK), and 53 (SS).

Donc il semblerai qu'il y est bien conflit entre les deux derniers relay et l'ethernet shield, et vu que c'est MISO et SCK ça pourrait ben être la cause des bugs.

Ensuite je vois un autre conflit entre les deux servo et les relay 4 et 5.

C'est encore moi :slight_smile:

Bon, grâce à toutes vos remarques j'ai fais quelques modifs :

  • Arduino Mega
  • Shield Ethernet officiel
  • clavier matriciel : 2,3,4,5,6,7,8,9
  • écran LCD : 22,24,26,28,30,32
  • 7 relais : 36,38,40,42,44,46,48
  • 2 servos : 34,36
  • LM35 : A15

Et mon problème est toujours le même ... je laisse un bout de mon code au cas ou quelqu'un aurait une petite idée.

// --- Inclusion des librairies ---
#include <SPI.h>
#include <Servo.h>
#include <math.h>

// --- librairies utilisées pour le module Ethernet  ---
#include <Server.h>
#include <Client.h>
#include <Ethernet.h>
#include <EthernetDHCP.h>

// --- librairie pour le LCD  ---
#include <LiquidCrystal.h>

// --- librairie pour stockage en mémoire flash programme  ---
#include <Flash.h> 

// --- librairies utilisées pour clavier matriciel  ---
#include <Keypad.h> // inclusion de la librairie

// --- constantes des broches ---
const int L4=9; //declaration constante de broche 
const int L3=8; //declaration constante de broche 
const int L2=7; //declaration constante de broche 
const int L1=6; //declaration constante de broche

const int C4=5; //declaration constante de broche 
const int C3=4; //declaration constante de broche 
const int C2=3; //declaration constante de broche 
const int C1=2; //declaration constante de broche

const int var=1;

int compt=0;
 
//--- Constantes utilisées avec le clavier 4x4 ---
const byte LIGNES = 4; // 4 lignes
const byte COLONNES = 4; //4 colonnes

char touches[LIGNES][COLONNES] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}};
  
//--- tableaux de lignes et colonnes ---
byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier
byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier
char touche; // variable de stockage valeur touche appuyée
Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );

char attempt[6]={0,0,0,0,0,0}; // used for comparison
int z=0;

// --- Déclaration des constantes des broches E/S numériques ---
const int RETRO=34;
const int SERVO=35;
const char* ip_to_str(const uint8_t*);
const int INTER[7]={36,38,40,42,44,46,48}; // Constante pour les broches

//--- Adresse mac de la shield Ethernet ----
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4D, 0x7F };

//--- création de l'objet serveur ----
Server serveurHTTP(80); //port 80 = port HTTP

//--- Const pour Afficheur LCD 16x2 ----
const int RS=32;
const int E=30;

const int D4=28;
const int D5=26;
const int D6=24;
const int D7=22;

//--- Initialisation LCD en mode 4 bits ----
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);

//--- crée un objet servo pour contrôler le servomoteur ----
Servo mon_servo;

//*******************************************\\
//*******************************************\\
//----- Definition du log/pass -------
String LOG = "******";
String PASS = "*****";
char PIN[6]={'1','2','3','4','5','6'};
//*******************************************
//*******************************************

//----- variables globales utiles  -------
int placeEgal=0;
int placeBlanc=0;
int placeConcat=0;
int comptChar=0; // variable de comptage des caractères reçus
int angle_servo=0;
int servoPosition_int=0;
int tempPin =15;
int page=0;

float temperature; // floatant pour affichage a virgule de la temp

String maChaine="";
String chaine1="";
String chaine2="";
String maChaineConcat="";
String maChaine1Corrige ="";
String maChaine2Corrige ="";
String chaineRecue=""; // déclare un string vide global
String login="";
String password="";
String servoPosition="90";
String ip_str; // utilisé pour afficher l'adresse ip dans l'url

//------ tableau de String ---- 
// variables globales de mémorisation de l'état d'une case à cocher "" ou "checked"
String etatCase[7]={ "","","","","","",""};

//**************** FONCTION SETUP = Code d'initialisation *************************
// ********************************************************************************
// ********************************************************************************
void setup()   { // debut de la fonction setup()

//---- initialise connexion série à 115200 bauds  -----------------  
Serial.begin(115200);

//---- initialise la connexion avec l'adresse MAC, l'adresse IP et le masque  -----------------  
EthernetDHCP.begin(mac);
  const byte* ipAddr = EthernetDHCP.ipAddress();
  const byte* gatewayAddr = EthernetDHCP.gatewayIpAddress();
  const byte* dnsAddr = EthernetDHCP.dnsIpAddress();
//byte gatewayAddr[] = { 192,168,1,254 }; // utilisé quand ip fixe
//byte dnsAddr[] = { 255, 255, 255, 0 }; // utilisé quand ip fixe
  ip_str = ip_to_str(ipAddr); // conversion en string pour l'injecter dans l'url
  
// ------------------ initialise le serveur HTTP -----------------  
serveurHTTP.begin();

// ------------------ Broches en sorties numériques -----------------  
  for (int i=0; i<=6; i++) {
     pinMode (INTER[i],OUTPUT); // Broche INTER configurée en sortie
  }
mon_servo.attach(SERVO); 
pinMode(SERVO, OUTPUT); //met la broche en sortie
pinMode(RETRO, OUTPUT); //met la broche en sortie

// --------------------- Initialise afficheur LCD --------------------  
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
delay(10); // pause rapide pour laisser temps initialisation
lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran

// ---------------- fonction de recuperation de l'ip ------------------
EthernetDHCP.maintain();
  digitalWrite(RETRO, HIGH);
  delay(10);
  lcd.print("Adresse IP : "); // affcihe chaine txt
  lcd.setCursor(0, 1); // deplace le curseur en ligne 2
  lcd.print(ip_to_str(ipAddr)); // affiche l'ip
  delay(2000); // pause de 2sec pour la lecture
  lcd.clear(); // on efface l'écran pour afficher la suite
  
  lcd.print("Passerelle : "); // idem pour la passerelle
  lcd.setCursor(0, 1);
  lcd.print(ip_to_str(gatewayAddr));
  delay(2000);
  lcd.clear();
  
  lcd.print("Adresse DNS : "); // idem pour le dns
  lcd.setCursor(0, 1);
  lcd.print(ip_to_str(dnsAddr));
  delay(2000);
  lcd.clear();
  
  digitalWrite(RETRO, LOW); // arret du retro eclairage
} // fin de la fonction setup()
// ********************************************************************************
// ********************************************************************************
// ********************************************************************************

//*************** FONCTION de l'adressage IP *************
const char* ip_to_str(const uint8_t* ipAddr)
{
  static char buf[16];
  sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
  return buf;
}
// ********************************************************************************
// ********************************************************************************
void correctPIN() // faire si le pin est ok
{
  lcd.print("* Correct PIN *");
  delay(1000);
  lcd.clear();
  lcd.print("  Entrer PIN...");
  delay(100);
}

void incorrectPIN() // faire si le code est incorrect
{
  lcd.print(" * Try again *");
  delay(1000);
  lcd.clear();
  lcd.print("  Entrer PIN...");
  delay(100);
}

void checkPIN()
{
  int correct=0;
  for (int q=0; q<6; q++)
  {
    if (attempt[q]==PIN[q]) // on compare la saisie avec le code
    {
      correct++;
    }
  }
  if (correct==6) // si les 6 sont correctes
  {
    correctPIN();
  } else
  {
    incorrectPIN();
  }
  for (int zz=0; zz<6; zz++) // on vide
  {
    attempt[zz]=0;
  }
 delay(100);
}

void readKeypad()
{
  char touche = clavier.getKey();
  if (touche != NO_KEY)
  {
    switch(touche)
    {
    case '*':
      z=0;
      break;
    case '#':
      delay(100); // for extra debounce
      lcd.clear();
      checkPIN();
      break;
    default:
      attempt[z]=touche;
      z++;
    }
  }
}

Encore merci pour vos réponses :slight_smile:
Amicalement,
Trigger