arduino项目的唯一机器ID

时间:2014-02-04 17:25:21

标签: arduino

我正在为arduino构建一些远程传感器节点,他们将使用RF将数据传输回基站。是否有某种独特的id支持arduino,我可以使用它来识别基站的远程arduino传感器节点?如果没有,其他人如何解决这个问题呢?

我意识到当我为该节点编译源代码时,我可以对nodeid进行硬编码,看起来似乎不能很好地扩展。我需要的是类似于http land中的mac地址的东西。

5 个答案:

答案 0 :(得分:2)

(抱歉英语不好,我是德国人) 据我所知,Arduino没有唯一的产品ID,但在复位后,RAM中的每个字节都有一个随机值,每个arduino都有不同的值。 该程序应在每个arduino上输出不同的值:

void setup()
{
  uint32_t checksum = 0;
  for(uint16_t u = 0; u < 2048; u++)
  {
    checksum += * ( (byte *) u );//checksum += the byte number u in the ram
  }
  Serial.begin(115200);
  Serial.println(checksum , HEX);
}
void loop()
{
}

更新: 你可以在eeprom上写一个数字 - &gt;您有自己的唯一ID

答案 1 :(得分:1)

令人讨厌的是,Arduino设备上没有可用的硬件ID。我创建了一个小型库(70行代码)来将您自己的ID存储在EEPROM存储器中,并在以后进行验证。

您可以使用它来防止在您的设备上安装错误的草图并损坏外围设备或用于任何其他类似目的:

https://github.com/skoumalcz/arduino-id-guard

答案 2 :(得分:0)

我很抱歉,但我知道的所有atmega芯片都不会提供唯一ID,但xmega系列确实如此(但那时你真的远离arduino)。

您可以在编译时在eeprom中放置一个值,但正如所说的那样不能很好地扩展。

除非,作为mpflaga,您可以使用“-U eeprom:w:mydata.eep”参数将SN#直接写入EEPROM。

你也可以实现像在总线中请求ID一样的somenthing,如果它是免费使用并存储它,但会给你的协议增加很多复杂性

答案 3 :(得分:0)

我在尝试自己找到答案时偶然发现了这个问题,并决定使用评论(arduino.cc forum: "Arduino serial number S/N ?")中提供的链接中引用的DS2401。

无论如何我的项目都会有1线总线,所以有一个额外的(而且相当便宜)组件并不重要,它将提供全球唯一的ID,无论使用哪种板型号和芯片(也适用于克隆mfgs,例如,我有几个DCcduino UNO板,有CH340G用于通信,而不是Arduino UNO的Atmega8U2 / Atmega16U2和其他Arduino板的FTDI。

答案 4 :(得分:0)

我知道这是一个老帖子,但我很好奇你是如何解决这个问题的。我目前正在生成一个带有校验位的唯一ID(使用与UPC代码相同的方法)。

我目前使用外部程序管理我的序列号,然后使用单独的草图将其写入EEPROM。所有这些都通过构建过程来控制。听起来很复杂,但我无法想到一个更好的方法(没有硬编码串口#)。

我考虑过DS2401方法;但是,我不能证明额外的硬件是合理的。我没有看到写入EEPROM和另一个硬件组件写入串口的区别。

我还有一个SerialNumber类,用于读取可在任何项目中使用的数据。