Probleme de PIN avec mega 2560

Bonjour , dans mon code , si je definis une pin sur le 1 , je connecte mon relais sur la sortie 45 et cela fonctionne :nauseated_face:

J ' aimerais bien que ce lorsque je choisis un pin a activer , ce soit le relais correspondant qui soit activé .

je n' arrive pas a trouver le probleme :hot_face: et je ne comprends pas d ' ou ca vient , je n' ose pas poster le code , car il est long et pas tout a fait au point , ya plein de commentaire et c ' est devenu la galere a debugger , surtout que ca fait un petit moment que je n ' y ai pas remis le nez dedans ...

hello, tu n'es pas clair
si tu mets la pin 45 en sortie et que tu la mets à HIGH, le relais branché sur la pin 45 est activé.
jusque là, tout va bien.
ensuite tu sembles ne pas pouvoir reproduire la meme chose sur d'autres pins...

postes ton code, ce sera plus facile

Salut , je poste le dossier zip .

j ' ai commenté dans la loop , tout ce qui ne sert pas pour le probleme actuel ...

lorsque j' active la fonction actualiserRTC , cela se met a fonctionner ca a peut etre un rapport , je ne sais plus trop ...

j ' expere qu ' un regard neuf pourra m ' aider a depatouiller tout ca .
serveur_machine_etats.7.317.zip (19.1 KB)

ce fameux relais est defini a la ligne 142 ou 132 du fichier serveur machine etat 7.317 .

il est ensuite utilisé dans la fonction relaisheurecreuse du fichier relaisfonction.ino

:thinking:ouch, c'est copieux.
c'est pour la mega qui fait le wifi?

Bonjour dfgh oui , pour ca que je ne voulais pas vous decourager avec le code .

non , pas de wifi , c ' est un shield ethernet W550 dessus avec un DS 1307 . le DS1307 utilise le pin 20 et 21 .

je penche plus pour l' utilisation d ' une pin utilisé dans le code qui ne devrait pas car reservé a un device le shiel ou l' horloge , sauf que meme si c' etait effectivement le cas , je ne vois pas comment mon relais relié au pin 45 pourrait s ' enclencher a travers la commande du pin 1 et quand je pilote dans le code le pin 45 , rien ne se passe ...

Bon j ' ai fait un code plus simple :

#include <SPI.h>
#include <Ethernet2.h>
#include <EthernetUdp2.h>
#include <Wire.h>
#include "AsyncTask.h"
#include "simpleRTC.h"
/*************************************/

// Pour avoir un mode debug de notre programme
#define DEBUG true              // à mettre à false si on ne veut pas de debug
#define DEBUGSTREAM Serial

#if DEBUG
	#define DEBUG_PRINT(...)    DEBUGSTREAM.print(__VA_ARGS__)
	#define DEBUG_PRINTLN(...)  DEBUGSTREAM.println(__VA_ARGS__)
	#else
	#define DEBUG_PRINT(...)
	#define DEBUG_PRINTLN(...)
#endif

// POUR essayer en mode securisé : MODE TEST = 1 desactive les digitalWrite sur pin
const bool TEST = 0;


const unsigned int // pour les heures creuses
HC_START_TIME_N = 1*60 + 30, // 1 H 30 min
HC_END_TIME_N = 8*60 + 55, // 7 H 30 min
HC_START_TIME_D = 12*60, // 12 h 00 min
HC_END_TIME_D = 14*60; // 14 h 00 min

const unsigned long TIMER_A = 7200000UL, TIMER_P = 120000UL, TIMER_V = 30000UL; // 2 heures , 2 minutes et 30 sec.
/*************************************/

/*** pins definitions ***/
const uint8_t
BROCHE_ONEWIRE = 2,
SDCARD_PIN = 4,
RELAY_START_PIN = 44,
RHC_PIN_RELAY= 1;  // devrait etre 45 normalement ...


////*   Relais    *////
#define RELAIS_ACTIF LOW
#define RELAIS_INACTIF HIGH
uint8_t tableau_Pin_Relais [RHC_PIN_RELAY]; // numeros de pins
bool tableau_Etat_Relais [RHC_PIN_RELAY]; // etat des pins

/****************************************************************************************************************/
/****************************************************************************************************************/
void actualiserRTC () {
	static uint32_t ref = 0;
	if (millis() - ref >= 1000) {
		ref += 1000;
		RTC.actualiser();
	}
}

// return true if time is between limits
int timeTest() {
	unsigned int timestamp = RTC.heure()*60 + RTC.minute();
	bool boool=0;
	if ( (timestamp > HC_START_TIME_N && timestamp < HC_END_TIME_N) || (timestamp > HC_START_TIME_D && timestamp < HC_END_TIME_D) )  boool=1;
	if (DEBUG) {
			Serial.print (F("timestamp = "));
			Serial.print (timestamp);
			Serial.print (F(" , retour fonction = boool : "));
			Serial.println (boool);
		}

	return boool;
}

void reInitRelais_A (t_commandID pin) {
	if (!tableau_Etat_Relais[pin]) {
		tableau_Etat_Relais[pin] = RELAIS_INACTIF; // commande a off
		digitalWrite(tableau_Pin_Relais[pin], tableau_Etat_Relais[pin]); // relais off
		if (DEBUG) {
			Serial.print (F("reInitRelais_A => Relais numero "));
			Serial.print (pin);
			Serial.println (F(" desactive"));
		}
	}
}

void activeRelais_A (uint8_t pin) {
	if (tableau_Etat_Relais[pin]) {
		tableau_Etat_Relais [pin] = RELAIS_ACTIF; //on prend en compte le nouvel état du relais
		if (!TEST) digitalWrite (tableau_Pin_Relais[pin] , tableau_Etat_Relais[pin]); //on effectue la mise à jour du pin
		if (DEBUG) {
			Serial.print (F("activeRelais_A => numero "));
			Serial.print (pin);
			Serial.println (F(" active"));
		}
	}
}

void reInitRelais (uint8_t pin) {
	reInitRelais_A(pin); // changer etat  + changer digitalwrite
	//desactivResetTimer(pin); // verifier si tache existe => oui supprimer
}

void initRelaisTable (uint8_t RHC_PIN_RELAY) { // on initialise tous les pins de relais
	for (uint8_t i = 0; i < RHC_PIN_RELAY; i++) {
		tableau_Pin_Relais [i] = (i + RELAY_START_PIN); // initialisation variable tableau de pin pour les Relais .
		pinMode (tableau_Pin_Relais [i], OUTPUT); //pin en mode OUTPUT
		reInitRelais(i); // on passe les relais en OFF , remplissage du tableau + affichage de base a off
	}
}

void relaisHeureCreuse () { // RHC_PIN_RELAY45
	static unsigned long chrono = 0;
	unsigned int timestamp = RTC.heure()*60 + RTC.minute();
	static int RHC = -1; // jamais lu
	bool boool=0;
	//static bool oldRHC = false;
// heures creuses de 1 h 30 a 7 H 30 et de 12 a 14 Heures
	if ( (RHC == -1) || (millis() - chrono >= TIMER_V) ) { // si jamais lue ou lue depuis plus de 30 secondes
		if (DEBUG && RHC == -1 ) {
			Serial.print (F("relaisHeureCreuse => initialisation sur PIN : "));
			Serial.print (RHC_PIN_RELAY);
			Serial.print (F(" , etat : "));
			Serial.println (tableau_Etat_Relais[RHC_PIN_RELAY]);
		}

		// si l' heure est plus grande que 1 heure et 30 minutes et que l' heure est plus petite que 7 heures et 30 minutes : on active le relais .
		if ( (timestamp > HC_START_TIME_N && timestamp < HC_END_TIME_N) || (timestamp > HC_START_TIME_D && timestamp < HC_END_TIME_D) ) { // si on est dans le bon crenau horraire
			boool=1;
			// si l' ectat actuel du relais est le meme que maintenant : actif , alors on ne fait rien .
			//sinon , on echange le realis d' etat .
			if (tableau_Etat_Relais[RHC_PIN_RELAY] == RELAIS_INACTIF) {
			  activeRelais_A(RHC_PIN_RELAY);
			  RHC = 1;
			  if (DEBUG) Serial.println (F("relaisHeureCreuse => etat actif"));
			}
		}
		else {
			if (tableau_Etat_Relais[RHC_PIN_RELAY] == RELAIS_INACTIF) {
				reInitRelais_A(RHC_PIN_RELAY);
				RHC = 0;
				if (DEBUG) Serial.println (F("relaisHeureCreuse => etat passif"));
			}
		}
		
    if (DEBUG) {
		Serial.print (F("timestamp = "));
		Serial.print (timestamp);
		Serial.print (F(" , retour etat creneau horaire : "));
		Serial.println (boool);
		Serial.print (F("relaisHeureCreuse => etat final : "));
		Serial.println (tableau_Etat_Relais[RHC_PIN_RELAY] == RELAIS_ACTIF ? F("Activé") : F("Desactivé"));
	}
		chrono = millis();
	}
}


/****************************************************************************************************************/
/****************************************************************************************************************/
void setup() {

	initRelaisTable (RHC_PIN_RELAY);
	Wire.begin();

	if (DEBUG) {
		Serial.begin(115200);
	}
}


