简体   繁体   中英

How do make code compatible to ESP32 board?

I'm trying to get a GY-US-42 ultrasonic sensor working on the ESP32. However, I keep getting an error while compiling. For and Arduino Board it is not a problem, but for the ESP32.

My code:

#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
}
}

Error:

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

The word() is for casting a variable or literal into a 16-bit word, it does not add two bytes into a 16-bit word as you do word(HighByte, LowByte) , I'm actually surprise this even compiled in Arduino.

To get the range value, you could do:

int range = HighByte * 256 + LowByte;

or:

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

But since Wire.read() is returning an int instead of a byte(you can see its function prototype definition here ), therefore you code can actually be written like this:

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()

By the way, when you use #define , you don't need to specifically cast the const value into specific data type, the compiler will take care of the optimization and the right data type, so:

#define SensorAddress byte(0x70)

would be just fine by defining like this:

#define SensorAddress 0x70

You also do not need to cast const value with byte(2) or return word(0) . In the latter case, your function prototype already expect the return would be a data type of word .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM