Bonjour, je cherche la méthode la plus simple pour stoker et lire une chaine stoké en eeprom d'un arduino uno.
Pour une variable sa semble facile mais pour des caracteres je ne trouve pas.
Bonjour, je cherche la méthode la plus simple pour stoker et lire une chaine stoké en eeprom d'un arduino uno.
Pour une variable sa semble facile mais pour des caracteres je ne trouve pas.
Il me semble que tout est dans la doc de la librairie EEPROM.
Voir put et get qui permettent de manipuler tous les types de variables ou d'objets avec, en prime, l'écriture que si le contenu a changé pour limiter le nombre d'écritures à l'essentiel.
Question bête : pourquoi stocker un mot de passe en EEPROM ?
L'EEPROM sert à stocker des informations:
Pour que l'utilisateur final puisse le choisir et le changer ?
ah oui OK - donc info modifiée en cours d'exécution.
c'est quand même assez courant de pouvoir modifier un mot de passe ![]()
c'est même recommandé
un truc comme cela pour le put et get (attention il faut que le '\0' de fin de chaîne rentre dans le tableau)
#include <EEPROM.h>
char mdp[20] = "m0tD3Pa$$";
void setup() {
Serial.begin(115200);
EEPROM.put(10, mdp); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM
char mdpLecture[20];
EEPROM.get(10, mdpLecture); // on relit les 20 octets à partir de l'adresse 10 en EEPROM
if (strcmp(mdp, mdpLecture) == 0) {
Serial.print("J'ai bien lu : "); Serial.println(mdpLecture);
} else {
Serial.print("Erreur J'ai lu : "); Serial.println(mdpLecture);
}
}
void loop() {}
ensuite comme c'est assez facile de lire l'EEPROM d'un UNO...
Bonjour
bah suffit d'encoder le mdp et de stocker le code. (genre MD5 c'est suffisant)
Après si qq1 veut cracker le truc il le crackera.
Merci, c'est ce que je voulais, je vais l'ajouter a mon code
Est ce que le fait d'utiliser la fonction F par exemple comme ceci:
client.println(F("<button type="submit">Envoyer"));
Peut provoquer une ecriture a l'endroit ou se trouve mon mot de passe?
Car j'ai des caracteres bizarres qui s'affichent a la place du mot de passe lorsque je fais:
Serial.println(mdpLecture);
F("xxx") met la chaîne xxx en mémoire flash, pas en EEPROM
mais on ne peut pas mettre de guillemets comme cela dans le texte, il faut un anti slash avant
client.println(F("<button type=\"submit\">Envoyer"));
postez votre code complet si vous voulez plus d'infos
Voici le caractere bizarre qui s'affiche dans le terminal:

