Lire un fichier text

Bonjour,
Je suis étudiant en science et j'ai fait récemment l'acquisition d'un arduino uno pour mon travail XD
J'aimerais calculer à partir d'un fichier text l'intensité d'une LED.
ce fichier contient des un pourcentage d'intensité lumineuse du temps 0 au temps final.
Existe t-il une commande capable d'assigner à une variable les valeurs de ce fichier text ???

Merci beaucoup pour votre aide :slight_smile: :slight_smile: :slight_smile:

Il viendrai de où le fichier texte ?

Salut B@tto,
Le fichier text est un fichier que j'ai crée à partir de Matlab par exemple.
Il contient un vecteur de % d'intensité :
[0 100 40 20 40 50 100 ... ]

il est localisé dans le même dossier que le code arduino dans l'ordinateur

Oula oui c'est large comme idée, il va falloir préciser parce que la on peut imaginer plusieurs solutions : texte envoyé par un soft sur pc puis envoyé à l'arduino, lecture par l'arduino d'une carte sd ...

En gros l'idée est de générer un vecteur d'intensité lumineuse (en pourcentage d'intensité) avec un soft tel que matlab.
J'enregistre donc ce vecteur dans un fichier text.
Puis mon but est d'importer ce fichier text dans l'arduino et lui faire lire à chaque pas de temps l'intensité lumineuse correspondante afin que ma led s'allume avec telle % d'intensité.

exemple :
[100 0 50 100]
si je prends comme pas de temps toutes les 5 secondes par exemples :
100 % d'intensité pendant 5 secondes puis 0 % d'intensité pendant 5 secondes puis 50 % d'intensité etc.

Peut être qu'il existe une solution plus simple sans passer par un fichier text à importer mais j'avoue que mes connaissance en arduino et en C sont vraiment très limités. =(

Merci beaucoup :slight_smile:

Si on s'en tiens à un principe simple : http://www.earthshineelectronics.com/files/ASKManualRev5.pdf ==> p58 il y a le programme côté arduino : on envoi une chaine par le port série contenant trois valeurs et l'Arduino allume une LED RGB en conséquence.

A toi après côté PC de créer un programme capable de lire ton fichier texte et d'envoyer la chaine à l'Arduino via le port série.

une solution si tu utilise une SD consisterai a ajouter des séparateur genre "; "éventuellement transformer tes valeurs en float ex: 50.0 , 100.0....etc
et utilisé la fonction :
ma_valeur=file.parseFloat (); qui recherche directement des float dans un fichier text
et te décaler dans ton fichier au fur est a mesure avec:

 file.position()+1

au dépars c'est la solution que j'ai utiliser car vraiment plus simple a faire que d’analyser des suites de chaîne de caractère, la c'est les fonction de la lib SD.h qui le font pour toi !
mais il existe plein d'autre possibilité!

Bonjour,

Il existe une solution pour ce genre de probléme : le format CSV.

Voici un exemple de code pour parser une ligne de texte en provenance du port série :

Le principe est le même avec un fichier sur une carte SD.

Bonjour à tous,

Merci pour vos messages et désolé de mon temps de réponse ...
je ne compte pas utiliser de carte SD mais directement passer par l'ordinateur.
Skywodd merci pour ta réponse mais dans ton cas il faut que je passe une ligne de texte en provenance d'un port série et j'avoue que je sais pas trop comment le faire ... aurais tu un lien qui explique comment faire ?

Merci à vous

bobijack:
Skywodd merci pour ta réponse mais dans ton cas il faut que je passe une ligne de texte en provenance d'un port série et j'avoue que je sais pas trop comment le faire ... aurais tu un lien qui explique comment faire ?

Bon attend remet les choses au clair, qu'est-ce que tu veut faire exactement et comment ?

Ok Je vais essayé d'être le plus clair possible ...

Donc j'ai un fichier texte de pourcentage d'intensité :

I = [100 50 20 30 40 90 80 30 ...]

Je veux faire lire ce fichier à l'arduino pour que toutes les 2 mins par exemple il réduise ou augmente l'intensité de 4 leds (les 4 leds se comportent de la même manière)
Donc avec l'exemple que j'ai donné les leds s'allumeront à 100% - puis 2 mins plus tard - 50 % - puis 2 mins plus tard 20 % ... etc.

J'ai un arduino uno mais je peux éventuellement acheter un shield pour carte SD si le problème se résout plus simplement comme ça :slight_smile:

Merci infiniment de ton Aide :wink: :slight_smile:

Moi je suis curieux de voir comment on fait pour lire un fichier text ou csv sur l'ordinateur et balancer tout sa sur le port serie ?
pour moi on peut pas sans un soft qui tourne coté PC , c'est peut'etre ça qui te pose probléme non?
avec processing sa doit pouvoir ce faire des truc comme ça mais j'ai jamais tester perso!

bobijack:
Ok Je vais essayé d'être le plus clair possible ...

Donc j'ai un fichier texte de pourcentage d'intensité :

I = [100 50 20 30 40 90 80 30 ...]

Je veux faire lire ce fichier à l'arduino pour que toutes les 2 mins par exemple il réduise ou augmente l'intensité de 4 leds (les 4 leds se comportent de la même manière)
Donc avec l'exemple que j'ai donné les leds s'allumeront à 100% - puis 2 mins plus tard - 50 % - puis 2 mins plus tard 20 % ... etc.

J'ai un arduino uno mais je peux éventuellement acheter un shield pour carte SD si le problème se résout plus simplement comme ça :slight_smile:

Merci infiniment de ton Aide :wink: :slight_smile:

Oui donc il faut "streamer" le texte par le port série. Une Arduino ne lit pas directement des textes comme un PC. Par contre par le port série tu peux lui transmettre des données, comme dans le lien que je t'ai donné. Donc il faut un soft sur le PC qui va pouvoir lire le texte et transmettre les données par le port série. Ou deuxième solution : utiliser une carte SD sur laquel tu auras préalablement copier ton fichier texte, et la avec la librairie adéquat on peut lire le fichier texte ou csv avec l'Arduino.

Merci pour ta réponse :slight_smile:

J'ai essayé ce tuto :

http://arduinobasics.blogspot.co.uk/2012/05/reading-from-text-file-and-sending-to.html

Son exemple marche bien mais malheureusement j'ai du mal à comprendre le fichier processing ...
du coup j'ai du mal à modifier le code pour lire mon fichier texte et du coup modifier l'intensité de mes leds.

J'aimerai essayé les deux possibilité pour voir quelle solution est la plus simple pour mes expériences.

B@tto : j'ai en effet suivis ton exemple mais malheureusement ce qui me pause problème c'est le code pour envoyer les données à l'arduino via le port serie.

Bonjour,

Regarde du côté de Python et de PySerial :wink:
C'est un langage de programmation très simple et rapide à mettre en œuvre.

Ensuite ce qu'il faut que tu fasses c'est mettre en place un protocole de communication entre ton ordinateur et ton arduino.
C'est via ce protocole de communication que ton ordinateur va (au moment qui va bien) envoyer les ordres pour faire ceci ou cela à l'arduino.
Regarde dans la partie tutoriel du forum, Barbudor a fait un très bon tuto sur ce sujet :wink:

je me suis tourné du coté de la carte SD car cela m'apporte plusieurs avantages :slight_smile:

J'arrive bien à lire et ouvrir mon fichier stocker sur ma carte SD avec la library SD
Mais j'arrive pas à parser mon fichier et récupérer l'intensité à chaque pas de temps ...
pourtant j'ai suivis ton tuto sur ton site mais rien y fait ma led brille de la même façon.

suis-je obligé de stocker les valeurs d'intensités ? ou je peux directement les récupérer du fichier et les assigner dans le analogwrite ?

encore 1000x merci pour votre aide :wink:

Faire voir ton code actuel et un exemple de fichier texte :wink:

Salut Skywodd :slight_smile:
Merci de ton aide ...

voici mon horrible code traficoté avec plusieurs choses trouvées sur le net.
J'ai plusieurs erreurs et j'ai vraiment du mal mais bon ça vous donnera surement une idée.

#include <SPI.h>
#include <SD.h>

File myFile;
String config;
int led1 = 9;   

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  
  // open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  File myFile = SD.open("test.txt");
  if(myFile){
    for(int i=0;i<10;i++)
    config[i]=myFile.parseInt();
    
    analogWrite(led1, config[i]);
    delay(5000)
    
    myFile.close();
  }
  
}

mon fichier txt ressemble à ça :

255,100,255,50,100,20,10,200,50,90,85,200,0,0,0,255

Mais je peux le mettre sous une forme différente selon ce qui est plus facile.

Dans mon vrai travail le vecteur sera beaucoup beaucoup plus long.
du coup autre question : il y a t-il une taille maximal de fichier utilisable ?

Encore merci :slight_smile:

bobijack:
voici mon horrible code traficoté avec plusieurs choses trouvées sur le net.
J'ai plusieurs erreurs et j'ai vraiment du mal mais bon ça vous donnera surement une idée.

Aie aie aie ... le code va pas du tout, ya de grosses erreurs qui me sautent au visage :wink:

bobijack:
mon fichier txt ressemble à ça :

255,100,255,50,100,20,10,200,50,90,85,200,0,0,0,255

Mais je peux le mettre sous une forme différente selon ce qui est plus facile.

Tu peut ré-expliquer la signification de ces nombres j'ai cru comprendre mais je suis pas trop sûr.
Si j'ai bien compris j'ai une solution bien plus simple en tête pour toi.

bobijack:
Dans mon vrai travail le vecteur sera beaucoup beaucoup plus long.
du coup autre question : il y a t-il une taille maximal de fichier utilisable ?

La seule limite que je vois c'est le uint32_t qui stock la position dans le fichier soit un maximum de quelque chose comme 4Go donc.

Salut Skywodd,
Je savais bien que mon code était tout pourris ... :wink:

Ce que j'essaye de faire c'est reproduire une histoire lumineuse perçu par un objet x.
Donc une fois que j'ai cette histoire lumineuse (obtenue numériquement) je veux la tester en vraie :wink:

Concernant le fichier text : il contient les intensités lumineuses perçu par cette objet.
255 étant l'intensité maximal de ma led et 0 l'intensité minimale (led éteinte).

Donc mon fichier ressemblera à ça :

255,100,20, ... etc..., 200,10,230

où chaque nombre correspond à un entier que j'implemente dans la fonction : analogwrite.

Donc je veux qu'à chaque pas de temps (environ 60 secondes) ma led s'allume pendant 60 secondes à 255 puis 100 puis 20 ... etc.
et arrivé à la fin de mon vecteur que ça boucle et revient au début afin de reproduire n fois cette histoire lumineuse :wink:
est-ce-que c'est plus clair ?

Concernant le fichier je ne pense pas du coup qu'il dépassera 4giga :wink:

Merci 1000 fois pour ton aide precieuse :):):slight_smile: