Connexion entre deux RaspberryPi


30 posts   Page 1 of 2   1, 2
by Tomichouno » Fri Apr 28, 2017 2:02 am
Bonjour,

je suis actuellement en stage au Japon et j'ai un projet à mener avec RaspberryPi.

En gros, je dois capter la présence d'une personne dans une pièce et afficher dans une autre si oui ou non elle est présente. Et c'est au niveau de la transmission de la donnée où je suis novice. J'ai donc pensé a utiliser différents moyen de transmission (WiFi, 433 MHz ou bien bluetooth). Cependant je n'ai aucune idée de comment la connexion entre deux Raspberry Pi peut se faire ... J'ai beau chercher sur la toile, je ne trouve pas d'explication concrète à mon problème.

Alors en effet, je sais/pense qu'il va me falloir des shields WiFi (ou des émetteur/recepteur 433 MHz) pour chacune des deux Raspberry Pi, mais je ne sais pas comment je vais pouvoir les relier entre elles ...

Si quelqu'un aurait une réponse, cela m'aiderait grandement.

Pour ceux qui veulent en savoir plus sur mon projet :

Dans le cadre de mon stage, mon maître de stage (un prof de l'université où je suis) m'a demandé de réaliser un système qui préviendrait ses élèves (travaillant dans le laboratoire du prof) de sa présence ou non dans son bureau personnel.
Je dois donc installer un capteur (j'ai choisi un infrarouge) dans son bureau, il aura donc besoin d'être alimenté à l'aide d'un premier RPi et sa sortie sera émise vers le RPi présent dans son laboratoire, qui lui, traitera le signal (en langage Python) et affichera (sur un écran LCD ou un système de LED) la présence ou non de la présence du professeur dans son bureau.

Si vous avez des questions n’hésitez pas à me répondre, et si je vois que mon projet en intéresse quelques un je ne manquerait pas de les informer ici du déroulement de mon projet.

Tomichouno.
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by CarlRJ » Fri Apr 28, 2017 10:00 am
Bonjour,

J'utilise Google Translate, à la fois pour lire votre message et pour traduire ma réponse, car je ne comprends qu'un peu de français - j'espère que cela a du sens ...

Parmi les trois méthodes que vous nommez, je préférerais WiFi parce qu'elle fournit un signal fort, permet l'utilisation de la plupart des commandes / protocoles réseau et le matériel n'est pas compliqué. Certains nouveaux modèles Raspbery Pi (Pi 3B et Pi Zero W) ont un système WiFi intégré et peuvent être ajoutés à d'anciens modèles avec un «dongle USB WiFi».

En ce qui concerne la façon d'envoyer les données réelles, il existe de nombreuses méthodes. Mon préféré est "MQTT", un système souvent utilisé pour partager les données des capteurs entre les ordinateurs. Le Pi dans le bureau du professeur «publish» un message chaque fois qu'il prend une lecture, et le Pi dans le laboratoire «subscribe» à ces messages et traiterait les lectures (de la manière nécessaire) à mesure qu'elles arrivent de l'autre Pi. Cela nécessite un "MQTT Broker" (serveur) en cours d'exécution - cela pourrait fonctionner sur le Pi à chaque extrémité (jetez un oeil aux paquets apt-get "mosquitto" et "mosquitto-clients", et le "paho-mqtt" Python).

Alternativement, le Pi dans le laboratoire pourrait exécuter un petit serveur web (avec, par exemple, la bibliothèque "Flask" pour Python) et le Pi dans le bureau pourrait Envoie un message HTTP à chaque fois que l'état change. Vous pouvez également éviter les frais généraux de MQTT ou HTTP et écrire des programmes pour chaque extrémité qui utilisent des paquets TCP/IP pour communiquer directement, mais cela impliquera de résoudre beaucoup de problèmes vous-même que MQTT et HTTP ont déjà résolu.
User avatar
Posts: 580
Joined: Thu Feb 20, 2014 4:00 am
Location: San Diego, California
by laurent » Fri Apr 28, 2017 1:09 pm
Salut,

Je te conseille de poser ta question dans la partie francophone du forum, tu auras plus de chances d'avoir des réponses : https://www.raspberrypi.org/forums/viewforum.php?f=65
C'est sûr que pour les non anglophones, il n'est pas évident de savoir où aller à partir de l'index du forum.

Pour répondre à ta question, nul besoin de shields, les raspberry pi 3 et Zero W ont un module WiFi intégré. Le plus simple est sûrement d'utiliser un Pi Zero W + ton capteur infrarouge dans une pièce, relié en WiFi ou en Bluetooth directement à un Raspberry Pi 3 ou Zero qui aura un afficheur LCD dans l'autre pièce.
Je pense que le bluetooth en émulation d'un port série est le plus simple à mettre en oeuvre. Pour le WiFi, à moins d'avoir un réseau en place, je crains qu'il soit nécessaire de mettre en oeuvre un Raspberry Pi en Access Point, ce qui demande un peu plus de configuration (mais qui reste tout à fait faisable).
Posts: 234
Joined: Thu Jul 26, 2012 11:24 am
by YCN- » Fri Apr 28, 2017 2:21 pm
Salut,

Le wifi c'est une bonne idée, mais ça va te poser plusieurs problèmes.
Si les Rpi sont reliés au réseaux de la fac tout va bien, dans ce cas tu peux mettre un serveur http sur l'un des raspberry pi et écrire à ce serveur avec l'autre. J'ai fait ça un jour et ça marche très bien, et c'est relativement simple à mettre en marche.
En gros rpi1 : hôte un serveur
rpi2 : écrit au serveur : http://192.192.192.192:1920/1 si il est là
ou http://192.192.192.192:1920/0 si il n'est pas là
192.192.192.192 ce serait l'adresse IP du rpi1 et 1920 le port. Tu peux faire ce genre d'architecture client serveur très facilement en C si c'est ce que tu utilises. Tu devrais pouvoir trouver quelques tutoriels ou code faisant ça. Après tu n'auras plus qu'à les adapté pour tes besoins!
Après n'importe quel langage ou presque te permettra de faire ça. Je pense que le plus simple ce serait node.js, mais après ce n'est pas aussi bas niveau que du C.
Il y a ce tuto openclassroom qui est pas mal : https://openclassrooms.com/courses/des- ... ec-node-js

YCN-
Posts: 232
Joined: Fri Jun 10, 2016 3:18 pm
by Tomichouno » Mon May 01, 2017 1:30 am
CarlRJ wrote:Bonjour,

J'utilise Google Translate, à la fois pour lire votre message et pour traduire ma réponse, car je ne comprends qu'un peu de français - j'espère que cela a du sens ...

Parmi les trois méthodes que vous nommez, je préférerais WiFi parce qu'elle fournit un signal fort, permet l'utilisation de la plupart des commandes / protocoles réseau et le matériel n'est pas compliqué. Certains nouveaux modèles Raspbery Pi (Pi 3B et Pi Zero W) ont un système WiFi intégré et peuvent être ajoutés à d'anciens modèles avec un «dongle USB WiFi».

En ce qui concerne la façon d'envoyer les données réelles, il existe de nombreuses méthodes. Mon préféré est "MQTT", un système souvent utilisé pour partager les données des capteurs entre les ordinateurs. Le Pi dans le bureau du professeur «publish» un message chaque fois qu'il prend une lecture, et le Pi dans le laboratoire «subscribe» à ces messages et traiterait les lectures (de la manière nécessaire) à mesure qu'elles arrivent de l'autre Pi. Cela nécessite un "MQTT Broker" (serveur) en cours d'exécution - cela pourrait fonctionner sur le Pi à chaque extrémité (jetez un oeil aux paquets apt-get "mosquitto" et "mosquitto-clients", et le "paho-mqtt" Python).

Alternativement, le Pi dans le laboratoire pourrait exécuter un petit serveur web (avec, par exemple, la bibliothèque "Flask" pour Python) et le Pi dans le bureau pourrait Envoie un message HTTP à chaque fois que l'état change. Vous pouvez également éviter les frais généraux de MQTT ou HTTP et écrire des programmes pour chaque extrémité qui utilisent des paquets TCP/IP pour communiquer directement, mais cela impliquera de résoudre beaucoup de problèmes vous-même que MQTT et HTTP ont déjà résolu.



Salut,
Merci de ta réponse, je dois cependant avouer que tu utilises des termes dont je ne comprend pas tellement le sens ...
Je vais m'orienter sur d'autres réponses que j'ai obtenus qui me parlent beaucoup plus.

Merci à toi.

Tomichouno
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by Tomichouno » Mon May 01, 2017 1:36 am
laurent wrote:Salut,

Je te conseille de poser ta question dans la partie francophone du forum, tu auras plus de chances d'avoir des réponses : https://www.raspberrypi.org/forums/viewforum.php?f=65
C'est sûr que pour les non anglophones, il n'est pas évident de savoir où aller à partir de l'index du forum.

Pour répondre à ta question, nul besoin de shields, les raspberry pi 3 et Zero W ont un module WiFi intégré. Le plus simple est sûrement d'utiliser un Pi Zero W + ton capteur infrarouge dans une pièce, relié en WiFi ou en Bluetooth directement à un Raspberry Pi 3 ou Zero qui aura un afficheur LCD dans l'autre pièce.
Je pense que le bluetooth en émulation d'un port série est le plus simple à mettre en oeuvre. Pour le WiFi, à moins d'avoir un réseau en place, je crains qu'il soit nécessaire de mettre en oeuvre un Raspberry Pi en Access Point, ce qui demande un peu plus de configuration (mais qui reste tout à fait faisable).



Salut,
Merci de ta réponse, j'ai posté sur la partie français du site, comme tu me l'as conseillé, je t'en remercie.

Je comprend tout à fait ta réponse et je pense que tu as plutôt bien compris mon projet. Cependant j'ai oublié de dire que j'ai un Pi 2+ à utiliser dans mon projet, j'ai le droit de commander un autre Pi, selon toi je devrait prendre un Pi 3 ou un Pi Zero du coup ?
En ce qui concerne le moyen de transmission, je pense que la WiFi reste meilleur car je n'ai pas confiance en la distance d’émission du Bluetooth ...
Et au niveau du Wifi, j'ai lu que je pouvais me servir d'un Pi (celui du labo certainement) comme routeur, et qu'ainsi je pouvais connecter un autre pays dessus, dis moi si je me trompe. Mais dans ces cas là, comment les connecter entre eux ?
Et n'as-tu aucune informations concernant le 433 MHz ? C'est la fréquence utilisée en domotique ... J'ai cru comprendre que cela pourrait être un bon moyen de transmission ...

Merci de ta réponse.

Tomichouno
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by Tomichouno » Mon May 01, 2017 1:43 am
YCN- wrote:Salut,

Le wifi c'est une bonne idée, mais ça va te poser plusieurs problèmes.
Si les Rpi sont reliés au réseaux de la fac tout va bien, dans ce cas tu peux mettre un serveur http sur l'un des raspberry pi et écrire à ce serveur avec l'autre. J'ai fait ça un jour et ça marche très bien, et c'est relativement simple à mettre en marche.
En gros rpi1 : hôte un serveur
rpi2 : écrit au serveur : http://192.192.192.192:1920/1 si il est là
ou http://192.192.192.192:1920/0 si il n'est pas là
192.192.192.192 ce serait l'adresse IP du rpi1 et 1920 le port. Tu peux faire ce genre d'architecture client serveur très facilement en C si c'est ce que tu utilises. Tu devrais pouvoir trouver quelques tutoriels ou code faisant ça. Après tu n'auras plus qu'à les adapté pour tes besoins!
Après n'importe quel langage ou presque te permettra de faire ça. Je pense que le plus simple ce serait node.js, mais après ce n'est pas aussi bas niveau que du C.
Il y a ce tuto openclassroom qui est pas mal : https://openclassrooms.com/courses/des- ... ec-node-js

YCN-



Salut,
Merci de ta réponse, oui je crois bien que les RPi peuvent être connectée en Ethernet, au moins celui du labo en tout cas.
Ta réponse éclaire le comment "flou" que j'avais en tête, c'est cool, merci. Mais elle m'interroge sur certains points ...
Je peux faire ça en C ?

Merci pour ce tuto, je file y jeter un coup d'oeil !

Tomichouno
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by Tomichouno » Mon May 01, 2017 2:22 am
Au temps pour moi, j'ai déjà un RPi 3B !
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by jelopo » Mon May 01, 2017 6:51 am
Bonjour,

1 - Le plus simple est de passer en Ethernet en filaire.
Déjà valide si c'est possible.
2 - Il faut un Rpi client et un Rpi serveur. Là je rejoint @CarlRJ, pour utiliser MQTT. Il faut juste se pencher quelques minutes sur son fonctionnement. On trouve même des serveurs MQTT accessibles sur Internet, donc même pas besoin d'en installer un sur un Rpi Serveur !
Comme déjà proposé, il y a d'autres protocoles de communication comme http.
Donc, il faut choisir son protocole de communication client/serveur.
3 - Enfin il faut savoir sous quel langage développer. Ma préférence va au Python.
Un langage est-il imposé, sinon, choisi celui que tu maîtrise le plus.

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by totoharibo » Mon May 01, 2017 7:55 am
Posts: 3124
Joined: Thu Jan 24, 2013 8:43 am
by Tomichouno » Tue May 02, 2017 12:18 am
jelopo wrote:Bonjour,

1 - Le plus simple est de passer en Ethernet en filaire.
Déjà valide si c'est possible.
2 - Il faut un Rpi client et un Rpi serveur. Là je rejoint @CarlRJ, pour utiliser MQTT. Il faut juste se pencher quelques minutes sur son fonctionnement. On trouve même des serveurs MQTT accessibles sur Internet, donc même pas besoin d'en installer un sur un Rpi Serveur !
Comme déjà proposé, il y a d'autres protocoles de communication comme http.
Donc, il faut choisir son protocole de communication client/serveur.
3 - Enfin il faut savoir sous quel langage développer. Ma préférence va au Python.
Un langage est-il imposé, sinon, choisi celui que tu maîtrise le plus.

A+



Salut à toi,
Merci pour ta réponse.
1 - D'accord, je dois regardé si j'ai la possibilité de brancher un Ethernet dans le bureau du prof, je n'en suis pas certain.
2 - Je vais faire des recherches sur MQTT alors. Est-ce la solution la plus simple ?
3 - Oui je dois utilisé du Python dans mon projet.

Merci.
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by jelopo » Tue May 02, 2017 8:34 am
Bonjour,

1 - Si pas de possibilité de connecter en Ethernet filaire, vérifier si le WIFI passe.
N.B.: Une Raspberry est sur-dimensionnée pour seulement envoyer une info 0 ou 1 sur un channel MQTT. Mais bon
si c'est dans les pré-requis.

2 et 3 - Coté serveur, pour utiliser MQTT sous Python, voir ici : https://pypi.python.org/pypi/paho-mqtt/1.2
En une dizaine de lignes de code, le tour est joué pour la partie réception MQTT !
Je recommande mosquitto, comme serveur MQTT.

- Coté client, une seule ligne de commande pour envoyer un message avec la commande mosquitto-pub du paquet mosquitto-clients.

:geek: En plus, grâce à MQTT il sera aussi possible d'installer une appli Android sur un portable et d'interroger le serveur (en WIFI) pour savoir de n'importe quel endroit du campus si le prof est dans son bureau, cool non ?

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by Tomichouno » Mon May 08, 2017 6:59 am
jelopo wrote:Bonjour,

1 - Si pas de possibilité de connecter en Ethernet filaire, vérifier si le WIFI passe.
N.B.: Une Raspberry est sur-dimensionnée pour seulement envoyer une info 0 ou 1 sur un channel MQTT. Mais bon
si c'est dans les pré-requis.

2 et 3 - Coté serveur, pour utiliser MQTT sous Python, voir ici : https://pypi.python.org/pypi/paho-mqtt/1.2
En une dizaine de lignes de code, le tour est joué pour la partie réception MQTT !
Je recommande mosquitto, comme serveur MQTT.

- Coté client, une seule ligne de commande pour envoyer un message avec la commande mosquitto-pub du paquet mosquitto-clients.

:geek: En plus, grâce à MQTT il sera aussi possible d'installer une appli Android sur un portable et d'interroger le serveur (en WIFI) pour savoir de n'importe quel endroit du campus si le prof est dans son bureau, cool non ?

A+


Salut,

merci pour ces réponses !

J'ai tout compris, merci beaucoup ! :)
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by jelopo » Mon May 08, 2017 10:49 am
Bonjour,

Pour notre information, n'hésites pas à nous tenir au courant de l'avancement de ce projet. ;)

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by joeltisse » Fri May 12, 2017 9:17 am
Bonjour,

J'ai le meme type de sujet pour mon PFE.
Il s'agit de concevoir une balise intelligente de limitation de vitesse qui va communiquer avec la voiture dans un rayon de 300m.

Je veux utiliser le meme emetteur recepteur 433mhz.
Mais il l'a dit , cest pour juste envoyer un signal OUI / NON , soit pour allumer ou etteindre une LED;;;

Moi, je veux envoyer linformation de la vitesse limite, cest à dire un signal numerique ,,, 80KM/h par exemple...

Merci de maider sur ce coup.
Impatient de recevoir des idees et solutions. THANKS
Posts: 2
Joined: Thu May 11, 2017 12:18 pm
by Tomichouno » Thu May 18, 2017 6:27 am
joeltisse wrote:Bonjour,

J'ai le meme type de sujet pour mon PFE.
Il s'agit de concevoir une balise intelligente de limitation de vitesse qui va communiquer avec la voiture dans un rayon de 300m.

Je veux utiliser le meme emetteur recepteur 433mhz.
Mais il l'a dit , cest pour juste envoyer un signal OUI / NON , soit pour allumer ou etteindre une LED;;;

Moi, je veux envoyer linformation de la vitesse limite, cest à dire un signal numerique ,,, 80KM/h par exemple...

Merci de maider sur ce coup.
Impatient de recevoir des idees et solutions. THANKS


Salut à toi !

Je ne comprend pas bien ta question ... à ta place je referais un topic où je détaillerais mon projet et, où j'expliquerais parfaitement les problèmes que je rencontre.

Je peux simplement te dire que finalement je n'ai pas utilisé d'émetteur/récepteur 433 MHz, j'ai finalement opté pour une transmission d'informations par réseau local (TCP/IP).

Bon courage pour ton PFE
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by Tomichouno » Thu May 18, 2017 7:01 am
jelopo wrote:Bonjour,

Pour notre information, n'hésites pas à nous tenir au courant de l'avancement de ce projet. ;)

