View  Edit  Attributes  History  Attach  Print  Search

ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
Python > Shell > ATELIERS Python + Qt > PyQt apps > PyQt+Arduino | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | Les Mini-PC |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |

Programmer le pcDuino : Pyduino : Fichier : Ajouter une ligne de donnée horodatée à intervalle régulier dans un fichier texte, avec "journalisation" automatique toutes les minutes.

Par X. HINAULT - Juillet 2013

Ce que l'on va faire ici

  • Dans ce code, je vous montre comment ajouter une ligne de données horodatées dans un fichier à intervalle régulier, avec journalisation automatique du fichier toutes les minutes. Autrement dit, lorsque l'on change de minute, un nouveau fichier est créé.
  • L'intérêt ici est essentiellement de tester la journalisation automatique des fichiers... sans avoir à attendre 24H pour s'assurer du bon fonctionnement.
  • Le fichier obtenu pourra être lu dans un navigateur web à l'aide du code suivant : Afficher une courbe à partir d'un fichier de données Veuiller simplement à utiliser le même nom de fichier dans les 2 codes.

Pré-requis

  • un mini-PC (pcDuino conseillé) avec système Lubuntu opérationnel. Voir si besoin la page d'accueil du pcDuino
  • Langage Python (2.7) et l'IDE Pyduino ou l'éditeur Geany installés. Voir si besoin : Logiciel pour développer avec Pyduino
  • ma librairie pyDuino installée : voir si besoin : Télécharger et installer Pyduino sur le pcDuino
  • D'autre part, vérifier que le répertoire utilisé pour le stockage des données existe, à savoir ~/data/text/ (ici, le ~ symbolise le répertoire /home/user/). Si le répertoire n'existe pas, le créer graphiquement ou le faire avec la commande :
$ mkdir data/text/
  • Noter qu'il est également possible de le faire directement depuis le code Pyduino...

Schéma fonctionnel

  • Le code Pyduino lance écrit des données dans un fichier texte

Matériel nécessaire

Système

  • Le pcDuino
  • On pourra utiliser au choix le stockage en mémoire NAND interne (par défaut), ou bien sur une carte SD ou une clé USB. Le chemin sera à adapter en conséquence.

E/S

  • Pas utilisées.

Instructions de montage

  • Aucun montage.

Le montage à réaliser

  • Aucun montage

Le fichier *.yno

Copier/coller ce code dans l'IDE Pyduino

Le fichier *.py

Copier/coller ce code dans l'éditeur Geany :


#!/usr/bin/python
# -*- coding: utf-8 -*-

# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Aout 2013- Tous droits réservés - GPLv3
# voir : https://github.com/sensor56/pyDuino

# Creer un fichier de donnees horodatees avec journalisation (=nouveau fichier) auto par minute

from pyduino import * # importe les fonctions Arduino pour Python
import datetime # pour operations facilitees sur date/heure

# entete declarative
noLoop=True


filepath=""
filename=""
myDataPath=""

compt=0
refTime=None
intervalle=1 # intervalle en sec entre 2 mesures
#nombreMesures=1000 # nombre de mesures

minute0="" # derniere minute prise en compte
today0=""  # dernier jour pris en compte
hour0="" # derniere heure prise en compte

# duree = intervalle x (nombreMesure-1)

#--- setup ---
def setup():

        global filepath, filename, myDataPath, today0, hour0, minute0, refTime

        # définition initiale fichier

        myDataPath=("data/text/") # chemin d'enregistrement

        createFilename() # cree le nom du fichier a utiliser en se basant sur l'heure courante

        print filepath

        # creation fichier au besoin
        if exists(filepath):
                print "Le fichier existe"
        else :
                print "Le fichier n'existe pas : creation du fichier"
                myFile=open(filepath,'w') # création du fichier
                myFile.close()

        # memorise temps de reference
        #refTime=datetime.datetime(int(year()), int(month()), int(day())) # date a utiliser - heure 00:00:00 si pas precise
        #print refTime

        loop() # premier appel loop

        # NB : on peut aussi ouvrir le fichier dans l'editeur pour verifier son contenu

# -- fin setup --

# -- loop --
def loop():

        global filepath, filename, myDataPath, today0, hour0, minute0, refTime, compt

        if minute0!=minute():  # si la minute memorisee est differente minute courante

                createFilename()

                # creation fichier au besoin
                if exists(filepath):
                        print "Le fichier existe"
                else :
                        print "Le fichier n'existe pas : creation du fichier"
                        myFile=open(filepath,'w') # création du fichier
                        myFile.close()

                addDataToFile(filepath)  #ajoute donnee au fichier

        else: # sinon...
                addDataToFile(filepath)  #ajoute donnee au fichier

        """
        #-- lecture du fichier -- pour debug
        myFile=open(filepath,'r') # ouverture en lecture
        print ("Contenu du fichier : ")
        myFile.seek(0) # se met au debut du fichier
        print myFile.read() # lit le fichier

        myFile.close() # fermeture du fichier
        """


        # auto rappel de loop
        compt=compt+1 # incrémente compteur

        timer(intervalle*1000, loop) # auto appel de loop toutes les secondes

# -- fin loop --

def addDataToFile(filepathIn):

        global filepath, filename, myDataPath, today0, hour0, minute0, refTime, compt

        myFile=open(filepathIn,'a') # ouverture pour ajout de texte
        #myFile=open(filepath,'w') # ouverture pour ecriture avec effacement contenu

        #-- ajout de chaines au fichier

        #for t in range(1440) : # defile 1440 minutes theoriques
        dataValue=str(random(0,1023)) # genere une valeur aleatoire entiere

        #dataTime=refTime+datetime.timedelta(0, t*60) # jours, secondes - ici toutes les minutes
        #dataTime=refTime+datetime.timedelta(0, compt*intervalle) # jours, secondes - ici toutes les minutes
        #dataTime=datetime.timedelta(0, t*60) # jours, secondes - ici toutes les minutes - sans refTime

        #print dataTime

        # format de donnees utilise : JJ/MM/YYYY hh:mm:ss , val \n
        #dataLine=today('/') + " " + hh +":"+mm + ":" + str(t)+","+dataValue+"\n"
        #dataLine=str(dataTime)+","+dataValue+"\n" # format datetime JJ-MM-AAAA hh:mm:ss
        dataLine=today("-")+ " " + hour() +":"+ minute() +":"+ second() +"," + dataValue+"\n"# format datetime JJ-MM-AAAA hh:mm:ss
        print dataLine # debug
        myFile.write(dataLine) # ecrit la ligne dans le fichier

        myFile.close() # fermeture du fichier en ecriture

# fin addDataToFile

# fonction pour creer nom fichier
def createFilename() :

        global filepath, filename, myDataPath, today0, hour0, minute0, refTime, compt

        today0=today("_") # memorise jour courant
        hour0=hour() # memorise heure courante
        minute0=minute() # memorise minute courante

        path=homePath()+myDataPath  # chemin du répertoire à utiliser
        filename="data_"+today0+"_"+hour0+"_"+minute0+".txt" # nom du fichier
        filepath=path+filename # chemin du fichier

        print filepath

#--- obligatoire pour lancement du code --
if __name__=="__main__": # pour rendre le code executable
        setup() # appelle la fonction main
        while not noLoop: loop() # appelle fonction loop sans fin
 

Ce code est également disponible ici : https://raw.github.com/sensor56/pyduino-exemples/master/SD/WriteDataTestDatetimeTimerMinuteAuto.py

Utilisation

  • Réaliser le montage et connecter le clavier sur le port USB
  • Appuyer sur le bouton exécuter dans Geany
  • Une fenêtre de Terminal doit apparaître : une ligne de données horodatée s'affiche à intervalle régulier correspondant à la ligne ajoutée au fichier.
  • On pourra à tout moment ouvrir le fichier pour voir son contenu :
  • Visualisation depuis un navigateur :

Discussion technique

  • On pose ici les bases d'un datalogging automatisé, avec création d'un fichier différent, automatiquement, pour une période donnée (minute, heure, ou même journée)