Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet domotique raspberry pi c#

17 janvier 2016 à 12:45:43

Bonjour a tous, 

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...

Comment pourrais-je faire?

Pour le reste je pense pouvoir me débrouiller ;) 

Merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2016 à 16:31:17

steph02590 a écrit:

bébé qui va arriver 

félicitations!

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 :p

-
Edité par remace 17 janvier 2016 à 16:35:25

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

17 janvier 2016 à 20:37:29

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 ...

-
Edité par steph02590 17 janvier 2016 à 21:14:44

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2016 à 0:24:03

j'ai trouvé 2-3 pistes:

  • essaie de mettre à jour ta version de ta lib RPI.GPIO (va savoir comment...)
  • je ne vois pas de fonction qui désactive l'I2C en fin de programme, c'est normal? (quelque chose comme GPIO.cleanup() )
  • as-tu bien vérifié comment fonctionne ta lib SMBus?
  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

18 janvier 2016 à 16:54:37

Pour te répondre :

-Ma lib RPI.GPIO est a jour.

-Il n'y en a pas certes, mais pour le moment ce n'est pas ce qui me géne. Et dans tout les codes que j'ai vu je n'ai rien vu de tout ça.

-Pour SMBus oui j'ai bien vérifier :/ même si je n'en suis pas sur d'où le fait que je viennes demander de l'aide aussi :)

  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2016 à 20:38:39

J'ai trouvé ce code qui fonctionne très bien :)

#!/usr/bin/python3
import struct 
import array 
import time 
import i2c_base 
HTU21D_ADDR = 0x40 
CMD_READ_TEMP_HOLD = b"\xE3" 
CMD_READ_HUM_HOLD = b"\xE5" 
CMD_READ_TEMP_NOHOLD = b"\xF3" 
CMD_READ_HUM_NOHOLD = b"\xF5" 
CMD_WRITE_USER_REG = b"\xE6" 
CMD_READ_USER_REG = b"\xE7" 
CMD_SOFT_RESET = b"\xFE" 

class HTU21D(object):
    def __init__(self):
        self.dev = i2c_base.i2c(HTU21D_ADDR, 1) # HTU21D 0x40, bus 1
        self.dev.write(CMD_SOFT_RESET) # Soft reset
        time.sleep(.1)
    def ctemp(self, sensor_temp):
        t_sensor_temp = sensor_temp / 65536.0
        return -46.85 + (175.72 * t_sensor_temp)
    def chumid(self, sensor_humid):
        t_sensor_humid = sensor_humid / 65536.0
        return -6.0 + (125.0 * t_sensor_humid)
    def temp_coefficient(self, rh_actual, temp_actual, coefficient=-0.15):
        return rh_actual + (25 - temp_actual) * coefficient
    def crc8check(self, value):
        # Ported from Sparkfun Arduino HTU21D Library: 
        # https://github.com/sparkfun/HTU21D_Breakout
        remainder = ((value[0] << 8) + value[1]) << 8
        remainder |= value[2]
        # POLYNOMIAL = 0x0131 = x^8 + x^5 + x^4 + 1 divisor = 0x988000 is 
        # the 0x0131 polynomial shifted to farthest left of three bytes
        divisor = 0x988000
        for i in range(0, 16):
            if(remainder & 1 << (23 - i)):
                remainder ^= divisor
            divisor = divisor >> 1
        if remainder == 0:
            return True
        else:
            return False
    def read_temperature(self):
        self.dev.write(CMD_READ_TEMP_NOHOLD) # Measure temp
        time.sleep(.1)
        data = self.dev.read(3)
        buf = array.array('B', data)
        if self.crc8check(buf):
            temp = (buf[0] << 8 | buf[1]) & 0xFFFC
            return self.ctemp(temp)
        else:
            return -255
    def read_humidity(self):
        temp_actual = self.read_temperature() # For temperature coefficient compensation
        self.dev.write(CMD_READ_HUM_NOHOLD) # Measure humidity
        time.sleep(.1)
        data = self.dev.read(3)
        buf = array.array('B', data)
        if self.crc8check(buf):
            humid = (buf[0] << 8 | buf[1]) & 0xFFFC
            rh_actual = self.chumid(humid)
            rh_final = self.temp_coefficient(rh_actual, temp_actual)
            rh_final = 100.0 if rh_final > 100 else rh_final # Clamp > 100
            rh_final = 0.0 if rh_final < 0 else rh_final # Clamp < 0
            return rh_final
        else:
            return -255 
if __name__ == "__main__":
    while 1:
        obj = HTU21D()
        print("Temp: %s C" % obj.read_temperature())
        print("Humid: %s %% rH" % obj.read_humidity())
        time.sleep(.5)

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2016 à 21:25:33

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)

-
Edité par remace 19 janvier 2016 à 22:47:41

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

19 janvier 2016 à 21:27:37

Je n'ai rien trouver pour lire l'i2c en c# :/
  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2016 à 23:27:03

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?

-
Edité par remace 19 janvier 2016 à 23:59:59

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

19 janvier 2016 à 23:34:13

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...

  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2016 à 21:53:48

ha? tu excite ma curiosité là... les timers de C# ne sont pas logiciels?
  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

20 janvier 2016 à 23:03:17

Que veut tu dire par "Les times de C# ne sont pas logiciels"?
  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2016 à 0:48:00

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...

-
Edité par remace 21 janvier 2016 à 0:48:18

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

21 janvier 2016 à 18:58:01

Et bien le framework .net le propose :)
  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2016 à 19:21:49

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)
  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

21 janvier 2016 à 19:34:28

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

-
Edité par steph02590 21 janvier 2016 à 21:03:03

  • Partager sur Facebook
  • Partager sur Twitter
25 janvier 2016 à 13:53:10

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

une idée?


  • Partager sur Facebook
  • Partager sur Twitter
27 janvier 2016 à 14:56:33

plusieurs choses:

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 :p
ensuite, pourquoi envoyer ton nombre sous forme de string?

-
Edité par remace 27 janvier 2016 à 14:59:18

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

27 janvier 2016 à 16:01:07

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é :/
  • Partager sur Facebook
  • Partager sur Twitter
27 janvier 2016 à 16:03:46

Il doit y avoir un beug sur OCR je n'arrive pas à éditer mon message depuis mon smartphone. Je précise que j'ai essayer de rajouter un

Serial.println ("quelque chose");

Et que je vois bien le message passer 

  • Partager sur Facebook
  • Partager sur Twitter
29 janvier 2016 à 17:45:13

bah si ça marche avec le code C, où est le problème?

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

30 janvier 2016 à 19:56:30

Et bien ça m'embete d'utiliser le C en + du python et du c# ^^.(désolé pour le retard un heureux evenement est arrivé :D)
  • Partager sur Facebook
  • Partager sur Twitter
30 janvier 2016 à 21:30:18

ha oui, quand tu disais "bientôt", c'était "bientôt" quoi :p

bah re-félicitations!

sinon, pour ton programme, c'est étonnant à quel point tu choisis tes langages à chaque fois :p . 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 :p

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

31 janvier 2016 à 10:08:50

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

  • Partager sur Facebook
  • Partager sur Twitter
31 janvier 2016 à 12:00:46

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 :p ),

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 :p

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"?

-
Edité par remace 31 janvier 2016 à 12:17:09

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

31 janvier 2016 à 12:22:16

sinon, pour lire un capteur à travers d'I2C, j'ai trouvé ça (clique c'est un lien) en 1 recherche google :p
  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.

31 janvier 2016 à 18:19:36

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

-
Edité par steph02590 31 janvier 2016 à 18:53:26

  • Partager sur Facebook
  • Partager sur Twitter
31 janvier 2016 à 22:18:57

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 :p

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 :p

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

-
Edité par remace 31 janvier 2016 à 22:21:43

  • Partager sur Facebook
  • Partager sur Twitter

oui. non. enfin je regarde et je te dis.