下载VL6180X和Adafruit_VL6180X这两个库
在arduino的library路径下,分别打开这两个库对应的cpp和h文件
把VL6180X.cpp里面的setScaling函数和其内部包含的writeReg16Bit、writeReg、readReg一同打包到Adafruit_VL6180X.cpp下
在.h里面定义好所有参数地址,库文件就基本搞定了。
//----------------------------------------------------------------------------------------------------------
// 设置范围
//----------------------------------------------------------------------------------------------------------
void Adafruit_VL6180X::writeReg16Bit(uint16_t reg, uint16_t value)
{
_i2c->beginTransmission(_i2caddr);
_i2c->write((uint8_t)(reg >> 8)); // reg high byte
_i2c->write((uint8_t)(reg >> 0)); // reg low byte
_i2c->write((uint8_t)(value >> 8)); // value high byte
_i2c->write((uint8_t)(value >> 0)); // value low byte
last_status = _i2c->endTransmission();
}
void Adafruit_VL6180X::writeReg(uint16_t reg, uint8_t value)
{
_i2c->beginTransmission(_i2caddr);
_i2c->write((uint8_t)(reg >> 8)); // reg high byte
_i2c->write((uint8_t)(reg >> 0)); // reg low byte
_i2c->write(value);
last_status = _i2c->endTransmission();
}
uint8_t Adafruit_VL6180X::readReg(uint16_t reg)
{
uint8_t value;
_i2c->beginTransmission(_i2caddr);
_i2c->write((uint8_t)(reg >> 8)); // reg high byte
_i2c->write((uint8_t)(reg >> 0)); // reg low byte
last_status = _i2c->endTransmission();
_i2c->requestFrom(_i2caddr, (uint8_t)1);
value = _i2c->read();
return value;
}
void Adafruit_VL6180X::setScaling(uint8_t new_scaling)
{
uint16_t const ScalerValues[] = {0, 253, 127, 84};
uint8_t const DefaultCrosstalkValidHeight = 20; // default value of SYSRANGE__CROSSTALK_VALID_HEIGHT
// do nothing if scaling value is invalid
if (new_scaling < 1 || new_scaling > 3) { return; }
scaling = new_scaling;
writeReg16Bit(RANGE_SCALER, ScalerValues[scaling]);
uint8_t ptp_offset = read8(VL6180X_REG_SYSRANGE_PART_TO_PART_RANGE_OFFSET);
// apply scaling on part-to-part offset
writeReg(VL6180X_REG_SYSRANGE_PART_TO_PART_RANGE_OFFSET, ptp_offset / scaling);
// apply scaling on CrossTalkValidHeight
writeReg(SYSRANGE_CROSSTALK_VALID_HEIGHT, DefaultCrosstalkValidHeight / scaling);
// This function does not apply scaling to RANGE_IGNORE_VALID_HEIGHT.
// enable early convergence estimate only at 1x scaling
uint8_t rce = readReg(SYSRANGE_RANGE_CHECK_ENABLES);
writeReg(SYSRANGE_RANGE_CHECK_ENABLES, (rce & 0xFE) | (scaling == 1));
}
arduino正常引用Adafruit_VL6180X.h,setup里面加上setscaling和readrange的结果记得 * 3
#include "esp_system.h"
#include "esp_task_wdt.h"
#include <SPI.h>
#include <Adafruit_VL6180X.h>
#define SCALINE 3
#define LOX1_ADDRESS 0x30
#define SHT_LOX1 25
// objects for the VL6180X
Adafruit_VL6180X lox1 = Adafruit_VL6180X();
Adafruit_VL6180X *sensors[] = {&lox1};
unsigned long lastPrintTime = 0;
const unsigned long printInterval = 500; // 100ms
void setID() {
digitalWrite(SHT_LOX1, HIGH);
// initing LOX1
if (!lox1.begin()) {
Serial.println(F("Failed to boot first VL6180X"));
while (1);
}
lox1.setAddress(LOX1_ADDRESS);
delay(10);
}
void readSensor(Adafruit_VL6180X &vl) {
uint8_t addr = vl.getAddress();
Serial.print(" ");
Serial.print(addr);
Serial.print("-");
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print(range * 3);
}
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.print("(System error)");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.print("(ECE failure)");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.print("(No convergence)");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.print("(Ignoring range)");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.print("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.print("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.print("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.print("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.print("Range reading overflow");
}
}
void read_sensors() {
Serial.print("Addr-Range");
readSensor(lox1);
Serial.println();
}
void setup() {
Serial.begin(115200);
pinMode(SHT_LOX1, OUTPUT);
digitalWrite(SHT_LOX1, LOW);
setID();
Serial.println("System initialized.");
lox1.setScaling(3);
}
void loop() {
if (millis() - lastPrintTime > printInterval) {
lastPrintTime = millis();
read_sensors();
}
}
实习加班有感!