A+



Salut !

Comme tu le souhaites, je vous informe de l'avancement de mon projet.

J'ai d'abord reçu mon capteur PIR (Détecteur de mouvement) que j'ai fais fonctionner assez rapidement.
Ensuite j'ai repris un vieux code que j'avais fais lorsque j'ai appris à coder en python pour afficher à l'écran lorsque le capteur détectait un mouvement :
Lorsqu'il détecte un mouvement, il affiche un "1".
Lorsqu'il ne détecte rien, il affiche un "0".
Tout cela dans un "while" qui termine par un délais de 0.1s ce qui permet de rafraîchir l'état de la sortie du capteur assez rapidement.

Suite à cela je me suis lancé dans la transmission de donnée.
J'ai donc connecté le RPi en ethernet pour pouvoir fonctionner avec des sockets.
J'ai fais deux programmes, un client et un serveur, où le client envoi le programme que j'ai décris un peu plus haut.
Le serveur, quant à lui, accepte l'envoie du client et traite ainsi ce qu'il reçoit.
Si il reçoit un "1", la LED s'allume
Si il reçoit un "0", la LED s'éteint.

En ouvrant deux terminaux je peux donc exécuter les programmes sur la même machine.
Cela fonctionne parfaitement.

Il ne me reste donc plus qu'à re-tester ces programmes sur deux RaspberryPi différentes, suite à cela je pourrais peaufiner mon projet en imprimant des boîtes en 3D pour un rendu plus propre.

Il me reste tout de même un problème à régler, je m'explique :

Comme je l'ai dis précédemment, je possède un capteur de mouvement, c'est à dire qu'il renvoie quelque chose uniquement si il détecte un mouvement. Hors, mon projet est de détecter une présence dans une pièce, au quel cas une personne présente immobile dans la pièce ne serait pas détectée par le capteur.
A partir de là, vous devez avoir besoin de mon code pour comprendre.
Alors voilà mon code pour le serveur :

Code: Select all
#! /usr/bin/env python
# coding: utf-8


import socket
import RPi.GPIO as GPIO
import time


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.OUT)


socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('',15555))

while True:
   socket.listen(5)
   client, address = socket.accept()
   print"{} connected".format( address )
   while True:
      socket.listen(5)
      response = client.recv(1)
      time.sleep(0.1)
      if response == "1":
         GPIO.output(24,GPIO.HIGH)
         print response
      if response == "0":
         GPIO.output(24,GPIO.LOW)
         print response

print "Close"
client.close()
stock.close()


*Le programme ci-dessus n'illustre pas les propos qui suivent, ce programme allume la LED à la détection d'un 1, et l'éteint à la détection d'un 0, c'est tout."

J'ai donc pensé à afficher si le capteur avait détecté un mouvement dans la dernière minute. Ainsi, j'ai pensé à ajouter un délais de quelques secondes après l'allumage de la LED dans le "if" ... Mais lorsque la boucle reprend, la série de 1 et de 0 que j'envoie, reprend au moment ou elle à été mis en attente.

Et je vous met également le code du client :
Code: Select all
#! /usr/bin/env python
# coding: utf-8

import socket
import RPi.GPIO as GPIO
import time


GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.IN)

hote = "localhost"
port = 15555

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
socket.connect((hote, port))
print "Connection on {}".format(port)

while True:
   data = GPIO.input(9)
   dat = str(data)
   socket.send(dat)
   time.sleep(0.1)

GPIO.cleanup()
print "Close"
socket.close()


Pour résumer le problème :
Le capteur détecte un mouvement, la LED s'allume pendant quelque seconde.
La boucle continue mais la LED reste allumée car lorsque le capteur a détecter un mouvement, il a "retenu" plusieurs "1" à la suite, ce qui fait que la LED reste allumée bien plus longtemps que ce que je voudrais.

Je pense qu'il est très difficile de comprendre mon problème en n'ayant seulement le code et mes explications ... Il vous faudrait le surement le système sous les yeux pour le comprendre parfaitement ...

Bref, si vous avez des questions, n'hésitez pas.

Tomichouno.
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by jelopo » Thu May 18, 2017 7:49 am
Bonjour,

Si je comprends bien, tu souhaites que l'état haut reste actif une minute après la dernière détection de mouvement envoyée par le PIR. C'est ainsi que fonctionne la majorité des éclairages d'extérieur équipés d'un détecteur de mouvement. Sur ces détecteurs extérieurs, il y a généralement au 3 réglages, distance de détection, et durée d'activation, et luminosité.

