Y-a-t-il un moyen de stocker dans un Arduino, une donnée non volatile ou faut-il obligatoirement passer par une eeprom?
Je précise que je n'aurai à stocker qu'un chiffre de 1 à 5
bin, l'EEPROM est là pour ça ! Et uniquement pour ça.
On peut aussi stocker en flash si la valeur est connue à la compilation sur UNO et similaire et en utilisant le file system sur les architectures 32 bits un peu plus riches en mémoire flash et compétence.
Sur plus petite architectures s’il y a une RTC genre DS3231 on peut utiliser sa mémoire protégée aussi par exemple
On peut aussi rajouter une carte SD même si c’est gigantesque pour stocker un seul octet
Bref il y a des solutions en fonction du besoin et de la plateforme
On peut aussi stocker en flash si la valeur est connue à la compilation sur UNO et similaire et en utilisant le file system sur les architectures 32 bits un peu plus riches en mémoire flash et compétence.
Comme je n'ai qu'un chiffre de 1 à 5 à stocker et que la flash contenue dans mon XIA0 suffit largement, je m'en vais voir s'il y a des tutos quelque part expliquant comment l'y inscrire et l'y relire
quel XIA0?
OK c'est à base de SAMD21 et il n'y a pas d'EEPROM mais on peut écrire en flash, il y a plusieurs bibliothèques qui pourraient fonctionner
essayez
ou son fork
Super ... je m'en va regarder cela
attention il se peut que la donnée soit effacée si vous rechargez du code. Mais ça doit résister à un reboot
Dans ta 3eme proposition j'ai trouvé ceci .. cette bibliothèque rend les choses très simples
/*
Store and retrieve an integer value in Flash memory.
The value is increased each time the board is restarted.
This example code is in the public domain.
Written 30 Apr 2015 by Cristian Maglie
*/
#include <FlashStorage.h>
// Reserve a portion of flash memory to store an "int" variable
// and call it "my_flash_store".
FlashStorage(my_flash_store, int);
// Note: the area of flash memory reserved for the variable is
// lost every time the sketch is uploaded on the board.
void setup() {
SERIAL_PORT_MONITOR.begin(9600);
int number;
// Read the content of "my_flash_store" and assign it to "number"
number = my_flash_store.read();
// Print the current number on the serial monitor
SERIAL_PORT_MONITOR.println(number);
// Save into "my_flash_store" the number increased by 1 for the
// next run of the sketch
my_flash_store.write(number + 1);
}
void loop() {
// Do nothing...
}
Tout simple!
Ca avance ... la sortie DAC du AXI0 fonctionne très bien ... juste un regret c'est que j'aurais eu besoin que sa sortie monte jusqu'à 3,55v mais malheureusement sa sortie est plafonnée à 3,3v ... une idée pour augmenter cette plage 0 à 3,3v jusqu'à 0 à 3,55v de façon analogique?
Est-ce que 4 fonctions "IF" en cascade est la meilleure fonction pour analyser 4 entrées digitales et attribuer à une variable B une valeur différente suivant l'entrée activée? .. il n'y aura qu'une seule entrée à la fois
@68tjs ou @hbachetti je suis sûr auront des idées. La différence est faible est-ce que ça vaut vraiment le coup (vos tensions sont elles super stables et calées à 5% près ?)
Pas sûr de voir vos 4 if car Vous avez donc 16 valeurs possibles pour la combinaison de vos 4 entrées.
Une analyse par Table de Karnaugh permet de regrouper les cas sinon vous prenez un octet, utilisez les 4 bits de poids faible et mettez un 0 ou 1 par entrée et vous faites un switch sur cet octet avec 16 possibilités
Édit - j’avais raté le fait qu’il n’y a qu’une entrée active. Oui 4 if avec des else ça peut le faire ou la technique du switch en groupant les 4 bits. Le compilateur optimisera. Avec des if/else testez dans l’ordre décroissant de probabilités si certaines configurations sont plus fréquentes que d’autres
Je n’ai plus d’idées, elles sont trop compliquees.
Aller juste une question de methode.
Se faire un tableau avec les caractéristiques indispensables que devront avoir les composants.
Seulement après choisir les composants
Donc sur ce projet cela aurait voulu dire choisir un Dac alimenté en Vcc= 5V.
Je vais regarder comment fonctionne le switch avec des groupes de bit et juger si cela en vaut la peine
J'utilise le DAC contenu dans le Seeedarduino XIA0 qui , malgré que celui-ci soit alimenté par du 5v , ne délivre que du 3,3v
un exemple
const byte lesPins[] = {2, 3, 4, 5};
// les fonctions appelées si leur pin est active
void pin0() {}
void pin1() {}
void pin2() {}
void pin3() {}
void verifierPins() {
uint8_t combinaison = 0;
for (byte i = 0; i < sizeof lesPins; i++)
if (digitalRead(lesPins[i]) == HIGH) bitSet(combinaison, i);
// une seule pin ne peut être active à la fois
switch (combinaison) {
case 0b0001: pin0(); break;
case 0b0010: pin1(); break;
case 0b0100: pin2(); break;
case 0b1000: pin3(); break;
default: Serial.print("cas louche. la combinaison vaut 0b"); Serial.println(combinaison); break;
}
}
void setup() {
Serial.begin(115200);
for (byte b : lesPins) pinMode(b, INPUT);
}
void loop() {
verifierPins();
}
(code tapé ici donc absolument non testé)
c'est pratique surtout si vous avez des cas où plusieurs pins peuvent être actives à la fois et qu'il faut décider en fonction de cela ce que l'on fait
par exemple vous rajoutez un
case 0b1010: ...
si vous voulez traiter le cas où la pin 1 et 3 sont actives et les deux autres inactives
@J-M-L tu parle d'appliquer un mask bit?
Oups tu as répondu à ma question avant que je ne la pose
!!
on construit une représentation binaire et on compare avec des masques / valeurs qui nous intéresse.
l'approche est aussi utile sur certains processeurs comme le 328P où l'on peut lire en un seul registre l'état de 8 broches d'un coup donc on n'a même pas besoin de construire la représentation binaire et les pins sont toutes échantillonnées au même moment, il n'y a pas 4 digitalRead() de suite à faire
Ah mais c'est très bien ces masques .. cela procure de la clarté au sketch! ... merci JML