je ne sais pas trop ou poster ce sujet car il parle d'électronique et de plusieurs langage...
j'ai pour projet d'utiliser mon raspberry pi 2 comme ordinateur de contrôle pour une gestion domotique.
Je vais utiliser :
-1 Raspberry pi 2
-2 modules SHT21 pour récupérer la température et l'humidité interieur et extérieur.
-1 camera pour la chambre de bébé qui va arriver.
-1 relais TOR pour contrôler la chaudière.
-1 écran officiel pour le raspberry afin d'afficher une interface graphique codé en c#.
J'ai plusieurs question :
1- je ne trouve aucune bibliothéque pour les modules SHT21 en c#. Donc j'ai voulu porté cette partie du code en python mais lorsque je lance mon code, il me dis :
pi@raspberrypi ~/Desktop $ sudo ./test.py
Traceback (most recent call last):
File "./test.py", line 10, in <module>
data = bus.read_i2c_block_data(0x40, 0)
IOError: [Errno 16] Device or resource busy
Voici mon code :
#!/usr/bin/python3.2
# -*-coding:Latin-1 -*
import time
from smbus import SMBus
bus= SMBus(1) # 1 indique qu'il faut utiliser le port /dev/i2c-1
while True:
# Le composant porte l'adresse 0x48 (A0 et A1 relies à GND)
# On va lire plusieurs octets a partir du registre 0
data = bus.read_i2c_block_data(0x40, 0)
tempMSB = data[0]
tempLSB = data[1]
temperature=(((tempMSB << 8) + tempLSB) >>7) * 0.5
if temperature > 128 : # test si la temperature est negative
# complement a 1 de la temperature
temperature = (((((tempMSB << 8) + tempLSB) >>7 )* 0.5) -256)
print(temperature)
time.sleep(2)
Je ne comprend pas vraiment comment ça ce fait que j'ai ce type d'erreur. Pourriez vous me mettre sur la voie?
2- Je voudrais integré le flux vidéo de la camera ip (Je ne l'ai pas actuellement c'est pour cela que j'utilise mon smartphone comme camera ip pour faire mes test). Sur windows, j'arrive a ouvrir la page dans une Form en utilisant un WebBrowser mais quand je porte l'exe sur le raspberry je n'arrive pas a le lancer. Je précise qu'une textBox ou un bouton fonctionne bien par contre...
1ère et seule remarque: pourquoi programmer en C# dans un environnement linux?
pour le premier point soulevé, il semblerait qu'il y ait un soucis d'accès à ton bus I2C: il semble déjà occupé. et là je sais pas quoi te dire, à part te lancer sur les pistes courantes:
un autre logiciel s'en sert (une ancienne instance "mal fermée" du programme par exemple)
le fichier réception est vide
l'I2C est désactivé par l'OS? (je vois pas bien comment, mais je suppose que c'est possible)
ça pourrait etre aussi un soucis de droits d'utilisation (sous linux, tout est fichier, et tout fichier an des droits d'utilisation)
sinon pour le 2e problème, j'y connais pas grand chose ni en c# ni en python, à part que ton flux vidéo est continu là où un champ de texte et un bouton sont fixes. donc à priori c'est pas du tout la même chose
en attendant que quelqu'un de plus expérimenté que moi passe je te laisse réfléchir avec les 2-3 modestes pistes que je t'ai données
Merci de ta réponse. L'i2c est bien activé (dans les paramètres de raspbian). D'ailleurs je suis passé sur i2c-0 au lieu de i2c-1 est maintenant j'ai cette erreur :
Traceback (most recent call last):
File "./test.py", line 10, in <module>
data = bus.read_byte(0x40)
IOError: [Errno 5] Input/output error
Ma sonde est elle foireuse ??? J'ai essayer plein de truc et rien ne vas ... Je désespère légèrement la ....
Edit : J'ai trouver tout un code en C et ça fonctionne, alors pourquoi ça ne fonctionne pas en python ... Mystère!!!!! mais frustrant ...
Maintenant j'ai une bonne question . Comment je pourrais récupérer les valeurs de la sonde en C#. J'ai pensé à ecrire dans un fichier la valeur de la sonde puis executer le code python depuis C# et relire le fichier a chaque fois mais je pense que c'est un peu lourd non ?
pourquoi pas lire directement le fichier qui contient les messages de la liaison I2C avec le C#? non parce que je dis ça, mais sur ces cartes raspberry Pi, c'est géré de manière à ce que les messages s'écrivent dans un répertoire (/dev/ quelque chose)
bah tu peux ouvrir un fichier et lire ce qui est dedans non?
à priori ce serait dans /sys/class/GPIO/I2c-1, quelque chose comme ça. navigue dans ton arborescence dans /sys/class, tu verras tu trouveras un dossier dont le nom est plus ou moins explicite, avec I2C dedans, normalement... et dans ce dossier, tu as un fichier qui dit si le port est activé, tu as un fichier qui a ce qu'il contient, et d'autres...
EDIT: c'est dans /sys/class/i2C-adapter/i2c-[0 ou 1]/
ceci dit, je vais réitérer ma question-remarque, pourquoi C# dans un environnement linux?
Oui c'est ce que j'ai fait, et ça fonctionne je viens lire toutes les 5 secondes la sonde et tout va bien. Et l'avantage du C#, c'est que grace au timer, je n'utilise presque pas de CPU :).
Me reste maintenant plus qu'a rajouter la camera :/ et le relais pour la chaudiere. Le plus compliqué reste la caméra...
bah un timer, c'est un objet physique en électronique (un registre qui s'incrémente tout seul en fonction des vibrations d'un quartz, par exemple, sans forcément prendre du temps au processeur)
mais c'est aussi un objet "logiciel", qui "fait des incrémentations dans un registre" mais qui le fait à travers le processeur, grâce à une scrutation de l'horloge (et ça prend du temps CPU, ça, par contre).
et vu le degré d'abstraction du langage C#, et ce pourquoi il a été créé, ça m'étonnait d'avoir ce genre de possibilités...
alors j'ai regardé (ça m'étonnait vraiment, c'est pour ça que j'ai regardé), c'est un timer logiciel. donc ça prend du temps au CPU. pas suffisamment pour que ça se voie sur un intel 4770K ou quoi, ou sur un du style de celui qui est sur la RPi, (et encore que, si tu charge suffisamment le processeur avec d'autres programmes, un code C# avec un timer dedans peut vite finir par "être la goutte d'eau". donc au final pas de différence avec Java ou C++. sauf que c'est pas très portable (Mono qui est loiiiiin à la traîne par rapport au développement du framework.net)
Je comprends mieux ^^. Mon petit programme tourne avec deux timers et je consomme peu de cpu (2 a 3 %). J'ai un timers pour lire dans le fichier où est stocker la température et un autre pour afficher l'heure .
Mono est un peu à la traîne certe mais c'est déjà pas trop mal. Les forms sont pris en charge, il y a juste des petites choses à adapté ; )
J'ai branché un émeteeur radio sur mon arduino et le recepteur sur le RPI. J'ai trouvé un petit tuto avec les codes tout fait pour envoyer un message de l'arduino au raspberry pi. Mais je n'arrive pas a recevoir. Je ne vois pas ce qui peut déranger... Voici les codes :
Arduino :
// Émission d'un message a 433 MHz par l'Arduino
// basé sur:
// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
#include <VirtualWire.h>
int compteur = 0;
const char *msg = "Bonjour, ici l'Arduino. Message # ";
char nombre[VW_MAX_MESSAGE_LEN];
char message[VW_MAX_MESSAGE_LEN];
void setup()
{
Serial.begin(9600); // Debugging only
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}
void loop()
{
compteur++;
// Conversion du int en tableau de chars
itoa(compteur,nombre,10); // 10 car décimal
strcpy (message, msg);
strcat(message,nombre);
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
delay(200);
}
Python :
import time
import pigpio
#!/usr/bin/env python
# -*- coding: latin-1 -*-
'''
Réception d'un message par le Raspberry Pi,
reçu à 433 MHz par un récepteur
relié à la pin GPIO 11
Nécessite la présence du fichier vw.py dans le
même répertoire.
http://www.raspberrypi.org/forums/viewtopic.php?t=84596&p=598087
'''
import vw
RX=11
BPS=2000
pi = pigpio.pi()
rx = vw.rx(pi, RX, BPS)
start = time.time()
print("En attente de la reception des donnees")
while (time.time()-start) < 100:
while rx.ready():
print("".join(chr (c) for c in rx.get()))
rx.cancel()
pi.stop()
déjà "je n'arrive pas à recevoir", ça veut dire quoi, pour toi?
je reçois un message mais il ne veut rien dire (il n'est pas identique à celui que j'ai envoyé et je trouve pas le lien entre les deux)
je ne reçois pas du tout de message
obi-wan kenobi
sinon, je vois que tu fais clignotter une led pendant l'envoi, ça se voit ou pas? (sinon mets un delay de 0.5s avant de l'éteindre tu verras le résultat
ensuite, pourquoi envoyer ton nombre sous forme de string?
Je dirai obi-wan kenobi ^^. Je ne reçois pas de message , le problème vient bien de la réception car avec un code en C que j'ai récupéré ça fonctionne .... et ce code est un code que j'ai récupérer sur internet aussi car je ne connaissait vraiment pas les modules rf. La led n'est pas branché :/
ha oui, quand tu disais "bientôt", c'était "bientôt" quoi
bah re-félicitations!
sinon, pour ton programme, c'est étonnant à quel point tu choisis tes langages à chaque fois . si y'en a un à ne pas balancer dans la liste que tu cites, c'est bien le C, qui est systématiquement fourni en libs pour quasiment tout ce qui est électronique sur Terre. python, j'ai appris à m'en méfier et j'aime pas du tout, donc j'en parlerai pas de trop, pour éviter de faire de la désinformation, mais il me semble que c'est pas du tout adapté à faire de l'électronique, même si les fanboys du langage qui ont un raspberry Pi te diront systématiquement le contraire en faisant clignotter des leds (je hurle au bullshit dans ma tête quand je vois ça, mais passons). quand à C# je te fais pas un dessin, je t'ai déjà dit ce que je pensais de ce choix
Merci je suis d'accord avec toi pour le C, je vais peut être même essayer de virer python car moi non plus je ne suis pas fan, mais je quand je cherche des exemple pour le pi je trouve souvent du python. Il faudrais que je trouve comment récupérer une sonde brancher en i2c en C. Et pour le c# c'est juste pour l'interface graphique au moins que tu es autre choses à me proposer car avec les winforms je me trouve assez limité ou alors c'est moi sui suis limiter lol
tu as des éditeurs qui te font une interface sur mesure "en point&clic" avec java -je pense à un plugin netbeans, mais je suppose que ça doit aussi se trouver dans eclipse (et c'est portable, en plus, parce que c'est java, il suffit d'installer une jvm sur ton raspberry Pi ),
tu as de quoi faire aussi avec Qt en C++ (g++ compile aussi le C, du coup ça te fait pas vraiment de nouveau langage), je suppose que la création d'interfaces en graphique est possible (et à priori ça se porte bien d'un système à un autre, même si j'en suis moins sûr, par rapport aux appels système)
python permet d'en générer de belles aussi, mais je connais pas bien, et j'aime pas python
si j'avais eu ton projet, j'aurais certainement fait en java pour l'interface et gérer la webcam (parce qu'il existe des libs pour faire de la vision et du traitement d'image directement depuis la camera, je pense à openCV notamment), et en C pour l'interaction avec les différents capteurs plus "électroniques". mais ça c'est parce que je connais mieux Java et presque pas C# (je connais plus ou moins l'histoire de .NET, et les soucis qu'ils ont, notamment pour le portage, c'est tout)
dis voir, tu serais pas dev' web, pour faire tes programmes avec autant de "lancement d'exécutables tiers"?
Merci pour ton temps passé sur mon poste. Je ne connais pas du tout le java. Donc au pire je pourrais peut être me lancer sur le c++ car j'ai quelques base. A part QT n'y a t'il pas un autre logiciel? Tu veux dire quoi par dev'web? Développeur Web? car si c'est ça et bien non fin j'ai des bases en HTML/CSS et vite fait en php (j'ai commencé le cour ).
J'ai regarder le liens que tu m'a envoyer et je devrais pouvoir me debrouillé avec ça
Qt c'est un truc qui simplifie un peu le fait de faire des interfaces, mais tu dois pouvoir trouver ton bonheur dans les libs standard aussi, hein
mais vu que t'as commencé avec c# que t'as l'air de bien connaitre, continue comme ça, je m'étonnais juste de tes choix, c'est tout
la seule chose utile que tu peux retenir de tout ce que j'ai dit, c'est que quel que soit l'objet électronique, si driver il y a, tu le trouveras en C. ou en C++ comme pour les libs arduino, mais c'est plus ou moins pareil dans ce cadre (en C on crée une structure qu'on passe en argument de chaque fonction liée à cette structure, en C++ on fait un objet avec ses méthodes... c'est pareil d'un point de vue usage, quoi).
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.