Advertisement
AntonioVillanueva

write and Test ip in arduino EEPROM

Mar 21st, 2022 (edited)
919
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Antonio Villanueva Segura
  3.  * Changement d'adresse IP, écriture et lecture EEPROM
  4.  */
  5. #include <EEPROM.h>   //Uso de memoria EEPROM
  6.  
  7. #define MAC 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE
  8. #define IP 192, 168, 6,69
  9. #define PORT 80
  10.  
  11. String ip="";
  12. int ip_mem=0;//Adresse dans la mémoire EEPROM du IP
  13.  
  14. String mac="";
  15. int mac_mem=0;//Adresse dans la mémoire EEPROM du MAC
  16.  
  17. void setup() {
  18.   Serial.begin(9600);
  19.  // Serial.setTimeout(10000);//Tiem out serie x segundos
  20.  
  21.  //Nous avons des données IP correctes dans l'EEPROM ?
  22.   ip=readStringFromEEPROM(ip_mem);
  23.   Serial.print ("ip from EEPROM = ");Serial.println (ip);
  24.   delay (5000);
  25. }
  26.  
  27. void loop() {
  28.   menu();//Afficher un menu simple
  29.   delay(2000);
  30. }
  31.  
  32. //Écrire une chaîne dans un emplacement mémoire
  33. void writeStringToEEPROM(int addrOffset, const String &strToWrite)
  34. {
  35.  
  36.   byte len = strToWrite.length();
  37.   EEPROM.write(addrOffset, len);
  38.   for (int i = 0; i < len; i++)
  39.   {
  40.     EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
  41.   }
  42.   Serial.print (strToWrite);Serial.println (" write in EEPROM !");//DEBUG
  43. }
  44.  
  45. //Récupérer une chaîne de la mémoire
  46. String readStringFromEEPROM(int addrOffset){
  47.  
  48.   int newStrLen = EEPROM.read(addrOffset);
  49.   char data[newStrLen + 1];
  50.  
  51.   for (int i = 0; i < newStrLen; i++)
  52.   {
  53.     data[i] = EEPROM.read(addrOffset + 1 + i);
  54.   }
  55.   data[newStrLen] = '\0'; // !!! NOTE !!! Remove the space between the slash "/" and "0" (I've added a space because otherwise there is a display bug)
  56.   Serial.print (data);Serial.println ("Read from EEPROM ");//DEBUG
  57.   return String(data);
  58. }
  59.  
  60. //Ecrire une question  retourner la réponse , timeout , block (attendre response)= true false
  61. String readData (String title=" Entrez une nouvelle IP + ENTRÉE  ",int timeout=1000, bool block=true){
  62.   String tmp="";
  63.   Serial.setTimeout(timeout);
  64.   Serial.println (title);  
  65.   //while (tmp==""){tmp=Serial.readString();} //Attendre response
  66.   do{ tmp = Serial.readString() ;} while ( (tmp=="") && block);
  67.   Serial.setTimeout(1000);//Norma
  68.  
  69.   return tmp;  
  70. }
  71.  
  72. //Analyse d'une chaîne IP analyser si la valeur IP est correcte
  73. bool testIp (String ip){
  74.   int ptos=0;
  75.   if (ip.length() >( 15 +1 )  ){return false;} //ex 255.255.255.255 >
  76.   if (ip.length() <(7 + 1 ) ){return false;}  //ex 0.0.0.0 <
  77.  
  78.   //compter le nombre de points  ... ex 192.168.3. 3 points
  79.   for (byte index=0; index < ip.length()-1 ;index++){if ( ip[index]=='.') {ptos++;}}
  80.  
  81.   if (ptos!=3){return false;}//une adresse ip contient 3 points
  82.  
  83.   //Ctrl.ascii caractères non autorisés
  84.   for (int index=0 ; index < ip.length()-1  ; index++ ){
  85.     if ( ( ip[index]<'0'||ip[index] >'9')&& ip[index]!='.') {return false;}}
  86.  
  87.   //Ctrl. last char number ,le dernier caractère doit être un nombre
  88.   if ( ip [ip.length()-2]<'0'||ip [ip.length()-2]>'9'){ return false;}
  89.  
  90.   //Analyse les blocs de nombres entre 0 et 255 aaa.bbb.ccc.ddd
  91.   const char * separator = ".";
  92.   char ipc[ip.length()];
  93.   ip.toCharArray(ipc,ip.length());
  94.  
  95.   char * strToken = strtok ( ipc, separator );
  96.   while ( strToken != NULL ) {
  97.       //Serial.println (  strToken );
  98.       strToken = strtok ( NULL, separator );// On demande le token suivant.
  99.  
  100.       //Serial.print ("Version int = ");Serial.println (atoi(strToken));
  101.      if ( atoi(strToken)>255){return false;}
  102.   }
  103.  
  104.   return true;
  105. }
  106.  
  107. //Afficher un menu simple pour changer ip
  108. void menu(){
  109.     String tmp="";
  110.     tmp = readData ("Change ip (y) or (Y) ?",2000,false);
  111.    
  112.     if (tmp!="" &&  ( tmp[0]=='y'||tmp[0]=='Y' )){//YES change IP      
  113.      
  114.       tmp = readData (" Entrez une nouvelle IP + ENTRÉE  ");
  115.       Serial.print (" Valeur IP ");Serial.println (tmp);
  116.  
  117.       //Test ip
  118.       //Serial.print (" adresse IP correcte ? = ");Serial.println ( testIp( tmp ) ? " YES " :" NON " );
  119.       if (testIp( tmp )){
  120.         writeStringToEEPROM(ip_mem, tmp);
  121.       }      
  122.       tmp="";        
  123.     }  
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement