Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jeedouino avec arduino+Expander PCF8574 en I2C #15

Closed
mytika opened this issue May 9, 2020 · 7 comments
Closed

Jeedouino avec arduino+Expander PCF8574 en I2C #15

mytika opened this issue May 9, 2020 · 7 comments

Comments

@mytika
Copy link

mytika commented May 9, 2020

Bonjour,
Désolé de vous importuner ,
Je souhaiterais si vous pouvez m'apporter des réponses à propos de Jeeduino,
J'ai raccordé en I2C un arduino Uno + 4 interfaces avec un PCF8574 dont 2 interfaces en entrées et 2 en sorties / relais, donc 16 entrées et 16 sorties relais.
J'ai suivi les instructions dans le fichier sketch à injecter dans l'arduino que j'ai décortiquer ci-dessous :
On a l'instruction #define UserSketch 1

  • Dans la section // UserVars , j'ai mis :

    #include "PCF8574.h"
    #include <Wire.h>

    PCF8574 PCF_20(0x20); // Carte 8 Entrées Optocouplées
    PCF8574 PCF_21(0x21); // Carte 8 Entrées Optocouplées
    PCF8574 PCF_38(0x38); // Carte 8 Sorties Relais
    PCF8574 PCF_39(0x39); // Carte 8 Sorties Relais

  • Dans la section // UserSetup , j'ai mis :
    PCF_20.begin(); // TT
    PCF_21.begin(); // TT
    PCF_38.begin(); // TT
    PCF_39.begin(); // TT

  • Et dans la section // UserLoop, j'ai mis 👍
    void UserLoop()
    {
    uint8_t input_pcf20 = PCF_20.read8();
    uint8_t i = 0;
    while (i < 8) {
    jeedom += '&';
    jeedom += (500 + i);
    jeedom += '=';
    if (input_pcf20 & ( 1 << i ))
    {
    jeedom += '1';
    }
    else
    {
    jeedom += '0';
    }
    i++;
    }

Et voilà pour le code, j'ai programmé aussi 1 entrée et 1 sortie sur l'arduino lui-même afin d'être sûr que l'arduino fonctionne, çà marche.
Bien sur dans Pins utilisateurs, j'ai créé aussi mes entrées de 500-516 / sorties de 517 à 531.
Et bien çà ne fonctionne pas en testant les 8 premières entrées.
Voilà si vous pouvez m'orienter svp.
Merci d'avance
Bien cordialement
Thierry

@revlysJ
Copy link
Owner

revlysJ commented May 9, 2020

Bonjour,

Pour ce genre de questions, je pense que le forum est plus adapté.

Sinon, vous ne précisez pas mais votre arduino est connecté en usb ou en ethernet ?
Si en ethernet, quelle modèle de carte réseau ?
Un uno possède peu de mémoire, et suivant les lib chargées, il se peut que cela ne fonctionne pas même si il n'y a pas d'erreur au téléversement.

Coté code, dans userloop(), j'aurais plutôt mis (pour une meilleure lisibilité):

uint8_t input_pcf20 = PCF_20.read8();
for (int i = 0; i < 8; i++)
{
jeedom += '&';
jeedom += 500 + i;
jeedom += '=';
jeedom += (input_pcf20 >> i) & 1;
}

Par contre vérifiez bien que l'appel de userloop() se fait bien comme ceci (dans cet ordre):

#if (UserSketch == 1)
//UserLoop(); // Appel de votre loop() permanent
if (NextRefresh < millis()) UserLoop(); // Appel de votre loop() toutes les 60s
#endif
if (NextRefresh < millis())
{
NextRefresh = millis() + 60000; // Refresh auto toutes les 60s
if (RepByJeedom) // sert a verifier que jeedom a bien repondu a la demande dans Load_eeprom
{
jeedom += F("&ASK=1"); // Sinon on redemande
}
}

Ce bout de code se trouve quelques lignes avant le void userloop().

Avec ceci, vous devriez recevoir dans le log Jeedouino quelque-chose comme cela:

[2020-05-09 20:03:06][DEBUG] : CALLBACK - Requête reçue : ? BoardEQ=56&500=1&501=0&502=1&503=1&504=0&505=1&506=0&507=1

Bonne journée.

@mytika
Copy link
Author

mytika commented May 9, 2020

Bonjour,
Merci de m'avoir répondu,
j'avais déjà posté sur le forum de Jeedom https://community.jeedom.com/t/jeedom-arduino-uno-expander-gpio-pcf8574/27174 , on m'a renvoyé à la doc de Jeedouino et sur le discord de Domotech. aucune réponse.

Oui exact j'ai oublié quelques précisions, c'est un shield Ethernet ( https://www.eagle-robotics.com/accueil/18-shield-ethernet-arduino-unomega-w5100-0180201370185.html ),
Si vous me dîtes que le Uno est trop court en mémoire, je vais passer avec le Mega.
Merci encore pour vos conseils.

@mytika
Copy link
Author

mytika commented May 9, 2020

Bonjour revlysj
C'est vraiment mieux, ça marche sur toutes les entrées.
Par contre j'ai voulu faire les sorties, je n'ai pas compris les exemples

// Ens cas d'une reception d'une commande user action depuis jeedom
// c[0]='U' & c[n]='R')
//
// 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
//
// Ex:
// U5000R -> U 500 0 R = binary 0 pin 500
// U5001R -> U 500 1 R = binary 1 pin 500
// U502128R -> U 502 128 R = Slider Value 128 pin 502
// U507[Jeedom] Message|Ceci est un testR -> U 507 [Jeedom] Message | Ceci est un test R = Message pin 507

Si vous pouvez me donner une exemple pour commander mes relais.
Merci d'avance
Bien cordialement

@revlysJ
Copy link
Owner

revlysJ commented May 10, 2020

Bonjour,

Ah, je pensais que les exemples suffisaient.
Voici un bout de code pour vous aider:

// 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 >= 516 and pin_id < 524) // 8 pins sorties
{
  // JEEDOM  : Sortie Numérique (Sous-type Jeedom: défaut)
  // ARDUINO : c[] = U5000R -> U 500 0 R = binary 0 pin 500
  // ARDUINO : c[] = U5001R -> U 500 1 R = binary 1 pin 500
  if (c[4] == 0) PCF_38.digitalWrite(pin_id - 516, LOW);
  else PCF_38.digitalWrite(pin_id - 516, HIGH);
}
// exemple 2
if (pin_id >= 524 and pin_id < 532) // 8 pins sorties
{
  // JEEDOM  : Sortie Numérique (Sous-type Jeedom: curseur)
  // ARDUINO : c[] = U502128R -> U 502 128 R = Slider Value 128 pin 502
  int multiple = 1;
  int value = 0;
  for (int i = n-1; i > 3; i--)                   // récupération de la valeur du nombre
  {
    value += int(c[i]) * multiple;
    multiple *= 10;
  }
  // exemple value : 0 à 255
  if (value == 0) PCF_39.digitalWrite(pin_id - 524, LOW);
  else PCF_39.digitalWrite(pin_id - 524, HIGH);      
}

Bonne journée.

@mytika
Copy link
Author

mytika commented May 10, 2020

Bonjour revlysj
Il semble avoir un problème sur les sorties, il semble que le Jeedom n'envoie rien à l'arduino.

Capture
D'ou es-ce que cela pourrait provenir ?
Merci pour votre réponse
Bien cordialement

@revlysJ
Copy link
Owner

revlysJ commented May 11, 2020

Bonjour,

En fait c'est juste le log qui n'est pas rempli correctement, suite à une erreur de ma part.
C'est corrigé en beta.
Mais l'arduino reçoit bien les commandes du plugin.
Vous pouvez le voir dans la console série si besoin avec #define DEBUGtoSERIAL 1

Bonne journée.

@revlysJ revlysJ closed this as completed May 26, 2020
@Greenystuff
Copy link

Greenystuff commented Mar 18, 2021

Bonjour tout le monde !

Je cherche de l'aide car j'aimerais contrôler un dimmer IRF520 avec un UserAction mais je ne trouve aucun exemple pertinent pour mon cas. c'est un MOSFET qui reçoit une valeur en PWM de 0 à 255 et je n'arrive pas à le faire réagir.
Jeedom envoie bien une donnée Slider 128 au Arduino par l'USB mais le Dimmer ne réagit pas.

Voici ce que j'ai fait dans mon UserAction :

`
UserVars
int fan = 6;

void UserSetup()
{
// Votre setup()
pinMode(6, OUTPUT);
analogWrite(6,0);
}

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

if (pin_id >= 524 and pin_id < 532) // 8 pins sorties
{
// JEEDOM : Sortie Numérique (Sous-type Jeedom: curseur)
// ARDUINO : c[] = U502128R -> U 502 128 R = Slider Value 128 pin 502
int multiple = 1;
int value = 0;

for (int i = n-1; i > 3; i--) // récupération de la valeur du nombre
{
value += int(c[i]) * multiple;
multiple *= 10;
}

    analogWrite(fan, value);

}
}
`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants