Как сделать код совместимым с платой ESP32? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь получить ультразвуковой датчик GY-US-42 c, работающий на ESP32. Тем не менее, я продолжаю получать ошибку при компиляции. Для Arduino и Board это не проблема, а для ESP32.

Мой код:

#include "Wire.h"
//The Arduino Wire library uses the 7-bit version of the address, so the code example uses 0x70 instead of the 8-bit 0xE0
#define SensorAddress byte(0x70)
//The sensors ranging command has a value of 0x51
#define RangeCommand byte(0x51)
//These are the two commands that need to be sent in sequence to change the sensor address
#define ChangeAddressCommand1 byte(0xAA)
#define ChangeAddressCommand2 byte(0xA5)
void setup() {
 Serial.begin(115200); //Open serial connection at 9600 baud

 Wire.begin(); 
// changeAddress(SensorAddress,0x40,0);
}
void loop(){
 takeRangeReading(); //Tell the sensor to perform a ranging cycle
 delay(50); //Wait for sensor to finish
  word range = requestRange(); //Get the range from the sensor
  Serial.print("Range: "); Serial.println(range); //Print to the user

}

//Commands the sensor to take a range reading
void takeRangeReading(){
  Wire.beginTransmission(SensorAddress); //Start addressing
  Wire.write(RangeCommand); //send range command
  Wire.endTransmission(); //Stop and do something else now
}
//Returns the last range that the sensor determined in its last ranging cycle in centimeters. Returns 0 if there is no communication.
word requestRange(){
  Wire.requestFrom(SensorAddress, byte(2));
  if(Wire.available() >= 2){ //Sensor responded with the two bytes
  byte HighByte = Wire.read(); //Read the high byte back
  byte LowByte = Wire.read(); //Read the low byte back
  word range = word(HighByte, LowByte); //Make a 16-bit word out of the two bytes for the range
  return range;
}
else {
  return word(0); //Else nothing was received, return 0
}
}

Ошибка:

sketch/GY-US42_I2C.ino.cpp.o:(.literal._Z12requestRangev+0x0): undefined reference to `makeWord(unsigned short)'
sketch/GY-US42_I2C.ino.cpp.o: In function `requestRange()':
/Users/Arduino/GY-US42_I2C/GY-US42_I2C.ino:42: undefined reference to `makeWord(unsigned short)'
collect2: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 27 марта 2020

word() предназначен для приведения переменной или литерала в 16-битное слово, он не добавляет два байта в 16-битное слово, как вы делаете word(HighByte, LowByte), я действительно удивлен, что это даже скомпилировано в Arduino .

Чтобы получить значение range, вы можете сделать:

int range = HighByte * 256 + LowByte;

или:

int range = ((int)HighByte) << 8 | LowByte; //cast HighByte to int, then shift left by 8 bits.

Но поскольку Wire.read() возвращает int вместо вместо байт (вы можете увидеть определение прототипа его функции здесь ), поэтому ваш код на самом деле может быть записан так:

int reading = Wire.read();  //read the first data
reading = reading << 8;     // shift reading left by 8 bits, equivalent to reading * 256
reading |= Wire.read();     // reading = reading | Wire.read()

Кстати, когда вы используете #define, вы не нужно специально приводить значение const к указанному типу данных c, компилятор позаботится об оптимизации и правильном типе данных, поэтому:

#define SensorAddress byte(0x70)

будет в порядке, если определить this:

#define SensorAddress 0x70

Вам также не нужно приводить значение const с byte(2) или return word(0). В последнем случае ваш прототип функции уже ожидает, что возвращение будет иметь тип данных word.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...