Les cartes PIR ont aussi souvent des réglages, donc un tournevis est bien plus efficace à manipuler que des lignes de codes à écrire. :D
:ugeek: D'où le conseil du jour RTFM

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by YCN- » Thu May 18, 2017 8:21 am
Salut,

De ce que je comprend en fait tu met la Led On tant que tu n'as pas reçu de 0.
Je crois pas que ce soit très bien, tu devrais plutôt faire comme suit : lorsque tu reçois un 1, il faut que tu dise à un thread que la led doit être allumé pendant quelques secondes puis à nouveau éteinte si elle n'a pas reçu un autre 1.
Ensuite tu peux aussi temporiser plus, ça ne sert à rien que tu envoies en flux "tendu" tes données, tu pourrais les envoyer toutes les n secondes et actualiser le statut toutes les n secondes. Au contraire ça a même du sens de laisser la led un peu plus longtemps après avoir eu le dernier 1 puisque la personne ne s'est pas téléporté.
Maintenant je pense que tu t'en es rendu compte le choix de ton capteur n'est pas vraiment très très bien adapté, un capteur de distance mis sur la porte aurait pu être plus approprié et aurait pu de donner une information plus simple et sure. Couplé avec ton capteur de présence tu aurais pu être sure à 100% que le professeur est là. Peut être est ce une piste d'amélioration de ton produit.

