Pages: [1]   Go Down
Author Topic: Custom library including LiquidCrystal and Wire libraries  (Read 482 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dear community,

I'm new to the arduino board and have no experience in c++. I'm currently trying to learn how to write a custom library. However, I'm running into some problems when including libraries in my own custom library. I think I'm doing something wrong when calling the LiquidCrystal library. The main question is: How to I call my libraries properly?

What I want to archive:
I have a LCD screen and a I2C device. I want to write a custom library which includes the LiquidCrystal and Wire libraries. Also, these libraries have to be available for use in the main program.

Main program:
Code:
#include <LiquidCrystal.h>
#include <Wire.h>
#include "customLib.h"

customLib customlib;

void setup()
{
  customlib.identify();
}

void loop()
{
  lcd.setCursor(0, 1);
  lcd.print("I am main program");
}

customLib header:
Code:
#ifndef customLib_h
#define customLib_h

#include "Arduino.h"
class Wire;
class LiquidCrystal;

class customLib
{
  public:
    customLib();
    void identify();
  private:
};

#endif

customLib cpp file:
Code:
#include "Arduino.h"
#include "customLib.h"
#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 10);

customLib::customLib()
{
  lcd.begin(16,2);
}

void customLib::identify()
{
  lcd.clear();
  lcd.print("I am customLib");
}
Note: all this code is stripped down to the bare minimum I needed to describe my problem

When I compile this, it gives the error 'lcd was not declared in this scope'. This makes sense, as I've declared lcd in customLib.cpp. However, when I declare lcd in the main program, it will give the same error. This also makes sense, as I've now declared lcd in the main program, and not in the customLib.cpp. This brings us to the main question, How to I call my libraries properly?

Using the wire library gives no problems. I think this is because it doesn't need to be declared (e.g. no 'Wire wire;') in the code.

Thanks for your time, and I hope you can help me in understanding the Arduino code.

Used websites:
http://provideyourown.com/2011/advanced-arduino-including-multiple-libraries/
http://arduino.cc/en/Hacking/LibraryTutorial
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5145
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Take a look at the "extern" statement: http://www.geeksforgeeks.org/archives/840
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

If I understand correctly, I can define lcd in my main program and declare it in customLib? I'm not sure how I would do that. I'm not sure what the data type of lcd is.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay, I got it. The data type of lcd is of course LiquidCrystal. So I would define lcd in my main program with
Code:
LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 10);

and then declare lcd in customLib with
Code:
extern LiquidCrystal lcd

Thanks for helping me understand a bit more of c++!
Logged

Dallas, TX USA
Offline Offline
Faraday Member
**
Karma: 67
Posts: 2702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Take a look at this LCD library. It does what you seem to be wanting to do
using C++ inheritance and virtual functions.
It separates things into layers and allows a common LCD layer to sit on top
of lower interface layers so you can swap in i2c, shift registers, or run the original 4 bit parallel mode
as well as any other interface.
The interface layer code is quite minimal since the bulk of the code that handles the LCD and API
is up above.

https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home

--- bill
Logged

Pages: [1]   Go Up
Jump to: