Initialiser des variables par carte SD

Bonjour,
Après avoir lu un paquet sur internet, il me semble que cette solution n'est pas super viable. Néanmoins je la pose quand même.

Je voudrais savoir s'il est possible de lire certaine données d'un fichier texte et de les appliquer sur des objets ?

Je m'explique,
Imaginons que j'ai un objet Temperature définit par
Temperature(byte pin,byte numberSensor);

Au début du programme je ne le connais absolument pas, je veux l’initialiser à l'aide de la carte SD que je lis dans le "setup" du code arduino.

Alors j'ai une petite fonction "myFile.lecture" qui me permet d'avoir ces valeurs ( eg la pin et le nombre de senseur).
Le soucis c'est que j'arrive à créer mon object Temperature dans le "setup" mais je ne peux y accéder ailleurs ( vu que l'objet n'est pas global).

J'ai pensé l'atteindre grâce au pointeur mais je n'y arrive pas non plus. D'ailleurs je ne pense pas que ce soit la meilleure idée...

Voici un exemple de code :

SdFat sd;
SdFile myFile;
// IDEE : création du pointeur de Temperature *temp, comment ce passe l'assignation dans le setup ?
void setup()
{
    Serial.begin(9600);
    while (!Serial) {}  // wait for Leonardo
    Serial.println("Starting device, please wait");
    // Initialize SdFat or print a detailed error message and halt
    // Use half speed like the native library.
    // change to SPI_FULL_SPEED for more performance.
    if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
    // pen the file for reading:
    if (!myFile.open("SETTINGS.txt", O_READ))
    {
        sd.errorHalt("opening test.txt for read failed");
    }
    String variables = myFile.lecture();
    byte pin = getPin(variables);
    byte numberOfSensor = getSensor(variables);
    
    Temperature myTemp(pin,numberOfSensor);
}
loop()
{
// comment pourrais-je accéder à l'objet Temperature créé précédemment  ? 
}

Une autre idée, mais c'est vraiment dégueulasse, c'est de tout assigner dans le "loop". Mais c'est tellement honteux que je ne veux pas le faire :p.

Pour ceux qui désire savoir pourquoi je fais ça :
Je suis entrain (d'essayer) de créer un code qui peut s'adapter à plusieurs utilisateurs différents, le tout piloté par une application android. J'avais pour cela deux solutions.
- Envoyer le code directement via la plateforme android sur l'arduino via la liaison série (bluetooth dans mon cas). Malheureusement cela semble impossible.
- Envoyer la configuration de l'utilisateur sur la carte SD de l'arduino qui ensuite, appliquera les variables demandées.
- Créer des objets vide avec des fonctions init() qui vont ensuite le construire. C'est pas top non plus car ça me demande de changer tout mon code ... Et malheureusement j'ai déjà quelques lignes...
De plus, je ne sais pas si cette solution sera très fonctionnelle non plus :'(.

Merci à tous !

Crée ta variable en globale, de toutes façons ça ne change pas vraiment ta capacité mémoire de l'arduino et comme on est pas "vraiment" dans de l'informatique pure, ça marchera très bien :wink:

Oui mais si c'est en globale il n'a pas les infos de la SD pour l'instancier :wink:

Deux options qui me passe par la tête, y'en a surement d'autres :

  1. Oublie loop(). Enfin laisse le vide, et utilise un while(1) { } en fin de setup() pour jouer le rôle de loop()
  2. Modifier la lib qui instancie ton capteur et change la stratégie : instanciation de lobjet en global sans spécification de pin, puis dans le setup() utilisation d'une méthode begin(pin,numberOfSensor) pour configurer et lancer

Je trouve la méthode 2) plus élégante, mais il faut modifier la lib alors que la 1) y'a rien a faire

La méthode 2 était vraiment parfaite, mais devoir réécrire mes librairies ne me plaisait pas du tout.
D'ailleurs, désolé du retard de la réponse, j'avais lu mais pas répondu ( honte à moi ).

Je vous remercie d'ailleurs tout deux ;).

Voici ma solution : Passage par l'EEPROM.
En effet, je démarre mon programme en istanciant les variables comme ceci :

maVariable ( EEPROM.READBYTE(ADRESS), ... )

Les variables créé ainsi ne peuvent prendre que des valeurs 255 la première fois. Ce qui est faux évidemment.

Dans le setup, je passe par une fonction qui lit les données sur la carte SD. Une fois les données lue et qui informe du nombre de capteurs ainsi que de leur endroit, j'ai deux possibilités :

  • Je modifie les valeurs dans l'EEPROM dans ce cas, je redémarre le contrôleur ( et les variables prennent les bonnes valeurs comme par magie :D)
  • Les valeurs stockées dans l'EEPROM correspondent aux valeurs que la carte SD à lue, et dans ce cas le programme continue.

L'histoire est plié et c'est fonctionnel.

Par rapport à la méthode de badoo, le gros avantage c'est qui si pour une raison quelconque la configuration était déjà dans l'EEPROM, si je n'arrive pas à lire la carte SD, le programme peut démarrer et fonctionner.

L'inconvénient est évidemment de devoir utiliser l'EEPROM.

Bonjour,

Je prends le sujet tardivement, mais je ne vois pas pourquoi l'accès par pointeur ne fonctionnerait pas.

SdFat sd;
SdFile myFile;

Temperature *pMyTemp;

void setup()
{
    Serial.begin(9600);
    while (!Serial) {}  // wait for Leonardo
    Serial.println("Starting device, please wait");
    // Initialize SdFat or print a detailed error message and halt
    // Use half speed like the native library.
    // change to SPI_FULL_SPEED for more performance.
    if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
    // pen the file for reading:
    if (!myFile.open("SETTINGS.txt", O_READ))
    {
        sd.errorHalt("opening test.txt for read failed");
    }
    String variables = myFile.lecture();
    byte pin = getPin(variables);
    byte numberOfSensor = getSensor(variables);
    
    static Temperature myTemp(pin,numberOfSensor);
    pMyTemp=&myTemp;
}

loop()
{
// comment pourrais-je accéder à l'objet Temperature créé précédemment  ? 
// Comme ça !!
    pMyTemp->
}

La seule chose à laquelle il faut faire attention est de déclarer l'objet en static autrement il est détruit en sortie de setup