YCN-
Posts: 232
Joined: Fri Jun 10, 2016 3:18 pm
by Tomichouno » Fri May 19, 2017 1:01 am
jelopo wrote:Bonjour,

Si je comprends bien, tu souhaites que l'état haut reste actif une minute après la dernière détection de mouvement envoyée par le PIR. C'est ainsi que fonctionne la majorité des éclairages d'extérieur équipés d'un détecteur de mouvement. Sur ces détecteurs extérieurs, il y a généralement au 3 réglages, distance de détection, et durée d'activation, et luminosité.

Les cartes PIR ont aussi souvent des réglages, donc un tournevis est bien plus efficace à manipuler que des lignes de codes à écrire. :D
:ugeek: D'où le conseil du jour RTFM

A+



Non, je souhaite que la LED reste allumée pendant, disons une minute, dès que le capteur envoie un état haut. Et qu'après cette minute, le capteur recommence à envoyer la trame de 1 et de 0 jusqu'à détection d'un nouvel état haut.
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by Tomichouno » Fri May 19, 2017 1:11 am
YCN- wrote:Salut,

De ce que je comprend en fait tu met la Led On tant que tu n'as pas reçu de 0.
Je crois pas que ce soit très bien, tu devrais plutôt faire comme suit : lorsque tu reçois un 1, il faut que tu dise à un thread que la led doit être allumé pendant quelques secondes puis à nouveau éteinte si elle n'a pas reçu un autre 1.
Ensuite tu peux aussi temporiser plus, ça ne sert à rien que tu envoies en flux "tendu" tes données, tu pourrais les envoyer toutes les n secondes et actualiser le statut toutes les n secondes. Au contraire ça a même du sens de laisser la led un peu plus longtemps après avoir eu le dernier 1 puisque la personne ne s'est pas téléporté.
Maintenant je pense que tu t'en es rendu compte le choix de ton capteur n'est pas vraiment très très bien adapté, un capteur de distance mis sur la porte aurait pu être plus approprié et aurait pu de donner une information plus simple et sure. Couplé avec ton capteur de présence tu aurais pu être sure à 100% que le professeur est là. Peut être est ce une piste d'amélioration de ton produit.

YCN-



Salut,

Non, je met la LED ON pendant une minute quand je reçoit un 1.
Parce qu'en fait, le problème que j'ai, c'est que lorsque le capteur détecte un mouvement, il envoie plusieurs "1" à la suite. Ainsi, si je met un "time.sleep(60)" dans mon code, le programme se bloque et l'envoie de la trame de 0 et de 1 également, lorsque les 60 secondes sont passées c'est le second "1" qu'avait détecté le capteur qui déclenche a nouveau la LED pendant 60 secondes.

Ce que j'aimerais réussir à faire, c'est :
- le serveur reçoit un 1, il allume la LED pendant 60 seconde mais il continue à recevoir la trame de 0 et de 1 que le client lui envoie et continue à l'examiner.
- si le serveur reçoit un second 1 pendant ces 60 secondes, alors la LED le délai de 60 secondes recommence.

Certes le choix du capteur n'est pas optimum, il y aura une marge d'erreur d'au plus une minute ...
Posts: 17
Joined: Fri Apr 28, 2017 1:44 am
by jelopo » Fri May 19, 2017 6:56 am
@Tomichouno
- si le serveur reçoit un second 1 pendant ces 60 secondes, alors la LED le délai de 60 secondes recommence.

C'est ce que je pensait vouloir dire !

