Bonjour. Je suis un peu touche à tout, et aujourd’hui je voudrais relire une donnée d’un fichier .csv. Les séparateurs sont des “;” Je voudrais la 5e donnée( MaData) donc après 4 “;” .
Est ce que dans la ligne extraite du .csv qui s’appelle SLine:
indexOf(val), commence toujours sa recherche à partir du début de la chaîne.
Donc tu auras toujours l'index du premier ";"
byte pos[i] crée une variable locale à la boucle qui sera inconnue hors de celle-ci, donc inexploitable dans le reste de la fonction.
Pour continuer la recherche il faut utiliser la forme indexOf(val, from)
from étant l'index à partir duquel la recherche commence.
Il faudrait faire quelque chose dans ce genre
curPos = 0; // la recherche commence au premier caractère de la chaîne
byte pos[MAX_CHAMPS]; // on déclare un tableau de MAX_CHAMPS valeurs
for(int i=0,i<MAX_CHAMPS,i++){
curPos = SLine.indexOf(";", curPos); // la recherche commence à curPos
pos[i] = curPos;
curPos++; // la prochaine recherche commencera au caractère suivant.
}
MAX_CHAMPS c'est le nombre maximal de champs dans ton fichier csv à définir par ailleurs.
Ceci dit, comme tu ne veux que la cinquième valeur tu pourrais te contenter d'un tableau de taille 5.
Merci les gars. C’est super sympa. Je vous dois bien une bière, mais j’ai peur des distances…
Je ne connaissais pas la bibliothèque indiquée par jpb. Elle mérite de l’intérêt. Comme mon soft commence tout doucement à saturer mon arduino, je vais agir au mieux.
Pour ordonner mes données je voulais mettre un repère basé sur une pseudo date. Je voulais concaténer l’annee et je jourAnnee
int annee = 2025;
int jourAnnee = 300;
void setup() {
Serial.begin(9600);
unsigned long periode = (annee*1000)+ jourAnnee ;
String Speriode= String(periode);
Serial.print(" periode ");Serial.print( Speriode);
}
void loop() {
// put your main code here, to run repeatedly:
}
Ben là mon arduino ne sais plus compter. La réponse est
en fait c’est dû à une règle qui dit que un nombre écrit littéralement comme 1000 va être du plus petit type pouvant le contenir, signé si possible. Donc 1000 était un int.
Comme année était aussi un int, la multiplication 1000*annee se faisait en type entier int et ça débordait
En mettant année en unsigned long, vous avez alors une multiplication entre un int et un unsigned long, la règle de compilation dit que le type le plus petit est implicitement promu vers le rang du plus grand type avant l’opération et en unsigned si celui ci est non signé. Donc 1000 est promu en unsigned long et la multiplication se fait en unsigned long et il n’y a plus de débordement.
Vous auriez pu écrire aussi 1000ul * annee et le suffix ul (unsigned long) disait au compilateur de passer le nombre en type unsigne long. La règle s’applique alors dans l’autre sens et c’est annee qui aurait été promue vers unsigned long avant de faire la multiplication.
La meilleur façon de faire sans doute aurait été de déclarer une constante typée pour votre facteur multiplicateur
Notez que vous n’avez pas besoin de passer par une String qui consomme de la mémoire pour imprimer
constexpr unsigned long facteurMultiplicateur = 1000;
int annee = 2025;
int jourAnnee = 300;
void setup() {
Serial.begin(9600);
unsigned long periode = (annee* facteurMultiplicateur)+ jourAnnee ;
Serial.print(" periode ");
Serial.println(periode); // print sait imprimer un nombre, println rajoute un passage à la ligne ensuite
}
void loop() {}