Você sabia que a placa do Arduino possui um ID único, uma espécie de MAC address? É basicamente isso que a biblioteca ArduinoUniqueID faz, ela retorna esse valor de identificação do chip. O mais interessante é que essa característica não está descrita no datasheet do microcontrolador atmega328p (Arduino Uno), e como que eu acabei descobrindo esse hidden ID?
Hidden Serial Number
Tudo começou quando decidi compra alguns chips atmega328p em SMD para um projeto utilizando LoRa. O problema é que acabei comprando a versão ‘b’ do chip, no caso atmega328pb, que é uma versão bofada do atmega328p.
Mas o que tem de diferente um chip do outro? Este datasheet demonstra exatamente isso.
A parte interessante dessa versão bufada é que ela possui um ‘Serial Number’, um número de série de 10 bytes único em cada chip. Já que o projeto que estava desenvolvendo era com LoRa, esse detalhe me chamou a atenção. No caso seria uma maneira de identificar cada placa sem precisar criar vários códigos.
Pensando…Talvez o chip atmega328p possuísse esse número de série, mas o datasheet não fala nada sobre…
Sim, o Arduino possui um número de série não oficial. Pelos testes que fiz, o atmega328p possui um número de série com 9 bytes. E acabei encontrando algo que confirma essa teoria, um datasheet antigo da versão ‘b’ que mostra que o chip possui um número serial de 9 bytes.
Pensando assim outros chips da Atmel devem ter essa característica. No caso, testei os chips Atmega2560 e Attiny85, mostrando que esses chips possuem um número serial de 9 bytes.
Para simplificar as coisas, desenvolvi uma biblioteca para poder obter esse número de série.
ArduinoUniqueID
Esta biblioteca permite obter o número de série de alguns chips, como Atmel AVR, SAM, SAMD e ESP. Você pode baixar a biblioteca utilizando o gerenciador de bibliotecas dentro do Arduino IDE, basta procurar ArduinoUniqueID. Ou pode baixar pelo github, que possui toda a documentação da mesma.
Para começar a utilizar a biblioteca é muito simples, basta inserir este include:
#include <ArduinoUniqueID.h>
Para visualizar o número de série do chip basta inserir a função UniqueIDdump() depois do Serial.begin.
UniqueIDdump(Serial);
Neste caso vamos ter algo parecido com isto no monitor serial:
UniqueID: 50 51 31 47 42 51 19 34 1A
Já que a biblioteca funciona em diversos tipos de chips e cada chip possui uma quantidade de bytes de UniqueID, adicionei uma variável UniqueID8 que retorna os 8 últimos bytes do número serial.
Utilizando a função UniqueID8dump é possível visualizar:
UniqueID: 51 31 47 42 51 19 34 1A
Claro, você pode utilizar o exemplo da biblioteca para poder verificar o número de série do chip. Reference no github sempre é um bom local pra verificar os features da biblioteca. Se você achou esse feature útil, be free to use!






No arduino nano configurei o mac com o uniqueID dessa maneira:
byte array_id[6]; String id = ""; int soma_id = 0; for(size_t i = 0; i < UniqueIDsize; i++){ id = id + "." + String(UniqueID[i]); soma_id = soma_id + UniqueID[i]; if(i < 6){ array_id[i] = UniqueID[i]; } } //String ID Serial.println(id); Serial.println("soma " + String(soma_id)); byte mac[] = { 0x00, 0xAA, array_id[0], array_id[1], array_id[2], array_id[3] };Olá bom dia amigo, estou fazendo um projeto de pesquisa e seria muito interessante esta metodologia de pegar o id no arduino, peço desculpas pelo poco intendimento do mesmo, mas como eu posso fazer para transferir os dados para uma String ? tentei de diversas formas mas não consegui Ex:
string a = UniqueIDdump(Serial);
Entre outras tentativas frustradas, teria como por gentileza dar uma “luz” ?
Dês de já muito obrigado por ter postado este conhecimento para todos nós.
Abraços
Estou tentando fazer isso, mas não estou conseguindo também, você conseguiu resolver isso?
usei o seguinte para armazenar em uma variável
#include <ArduinoUniqueID.h> String id; void setup() { // put your setup code here, to run once: Serial.begin(9600); for (size_t i = 0; i < UniqueIDsize; i++) { if (UniqueID[i] < 0x10) id += String("0"); id += String(UniqueID[i], HEX); } }E como faz para por em uma variável em vez de enviar para a serial???
Se toda vez que precisar disso, eu tiver que ler pela serial, usar um desktop pendurado no Arduino e criar um programa pra devolver o código pro Arduino…
Seja prático, ponha em variáveis a saída de qualquer coisa. O usuário decide se quer ou não mandar pra serial.
Grato pela compreensão.
amigo, veja abaixo o exemplo que postei, o exemplo ensina a fazer o que você deseja.
Bom dia. Não consigo baixar o seu exemplo. Estou precisando disso também. Obrigado.
Parabéns!
Incrível Luiz, funcionou !
Eu criei um código que aproveita o resultado da sua biblioteca pra criar sketchs unicos, que so rodam em um unico arduino.
Isso abre a porta para criacao de Hard Keys com arduino, e projetos ultra seguros.
Cara, muito obrigado por ter compartilhado o conhecimento.
Pode compartilhar esse seu código? Obrigado.
Muito bom!
Incrivel, nao tenho um arduino a mao agira, mas amanha eu test, ja imaginou o potencial dessa descoberta pra evitar a clonagem de projetos ou codigos? AfinL ja li que era possivel extrair o .HEX e instalar em outro chip, mas com uma id nativa a cada chip, isso se tornara quase impossivel. Obrigado.