void loop() {
	actualiserRTC ();
	relaisHeureCreuse ();
}

mon relais est connecté le VIN sur le pin 45 du mega .
il est defini dans le code sur le relais 1 et là ca fonctionne ...

si j' utilise le

RHC_PIN_RELAY=45

ca ne fonctionne pas , et j' aimerais bien comprendre pourquoi .

En esperant que ca soit plus clair maintenant .

/**************************************/
Je pense que finalement j' ai trouve , c' est a cause de :

void initRelaisTable (uint8_t RHC_PIN_RELAY) { // on initialise tous les pins de relais
	for (uint8_t i = 0; i < RHC_PIN_RELAY; i++) {
		tableau_Pin_Relais [i] = (i + RELAY_START_PIN); // initialisation variable tableau de pin pour les Relais .
		pinMode (tableau_Pin_Relais [i], OUTPUT); //pin en mode OUTPUT
		reInitRelais(i); // on passe les relais en OFF , remplissage du tableau + affichage de base a off
	}
}

Si c' est bien cela , du coup autre question : pourquoi est ce que ca m' affiche le pin etant comme le numero 1 au lieu du 45 dans mon mode debug ?

Regarde ce qui se passe pour le numéro de pin que tu mets dans le tableau suivant la valeur de RHC_PIN_RELAY que tu passes en argument.

Tu ferais bien aussi de regarder s'il n'y a pas des mélanges entre numéro de pin et numéro de relais. Ton code de ce coté là ne me semble pas clair.

Tout a fait , c' est pas clair du tout comme truc , il faudrait que je reprenne cette partie là , mais ca va engendrer d ' autre changement suplementaire , y a du boulot pour que ca devienne clair . car cette fonctione gere plusieurs pin relais ...

mais ce manque de clarté a engendre plusieurs autres petits bug dans le code , , faut que je m' y remette serieusement :yawning_face:

Bonjour , bon malgré plusieurs corrections de code , j ' observe toujours le probleme principal .
les PINS fonctionnent correctement , mais la connexion au reseau est systematiquement perdue au bout de quelques heures .

Mon montage comprend :

  1. un mega2560
  2. un DS1307
  3. un shield ethernet W5500
  4. une chiée de relais .

je sais que le DS1307 utilise les pins 20 et 21 .

mais je ne sais pas quel PINS sont utilisés par le W5500 , qui lui est enfiché directement dessus le mega ...

Autre chose , au niveau de la configuration , dans le code je vois ce commentaire :

Arduino communicates with both the Ethernet Shield and SD card using the SPI bus
	This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega.
	Pin 10 is used to select the Ethernet chip and pin 4 for the SD card.
	These pins cannot be used for general I/O.
	On the Mega, the hardware SS pin, 53, is not used to select either the Ethernet chip or the SD card,
	but it must be kept as an output or the SPI interface won't work.
	Note that because the Ethernet chip and SD card share the SPI bus, only one at a time can be active.
	If you are using both peripherals in your program, this should be taken care of by the corresponding libraries.
	If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it.
	To do this with the SD card, set pin 4 as an output and write a high to it.
	For the Ethernet chip, set digital pin 10 as a high output.

Du coup , est ce que je dois passer le pin 4 et le 53 en mode OUPUT et en etat HIGH a l' initialisation du programme , j' avoue que là je suis un peu largué :nauseated_face:

Pour info , voici les pins qui sont utilisés dans mon programme si ca peut etre utile :

  // 22 => 29 : ouvertures volets 
  // 30 => 37 fermetures volets
  // 38 => 43 arrosages
  // 44 => Portail
  // 45 => Relais Heures Creuses
  // 46
  // 47
  // 48 Alim Capteur Pluie
  // 49 Alim Capteur humidité
  // A0 Capteur Pluie
  // A1 Capteur Humidité

Bonjour , j' ai trouve le manuel pour le W5500 , ya+ka

Suite a la lecture de la datasheet , j ' ai pas vraiment trouvé quelquechose de concluant .

je vais essayer d ' aller voir les exemples pour ce shield en esperant touver ce dont j' ai besoin .

Salut.
Comme indiqué dans la doc de la librairie Ethernet2 :

This library is no longer going to be used, since the official Arduino library has been updated and works great GitHub - arduino-libraries/Ethernet: Ethernet Library for Arduino

Salut henri .

il faudrait " simplement que j' utilises alors

#include <Ethernet.h>

a la place de

#include <Ethernet2.h>

ca serait trop beau et trop simple .

les methodes sont identiques dans les 2 Biblio ? cela m' etonnerait , je vais tester de ce pas .

EDIT : en fait si :grin:

