Bonjour à tous !
Je me permet de venir demander votre aide car j'ai un problème de transmission entre un script Python lancé sur linux et un arduino Nano.
Mon projet est de créé un système commandé par Domoticz ( qui est une application sur linux de domotique ) qui est dans mon bureau, pour piloter ma climatisation qui est dans mon salon via une led Infra rouge.
Actuellement j'ai un système comme ceci :
- Un serveur Linux sur un petit PC
- L'application Domoticz
- un RFXCom 433 MHz
- des relais 433MHz sur mes radiateurs éléctriques
- un Broadlink Infrarouge WiFi qui reproduit mes trames infrarouges lancé normalement via ma télécommande de clim
Mon but est de supprimé le broadlink wifi.
Tout ceci permet de gérer mon chauffage à distance via l'application smartphone, ou automatiquement grâce au calendrier.
Pour supprimer de broadlink IR j'ai imaginé un petit système :
- Une carte émettrice : connecté au PC avec Domoticz et qui envoi l'information via un transmetteur RF 433Mhz
- Une carte Recepteur : alimenté par secteur dans le salon avec le recepteur RF 433MHz et une led Infra rouge pour reproduire la trame IR
Donc on récapitule, le fonctionnement du système est :
1 - Je lance une script Python via Domoticz avec une commande : lgChaud22fast ( climatiseur LG en mode Chauffage à 22° et ventilation rapide )
2 - le Script Python recoit l'ordre et transmet la trame infra rouge correspondante
3 - la carte émetteur recoit la trame et la divise en deux ( j'utilise la bibliothéque VirtualWire pour envoyer la trame sous forme de tableau et si le tableau est trop long l'arduino bug )
4 - la carte récepteur recoit la trame en deux fois
5 - la carte récepteur réintégre la trame divisé en deux dans un seul tableau
6 - la carte récepteur envoie la trame Infra Rouge via la LED
Pour mieux comprendre voilà un peu de code :
et l'arduino Nano pour l'émetteur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #!/usr/bin/python #coding=utf-8 import sys import time import serial ser = serial.Serial( port='/dev/ttyACM0', baudrate=9600, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO, bytesize=serial.SEVENBITS ) trame = 'null' try: ordre = sys.argv[1] except IndexError: ordre = 'null' if ordre == 'lgChaud22fast': trame = ["444", "14876", "104", "11372", "184", "9016", "364", "1724", "232", "30844", "3208", "9880", "500", "1576", "500", "564", "476", "540", "496", "560", "472", "1596", "476", "556", "476", "556", "472", "568", "476", "560", "476", "560", "472", "556", "476", "556", "476", "556", "476", "1588", "448", "576", "496", "556", "476", "556", "476", "1588", "476", "1584", "476", "1604", "476", "556", "472", "1588", "476", "556", "476", "556", "476", "1588", "476", "1580", "496", "1588", "476", "1588", "476",";"] elif ordre == 'lgChaud18fast': trame = '3208, 9848, 476, 1600, 504, 540, 504, 544, 496, 532, 496, 1604, 476, 540, 504, 552, 476, 532, 500, 556, 476, 556, 476, 532, 496, 540, 500, 544, 504, 1596, 476, 536, 504, 552, 476, 532, 500, 532, 500, 1588, 476, 1584, 476, 536, 504, 1588, 476, 536, 504, 532, 496, 1596, 476, 532, 500, 1584, 476, 1596, 476;' elif ordre == 'lgSwingOn': trame = '3232, 9832, 496, 1584, 500, 556, 476, 556, 476, 552, 476, 1612, 476, 540, 496, 560, 472, 556, 476, 556, 476, 556, 476, 556, 476, 1600, 452, 572, 500, 556, 476, 1588, 476, 1576, 500, 564, 476, 564, 476, 556, 476, 1584, 476, 556, 476, 1588, 476, 540, 496, 556, 476, 1588, 476, 564, 452, 572, 500, 1584, 476;' elif ordre == 'lgSwingOff': trame = '3204, 9848, 500, 1584, 500, 556, 476, 556, 472, 556, 480, 1584, 476, 540, 500, 556, 472, 560, 472, 556, 476, 556, 476, 556, 476, 1584, 476, 560, 472, 556, 452, 1612, 500, 1584, 476, 564, 476, 540, 500, 548, 500, 564, 472, 1604, 476, 540, 500, 556, 476, 1588, 476, 1576, 476, 1612, 500, 556, 476, 1600, 476;' elif ordre == 'lgFroid25fast': trame = '3208, 9848, 472, 1616, 504, 532, 500, 532, 500, 528, 504, 1568, 500, 536, 504, 536, 504, 536, 504, 524, 504, 532, 500, 532, 500, 540, 500, 532, 500, 532, 500, 528, 500, 536, 504, 1568, 504, 536, 504, 1584, 476, 532, 500, 532, 500, 1576, 504, 532, 504, 532, 500, 1612, 476, 1572, 504, 1564, 500, 540, 500;' elif ordre == 'lgFroid25auto': trame = '3208, 9860, 532, 1592, 480, 532, 504, 532, 500, 532, 500, 1576, 500, 544, 496, 564, 452, 568, 504, 528, 504, 528, 504, 528, 504, 536, 500, 532, 500, 532, 500, 556, 476, 536, 504, 1584, 476, 536, 504, 1592, 480, 536, 500, 532, 500, 1592, 480, 532, 500, 1584, 476, 1568, 504, 1572, 504, 1588, 476, 1600, 480;' elif ordre == 'lgFroid26auto': trame = '3288, 9876, 500, 1596, 504, 540, 500, 536, 504, 528, 504, 1584, 480, 528, 500, 532, 500, 532, 500, 528, 504, 532, 496, 532, 500, 536, 504, 532, 500, 532, 500, 528, 504, 528, 504, 1564, 496, 532, 500, 1576, 504, 1560, 500, 540, 500, 1576, 504, 532, 508, 1584, 476, 532, 500, 532, 500, 528, 500, 532, 500;' elif ordre == 'lgFroid26fast': trame = '3288, 9880, 476, 1600, 504, 536, 500, 532, 504, 528, 500, 1564, 500, 536, 504, 532, 472, 568, 504, 532, 500, 532, 500, 532, 500, 536, 504, 528, 504, 528, 500, 532, 500, 536, 504, 1584, 480, 532, 504, 1596, 476, 1568, 504, 536, 500, 1572, 500, 536, 504, 528, 504, 1584, 476, 1596, 476, 1584, 476, 1604, 476;' elif ordre == 'lgFan': trame = '3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476;' elif ordre == 'lgFanOff': trame = '3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476;' ser.isOpen() time.sleep(2) ser.write(trame.encode("ascii")+'\r\n') #n = len(trame) #print trame #for lettre in trame: # if lettre != " ": # ser.write(lettre.encode("ascii")+'\r\n') # print lettre # elif lettre == ";": # break #ser.close() lu = ser.readline() print lu print "Code Sent...."
Donc en faite... tout fonctionne ! Sauf lorsque le script Python envoie la trame qui correspond à l'ordre en question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 #include <VirtualWire.h> int tIR[69] = {0}; int octetReception = 0; // variable de stockage des valeurs reçues sur le port Série (ASCII) char caractereRecu = 0; // variable pour stockage caractère recu int compt = 0; // variable comptage caractères reçus int nbIR = 0; String chaineReception = ""; void setup() { // Initialisation de la bibliothèque VirtualWire // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire Serial.begin(9600); vw_setup(2000); vw_set_tx_pin(11); } void sendRF() { int tRF1[35] = {0}; int tRF2[36] = {0}; tRF1[0] = 1; tRF2[0] = 2; int i2 = 1; int i = 0; int i3 = 1; for (i = 0; i < 34; i++) { tRF1[i2] = tIR[i]; i2++; } i2 = 1; for (i = 34; i < 69; i++) { tRF2[i2] = tIR[i]; i2++; } // Lit les broches analogiques vw_send((byte *) &tRF1, sizeof(tRF1)); // On envoie le message vw_wait_tx(); // On attend la fin de l'envoi delay(100); vw_send((byte *) &tRF2, sizeof(tRF2)); // On envoie le message vw_wait_tx(); // On attend la fin de l'envoi delay(50); nbIR = 0; } void loop() { int c = 0; while (Serial.available() > 0) { // tant qu'un octet en réception octetReception = Serial.read(); // Lit le 1er octet reçu et le met dans la variable compt = compt + 1; if ((octetReception == 44) || (octetReception == 59)) { char str[15] = {NULL}; int v; for (v = 0; v <= compt; v++) { str[v] = chaineReception[v]; } tIR[nbIR] = strtol(str, NULL, 10); if (octetReception == 59) { sendRF(); chaineReception = ""; //RAZ le String de réception compt = 0; // RAZ compteur break; } else { nbIR++; } chaineReception = ""; //RAZ le String de réception compt = 0; // RAZ compteur } else { // si le caractère reçu n'est pas un saut de ligne caractereRecu = char(octetReception); // convertit l'octet reçu en caractère chaineReception = chaineReception + caractereRecu; } } }
Donc le script python balance la trame 476, 15972, 455 machin machin
et l'arduino ( carte émetteur qui est connecté au PC avec linux ) recoit :
TrameIR=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 1, 47, 1, 47, 0, 0, 1, 47, 0, 0, 0, 4, 1, 47, 0, 0, 1, 47, 1, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
le Nano recepteur recoit aussi cette trame la incomplète
lorsque je travail sur l'IDE et le moniteur série de l'arduino et que j'envoi manuellement la trame correct, la clim se met en route ou s'arrête suivant les ordres transmit.
J'ai essayé pas mal de chose, comme faire un tableau dans le script python et envoyer les données une par une, mais je n'y arrive pas.
J'ai du mal à trouver des informations là dessus, car la trame à transmettre n'est pas un message courant, d'habitude on envoi un mot ou un entier etc...
J'avou que mon code est loin d'être un code de pro et j'avou avoir pioché des morceaux dans des tuto à droite et à gauche.
Je passe par un système comme celui ci car je ne veux pas avoir les trames IR programmé en dur dans l'arduino car si je veux faire une petite modif j'aurais la flemme de brancher l'arduino et le reprogrammer etc... Et puis aussi par plaisir de bidouiller j'aime faire fabriquer mes trucs
De plus je pourrais réutiliser la carte émetteur pour d'autre application, je vais me faire plus tard un système d'irrigation, un petfeeder et un truc pour changer l'eau de mes poule (faut pas que sa bug LOL) le tout commandé par domoticz avec par exemple contrôle du réservoir de graines de mes poules :p
car oui oui j'arrive à faire porter un émetteur RF low cost à l'autre bout de la maison dans mon jardin :p
Si jamais mon système interresse quelqu'un je peux vous montrer le câblage et le code dans son ensemble. Avec grand plaisir.
En tout cas merci à ceux qui ont eu le courage de me lire jusqu'au bout !
Merci d'avance pour votre aide !
Bonne soirée !
Partager