Mon code qui commence a être long:
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 0, 178 }; // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 0, 254 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(16678); //server port
String readString = "";
char str;
byte connecte = 0;
int led1 = 1;
int led2 = 2;
int led3 = 3;
int led4 = 4;
String get0 = "";
String get1 = "";
IPAddress ip_client;
IPAddress ip_client_connecte;
char user;
char passe[20];
void setup() {
pinMode(led1, OUTPUT); //led1 en sortie
pinMode(led2, OUTPUT); //led2 en sortie
pinMode(led3, OUTPUT); //led3 en sortie
pinMode(led4, OUTPUT); //led4 en sortie
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.println("*******************************************************");
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
EEPROM.put(10, "passe");
}
void loop() {
// Create a client connection
EthernetClient client = server.available();
if (client) {
Serial.println("//////////////////////////////////////////////////////");
Serial.print("Remote IP address: ");
Serial.println(client.remoteIP());
ip_client = client.remoteIP();
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
}
//if HTTP request has ended
if (c == '\n') {
Serial.println(readString); //print to serial monitor for debuging
int longueur= readString.length();
readString = readString.substring(0,longueur -11); //supprimer la fin
readString = readString.substring(6,longueur); //supprimer le debut
char *myCstring = readString.c_str();
char *token;
token = strtok(myCstring, "&");
int i = 0;
while( token != NULL ) {
String str = token;
int index = str.indexOf("=");
String var = str.substring(index + 1);
if(i==0){get0=var;} //enregistre le mot de passe
if(i==1){get1=var;} ///enregistre le nom d'utilisateur
token = strtok(NULL, "&");
i++;
}
Serial.print("get0:");Serial.println(get0);
Serial.print("get1:");Serial.println(get1);
char mdpLecture[20];
EEPROM.get(10, mdpLecture);
Serial.print("mdplecture:");
Serial.println(mdpLecture);
ip_client_connecte = client.remoteIP();
if(get0 == "admin" && get1 == mdpLecture && ip_client_connecte == ip_client)
{
connecte=1;
Serial.println("connecte");
}
if(get0 == "deconnexion"){
Serial.println("deconnexion");
connecte=0;
}
drive_pin(); // commander les sorties
if(connecte == 1 && get0 == "change_passe")
{
get1 ="test"; //pour tester
change_passe(client); //afficher la page "mot de passe"
if(get1 !=""){
EEPROM.put(10, get1); //enregistrer le mot de passe
}
}
else if (connecte == 1)
{
helloWorldPage(client); //affiche la page principale
}
else
{
formulaire(client); //affiche la page d'autentification
}
delay(1);
//stopping client
client.stop();
get0="";
get1="";
readString="";
}
}
}
}
}
void drive_pin(){
// **********************************led1***********************
if(get0 == "button1on"){
digitalWrite(led1, HIGH);
Serial.println("button 1 ON");
}
if(get0 == "button1off"){
digitalWrite(led1, LOW);
Serial.println("button 1 OFF");
}
// **********************************led2***********************
if(get0 == "button2on"){
digitalWrite(led2, HIGH);
Serial.println("button 2 ON");
}
if(get0 == "button2off"){
digitalWrite(led2, LOW);
Serial.println("button 2 OFF");
}
// **********************************led3***********************
if(get0 == "button3on"){
digitalWrite(led3, HIGH);
Serial.println("button 3 ON");
}
if(get0 == "button3off"){
digitalWrite(led3, LOW);
Serial.println("button 3 OFF");
}
// **********************************led4***********************
if(get0 == "button4on"){
digitalWrite(led4, HIGH);
Serial.println("button 4 ON");
}
if(get0 == "button4off"){
digitalWrite(led4, LOW);
Serial.println("button 4 OFF");
}
}
void formulaire(EthernetClient& client){
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F(""));
client.println(F("<HTML>"));
client.println(F("<HEAD>"));
client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
client.println(F("<TITLE>Formulaire</TITLE>"));
client.println(F("</HEAD>"));
client.println(F("<BODY>"));
client.println(F("<H1>Autentification</H1>"));
client.println(F("<hr />"));
client.println(F("<H2>Votre ip est: "));
client.println(ip_client);
client.println(F("</H2>"));
client.println(F("<br />"));
client.println(F("<H2>Formulaire</H2>"));
client.println(F("<br />"));
client.println(F("<form action=\"/\" method=\"GET\">"));
client.println(F("USER:"));
client.println(F("<input type=\"text\" id=\"user\" name=\"user_name\" />"));
client.println(F("<br />"));
client.println(F("PASS:"));
client.println(F("<input type=\"text\" id=\"pass\" name=\"pass\" />"));
client.println(F("<br />"));
client.println(F("<button type=\"submit\">Envoyer</button>"));
client.println(F("</form>"));
client.println(F("<br />"));
client.println(F("</BODY>"));
client.println(F("</HTML>"));
}
void helloWorldPage(EthernetClient& client) {
client.println(F("HTTP/1.1 200 OK")); //send new page
client.println(F("Content-Type: text/html"));
client.println(F(""));
client.println(F("<HTML>"));
client.println(F("<HEAD>"));
client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
client.println(F("<TITLE>Commandes de relais</TITLE>"));
client.println(F("</HEAD>"));
client.println(F("<BODY>"));
client.println(F("<H1>Commandes de relais</H1>"));
client.println(F("<hr />"));
client.println(F("<br />"));
client.println(F("<H2>Vous etes Connecte</H2>"));
client.println(F("<br />"));
client.println(F("<H2>Votre ip est: "));
client.println(ip_client);
client.println(F("</H2>"));
client.println(F("<br />"));
client.println(F("<a href=\"/?button1on\"\">Turn On LED 1</a>"));
client.println(F("<a href=\"/?button1off\"\">Turn Off LED 1</a><br />"));
client.println(F("<br />"));
client.println(F("<a href=\"/?button2on\"\">Turn On LED 2</a>"));
client.println(F("<a href=\"/?button2off\"\">Turn Off LED 2</a><br />"));
client.println(F("<br />"));
client.println(F("<a href=\"/?button3on\"\">Turn On LED 3</a>"));
client.println(F("<a href=\"/?button3off\"\">Turn Off LED 3</a><br />"));
client.println(F("<br />"));
client.println(F("<a href=\"/?button4on\"\">Turn On LED 4</a>"));
client.println(F("<a href=\"/?button4off\"\">Turn Off LED 4</a><br />"));
client.println(F("<br />"));
client.println(F("<hr />"));
client.println(F("<br />"));
client.println(F("<a href=\"/?deconnexion\"\">Deconnexion</a>"));
client.println(F("<a href=\"/?page=change_passe\"\">Changer passe</a><br />"));
client.println(F("</BODY>"));
client.println(F("</HTML>"));
}
void change_passe(EthernetClient& client){
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F(""));
client.println(F("<HTML>"));
client.println(F("<HEAD>"));
client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
client.println(F("<link rel='stylesheet' type='text/css' href='https://randomnerdtutorials.com/ethernetcss.css' />"));
client.println(F("<TITLE>CHanger de mot de passe</TITLE>"));
client.println(F("</HEAD>"));
client.println(F("<BODY>"));
client.println(F("<H1>Changer de mot de passe</H1>"));
client.println(F("<hr />"));
client.println(F("<H2>Votre ip est: "));
client.println(ip_client);
client.println(F("</H2>"));
client.println(F("<br />"));
client.println(F("<H2>Formulaire</H2>"));
client.println(F("<br />"));
client.println(F("<form action=\"/\" method=\"GET\">"));
client.println(F("<input type=\"hidden\" id=\"page\" name=\"page\" value=\"change_passe\" />"));
client.println(F("Nouveau mot de passe:"));
client.println(F("<input type=\"text\" id=\"passe\" name=\"passe\" />"));
client.println(F("<br />"));
client.println(F("<br />"));
client.println(F("<button type=\"submit\">Envoyer</button>"));
client.println(F("</form>"));
client.println(F("<br />"));
client.println(F("<br />"));
client.println(F("<a href=\"/\"\">Retour</a>"));
client.println(F("</BODY>"));
client.println(F("</HTML>"));
}
Je crois avoir trouvé le problème:
J'essai d'ecrire un string dans l'eeprom
A non, je viens de convertir avec c_str() j'ai toujours le problème
C’est une mauvaise idée - sans longueur n’est pas fixe et c’est une instance d’une classe dont la mémoire associée n’est pas dans la structure
Prenez un buffer comme je l’ai fait de la longueur max que vous voulez pouvoir conserver
➜ utilisez une cString
Je viens de tester ce code:
#include <EEPROM.h>
char mdp[20] = "m0tD3Pa$$";
String get0 = "";
void setup() {
Serial.begin(115200);
EEPROM.put(10, get0); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM
char mdpLecture[20];
EEPROM.get(10, mdpLecture); // on relit les 20 octets à partir de l'adresse 10 en EEPROM
Serial.print("J'ai bien lu : "); Serial.println(mdpLecture);
Serial.print("Erreur J'ai lu : "); Serial.println(mdpLecture);
}
void loop() {}
J'ai cette erreur:

