Hello i got this error and dont know how to solve it. I usually want to make a follow-me robot where i put the coordinates and the robot will go to it.
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:34:7: error: ambiguating new declaration of 'float getHeading()'
float getHeading(){
^~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\last.ino:86:8: note: old declaration 'double getHeading()'
double getHeading() {
^~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\last.ino: In function 'void setup()':
C:\Users\Azri\Documents\Arduino\last\last.ino:39:11: error: 'class HMC5883L' has no member named 'setScale'; did you mean 'setRange'?
compass.setScale(1.3); // Set measurement range
^~~~~~~~
setRange
C:\Users\Azri\Documents\Arduino\last\last.ino:40:30: error: 'Measurement_Continuous' was not declared in this scope
compass.setMeasurementMode(Measurement_Continuous); // Set to continuous measurement mode
^~~~~~~~~~~~~~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino: At global scope:
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:4:10: error: redefinition of 'HMC5883L compass'
HMC5883L compass;
^~~~~~~
C:\Users\Azri\Documents\Arduino\last\last.ino:16:10: note: 'HMC5883L compass' previously declared here
HMC5883L compass;
^~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino: In function 'void setup()':
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:7:6: error: redefinition of 'void setup()'
void setup(){
^~~~~
C:\Users\Azri\Documents\Arduino\last\last.ino:22:6: note: 'void setup()' previously defined here
void setup() {
^~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino: In function 'void loop()':
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:16:6: error: redefinition of 'void loop()'
void loop(){
^~~~
C:\Users\Azri\Documents\Arduino\last\last.ino:43:6: note: 'void loop()' previously defined here
void loop() {
^~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino: In function 'void setupHMC5883L()':
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:27:19: error: 'class HMC5883L' has no member named 'SetScale'
error = compass.SetScale(1.3); //Set the scale of the compass.
^~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:28:41: error: 'class HMC5883L' has no member named 'GetErrorText'
if(error != 0) Serial.println(compass.GetErrorText(error)); //check if there is an error, and print if so
^~~~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:30:19: error: 'class HMC5883L' has no member named 'SetMeasurementMode'; did you mean 'setMeasurementMode'?
error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
^~~~~~~~~~~~~~~~~~
setMeasurementMode
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:30:38: error: 'Measurement_Continuous' was not declared in this scope
error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
^~~~~~~~~~~~~~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:31:41: error: 'class HMC5883L' has no member named 'GetErrorText'
if(error != 0) Serial.println(compass.GetErrorText(error)); //check if there is an error, and print if so
^~~~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino: In function 'float getHeading()':
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:34:7: error: ambiguating new declaration of 'float getHeading()'
float getHeading(){
^~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\last.ino:86:8: note: old declaration 'double getHeading()'
double getHeading() {
^~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:36:3: error: 'MagnetometerScaled' was not declared in this scope
MagnetometerScaled scaled = compass.ReadScaledAxis(); //scaled values from compass.
^~~~~~~~~~~~~~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:37:25: error: 'scaled' was not declared in this scope
float heading = atan2(scaled.YAxis, scaled.XAxis);
^~~~~~
C:\Users\Azri\Documents\Arduino\last\HMC5883L_Simple.ino:37:25: note: suggested alternative: 'srand'
float heading = atan2(scaled.YAxis, scaled.XAxis);
^~~~~~
srand
Multiple libraries were found for "HMC5883L.h"
Used: C:\Users\Azri\Documents\Arduino\libraries\HMC5883L
Not used: C:\Users\Azri\Documents\Arduino\libraries\Grove_3-Axis_Digital_Compass_HMC5883L
Not used: C:\Users\Azri\Documents\Arduino\libraries\Firmware
exit status 1
Compilation error: ambiguating new declaration of 'float getHeading()'
and here the code im using:
#include <Wire.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <HMC5883L.h>
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
#define ENA 5
#define ENB 6
TinyGPSPlus gps;
SoftwareSerial bluetooth(0, 1); // RX, TX
SoftwareSerial gpsSerial(3, 4); // RX, TX
HMC5883L compass;
double targetLat = 0.0; // Set your target latitude
double targetLng = 0.0; // Set your target longitude
bool targetSet = false;
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
bluetooth.begin(9600);
gpsSerial.begin(9600);
Serial.begin(9600);
Wire.begin();
if (!compass.begin()) {
Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
while (1);
}
compass.setScale(1.3); // Set measurement range
compass.setMeasurementMode(Measurement_Continuous); // Set to continuous measurement mode
}
void loop() {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (bluetooth.available()) {
String data = bluetooth.readStringUntil('\n');
parseBluetoothData(data);
}
if (gps.location.isValid() && targetSet) {
double currentLat = gps.location.lat();
double currentLng = gps.location.lng();
double targetBearing = calculateBearing(currentLat, currentLng, targetLat, targetLng);
double currentHeading = getHeading();
double bearingDifference = targetBearing - currentHeading;
if (abs(bearingDifference) < 10) {
moveForward();
} else if (bearingDifference > 0) {
turnRight();
} else {
turnLeft();
}
} else {
stopMotors();
}
delay(500);
}
double calculateBearing(double lat1, double lng1, double lat2, double lng2) {
double dLon = radians(lng2 - lng1);
double y = sin(dLon) * cos(radians(lat2));
double x = cos(radians(lat1)) * sin(radians(lat2)) - sin(radians(lat1)) * cos(radians(lat2)) * cos(dLon);
double brng = atan2(y, x);
brng = degrees(brng);
brng = fmod((brng + 360), 360); // Normalize to 0-360
return brng;
}
double getHeading() {
Vector norm = compass.readNormalize();
float heading = atan2(norm.YAxis, norm.XAxis);
if (heading < 0) heading += 2 * M_PI;
float headingDegrees = heading * 180/M_PI;
return headingDegrees;
}
void moveForward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void moveBackward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void turnLeft() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void turnRight() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
}
void stopMotors() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void parseBluetoothData(String data) {
int commaIndex = data.indexOf(',');
if (commaIndex > 0) {
String latString = data.substring(0, commaIndex);
String lngString = data.substring(commaIndex + 1);
targetLat = latString.toDouble();
targetLng = lngString.toDouble();
targetSet = true;
bluetooth.print("Target set to: ");
bluetooth.print(targetLat, 6);
bluetooth.print(", ");
bluetooth.println(targetLng, 6);
}
}