Du coté réglage PIR il y a quelque chose ?

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by YCN- » Fri May 19, 2017 7:46 am
Tomichouno wrote:Ce que j'aimerais réussir à faire, c'est :
- le serveur reçoit un 1, il allume la LED pendant 60 seconde mais il continue à recevoir la trame de 0 et de 1 que le client lui envoie et continue à l'examiner.
- si le serveur reçoit un second 1 pendant ces 60 secondes, alors la LED le délai de 60 secondes recommence.


Garde le serveur d'un côté et utilise un thread pour la led. Ca donnerait un truc comme ça. Attention ça ne compilera pas cest juste pour le concept :

Code: Select all
int my_var;



void fnt_thread_led (void){

   while (1) {
      if ( my_var ) {
         ALLUME_LED(LED);
         sleep(60);
      }
      else {
         sleep(0.5);
      }
   }
}



int main (void) {

   thread my_thread ;
   start_thread ( my_thread , fnt_thread_led);

   while (1) {
      int receive = get_data(); // get_data() c'est tout ce que tu fais avec ton serveur pour recevoir la réponse
      if (receive){
         my_var = 1;
      }
      else {
         my_var = 0;
      }
      sleep (0.5);
   }
}


J'ai vu que tu faisais du python même si ce code est C-like je suppose que tu devrais pouvoir le comprendre. Tout ce qui est thread, ou start thread il faut que tu regardes comment ça se fait en python (cf le lien à la fin de ma réponse). Mais globalement un thread c'est un sous programme que tu vas lancer à l'interieur de ton programme et qui va avoir une vie quasiment indépendante du programme principal, même si ils partagent le même environnement (aka les variables sont partagés, et de même pour les fonctions ect...). Ce que j'ai fait n'est pas très légal puisque l'on est sensé avoir des protection de variables partagés, mais dans un cas simple comme le tiens tu n'en as pas vraiment besoin.

YCN-

-> thread en python : https://openclassrooms.com/courses/appr ... -threading
Posts: 232
Joined: Fri Jun 10, 2016 3:18 pm
by jelopo » Fri May 19, 2017 8:02 am
Autre approche, plutôt que d'envoyer 0 où 1, envoyer la date en secondes à chaque détection de présence par le serveur . Le client effectue une boucle qui allume la led tant que la date < date_envoyée + 1minute.
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm
by jelopo » Fri May 19, 2017 8:25 am
Encore une autre approche mais plus geek : utiliser la durée de vie d'un string dans un serveur redis.
(il faut installer un serveur Redis : # apt-get install redis-server et c'est tout )

A chaque détection, le serveur initialise le string "présence" et dans la foulée lui colle une durée de vie de 60 secondes.
Le client passe son temps à allumer la led tant que le string "présence existe".
Pas besoin d'envoyer de 0 car "presence" est supprimé au bout de la durée EXPIRE.

Exemple en ligne de commande :
Code: Select all
$ redis-cli SET presence 1
OK
$ redis-cli EXPIRE  presence 60
(integer) 1
...
$ redis-cli TTL  presence
(integer) 35
$ redis-cli EXISTS
(integer) 1
...
$ redis-cli TTL  presence
(integer) -1
$ redis-cli EXISTS
(integer) 0


Un buldozer pour enfoncer un clou, mais j'adore :lol: :lol: :lol:

N.B. : Une librairie redis existe sous Python.

A+
Posts: 1099
Joined: Wed Oct 17, 2012 7:53 pm