Tu écris une String vide et tu essaies de lire un tableau de char.
Tu t'attendais à un miracle?
@fdufnews vous a donné la raison.
si vous voulez utiliser la classe String, il faut mettre son contenu textuel dans un buffer avant d'envoyer cela en EEPROM avec put
String get0 = "";
•••
char buffer[20];
strncpy(buffer, get0.c_str(), 20); // on copie au plus 20 octets
buffer[19] = '\0'; // on s'assure que l'on a bien une cString
EEPROM.put(10, buffer); // on stocke les 20 octets à partir de l'adresse 10 en EEPROM
sinon vous pouvez lire le contenu de la String caractère par caractère et écrire ces caractères à des adresses successives en EEPROM
Comme expliqué dans la doc, put() et get() sont capables de manipuler toutes sortes de variables et d'objets, chacun avec ses caractéristiques.
get()
### Description
Read any data type or object from the EEPROM.
put()
#### Description
Write any data type or object to the EEPROM.
Pour pouvoir relire le contenu d'une structure ou d'un objet, il faut que get() connaissance son type pour en déduire sa structure interne (le nombre d'octets à lire et leur affectation, par exemple). Il faut donc que le type de la variable qui va recevoir les données du get() soit exactement du même type que la variable qui a été écrite par put().
il faut comprendre aussi que String et string sont deux entités complètement différentes.
Merci, La, ligne:
buffer[19] = '\0';
Est t'elle obligatoire? J'ai testé, sa marche sans elle.
Pourquoi ne puis je pas faire simplement:
EEPROM.put(10, get0.c_str);
En tous cas, merci beaucoup a vous tous, j'ai modifié mon code et sa marche parfaitement, le mot de passe est bien modifié!