Aller au contenu


Photo
- - - - -

Besoin d'aide avec python et arduino


  • Veuillez vous connecter pour répondre
3 réponses à ce sujet

#1 Snyp54

Snyp54

    Nouveau membre

  • Membres
  • 25 messages

Posté 28 novembre 2018 - 04:18

Bonjour a tous,

voila j'aurais besoin d'un coup de main. Je réalise une station météo avec un Arduino qui envoie ses données sur le port série @9600.

j'arrive à lire les valeurs sur le port série de l'Arduino IDE. Jusque la, pas de problème.

 

Maintenant j'utilise deux modules Dorji,un du coté de l'Arduino, un autre sur un serveur Debian avec adaptateur usb visible en /var/ttyUSB0 reglé en 9600 lié entre eux.

Coté arduino, la led rouge du module dorji s'allume lorsque le port série envoie quelque chose.

Coté serveur, la led bleu du module dorji s'allume signifiant qu'il à recu des données du module dorji de l'arduino

Mon problème est que je n'arrive pas ,du coté du serveur avec python, à lire le port /var/ttyUSB0.

 

Je vous met le code python(2.7) ainsi que le code Arduino.

#!/usr/bin/python
import serial 
import MySQLdb
import sys

#establish connection to MySQL.
dbConn = MySQLdb.connect("adress","login","pass","bdd_name") or die ("could not connect to database")
#open a cursor to the database
cursor = dbConn.cursor()

device = '/dev/ttyUSB0' # usually ttyUSB0 or ttyUSB1 for linux, or COM port number for windows
baudrate = 9600



def getSerialData():
 try:
  print "Trying...",device
  arduino = serial.Serial(device, baudrate) 
 except: 
  print "Failed to connect on",device    
 try:
     print "Trying to get data"
     next(arduino)
     data = arduino.readline()  #read the data from the arduino
     pieces = data.split("\t")  #split the data by the tab
     print "Data: %s" % data
     print "Piece 1: %s" % pieces[0]
     print "Piece 2: %s" % pieces[1]
     #Here we are going to insert the data into the Database
     try:
       print "Trying insertion..."
       cursor.execute("INSERT INTO data (temp,humidity) VALUES (%s,%s)", (pieces[0],pieces[1]))
       dbConn.commit() #commit the insert
       
     except MySQLdb.IntegrityError:
      print "failed to insert data"
     finally:
      print "closing cursor"
      
      del pieces[:]
 except:
  print "Failed to get data from Arduino!"
  sys.exit(1)


val = 0
while val == 0 :
 getSerialData()


#include <Wire.h>
#include "SparkFunHTU21D.h"

//Create an instance of the object
HTU21D myHumidity;

void setup()
{
  Serial.begin(9600);

  myHumidity.begin();
}

void loop()
{
  float humd = myHumidity.readHumidity();
  float temp = myHumidity.readTemperature();

 
  
  Serial.print(temp, 1); //HTU21D temperature (°C)
  Serial.print("\t"); 
  Serial.print(humd, 1); //HTU21D humidite (%)
  Serial.print("\t");

  delay(1000);
}

Merci pour l'aide que vous pourrez m'apporter.



#2 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 147 messages
  • Gender:Male
  • Location:Autriche

Posté 28 novembre 2018 - 05:19

À vue de nez, tu tentes d'établir la connexion à chaque appel de ta fonction. Tu devrais sortir cette instruction et la placer dans ta fonction main, juste avant ta boucle.

La structure du code serait :
import module1
import module2
...

def functionGetData(args):
   code

if __name__ == "__main__":
   # tenter d'établir connexion:
   try/except : arduino = serial.Serial( ... ) ...

   # si connexion établie:
   while condition:
     functionGetData()

Et voir si tu reçois quelque chose.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#3 Snyp54

Snyp54

    Nouveau membre

  • Membres
  • 25 messages

Posté 28 novembre 2018 - 05:23

Alors j'ai oublié de préciser que le code ce lance et ce bloque ici:

try:
     print "Trying to get data"

je regarde pour ce que tu me dit @R1D1



#4 Snyp54

Snyp54

    Nouveau membre

  • Membres
  • 25 messages

Posté 29 novembre 2018 - 09:47

Bonsoir, bon j'ai farfouillé un peu le net et en ajoutant un timeout=10 cela marche presque.

Oui presque, car mon Arduino envoyé ses données sur le port série toutes les 5 secondes et mon programme python en prend que un sur deux :/.

Le code rectifié:

#!/usr/bin/python

import serial 
import MySQLdb
import sys

#establish connection to MySQL.
dbConn = MySQLdb.connect("localhost","root","18Avril1989","weather") or die ("could not connect to database")
#open a cursor to the database
cursor = dbConn.cursor()

device = '/dev/ttyUSB0'
baudrate = 9600




def getSerialData():
 try:
  print "Connection sur:",device
  arduino = serial.Serial(device, baudrate, timeout=10) 
 except: 
  print "Connection impossible sur:",device    
 try:
     print "Recuperation des donnees:"
     next(arduino)
     data = arduino.readline()  #read the data from the arduino
     pieces = data.split("\t")  #split the data by the tab
     print "Data: %s" % data
     print "Piece 1: %s" % pieces[0]
     print "Piece 2: %s" % pieces[1]
     print "Piece 3: %s" % pieces[2]
     print "Piece 4: %s" % pieces[3]
     print "Piece 5: %s" % pieces[4]
     #Here we are going to insert the data into the Database
     try:
       print "Trying insertion..."
       cursor.execute("INSERT INTO data (temp,humidity,tempp,humdp,pres) VALUES (%s,%s,%s,%s,%s)", (pieces[0],pieces[1],pieces[2],pieces[3],pieces[4]))
       dbConn.commit() #commit the insert
       
     except MySQLdb.IntegrityError:
      print "failed to insert data"
     finally:
      print "closing cursor"
      
      del pieces[:]
 except:
  print "Impossible de recuperer les donnees!!!"
  sys.exit(1)


val = 0
while val == 0 :
 getSerialData()





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users