revlysJ / jeedouino

plugin for jeedom
6 stars 9 forks source link

Jeedouino avec arduino+Expander PCF8574 en I2C #15

Closed mytika closed 4 years ago

mytika commented 4 years ago

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

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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.

Greenystuff commented 3 years ago

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);

} } `