arduino项目的唯一机器ID

问题描述 投票:3回答:5

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

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

arduino
5个回答
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上写一个号码 - >你有你的唯一ID


1
投票

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

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

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


0
投票

对不起,但我知道的所有atmega芯片都不会给出一个唯一的ID,但xmega系列确实如此(但那时你真的远离arduino)。

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

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

您还可以实现诸如在总线中请求ID之类的内容,以及是否可以免费使用并存储它,但会给协议增加很多复杂性


0
投票

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

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.