librerie

Ciao a tutti :slight_smile:
E possibile utilizzare una libreria (standard) dentro una libreria che creo io?
Ho provato ad esempio con la che la includo dentro la mia ma non funziona (non da errori)
e volevo sapere se devo aggiungere qualcosa nel codice oppure dovrei applicare in qualche modo l'eredità.
Posto il codice che ho provato senza succeso:
File.ino

#include "LCD.h"

LCD lcd(0);

void setup(){
  lcd.Displayset();
  lcd.Message(1);
}

void loop(){
  
}

File.h

#ifndef LCD_h
#define LCD_h
class LCD{
  public:
    LCD(int n);
    void Displayset();
    void Message(int N);
};
#endif

File.cpp

#include <Arduino.h>
#include<LiquidCrystal.h>
#include "LCD.h"

LCD::LCD(int n){}
LiquidCrystal Display(22, 23, 24, 25, 26, 27);

void LCD::Displayset(){
  Display.begin(16, 4);
}
void LCD::Message(int N){
  Display.setCursor(N, 0);
  Display.print("FF");
}

Non ditemi su se ho fatto qualche caz...ta :confused:
Prima che me lo dica qualcuno so benissimo che programmare ad oggetti su una mcu di arduino
potrebbe dire volersi male da soli sopratutto se metti in ballo l'eredità, la domanda è a solo scopo informativo/curioso :slight_smile:
Grazie :slight_smile:

Ciao! Non sono esperto della programmazione ad oggetti in C++ su arduino, però posso dirti che è possibile includere librerie in una libreria personalizzata, di solito viene includa la libreria Arduino.h.
Va includa sia dove dichiari la classe nel file .h, sia dove implementi i metodi nel file .cpp.
Ripeto che non sono esperto della programmazione ad oggetti, ma tu non includi solo una libreria,tu crei un oggetto all'interno della libreria, questo non so se sia possibile, ossia non so se puoi creare un oggetto LiquidCrystal dentro una libreria.

La cosa mi ha incuriosito...

adesso non posso provare,
prova ad includere <LiquidCrystal.h> anche nel File.ino

Federico

A proposito di ereditarietà, dai un'occhiata qui e qui.

Federico

AndreAndre:
Prima che me lo dica qualcuno so benissimo che programmare ad oggetti su una mcu di arduino
potrebbe dire volersi male da soli sopratutto se metti in ballo l'eredità

Beh ni...
Il compilatore C++ genera probabilmente un codice più grande quando usi gli oggetti (i compilatori C++ in genere di fatto internamente trasformano il sorgente in C e poi compilano e linkano), ma non è affatto un problema programmare ad oggetti, almeno fino a quando non saturi la memoria... :wink: Anzi, se il programma non è proprio semplicissimo, a volte rende la programmazione ben più strutturata e riutilizzabile, quindi non preoccuparti di questo.

Non mi pare tu stia usando alcuna ereditarietà, si vede dalla dichiarazione della classe LCD dove non erediti da LiquidCrystal ma semplicemente nella tua classe fai riferimento ad un'altra per "incapsularla" in un oggetto per te più direttamente utilizzabile.

Ovviamente immagino che "File.h" e "File.cpp" siano in realtà "LCD.h" e "LCD.cpp", vero? Perché nel programma includi solo LCD.h...

Non so se questo sia il problema, ed ovviamente non posso provare senza creare il progetto a casa, ma crei l'oggetto Display che non è referenziato all'interno del file .h della classe, io la definirei tra le variabili private ossia metterlo nel file LCD.h come "private":

private: 
 LiquidCrystal Display;

Poi al posto tuo la istanzierei/inizializzerei nel costruttore, dove magari metti anche la begin (così puoi anche eliminare la DisplaySet:

LCD::LCD(int n)
{
  Display = new Display(22, 23, 24, 25, 26, 27);
  Display.begin(16, 4);
}

Prova e fammi sapere.

PS tra parentesi, a che ti serve il parametro numerico del costruttore visto che non lo usi mai?

AndreAndre:
E possibile utilizzare una libreria (standard) dentro una libreria che creo io?

E' un approccio che uso abitualmente, perchè isola le dipendenze da una libreria esterna ad una porzione ridotta del codice e quindi poi è più facile da manutenere (per esempio mi è capitato di cambiare una libreria con un altra che faceva la stessa cosa in modo diverso..) ed è più facile da portare da un progetto all'altro.

Io però uso una soluzione che NON è standard e NON è consigliata, però funziona, mi ci trovo bene, quindi continuo ad usarla: io includo tutto in un file .h in cui inserisco sia dichiarazioni che implementazioni che poi includo nel main.cpp

Più o meno così:

#ifndef LcdHelper_h
#define LcdHelper_h

#include <LiquidCrystal_I2C.h>

class LcdHelper
{

private:
    LiquidCrystal_I2C* lcd;

    int brightnessPin;
    int contrastPin;
    int luminositySensorPin;

public:
    LcdHelper();
    ~LcdHelper();

    void Initialize(int _brightnessPin, int _contrastPin, int _luminositySensorPin);
};


LcdHelper::LcdHelper() { }

LcdHelper::~LcdHelper() { }


void LcdHelper::Initialize(int _brightnessPin, int _contrastPin, int _luminositySensorPin)
{
    brightnessPin = _brightnessPin;
    contrastPin = _contrastPin;
    luminositySensorPin = _luminositySensorPin;

    pinMode(luminositySensorPin, INPUT);
    pinMode(brightnessPin, OUTPUT);
    pinMode(contrastPin, OUTPUT);

    lcd = new LiquidCrystal_I2C(0x27, 20, 4);
    lcd->init();
    lcd->backlight();
}

#endif

Poi nel main:

#include <LcdHelper.h>
#define LIGHT_PIN 6
#define CONTRAST_PIN 5
#define LIGHTSENSOR_PIN A1

LcdHelper helper;


void setup() {
    
    helper.Initialize(LIGHT_PIN, CONTRAST_PIN, LIGHTSENSOR_PIN);
}

void loop() {

}

ciao

Ciao eccomi scusate ma ieri tra lavoro, macchina dal meccanico, morosa e sonno non ho neanche acceso il pc,
allora,

docdoc:

LCD::LCD(int n)

{
 Display = new Display(22, 23, 24, 25, 26, 27);
 Display.begin(16, 4);
}




Prova e fammi sapere.

PS tra parentesi, a che ti serve il parametro numerico del costruttore visto che non lo usi mai?

ho provato ma nulla mi da errori:
err1 -> no matching function for call to 'LiquidCrystal::LiquidCrystal()'
err2 -> expected type-specifier before 'Display'

paolo311:
Io però uso una soluzione che NON è standard e NON è consigliata, però funziona, mi ci trovo bene, quindi continuo ad usarla: io includo tutto in un file .h in cui inserisco sia dichiarazioni che implementazioni che poi includo nel main.cpp

salve, dopo provo :slight_smile:

comunque prima ho provato a fare una roba "simile" come avevo fatto e funziona tutto ok, posto il cod:

testClass.ino

#include"test.h"

test test1(0);

void setup(){}

void loop(){
  test1.test_led();
}

test.h

#ifndef test_h
#define test_h

class test{
  public:
    test(byte a);
    void test_led();
};
#endif

test.cpp

#include<Arduino.h>
#include"led.h"
#include"test.h"

test::test(byte a){}

led led1(13);

void test::test_led(){
  led1.start(500);
}

led.h

#ifndef led_h
#define led_h
class led{
  public:
    led(byte pin);
    void start(int Time);
  private:  
    byte pin_;
    void switch_on();
    void switch_off(); 
};
#endif

led.cpp

#include<Arduino.h>
#include"led.h"

led::led(byte pin){
  pinMode(pin, OUTPUT);
  pin_ = pin;
}

void led::switch_on(){
  digitalWrite(pin_, HIGH);
}

void led::switch_off(){
  digitalWrite(pin_, LOW);
}

void led::start(int Time){
  switch_on();
  delay(Time);
  switch_off();
  delay(Time);
}

ah il parametro del costruttore l'ho messo perchè mi dava errore senza, magari sbagliavo sintassi :slight_smile:

non lo so cosa potrebbe essere, piu tardi provo il metodo di "paolo311" però se nell'esempio che ho fatto funziona ci deve essere qualcosa nella libreria che "blocca" qualche metodo :frowning:
grazie a tutti intanto

Ciao di nuovo, ho trovato il problema..mi sento proprio scemo, mi sono dimenticato di settare il pin del contrasto e me ne sono accorto quando ho escluso la mia libreria e ho messo la LiquidCrystal.h nel file.ino per poi scoprire che non funzionava neanche cosi e guardando un vecchio progetto ho scoperto l'inghippo, che mona, grazie a tutti per le risposte :slight_smile: :slight_smile:

Ok Bene.
Sai cosa é il vantaggio di tutta questa storia?
Non Te lo dimenticherai mai piú di settare il pin del contrasto.
Ciao Uwe

AndreAndre:
mi sono dimenticato di settare il pin del contrasto e me ne sono accorto quando ho escluso la mia libreria e ho messo la LiquidCrystal.h nel file.ino per poi scoprire che non funzionava neanche cosi

Beh, behe, l'importante è risolvere il problema! :slight_smile: E ora ho capito a cosa ti serviva il parametro nel costruttore della classe LED. :wink:
Comunque sia:

err1 -> no matching function for call to 'LiquidCrystal::LiquidCrystal()'

Si, scusami, è che la LiquidCrystal non ha alcun costruttore privo di parametri, mia abitudine di cercare sempre di parametrizzare. In questo caso ti basterebbe mettere i parametri nel LCD.h::

private:
 LiquidCrystal Display(22, 23, 24, 25, 26, 27);

e quindi nel costruttore lasci solo:

LCD::LCD(int n)
{
  Display.begin(16, 4);
}

Questa modifica te la consiglio comunque... :wink: