Go Down

Topic: Errore LiquidCrystal I2C  (Read 365 times) previous topic - next topic

orzowilde

Jul 12, 2019, 11:18 am Last Edit: Jul 12, 2019, 11:27 am by orzowilde
Salve a tutti, sto costruendo un bromografo ed ho trovato in rete il codice per la gestione del tempo di esposizione con l'attivazione e disattivazione a tempo del relè che farà attivare i neon.

Quando faccio la verifica del codice nell'IDE arduino mi da il seguente errore: no matching function for call to 'LiquidCrystal_I2C::begin()'

Non riesco assolutamente a capire quale sia il problema.

Potete aiutarmi?

Grazie anticipatamente.

Questo è il codice che sto usando:

Code: [Select]
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

#define encoder0PinA  2
#define encoder0PinB  3


volatile int encoder0Pos = 4;
volatile boolean PastB = 0;
volatile boolean update = false;

int contatoreFineTempo;
int lastButtonState = 0;
// ------------------------++++++++++++++++++++++   ENCODER
int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;
volatile long encoderValue2 = 0;
volatile long encoderValue3 = 0;

long lastencoderValue = 0;
long lastencoderValue2 = 0;
long lastencoderValue3 = 7;

int lastMSB = 0;
int lastLSB = 0;

// ------------------------++++++++++++++++++++++
int ore = 45;
int minuti = 5;
int secondi = 6;



//---------  timer variabili

int buzzer = 7;           //PIEDINO DEL BUZZER
int rele = 6;
int secondiTotali = 0;     //Tempo totale
int msg = 0;
int reset = 0;
int start = A6;            //Pulsador de arranque
int empieza = 1024;        // Variable para almacenaje del pulsador de arranque


// assegnazione ingressi per i due pulsanti start e encoder
int pushButton = 4;
int pushButtonSTART = 5;



int pushButtonSTARTstate = 0;


int timeHOLD;
int timeSEC = 0;
int HorMinSec = 0;
int step_funzione = 0;


// Grafica per clessidra e cursore
uint8_t testChar[8] = {0x1F, 0x17, 0x1B, 0x1D, 0x1D, 0x1B, 0x17, 0x1F,};
uint8_t testClessidra[8] = {0x1F, 0x11, 0x0A, 0x04, 0x04, 0x0E, 0x1F, 0x1F,};


/*
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                            VOID  SETUP                    VOID  SETUP
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
*/


void setup() {

  lcd.begin();
  Serial.begin(9600);
  Serial.begin(9600);
  pinMode(pushButton, INPUT); // dichiara che il "pushButton" è un input:
  pinMode(pushButtonSTART, INPUT);
  pinMode(start, INPUT);    //Pin de pulsador de arranque --> Entrada

  pinMode(encoder0PinA, INPUT);
  pinMode(encoder0PinB, INPUT);

  digitalWrite(encoder0PinB, HIGH);
  digitalWrite(encoder0PinA, HIGH);
  int pushButtonSTARTstate = HIGH;   //  RESISTENZA PULL UP DEL PULSANTE  START
  attachInterrupt(1, doEncoderB, FALLING);



  // CARICAMENTO dei valori temporali (ore, minuti, secondi)
 
  lastencoderValue3 = EEPROM.read(1);
  encoderValue3 = EEPROM.read(1);
  lastencoderValue2 = EEPROM.read(2);
  encoderValue2 = EEPROM.read(2);
  lastencoderValue = EEPROM.read(3);
  encoderValue = EEPROM.read(3);


// portare i resitori interni a pull up

  pinMode(encoderPin1, INPUT_PULLUP);
  pinMode(encoderPin2, INPUT_PULLUP);
  pinMode(pushButtonSTART, INPUT_PULLUP);
  pinMode(pushButtonSTARTstate, INPUT_PULLUP);
  pinMode(pushButton, INPUT_PULLUP);

  digitalWrite(pushButton, HIGH);  // forza il pin  a livello alto sfruttando la resistenza di pull-up interna ad arduino
 
  pinMode(buzzer, OUTPUT);  
  pinMode(rele, OUTPUT);  


 // presentazione iniziale
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Bromografo");
  lcd.setCursor(0, 1);
  lcd.print("Orzowilde");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Vers. Firmware");
  lcd.setCursor(0, 1);
  lcd.print("Beta 0.1");
  delay(2000);
  lcd.clear();



  msg = 0;                
  empieza = 1024;          

// CREAZIONE DEI DUE CARATTERI CUSTOM

  lcd.createChar(0, testChar); // Sends the custom char to lcd
  lcd.createChar(1, testClessidra); // Sends the custom char to lcd

}

/*
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                            VOID loop                    VOID  loop
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
*/


void loop() {
  lcd.setCursor(0, 1);
  lcd.print((char)1);  // STAMPA LA CLESSIDRA


  if (update) {
    update = false;
    PastB ? encoder0Pos++ : encoder0Pos--;


  }


  //  ore minuti secondi
  ore = lastencoderValue;
  minuti = lastencoderValue2;
  secondi = lastencoderValue3;




  switch (step_funzione) {
    case 0:    // STATO INIZIALE
      INIZIO();
      break;
    case 1:    // VAI ALLA FUNZIONE: EDIT TEMPO
      EDIT_TEMPO();

      break;
    case 2:    // VAI ALLA FUNZIONE: CONTO ALLA ROVESCIA
      COUNT_DOWN();
      break;
    case 3:    // VAI ALLA FUNZIONE: TEMPO SCADUTO
      TEMPO_SCADUTO();
      break;
  }
}


//---------------------- ---------------------- ---------------------- ----------------------
//---------------------- FUNZIONE: INIZIO ---------------------- ----------------------------
//---------------------- ---------------------- ---------------------- ----------------------

void INIZIO() {
  lcd.setCursor(0, 0);
  lcd.print("   PREMI START  ");
  lcd.setCursor(0, 1);


  lcd.setCursor(4, 1);
  if (ore < 10) lcd.print("0");     // SE LE ORE SONO MENO DI 10, SCRIVI LO ZERO A SINISTRA.
  lcd.print(ore);                   // STAMPA LE ORE
  lcd.print(":");                   // STAMPA I DUE PUNTI

  if (minuti < 10) lcd.print("0");  // SE I MINUTI SONO MENO DI 10, SCRIVI LO ZERO A SINISTRA.
  lcd.print(minuti);                // STAMPA I MINUTI
  lcd.print(":");                   // STAMPA I DUE PUNTI

  if (secondi < 10) lcd.print("0");  // SE I SECONDI SONO MENO DI 10, SCRIVI LO ZERO A SINISTRA.
  lcd.print(secondi);                // STAMPA I SECONDI





PS. non ho messo tutto il codice perchè il forum non mi permette di scrivere più di 9000 caratteri.

nid69ita

#1
Jul 12, 2019, 11:46 am Last Edit: Jul 12, 2019, 11:47 am by nid69ita
PS. non ho messo tutto il codice perchè il forum non mi permette di scrivere più di 9000 caratteri.

Allora allega il file.
P.S. guarda la libreria dentro al file LiquidCrystal_I2C.h il comando begin(), probabilmente non puoi non passare dei parametri. 
my name is IGOR, not AIGOR

Federico66

#2
Jul 12, 2019, 11:47 am Last Edit: Jul 12, 2019, 11:57 am by Federico66
La begin per lcd, se non sbaglio, va chiamata passandogli colonne e righe:

Prova cosi:

Code: [Select]

  lcd.begin(16, 2);



[edit]
in realtà dipende dalla libreria...

Federico

orzowilde

La begin per lcd, se non sbaglio, va chiamata passandogli colonne e righe:

Prova cosi:

Code: [Select]

  lcd.begin(16, 2);



Federico
Ho provato pure così ma mi da un altro errore: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int)'


Comunque in allegato il file con tutto il codice.

Federico66

Ho provato pure così ma mi da un altro errore: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int, int)'
Allora forse è il caso che ci dici quale libreria stai usando
Io ho usato la versione recente di questa.

Alcune versioni usano lcd.init()


orzowilde

#5
Jul 12, 2019, 12:11 pm Last Edit: Jul 12, 2019, 12:22 pm by orzowilde
ma come faccio a dirvi quale libreria sto usando?


Leggendo all'interno del file LiquidCrystal_I2C.h ho trovato questa riga di spiegazione: After creating an instance of this class, first call begin() before anything else.

Quindi penso che dovrei usare begin(), o sbaglio?

Federico66

#6
Jul 12, 2019, 12:20 pm Last Edit: Jul 12, 2019, 12:26 pm by Federico66
ma come faccio a dirvi quale libreria sto usando?
Scusa mi ero perso un pezzo del post!



ma l'hai installata la libreria LiquidCrystal_I2C?

cerca LiquidCrystal_I2C

- controlla da Gestione librerie
- controlla nella sotto cartella libraries di Arduino

oppure fai una ricerca sul disco cercando "LiquidCrystal_I2C.h"


Federico

orzowilde

#7
Jul 12, 2019, 12:26 pm Last Edit: Jul 12, 2019, 12:29 pm by orzowilde
Ho appena controllato, la libreria è installata e mi restituisce sempre lo stesso errore: no matching function for call to 'LiquidCrystal_I2C::begin()'


Mi sta facendo impazzire...

Possibilmente sarà una cretinata (almeno spero...)

Federico66

Leggendo all'interno del file LiquidCrystal_I2C.h ho trovato questa riga di spiegazione: After creating an instance of this class, first call begin() before anything else.
Quindi penso che dovrei usare begin(), o sbaglio?
ma è quello che stai facendo...

hai provato gli esempi installati con la libreria? funzionano?

se nessuno ha altri consigli, io proverei a cambiarla, elimini quella e installi ad esempio questa


Federico

orzowilde

Ho scaricato ed installato la nuova libreria consigliatami da Federico66  ma mi da sempre lo stesso problema...

non so più che pesci prendere....

Federico66

#10
Jul 12, 2019, 01:01 pm Last Edit: Jul 12, 2019, 01:02 pm by Federico66
Ho scaricato ed installato la nuova libreria consigliatami da Federico66  ma mi da sempre lo stesso problema...

non so più che pesci prendere....
se hai installato quella, allora lcd.begin(16, 2);

in alternativa lcd.init();

Federico

gpb01

#11
Jul 12, 2019, 01:43 pm Last Edit: Jul 12, 2019, 01:44 pm by gpb01
non so più che pesci prendere....
... studiare tutti gli esempi che sono a corredo di una libreria per vedere i vari metodi come vanno chiamati.

Della LiquidCrystal ne esistono purtroppo diverse versioni, scritte da autori differenti e ... ciascuno ha scritto metodi leggermente diveri dagli altri, quindi, ripeto, l'unica è studiarsi bene gli esempi a corredo e NON fare copia/incolla di programmi trovati in giro senza sapere cosa si sta facendo!

Guglielmo
Search is Your friend ... or I am Your enemy !

Maurotec

Ecco stavo per scrivere ciò che ha scritto gpb01 e quindi se anche gli esempio non funzionano avrai qualcosa di corrotto, magari durante il download della lib qualcosa si è perso per strada.

Prova con l'esempio Hello world e facci sapere.

Ciao.

orzowilde

... studiare tutti gli esempi che sono a corredo di una libreria per vedere i vari metodi come vanno chiamati.

Della LiquidCrystal ne esistono purtroppo diverse versioni, scritte da autori differenti e ... ciascuno ha scritto metodi leggermente diveri dagli altri, quindi, ripeto, l'unica è studiarsi bene gli esempi a corredo e NON fare copia/incolla di programmi trovati in giro senza sapere cosa si sta facendo!

Guglielmo
Hai completamente ragione, in questo caso ho fatto copia ed incolla di un programma trovato in giro su internet, comunque prendo sempre qualche esempio che trovo in giro per poi modificarlo in base alle mie esigenze.
Questo per avere un base su cui lavorare, non so se riuscirei almeno per ora a scrivere un programma da zero.

se hai installato quella, allora lcd.begin(16, 2);

in alternativa lcd.init();

Federico
Comunque ho provato sia lcd.begin(16,2); e lcd.init(); e funzionano tutti e due.

Grazie a tutti e specialmente a Federico66

orzowilde

Salve a tutti, sono di nuovo qua con un altro problema sempre relativo al timer in oggetto.

Premetto che sto usando un encoder rotativo collegato ad un arduino nano.
 In poche parole funziona tutto ma quando giro l'encoder i numeri che dovrei settare giro malamente nel senso che a volte girano, a volte no, altre volte ancora saltano numeri.

Il fatto è che non riesco a capire se è un problema hardware o software...

Qualcuno mi può aiutare?

Go Up