【问题标题】:How to initialize APDS-9930 ambient light / proximity sensor using ARDUINO Mega2560如何使用 ARDUINO Mega2560 初始化 APDS-9930 环境光/接近传感器
【发布时间】:2019-08-01 16:46:12
【问题描述】:

我购买了一个“APDS-9930”环境光传感器,它通过 I2C (TWI) 协议进行通信。我打算使用 ARDUINO Mega2560 开发板从中读取环境光水平。当我在网上搜索时,我发现了一个基于 APDS-9960 的修改后的 ARDUINO 库,它声称可以在 ARDUINO UNO 上使用 APDS-9930。但是,当与 Mega2560 一起使用时,它给了我“初始化错误”错误。这里有人知道如何处理这个错误吗?

我已经以多种方式使用“Wire.h”库来读取地址为 0x14 的“CH0 ADC 数据寄存器”,它保存环境电平值(根据数据表)。代码如下:

#define DUMP_REGS

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;

void setup() {
  //analogReference(EXTERNAL);

  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("APDS-9930 - Ambient light sensor"));
  Serial.println(F("--------------------------------"));

  // Initialize APDS-9930 (configure I2C and initial values)
  //if ( apds.init() ) {
   // Serial.println(F("APDS-9930 initialization complete"));
  //} else {
  //  Serial.println(F("Something went wrong during APDS-9930 init!"));
 // }

  // Start running the APDS-9930 light sensor (no interrupts)
  //if ( apds.enableLightSensor(false) ) {
   // Serial.println(F("Light sensor is now running"));
 // } else {
 //   Serial.println(F("Something went wrong during light sensor init!"));
 // }

#ifdef DUMP_REGS
  /* Register dump */
  uint8_t reg;
  uint8_t val;

  for(reg = 0x00; reg <= 0x19; reg++) {
    if( (reg != 0x10) && \
        (reg != 0x11) )
    {
      apds.wireReadDataByte(reg, val);
      Serial.print(reg, HEX);
      Serial.print(": 0x");
      Serial.println(val, HEX);
    }
  }
  apds.wireReadDataByte(0x1E, val);
  Serial.print(0x1E, HEX);
  Serial.print(": 0x");
  Serial.println(val, HEX);
#endif

  // Wait for initialization and calibration to finish
  delay(500);
}

void loop() {

  // Read the light levels (ambient, red, green, blue)
  if (  !apds.readAmbientLightLux(ambient_light) ||
        !apds.readCh0Light(ch0) || 
        !apds.readCh1Light(ch1) ) {
    Serial.println(F("Error reading light values"));
  } else {
    Serial.print(F("Ambient: "));
    Serial.print(ambient_light);
    Serial.print(F("  Ch0: "));
    Serial.print(ch0);
    Serial.print(F("  Ch1: "));
    Serial.println(ch1);
  }

  // Wait 1 second before next reading
  delay(1000);
}

【问题讨论】:

  • 你用什么板针来连接传感器?
  • 我在 Mega 上使用了两组 SCK 和 SDA 引脚,以及 3.3V 和 GND。还值得注意的是,使用 ID_Scanner 草图(确定连接的 I2C 模块的从机 ID),我成功找到了它的从机 ID,即 0x39。所以看起来引脚连接正确。
  • 我认为您的电路板可能是 5v 逻辑,而您尝试使用的传感器是 3.3v。您是否检查过引脚 20 和 21 是否通过电阻连接到 +5v?
  • ARDUINO Mega 有 3.3V 和 5V 输出。在这种情况下,我根据数据表使用了 3.3V。不过,我不太明白你的意思。引脚 20 和 21 分别是 SDA 和 SCK。我认为这些引脚不应连接到 3.3V 或 5V。
  • 对不起,我写的不是很清楚,我在手机上。我的意思是,引脚 20 和 21 上的 Mega 的 I2C 总线用于 5V 设备,因为它有两个上拉电阻将这些线连接到 +5V。请参阅 hereschematic。有两个电阻将引脚 SDA 和 SCK 连接到图纸中心顶部的 +5V。

标签: arduino sensors


【解决方案1】:

正如上面 cmets 中所讨论的,这个问题与硬件有关。

在 Arduino Mega 2560 board 上有两个电阻将线 SDA 和 SCK(连接器上的引脚 20 和 21)连接到 +5V。

使用这些上拉电阻,无法直接与工作在 3.3V 的传感器连接。

解决方案是添加一个电平转换器或移除板上的电阻,然后根据您要连接的传感器在必要时将它们安装到外部将它们连接到 5V 或 3.3V。

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多