Étape 2: Programmation - Arduino côté
Pour la partie distante de l’IR, nous allons utiliser la bibliothèque IRremote Arduino (https://github.com/shirriff/Arduino-IRremote). Cette bibliothèque peut être utilisée pour envoyer des données prédéfinies sur IR, comme le fait de LIRC. Mais nous utiliserons uniquement pour ses fonctions d’assistance (pour définir la fréquence de 38KHz pour IR et de gérer des horaires tout en envoyant des messages).
Lors de la précédente instructable nous avons constaté que nous avions besoin pour communiquer des commandes pour le conditionneur d’air envoyer une séquence de serrure, une introduction constante, la séquence de blocage encore une fois, puis la charge réelle. Bien l’Arduino peut très bien avoir l’introduction dans son code et attendez simplement que la charge utile. Nous pourrions juste envoyer les valeurs d’options et de faire l’Arduino à modifier un modèle avec ces valeurs, mais pour faire simple, nous allons juste fournir la charge entière et il permet d’envoyer un tel quel. Pour envoyer les bits il va allumer le LED IR et OFF selon le les timings trouvés précédemment.
Ici, l’Arduino agit comme un « esclave », jamais initier une communication elle-même. Comme j’ai l’intention de faire des usages multiples de cette unité, que j’ai commencer les communications d’un seul caractère « I » qui signifie « envoyer par IR », suivie de 19 octets de charge utile. L’Arduino puis envoie le message à l’air conditionné.
Du côté de l’Arduino, le code peut ressembler un peu trop compliqué, mais c’est parce qu’il est censé pour servir de relais radio aussi bien, alors la communication entre la Pi et l’Arduino sur l’interface série ne sera pas toujours juste d’envoyer le message de l’IR.
Voici la source arduino qui sera utilisée pour envoyer des commandes à l’Air conditionné.
Un peu d’explication :
-> le code de boucle juste vérifie si une commande est prête. Dans ce cas, il exécute la commande (pour maintenant juste "Envoyer un message de IR").
-> la SerialEvent() est appelée après un loop(), s’il y a des données série dans la mémoire tampon. Dans cette fonction que la commande est lu, la charge utile est préparée, puis un indicateur est défini pour indiquer la fonction loop() qu’une commande est prête
serialEvent recevra des caractères ASCII qui représentent les valeurs HEXADÉCIMALES. Pour le convertir, nous utilisons la fonction sscanf avec "%x" (hexadécimal) format option. Nous allons stocker les caractères reçus dans un tableau de 5 char et remplissez-le avec: « 0 x » + les caractères 2 + « \0 » (à la fin de la chaîne).
char hexConvert [5] = « 0 x » ;
ASCII est reçu
pour (int i = 0; i < 19; i ++) {}
hexConvert [2] = Serial.read() ;
hexConvert [3] = Serial.read() ;
hexConvert [4] = « \0 » ;
convertir les caractères reçus en une valeur numérique en charge utile [i]
sscanf (hexConvert, « %x » et (payload[i])) ;
}
À ce stade, charge utile [i] contient la valeur binaire représentée par les caractères reçus.
Dans leEnvoyer timings bon de commande servent à envoyer des serrures, introduction et charge utile. Pour envoyer des données, le code doit envoyer chaque bit séparément avec la fonction irsend.mark(duration) et irsend.space(duration). Comme il est expliqué dans le précédent instructable la durée est de tout 400us (devrait être en réalité plus proche 420 je pense) pour la marque (d’État) et 400us ou 1300us pour l’espace (état éteint) pour envoyer un 0 ou un 1, respectivement.
D’envoyer chaque bits de chaque octet le code suivant est utilisé :
pour (int s = 0; s < payloadSize; s + +) {}
pour (int i = 7; j’ai > = 0; i--) {/ / le Bit le plus significatif vient en premier
irsend.Mark(irSpace) ;
irsend.Space ((charge utile [s] >> i) & 1 == 1? irOne : irZero) ;
}
}
Si vous n’êtes pas familiarisé avec les opérations au niveau du bit il y a beaucoup de tutoriels disponibles sur le net.
Ce qui se passe ici est :
Pour chaque octet de la charge utile (fonctionne de la même manière avec l’intro) :
Pour i allant de 7 à 0
décalage de l’octet car j’ai rangs vers la droite
Regardez le dernier morceau
Si ce bit est 1, envoyez-nous un signal de « irOne » (1300us), sinon envoyez-nous un signal de « irZero » (400us)
Ce que nous obtenons en déplaçant l’octet droit de rang N (en ajoutant des zéros à gauche) est essentiellement la Nth mordu sur le côté à droite. Lorsque masquant avec une opération de bits AND (&) 1 nous prenons seulement le bit la plus à droite, donc dans le monde nous obtenons la valeur du nième binaire.
Exemple avec 5 b en hexa = 0101 1011 en binaire. Les parenthèses sont là pour mettre l’accent sur les bits décalés, pour une meilleure lisibilité...
J’ai = 7 = > Maj (0) 101 1011 pour 7 rangs = > 0000 000(0)
masque avec 1 = > 0000 0000 & 0000 0001 = 0 = > Envoyer irZero
J’ai = 6 = > Maj (01) 01 1011 pour 6 rangs = > 0000 00(01)
masque avec 1 = > 0000 0001 & 0000 0001 = 1 = > Envoyer irOne
J’ai = 5 = > Maj (010) 1011 1 pendant 5 rangs = > 0000 0(010)
masque avec 1 = > 0000 0010 & 0000 0001 = 0 = > Envoyer irZero
J’ai = 4 = > shift (0101) 1011 pour 4 rangs = > 0000 (0101)
masque avec 1 = > 0000 0101 & 0000 0001 = 1 = > Envoyer irOne
J’ai = 3 = > Maj (0101 1) 011 pour 3 rangs = > 000 (0 1011)
masque avec 1 = > 0000 1011 & 0000 0001 = 1 = > Envoyer irOne
J’ai = 2 = > Maj (0101 10) 11 pour 2 rangs = > 00 (0110 01)
masque avec 1 = > 0001 0110 & 0000 0001 = 0 = > Envoyer irZero
J’ai = 1 = > Maj (0101 101) 1 pour 1 grade = > 0(010 1101)
masque avec 1 = > 0010 1101 & 0000 0001 = 1 = > Envoyer irOne
J’ai = 0 = > shift (0101 1011) pour grade 0 = > (0101 1011)
masque avec 1 = > 0101 1011 & 0000 0001 = 1 = > Envoyer irOne
Nous les avons envoyés bits à gauche pour le bon ordre.
Notez que la bibliothèque IRremote utilise pin3 pour envoyer des messages. Je suppose qu’il pourrait être possible d’utiliser la broche 11 (même minuterie pour PWM) en modifiant l’axe de la cible dans le code de la bibliothèque, mais je n’ai pas testé.