Notifications
Clear all

Library that will load for some sketches and not for others.

8 Posts
3 Users
1 Reactions
747 Views
(@quince)
Member
Joined: 3 years ago
Posts: 40
Topic starter  

Hello all, I have not seen this problem before and I could use some direction. When loading a new sketch and compiling the IDE informed me that the library I wished to use was not installed. I checked the library and it was installed. I then pulled up an older program that used the same library and it loaded and compiled fine. I re-downloaded the library and the IDE, no luck. Any help would be appreciated. Thanks, Quince  


   
Quote
MarkPritchett
(@markpritchett)
Member
Joined: 5 years ago
Posts: 14
 

What were the libraries, or the code, and I'll see if I can reproduce the problem

This post was modified 2 years ago by MarkPritchett

   
ReplyQuote
MarkPritchett
(@markpritchett)
Member
Joined: 5 years ago
Posts: 14
 

Also, when you verify the script it shows which ones it's found. You could compare those that work with the ones that don't.

Here a (reformatted) sample of the output when I 'verify' one of my sketches

The -I lines show where the libraries are looked for

 

Detecting libraries used...
/home/mark/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++
-c
-g
-Os
-w
-std=gnu++11
-fpermissive
-fno-exceptions
-ffunction-sections
-fdata-sections
-fno-threadsafe-statics
-Wno-error=narrowing
-flto
-w
-x
c++
-E
-CC
-mmcu=atmega328p
-DF_CPU=16000000L
-DARDUINO=10607
-DARDUINO_AVR_NANO
-DARDUINO_ARCH_AVR
-I/home/mark/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino
-I/home/mark/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/eightanaloginputs
/tmp/arduino-sketch-75B0016B03FA06C15AD1462BB02B01BF/sketch/Tank_Controller_Code.ino.cpp
-o
/dev/null

 

 

This post was modified 2 years ago by MarkPritchett

   
ReplyQuote
(@quince)
Member
Joined: 3 years ago
Posts: 40
Topic starter  

This is the code that will not use the library. Thanks for the look-see. Quince

 

 

 

[code]
#include <Servo.h>
#include <Wire.h>
#include <QMC5883L.h> // QMC5883L library

// QMC5883L I2C address
#define QMC5883L_ADDRESS 0x0D

// Create a Servo object
Servo myservo;

// Create an instance of the QMC5883L class
QMC5883L compass;

int counter = 90;
int previousHeading = 0;
unsigned long start_time = 0;

void setup() {
  // Start I2C communication
  Wire.begin();

  // Initialize the QMC5883L
  compass.init();

  // Setup Serial Monitor
  Serial.begin (115200);

  // Attach servo on pin 9 to the servo object
  myservo.attach(9);
}

void loop() {
  // Read the current heading from the QMC5883L
  int currentHeading = compass.getHeading();

  // Check if the current heading is different from the previous heading
  if (abs(currentHeading - previousHeading) > 3) {
    // Update the servo position
    counter = map(currentHeading, 0, 360, 0, 180);
    myservo.write(counter);

    Serial.print("Position: ");
    Serial.println(counter);

    // Reset the start time
    start_time = millis();
  }

  // Check if no movement is detected for 500ms
  if (millis() - start_time > 500) {
    // Return the servo to the initial counter
    myservo.write(90);
    counter = 90;
    Serial.println("Returning to initial position");
  }

  // Update previousHeading with the current heading
  previousHeading = currentHeading;
}
[/code]

   
ReplyQuote
Ron
 Ron
(@zander)
Father of a miniature Wookie
Joined: 4 years ago
Posts: 7641
 

@quince The message about not finding a library is board specific. For instance yesterday I was looking at a library issue and found several versions of the library, each stored within the specific boards folder structure. Also confusion over <lib.h> vs "lib.h" can lead to unexpected results.

Posting some of your code usually the first page that shows what header files are included is enough in this case. Also a screenshot of the IDE preferences, and IDE Tools menu as seen in attached picture

Screenshot 2023 01 10 at 07.35.37

 

First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.


   
ReplyQuote
MarkPritchett
(@markpritchett)
Member
Joined: 5 years ago
Posts: 14
 

There are many variants for QMC5883.

The most popular seems to be QMC5883LCompass

However, it's include file, QMC5883LCompass.h, isn't what your using in the sketch.

Do you have a url for the download of the one you're using?

 

IGNORE THE ABOVE

I see you attached the original file.

You're using the Compass version, so your include should be

#include <QMC5883LCompass.h>

 

This post was modified 2 years ago 2 times by MarkPritchett

   
Ron reacted
ReplyQuote
MarkPritchett
(@markpritchett)
Member
Joined: 5 years ago
Posts: 14
 

@quince You're using a more recent/different version of the library.

The 'compass' variable/object needs to be of type: QMC5883LCompass

and

currentDirection has become getAzimuth

I think the revised code should be

#include <Servo.h>
#include <Wire.h>
#include <QMC5883LCompass.h> // QMC5883L library

// QMC5883L I2C address
#define QMC5883L_ADDRESS 0x0D

// Create a Servo object
Servo myservo;

// Create an instance of the QMC5883L class
QMC5883LCompass compass;

int counter = 90;
int previousHeading = 0;
unsigned long start_time = 0;

void setup() {
  // Start I2C communication
  Wire.begin();

  // Initialize the QMC5883L
  compass.init();

  // Setup Serial Monitor
  Serial.begin (115200);

  // Attach servo on pin 9 to the servo object
  myservo.attach(9);
}

void loop() {
  // Read the current heading from the QMC5883L
  // int currentHeading = compass.currentHeading();
  int currentHeading = compass.getAzimuth();

  // Check if the current heading is different from the previous heading
  if (abs(currentHeading - previousHeading) > 3) {
    // Update the servo position
    counter = map(currentHeading, 0, 360, 0, 180);
    myservo.write(counter);

    Serial.print("Position: ");
    Serial.println(counter);

    // Reset the start time
    start_time = millis();
  }

  // Check if no movement is detected for 500ms
  if (millis() - start_time > 500) {
    // Return the servo to the initial counter
    myservo.write(90);
    counter = 90;
    Serial.println("Returning to initial position");
  }

  // Update previousHeading with the current heading
  previousHeading = currentHeading;
}

   
ReplyQuote
(@quince)
Member
Joined: 3 years ago
Posts: 40
Topic starter  

Thank you all. I will give it a try. Quince


   
ReplyQuote