Problème Plantage arduino nano

Bonjour,
Je débute dans l'électronique et l'Arduino.
Je vais vous présenter mon projet et mes problèmes en espérant que quelqu'un puisse m'aider.
Projet :
-Création d'un "automate" pour un tableau électrique.
Cahier des charges :
-Récupérer l'information quand un disjoncteur tombe.
-Récupérer l'information quand un arrêt d'urgence est appuyé.
-Afficher les informations précédentes sur écran pour identifier plus vite le problèmes.
-Créer un voyant lumineux clignotant quand il y'a un défaut.
Explication :
J'utilise un Arduino UNO (non officiel) pour faire mes tests, je récupère mes infos d'ARU(Arret urgence), de disjonction avec des boutons sur une Bread board, j'incorpore dans le projet un
Ecran LCD I2C 20/04, une sonde de température DS18B20, une horloge RTC DS3231, et un relais 5V.Une fois tout ça branché tout fonctionne parfaitement. Le relais me sert pour faire clignoter un voyant 220v. Je met tout ça sur une prise secteur pour tester tout les composant sur le long terme, tout ce passe parfaitement bien. Je réalise un schéma sur EASYEDA pour ensuite faire fabriquer un PCB. Pour le PCB je passe sur un Arduino nano (non officiel) pour gagner en place.

Une fois les composants soudé je met tout ça sur une prise et je laisse tourner 1 semaine de plus. Apres tout mes tests je met mon PCB dans le Coffret électrique (coffret métal) avec l'écran LCD en façade. Je simule mes défauts (ARU, Disjonctions), et la tout ce met a déconné l'écran se met a s'effacé au bout de quelque secondes ca revient et ça tourne en boucle comme ça. Si j'enlève le défaut tout devient normal ou des fois ca me fais planter l'Arduino et plus rien ne se produits en interaction avec l'Arduino.
Essai :
J'ai essayé de :
-refaire le PCB avec un COPPER AREA en prenant le GND.
-mettre le PCB et l'écran dans une boite plastique a fin de les isolés des perturbations électriques.

Si vous avez des réponses a mon problèmes je vous en remercie.
Si vous avez des questions pour mieux comprendre n'hésité pas.
Voici le code :

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS3231.h>

DS3231 rtc (SDA,SCL);

#define Temp A0
OneWire oneWire(Temp);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27,20,4);

unsigned long timer;
unsigned long Timer1;
int SEC = 0;
bool ledState = false;

const int no1 = 2;
const int no2 = 4;

int State1;
int State2;

const int km = 13;

void setup() {  
  Wire.begin();
  rtc.begin();
 
  lcd.init(); 
  lcd.backlight();
  lcd.clear();
  
  pinMode(no1, INPUT_PULLUP);
  pinMode(no2, INPUT_PULLUP);
  pinMode(no3, INPUT_PULLUP);
  pinMode(no4, INPUT_PULLUP);
  pinMode(km, OUTPUT);
  
  //rtc.setDOW(SUNDAY);          // Set Day-of-Week to SUNDAY
  //rtc.setTime(18, 48, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(05, 02, 2023);   // Set the date to January 1st, 2014
  
  timer = millis(); 
  delay(10);
}

void loop() {
  
  //HEURE
  lcd.setCursor(0,0);
  lcd.print("------");
  lcd.print(rtc.getTimeStr());
  lcd.print("------"); 
  ///////////////////////////////////////////////////////////////////////
  
  //TEMPERATURE
  /*sensors.requestTemperatures();
  int Temp = sensors.getTempCByIndex(0);
  lcd.setCursor(0,3);
  lcd.print("------Temp:");
  lcd.print(Temp);
  lcd.print("c------");*/
  ///////////////////////////////////////////////////////////////////////

  // DEFAUT
  State1 = digitalRead(no1); // ARRET URGENCE
  State2 = digitalRead(no2); // INTERRUPTEUR DIFFERENTIEL
  
    if(State1 == HIGH){
    lcd.setCursor(0,2);
    lcd.print("Defaut ARRET URGENCE !"); 
    Delay();
  }else{
    lcd.setCursor(0,2);
    lcd.print("                    "); 
    digitalWrite(km,LOW);
  }
  if(State2 == LOW{
    lcd.setCursor(0,1);
    lcd.print("Defaut Disjonction !"); 
    Delay();
  }else{
    lcd.setCursor(0,1);
    lcd.print("                    "); 
    digitalWrite(km,LOW);
  }
  /////////////////////////////////////////////////////////////////////////
  
  //RESET
     if (millis() - timer > 995) {
      timer = millis();
      SEC = SEC + 1;
     if (SEC > 1800) { 
      SEC = 0; 
      asm volatile("jmp 0x00");
      lcd.clear();      
      timer = 0;
      Timer1 = 0;
     }
   }
  /////////////////////////////////////////////////////////////////////////
}
void Delay(){
     if (millis() - Timer1 > 750) {
      ledState=!ledState; // changer l'état de la LED
      digitalWrite(km, ledState);
      Timer1 = millis();
   }
}

Salut.

Ce relais 5V a une résistance de bobine de 69Ω et consomme 73mA.
Un ARDUINO, peu importe le modèle, est incapable de fournir la moitié de ce courant.
A moins que tu aies fait tes premiers essais avec un module relais et non un relais nu, je ne vois pas comment cela peut avoir fonctionné.
De plus il manque la diode de roue libre.

On ne comprend pas très bien comment les informations défauts sont récupérées par l'Arduino.
On ne pilote pas une charge inductive directement par un I/O du µC.

oui pour mes test j'ai utilisé un module relais et j'ai ensuite utilisé un relais nu sur mon pcb.
je récupère mes défauts avec des fils directement souder sur l'Arduino .
Merci de ces premières pistes.

Il faut ajouter un transistor pour fournir le courant nécessaire à la commutation du relais.
Si tu déconnectes ton relais, tout fonctionne comme prévu? Tu peux connecter une LED à la place du relais pour t'assurer que l'alarme est bien remontée.

Je m'en doutais.
Il faut ajouter un transistor et une diode de roue libre :

si je remplace le relais tout fonctionne nickel, mais je vais enlevé ce relais et mettre une led déporté comme ça je n'aurai plus de problème. merci de vos réponses :smile:
es ce que le faits que je n'ai pas de resistance de pull up sur mes entées peut me crée des plantages aussi ?

Elles sont bien présentes, dans le code.

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