Probleme de config Jeedouino / carte arduino : il y a t'il des sorties PIN a ne pas utiliser?

Euh,; je precise aussi que j’ai mis en commentaire temporairement le reset auto de mon dev. pour ensuite creer un front descendant… Car pour le moment, je me concentre sur la communication dans le sens Jeedom vers Arduino :

j’ai une question : quand je fais une recherche dans mon code arduino sur UserPins, je ne trouve pas l’endroit où elles sont actualisées ? il doit manquer quelquechose…

En fait, je les ai déclaré comme ceci :

test_user_pin_510_essai_3

Mais il y a une chose que je n’ai pas trouvé à travers le forum (ou pas compris), à quelle moment ces bytes sont actualisé ? vu que dans le code arduino, personne n’y touche, je pense qu’il manque une zone mais je ne trouve pas cela en parcourant le forum…

Merci pour votre Eclairage

A+

DOM

Je pense que ce sont ces lignes là dans UserAction, mais il y a peut etre une erreur :

void UserAction()
	{
    int i;

    // c[1] = c[1]-'0';  ==5 (user pin start at 500)
    // c[2] = c[2]-'0';
    // c[3] = c[3]-'0';
    // pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]);   // pin action number
    //
    // c[4] to c[n-1]   // pin action value
    //
    for (int i = 1; i < n; i++)
    {
      if ( isDigit(c[i]) ) 
        c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
    }
    pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // Numero de pin: 500 et +

    // exemple 1
    if ( pin_id >= 510 and pin_id < 518 ) // 8 pins sorties
    {
        // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
        // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
        // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
        i = pin_id - 510;

        if ( c[4] == 1 ) 
        {
          UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
          UserPins[i] = 1; // mise à 1 de la pin virtuelle
        }
    }

test_user_pin_510_essai_4

Apres relecture, je pense que mon code n’etait pas adapté pour mon test ACTION = 1 je pilote mon relais, et ACTION = 0, j’arrete de piloter mon relais :

J’ai modifie mon code arduino car le suppose que dans le « if ( c[4] == 1 ) » c’est bien le contenu de mon action

Par contre, ça ne change rien, mon relais ne se pilote tjrs pas…

Mais il y a une chose que je n’ai pas trouvé à travers le forum (ou pas compris), à quelle moment ces bytes sont actualisé ? vu que dans le code arduino, personne n’y touche, je pense qu’il manque une zone mais je ne trouve pas cela en parcourant le forum…

C’est votre code perso, c’est à vous de les actualiser…
Dans le bout de code d’exemple que je vous ai mis précédemment, ici, vous pouvez aussi faire :

// UserAction()
for (int i = 1; i < n; i++)
{
  if (isDigit(c[i])) c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
}
pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // Numero de pin: 500 et +

if (pin_id >= 510 and pin_id < 518) // 8 pins sorties
{
    // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
    // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
    // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
    i = pin_id - 510;
	if (c[4] == 1)
	{
		UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
		UserPins[i] = 1; // mise à 1 de la pin virtuelle
        digitalWrite(53, HIGH);
	}
    else
    {
       UserPins[i] = 0;
       digitalWrite(53, LOW);
    }
}
//UserLoop() 
// A mettre avant l'appel userLoop() si vous avez :
// "if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s"
// comme appel de userLoop()
for (int i = 0; i < 8; i++)
{
    if (UserTimer[i] != 0 && UserTimer[i] < millis()) // dépassement de la temporisation
	{
	    UserTimer[i] = 0; // Suppression de la temporisation
		UserPins[i] = 0; // mise à 0 de la pin virtuelle
        digitalWrite(53, LOW);
	}
}
#if (UserSketch == 1)
	void UserSetup()
	{
		// Votre setup()
        for (int i = 0; i < 8; i++) UserPins[i] = 0; // initialisation à 0 des pins virtuelles
    }
#endif

Sans oublier l’init de la pin 53 en sortie:
pinMode(53, OUTPUT);

OK, il y a un truc que j’arrive pas a comprendre : j’ai raccordé un BP sur ma pin52 pour pister, voici mon code de debug qui fonction si je mets ce code dans mon UserLoop :

// Test de mon relais avec un bouton poussoir raccordé sur la pin 52 : 
    // Si le BP est relache
    if ( digitalRead(PIN_52_BP_LAMPE) == HIGH )
      digitalWrite(PIN_53_OUT_RELAIS_LAMPE, HIGH); // Arret - Pilotage de mon relais test
    else
      digitalWrite(PIN_53_OUT_RELAIS_LAMPE, LOW); // Pilotage de mon relais test

PAr contre, si je prend ce meme code, je l’enleve bien sur de mon UserLoop, et je le coupe-colle dans mon UserAction comme ceci :

void UserAction()
	{
    int i;

    // c[1] = c[1]-'0';  ==5 (user pin start at 500)
    // c[2] = c[2]-'0';
    // c[3] = c[3]-'0';
    // pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]);   // pin action number
    //
    // c[4] to c[n-1]   // pin action value
    //
    for (int i = 1; i < n; i++)
    {
      if ( isDigit(c[i]) ) 
        c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
    }
    pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // Numero de pin: 500 et +

    // exemple 1
    if ( pin_id >= 510 and pin_id < 518 ) // 8 pins sorties
    {
        // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
        // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
        // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
        i = pin_id - 510;

        if ( c[4] == 1 ) 
        {
//          UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
          UserPins[i] = 1; // mise à 1 de la pin virtuelle
          //digitalWrite(PIN_53_OUT_RELAIS_LAMPE, LOW); // Pilotage de mon relais test

        }
        else
        {
          UserPins[i] = 0; // mise à 0 de la pin virtuelle
          //digitalWrite(PIN_53_OUT_RELAIS_LAMPE, HIGH); // Arret - Pilotage de mon relais test
        }
    }

// le 02.06.2020 a 11h10 : Par contre, si je mets cela ici, mon relais ne commute pas !

// Test de mon relais avec un bouton poussoir raccordé sur la pin 52 : 
    // Si le BP est relache
    if ( digitalRead(PIN_52_BP_LAMPE) == HIGH )
      digitalWrite(PIN_53_OUT_RELAIS_LAMPE, HIGH); // Arret - Pilotage de mon relais test
    else
      digitalWrite(PIN_53_OUT_RELAIS_LAMPE, LOW); // Pilotage de mon relais test


//    // exemple 2

Il ne se passe plus rien sur mon relais,
en gros cela me domme l’impression que le code UserAction ne serait pas executé, pourtant, j’ai bien UserSketch a 1. De plus, j’ai aussi mes info pins utilisateur de 500 à 508 qui elles focntionnent correctement, j’ai bien donc une communication dans un sens…

L’appui sur mon bouton poussoir n’a plus d’effet sur mon relais si je deplace mon code de test de mon UserLoop vers mon UserAction, je pense que on va arrivé a cerner le probleme, mais pour le moment, je suis un peu perplexe…

A bientot

DOM

Ben c’est normal.
UserAction est uniquement appelée par jeedom lors d’une commande action (par exemple le bouton tester).
UserLoop est comme son nom l’indique une boucle permanente.

Votre test pour le bp, vous le laissez dans le UserLoop.
Mais il faut aussi traiter dans le UserAction le low/high de votre pin53 si vous voulez « visualiser » votre commande depuis jeedom.

Par contre, non, je rectifi, il y a bien une communication qui essaie de passer, car si j’appuie ou non sur mon BP, quand j’envoit une action depuis jeedom, mon relais commute.

OUI, oui, je comprend, en gros c’est l’adresse 510 qui ne semble pas fonctionner d’apres ce que je comprend

Je relis le code, et j’ai une question, quand vous m’aviez indiqué ce qu’il fallait rajouter dans UserAction(), j’ai été obligé de rajouter une declaration int i; pour que mon code compile, comme ceci :

	void UserAction()
	{
//    int i;

    // c[1] = c[1]-'0';  ==5 (user pin start at 500)
    // c[2] = c[2]-'0';
    // c[3] = c[3]-'0';
    // pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]);   // pin action number
    //
    // c[4] to c[n-1]   // pin action value
    //
    for (int i = 1; i < n; i++)
    {
      if ( isDigit(c[i]) ) 
        c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
    }
    pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // Numero de pin: 500 et +

    // exemple 1
    if ( pin_id >= 510 and pin_id < 518 ) // 8 pins sorties
    {
        // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
        // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
        // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
        i = pin_id - 510;

        if ( c[4] == 1 ) 
        {
//          UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
          UserPins[i] = 1; // mise à 1 de la pin virtuelle
        }
        else
        {
          UserPins[i] = 0; // mise à 0 de la pin virtuelle
        }
    }


Si je commente ma déclaration, mon code ne compile plus,normal je pense, mais ceci va peut être nous aidé à comprendre :

En parcourant le code, j’ai vu que le membre n etait déclaré comme ceci : byte n;

Par analogie, mais j’en suio pas sur, j’ai donc rajouter byte n; comme ceci :

![byte_i_a_rajouter|263x400]
(upload://fdpJYQ78gutngnl6WMMbIyHNw9g.jpeg)

Mais le resultat est tjrs le meme.

Mais par contre du coup, la OK j’ai avancé ce matin, car je sais que Jeedom communique avec mon arduino, j’ai modifé mon UserAction pour que quand mon code arduino demande une action provenant de Jeedom, mon code mette a jour la sortie de ma pin 53, au meme titre que l’appui sur mon Bouton Poussoir de debug (pin52), et là, oui, chaque fois que j’envois une Action depuis jeedom, selon que mon BP est enclenché ou non, mon relais suis l’etat de mon BP, il me reste donc a trouver le probleme d’adressage, je pense que cela vient de mon code arduino, j’attend votre aide pour la suite.

Merci pour l’aide que vous m’avez apporté ce matin

a bientot

DOM

Ouoas , ma capture d’ecran n’a pas marché, je la remet (a propos du « Byte n »; :

Code de mon UserAction qui reçoit bien une demande d’Action, mais qui ne la diffuse par a ma variable local :

	void UserAction()
	{
//    int i;

    // c[1] = c[1]-'0';  ==5 (user pin start at 500)
    // c[2] = c[2]-'0';
    // c[3] = c[3]-'0';
    // pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]);   // pin action number
    //
    // c[4] to c[n-1]   // pin action value
    //
    for (int i = 1; i < n; i++)
    {
      if ( isDigit(c[i]) ) 
        c[i] = c[i] - '0'; // conversion simple char(ascii) vers int
    }
    pin_id = 100 * int(c[1]) + 10 * int(c[2]) + int(c[3]); // Numero de pin: 500 et +

    // exemple 1
    if ( pin_id >= 510 and pin_id < 518 ) // 8 pins sorties
    {
        // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
        // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500 -> c[4] = '0'
        // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500 -> c[4] = '1'
        i = pin_id - 510;

        if ( c[4] == 1 ) 
        {
//          UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
          UserPins[i] = 1; // mise à 1 de la pin virtuelle
        }
        else
        {
          UserPins[i] = 0; // mise à 0 de la pin virtuelle
        }
    }

    if ( UserPins[0] == 1 || (digitalRead(PIN_52_BP_LAMPE) == LOW) )
        digitalWrite(PIN_53_OUT_RELAIS_LAMPE, LOW); // Pilotage de mon relais test
    else
        digitalWrite(PIN_53_OUT_RELAIS_LAMPE, HIGH); // Arret - Pilotage de mon relais test

J’ai ecris un test OU LOGIQUE qui me permet d’activer mon relais de 2 façons : soit mon BP est actionné, soit ma pin utilisateur a comme valeur 1…

En fait, il manque juste le int devant i = pin_id - 510;

int i = pin_id - 510;

Si votre code ne marche qu’avec le bp appuyé et au moment de l’envoi de l’action depuis jeedom, alors peut-être que c[4] n’est pas a 1.
Essayez de remplacer cette partie:

        if ( c[4] == 1 ) 
        {
//          UserTimer[i] = millis() + 700; // Ajout de la temporisation de 0.7 secondes
          UserPins[i] = 1; // mise à 1 de la pin virtuelle
        }
        else
        {
          UserPins[i] = 0; // mise à 0 de la pin virtuelle
        }

par : UserPins[i] = 1 - UserPins[i];
Comme cela, à chaque commande action depuis Jeedom cela alternera la valeur de UserPins entre 1 et 0;

J’ai fais ce que vous m’avez demandé, mais c’est tjrs sans effet, en mettant 1 dans ACTION puis Tester puis 0 dans ACTION puis tester, mon relais ne commute pas… Par contre, tjrs OK, si lorsque j’appuie sur Tester et selon l’etat de mon poussoir, le relais suis le poussoir, cela me permet de valider qu’il y a bien une com. mais pas à l’adresse souhaitée je pense

En relisant le post de Mystika, en fait on a pas eu la reponse non plus de son coté si il est parvenu a effectuer la communication dans le sens Jeedom vers Arduino ?