Arduino-Seriennummer Identifikationsnummer EEPROM
Manchmal kommt es vor das man seinem Arduino oder mehreren Arduino’s eine Serien- oder Identifikationsnummer verpassen will ohne das dies im Programm fest programmiert wird und auch erhalten bleibt wenn der Arduino mal vom Strom getrennt wird.
Ganz klar kann man im Programm ein String festlegen und Diesem einen Wert zuweisen :
1 |
String meineNummer = "1234567890"; |
Der Nachteil dieser Methode liegt ganz klar auf der Hand, man muss jedes Programm anpassen damit man unterschiedliche Nummern auf seinen Arduino’s hat.
Das blödeste ist, man muss, wenn man ein feines Gerät gebaut hat und man mal ein Firmware update machen will, sich die alte Seriennummer zu dem Gerät raussuchen, wieder fest coden und dann das Update auf spielen und das für jeden einzelnen Arduino den man so bearbeiten will.
Alles albern, machen wir nicht.
Stattdessen gehen wir einen anderen Weg und lassen eine Arduino-Seriennummer bei der ersten Inbetriebnahme generieren und schreiben Diese für die Ewigkeit in das EEPROM des Mikrocontrollers.
Wir können nun Firmware Updates aufspielen bis zum jüngsten Gericht, die Nummer wird erhalten bleiben bis wir den Speicherbereich im EEPROM selber überschreiben.
Ich habe mal ein kleines Beispielprogramm gemacht, schaut es euch an.
Liebe Nerd’s ich will jetzt nix hören…
Dies ist ein Beispielprogramm was auch Anfänger verstehen sollen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/* * Generate Device Serialnumber/identifier * Ralf Bohnen, 2013 * This example code is in the public domain. */ # Serialnumber ############################################# #include <EEPROM.h> String SerialbeginWith = "12345-"; int SerialNumberLen = 20; //"12345-" plus 14 Random Char's = 20 String serialNumber; ############################################################ void setup() { Serial.begin(9600); # Serialnumber ######################################### serialNumber = readSerialNumber(); //if Serialnumber is not generated if (!serialNumber.substring(0, SerialbeginWith.length()).equals(SerialbeginWith)) { randomSeed(analogRead(0)); //generate it serialNumber = generateSerialNumber(); } ######################################################### //TEST OUTPUT SERIALNUMBER Serial.println(serialNumber); } //END setup() void loop() { /* add main program code here */ }//END loop() # Read Serialnumber from EEPROM ############################# String readSerialNumber() { int value; String out = ""; for (int i = 0; i < SerialNumberLen; i++) { value = EEPROM.read(i); out = out + (char) value; } return out; } ############################################################# # Write Serialnumber to EEPROM ############################## String generateSerialNumber() { int SerialbeginWith_len = SerialbeginWith.length(); for (int i = 0; i < SerialbeginWith_len; i++) { //get each Char from SerialbeginWith String and put it to EEPROM int c = SerialbeginWith.charAt(i); EEPROM.write(i, c); } for (int i = SerialbeginWith_len; i < SerialNumberLen; i++) { int randNumber = random(48, 58); //generate ASCII Codes for Numbers 0-9 EEPROM.write(i,randNumber); } return readSerialNumber(); } ############################################################# |
Spielt mal mit den Werten in den Zeilen 9 und 10 rum, schaut euch das Ergebnis auf dem Serialmonitor an.