Par contre IDE2 , buggue en utilisant save as , on peut plus modifier le code ( lecture seule pour le document en 755 ...)
je viens d' installer IDE 2.01 , et là je ne peux plus compiler sans avoir relié la carte a l ' ordi :hot_face:
enfin c ' est ce que l' IDE dit , pourtant la carte mega est bien reliée via le cable USB .

755 veut dire que le propriétaire a le droit de lire et écrire.

Tu es certain qu'il n'y a pas autre chose?
Je n'ai aucun problème pour compiler sans carte connectée.

oui , voilà les permissions exactes :

iznobe@iznobe-PC:~$ ls -la /home/iznobe/Scripts/Arduino/SKETCH/SERVEUR_machine_etats.TEST.BIBLIO.ethernet
total 84
drwxrwxr-x  2 iznobe iznobe  4096 oct.  28 08:54 .
drwxr-xr-- 19 iznobe iznobe  4096 oct.  28 08:54 ..
-rw-rw-r--  1 iznobe iznobe  7417 oct.  28 08:59 arrosage_fonctions.ino
-rw-rw-r--  1 iznobe iznobe  1624 oct.  28 08:59 capteurs.ino
-rw-rw-r--  1 iznobe iznobe  1836 oct.  28 08:59 initialisations_fonctions.ino
-rw-rw-r--  1 iznobe iznobe 12487 oct.  28 08:59 page_web.ino
-rw-rw-r--  1 iznobe iznobe  5578 oct.  28 08:59 relais_fonctions.ino
-rw-rw-r--  1 iznobe iznobe 10178 oct.  28 08:59 SERVEUR_machine_etats.TEST.BIBLIO.ethernet.ino
-rw-rw-r--  1 iznobe iznobe 10583 oct.  28 08:59 serveurs.ino
-rw-rw-r--  1 iznobe iznobe  3567 oct.  28 08:59 timers_rtc.ino
-rw-rw-r--  1 iznobe iznobe  6074 oct.  28 08:59 volets_fonctions.ino
iznobe@iznobe-PC:~$ 

la carte est bien connectée , c' est ca le pire .

la je viens de deconnceter la carte , je reessaie .

bon ben maintenant cela fonctionne , carte connectée , bizarre .

/***********************************************/
Sinon , je vais tester si cela ne me perds pas la connexion au bout d' un certain temps apres le changement de biblio .

Qu ' est ce qui pourrait faire perdre la connexion sinon a part les pins reservés a l' usage du shield par autre chose ?

d' ailleurs savez vous quel PINs sont utilisés par le shield ? dans un des examples j ' ai vu 10 , 11 , 12 , 13 .

Comment etre sur que c' est aussi le cas pour moi ?

je viens de televerser le code dans le mega : la connexion internet ne s' est meme pas faite du tout .
je n' ai pourtant pas changer le code , je comprends pas vraiment ce qui se passe ...
le seul truc que j' ai changé , c' est la biblio :
j' ai transformer de la sorte :

#include <SPI.h>
#include <Ethernet.h>
//#include <EthernetUdp2.h>
#include <Wire.h>
#include "AsyncTask.h"
#include "simpleRTC.h"

et depuis plus d' acces au net :hot_face:

Commence déjà par essayer un exemple :

Bonne idée , effectivement .
l' exemple ne fonctionne pas , impossible de se conneceter a l' adresse : 192.168.1.177

L'exemple ne se connecte à aucune adresse, c'est un serveur.
Pour qu'il fonctionne il faut que l'adresse IP de ta box commence par 192.168.1
Sinon, tu peux passer par DHCP.
Qu'est ce que l'exemple affiche sur le terminal ?
En particulier l'adresse IP :

  Serial.println(Ethernet.localIP());

ba un serveur , c ' est bien fait pour envoyer une page a un client qui s' y connecte non ?
dans le code :

IPAddress ip(192, 168, 1, 177);

j ' ai vu quelquepart dans l' exemple que ca affichait la liste des pins , mais je trouve plus mais pas important .

Dans le terminal j ' obtiens :

ethernet web server example .
ethernet shield was not found . sorry can't run without hardware 

ha failli oublié , mon routeur a pour IP 192.168.1.1 et mon ordi 192.168.1.2 .

il faut peut etre modifié les pins utilisés par le SHIELD , sauf que je ne connais meme pas ceux qui servent actuellement .

EDIT : en fait c' est ecrit dans les 1eres lignes , je suis pas doué ...

Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino WIZnet Ethernet shield.

en se connectant donc a l' adresse ip dans le code , on devrait logiquement voir les valeurs des pins analogiques .
si tant est qu ' on se trouve bien dans le meme sous reseau local et qu ' on ait donc accés au serveur , et que celui-ci fonctionne . je suis bien dans le meme reseau local , mais no hardware detected :worried: