IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Eclairage automatique d'un aquarium


Sujet :

Raspberry Pi

  1. #1
    Invité
    Invité(e)
    Par défaut Eclairage automatique d'un aquarium
    Bonjour tout le monde,

    J'ai acheté un aquarium il y a quelques semaines et j'aimerai automatiser l'éclairage de celui-ci.
    Pour cela j'utilise un relais contrôlé par un Arduino qui lui-même est relié à une Raspberry Pi.


    J'ai donc créé un programme python (qui utilise la bibliothèque Serial) qui sera activé par une tâche planifiée :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import serial
     
    port = "/dev/ttyUSB0"
    output= 9600
    ser = serial.Serial(port, output)
    nb ="1"
    #nb = raw_input("nb: ")
     
    ser.write(nb)
     
    #print(ser.name)
    print(nb)

    le code est simple et pourtant il ne se passe rien à l'exécution.
    Ce qui est bizarre c'est que si je remplace le nb=1 par le raw_input() qui est en commentaire et que l'utilisateur rentre bien "1", le relais se déclenche...

    Voici le code de la Arduino :

    Code Arduino : 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
    int byte_read = 0; //<= the current byte
    int recieved_integer = 0; //<= the current recieved integer
     
    void setup() {
      pinMode(2, OUTPUT);
      digitalWrite(2, HIGH);
     
      Serial.begin(9600);
    }
     
    boolean is_a_number(int n){
      return n>=48 && n <=57;
    }
     
    int ascii2int(int n, int byte_read) {
      return n*10 + (byte_read - 48);
    }
     
    void loop() {
      recieved_integer =0;
      Serial.write("coucou");
      if (Serial.available()) { 
     
        int byte_read = Serial.read();
     
        if (is_a_number(byte_read)) {
          recieved_integer = ascii2int(recieved_integer, byte_read);
        }
     
        switch (recieved_integer ) {
          case 1:
              digitalWrite(2, LOW);
            break;
          case 2:
              digitalWrite(2, HIGH);
            break;
        }     
     
     
      }
      delay(2000);
    }

    Si vous avez une solution à mon problème je suis preneur...
    Dernière modification par Invité ; 12/10/2019 à 14h42. Motif: Ajout coloration syntaxique

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    C'est sans doute parce que l'ouverture du port dans Python provoque un reset de l'Arduino et qu'il faut lui laisser le temps de redémarrer avant d'y envoyer des données.
    Le temps de la saisie au clavier grâce au raw_input, l'Arduino a fini de démarrer et est prêt à recevoir les données.

    Une solution simple, après l'ouverture du port, faire une pause d'une ou deux secondes avant d'écrire dessus.

    Question : raw_input, c'est du Python 2. Pourquoi ne pas passer à Python 3 ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai testé de mettre un time.sleep(5) (j'ai même essayé avec 20 secondes de pause), cela n'a rien changé ...

    Pour le raw_input() j'avais suivi un tuto et je ne faisais pas attention à la version de python que j'utilisais... Mais maintenant j'utilise bien la version 3

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Citation Envoyé par SabSab43 Voir le message
    J'ai testé de mettre un time.sleep(5) (j'ai même essayé avec 20 secondes de pause), cela n'a rien changé ...
    Même en Python 2 ? Parce qu'avec Python 3 il pourrait bien il y a voir d'autres soucis dus au traitement des chaînes de caractères qui est différent de Python 2

  5. #5
    Invité
    Invité(e)
    Par défaut
    Même résultat en python 2...

    Pour lancer un programme un python 3 il faut bien utiliser la commande python3 programme.py et pour python 2 la commande python programme.py ?
    Je suis complétement novice avec les Raspberry et les Arduino donc peut-être que j'utilise pas la bonne commande ?

    Je remets mon code au cas où (le "Finish !" s'affiche bien à la fin du programme)...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import serial
    import time
     
    port ="/dev/ttyUSB0"
    output = 9600
    ser = serial.Serial(port, output)
    nb = 1
     
    time.sleep(5)
    ser.write(nb)
     
    print("Finish !")

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    nb=1 ou nb="1" ? Ce n'est pas la même chose...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Oups... oui en effet ...

    Je veux utiliser des entiers car j'ai aussi deux sondes sur l'Arduino (elles ne sont pas encore branchées).

    Du coup en fonction du nombre que j'enverrai à l'Arduino celle-ci me retournera les valeurs des sondes ou allumera/éteindra l'éclairage.

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Bonjour,

    si tu utilises un Arduino, active le flag rtscts. Un exemple (python 3) :
    Code python : 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
     
    # xonxoff = false
    # rtscts = true ; pour un reset de l'Arduino au démarrage
    #                 et une synchronisation des ports série
    # dsrdtr = false ; pour Arduino Mini c'est sans importance (= UNO)
    #                  pour Arduino Micro (=Leonardo), plantage si dsrdtr=true 
     
    import serial
    import time
     
    ser = serial.Serial()
    ser.port='/dev/ttyUSB0'
    ser.baudrate = 9600
    ser.bytesize = serial.EIGHTBITS 
    ser.parity = serial.PARITY_NONE
    ser.stopbits = serial.STOPBITS_ONE
    ser.timeout = 10
    ser.xonxoff = False     
    ser.rtscts = True     
    ser.dsrdtr = True
    ser.open()
    print('Ouverture du port serie')
     
     
    time.sleep(2)   # laisser le temps à l'arduino de s'initialiser
                    # +/- long selon la carte
     
    ser.flushInput()
    ser.flushOutput()
    print("envoi des données...")
    ser.write("Hello World !\n".encode("utf-8"))
    print(ser.readline())
     
    time.sleep(1)
    ser.write("Coucou !\n".encode("utf-8"))
    print( ser.readline() )
     
    time.sleep(1)
    ser.close()
    print('Terminé')

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai activé le flag rtscts comme tu m'as dit mais le relais ne s'allume toujours pas

    Le code à jour :

    Code python : 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
    import serial
    import time
     
    ser = serial.Serial()
    ser.port='/dev/ttyUSB0'
    ser.baudrate = 9600
    ser.bytesize = serial.EIGHTBITS
    ser.parity = serial.PARITY_NONE
    ser.stopbits = serial.STOPBITS_ONE
    ser.timeout = 10
    ser.xonxoff = False
    ser.rtscts = True
    ser.dsrdtr = True
    ser.open()
    print('Ouverture du port serie')
     
    nb = 1
    time.sleep(5)
     
     
    ser.flushInput()
    ser.flushOutput()
    print("envoi des données...")
    ser.write(nb)
     
    time.sleep(1)
    ser.close()
    print("Terminé")

    Edit: j'ai une arduino MEGA chinoise que j'ai commandé sur Aliexpress, peut être que le problème vient de là ? (lien : https://fr.aliexpress.com/item/32850...30bb6c371Hsd00)

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Le code Arduino attend un caractère : "0", "1", "2", ... "9", codes ASCII 48 à 57 :
    Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boolean is_a_number(int n){
      return n>=48 && n <=57;
    }

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ah oui en effet... Je ne sais pas pourquoi j'étais persuadé que c'était un entier que je devais envoyer ...

    Du coup ça marche maintenant, j'ai remplacé le nb=1 par nb = "1" et le ser.write(nb) par ser.write(nb.encode()).

    Merci à tous pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] [Interface] Redimensionnement automatique
    Par ychalan dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2002, 18h32
  2. BDE : Configurer automatiquement le NETDIR
    Par Harry dans le forum Paradox
    Réponses: 10
    Dernier message: 29/07/2002, 11h33
  3. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19
  4. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo