Go Down

Topic: librerie I2C che bloccano il codice (Read 1 time) previous topic - next topic

vince59

...come da titolo vi chiedo qualche chiarimento sulle librerie I2C.
Il problema nasce dal fatto che un vecchio codice, anzi due, che giravano benissimo su un LCD 16x2 e poi 20x4 (già provvisto di modulo I2C) se collegati al vecchio modo, ora stanno dando problemi con le librerie I2C associate ai relativi moduli I2C.
I display sono perfettamente funzionanti con TUTTI i codici che ho e mi stanno dando problemi solo su uno che utilizzo come termometro a due sonde.
Su monitor seriale l'output è corretto come inserisco le librerie I2C e la Wire.h si "sputtana" tutto.
Qual'è il motivo??

zemmo

Ciao,
la prima cosa che mi viene in mente quando ti si incasina tutto è che l'indirizzo dello slave con cui vuoi instaurare la comunicazione non sia corretto..





vince59

Ciao zemmo, prendo atto ma purtroppo non sono così tecnico da comprendere il significato dela tua indicazione e tantomento individuare il problema/soluzione.
Tieni conto che non gira solo su questo "semplice" programma termometro a due sonde mentre gira su tutti gli altri programmi. Nello specifico, ho due programmi termostato; uno che lavora sulla media dei valori (e con questo nessun problema) ed il secondo che lavora con un array (sul quale non lavora e incasina). Su output monitor seriale tutto ok fin quando non inserisco le linee relativa alle libreire I2C, wire e quant'altro.

MatteoDerrico

ciao

ho letto e riletto il posto... ma non è ben chiaro il problema, o almeno non riesco a capirlo io :(

se riesci a essere un po' più dettagliato nei procedimenti da te fatti allegando anche qualche pezzo di codice e un piccolo circuito farebbe comodo :)

MD
Se una scrivania in disordine è segno di una mente disordinata, di cosa sarà segno allora una scrivania vuota?

ORSO2001

ciao...cosa vuol dire "stanno dando problemi"?...errori in compilazione? quello che vedi nell'LCD non è coerente con quello che ti aspetti?...non scrive nulla?

per quanto scritto da zemmo...per farla semplice...I2C è un modo di trasmettere e richiedere informazioni a schede/componenti esterni ad arduino...siccome puoi averen più di uno connesso contemporaneamente un modo per far capire allo specifico componente che gli stai chiedendo qualche cosa è dare, in questo caso con configurazione hardware del modulo I2C del display, un indirizzo (ID) e specificare quest'indirizzo nei dati che invii.
c'è un programmino...mi sembra si chiami "I2C scanner"...ti dice che indirizzi sono collegati all'arduino

vince59

provvedo.
In parole...ho un semplice programma che mi fa da termometro con due sonde.
Funzionava regolarmente con un display LCD 16x2 QUANDO collegato con i vari PIN ed inseriti i relativi comandi/librerie.
Avendo a disposizione dei  moduli I2C li ho montati sui display LCD che ho e che utilizzo senza problemi con altri programmi.
Bene...anzi male...una volta inserite le istruzioni/libreria I2C il programmma non gira più e si stranisce...lcd blinka, l'out put su monitor seriale sbarella.

ecco il codice: messo così gia regolarmente e mi da output su monitor seriale corretto ovviamnte NO lcd dato che è collegato un I2C.
Se  attivo le prime tre linee (aggiornando i comandi nel setup) l'LCD non funziona e l'output su monitor seriale sfarfalla.

Code: [Select]

//#include <LiquidCrystal_I2C.h>
//#include <Wire.h>
//LiquidCrystal_I2C lcd(0x3f, 20, 4);  // LCD GRANDE

const int NRLETTURE = 10;    // numero letture
const int NRLETTURE2 = 10;
const int SensorPin = A0;    //variabile lettura sensore
const int SensorPin2 = A1;   // seconda variabileb sensore due

float valori[NRLETTURE];     //array con i valori
float valori2[NRLETTURE2];

int T_campionamento = 25;    // tempo campionamento
int T_campionamento2 = 25;

float sommaGradi, mediaGradi, sommaGradi2, mediaGradi2;

long previousMillis = 0;
long interval = 500;

#include <LiquidCrystal.h>             // include la libreria del display lcd
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pin display LCD

void setup()
{
// lcd.init();        // set up the LCD's number of columns and rows:
// lcd.backlight();
   lcd.begin(20, 4);
 // lcd.backlight();
  lcd.print("Created by: ");
  lcd.setCursor(0,2);
  lcd.print("ppregeo");
  Serial.begin(9600);      //inizializzo la seriale
 // analogReference(INTERNAL);  
 //delay(3000);
}
void loop()
{
  analogRead(SensorPin2);
  
  for ( int i = 0; i<=NRLETTURE;i++)
  {
    int sensorVal = analogRead(SensorPin);
    //float voltage = (sensorVal /1024.0) * 5.0; //dividendo per 1024.0 da una lettura inferiore.
    //float temperature = (voltage - .5) * 100;
    float temperature = (sensorVal * 4.30)/10;
    valori[i] = temperature;
    delay(T_campionamento);

    }
  sommaGradi = 0;                        // il primo valore deve essere sia zero, altrimenti poi sballa tutto
  for( int i = 0; i<=NRLETTURE; i++)     //ciclo che somma i valori dell'array
  {
    sommaGradi = sommaGradi + valori[i];   //sommaGradi2 = sommaGradi2 + valori[i];
  // }
  mediaGradi = sommaGradi / NRLETTURE;   //media valori
  }
  analogRead(SensorPin);
  
  for ( int i = 0; i<=NRLETTURE2;i++)
  {
    int sensorVal2 = analogRead(SensorPin2);
    //float voltage2 = (sensorVal2 /1024.0) * 5.0;
    //float temperature2 = (voltage2 - .5) * 100;
    float temperature2 = (sensorVal2 * 4.30) /10;
    valori2[i] = temperature2;
    delay(T_campionamento2);
  }
  sommaGradi2 = 0;
  for( int i = 0; i<=NRLETTURE2; i++)        //ciclo che somma i valori dell'array
  {
    sommaGradi2 = sommaGradi2 + valori2[i];
// }
  mediaGradi2 = sommaGradi2 / NRLETTURE2; //divido la somma dei valori per il loro numero (media)    
 }

  //--------------- prova delay ----------------
  //    unsigned long currentMillis = millis();
  //    if (currentMillis - previousMillis > interval)
  //    {
  //    previousMillis = currentMillis;
  
  //delay(T_campionamento);
  //--------------------------------------------

  Serial.print ("Temp mandata:    ");            //scrive sul display la parola "gradi"
  Serial.println (mediaGradi);
  Serial.print ("Temp ritorno:    ");
  Serial.println (mediaGradi2);
  Serial.print ("differenza:      ");
  Serial.println (mediaGradi-mediaGradi2);
  Serial.println ("---------------------------------------------");
    
  lcd.clear();
  lcd.print("In ");                  
  lcd.print(mediaGradi);               //scrivo la temperatura
  lcd.setCursor(0,1);
  lcd.print("Out ");
  lcd.print(mediaGradi2);
  lcd.setCursor(0,2);
  lcd.print("d ");
  lcd.print(mediaGradi - mediaGradi2);
}



vince59

#6
Dec 18, 2018, 12:09 pm Last Edit: Dec 18, 2018, 12:11 pm by vince59
@ ORSO... si l'LCD ha il corretto address...0x3f. gia verificato e cmd gia funzionanti con altri programmi.
l'LCD NON funziona proprio...nel migliore dei casi mi da solo la schermata del setup...ma non quella del ciclo loop. Ho provato anche ad isolarla con un void...ma nulla

maubarzi

#7
Dec 18, 2018, 12:09 pm Last Edit: Dec 18, 2018, 12:12 pm by maubarzi
Se usi uno di questi cosi possono avere un diverso indirizzo di default a seconda della versione dell'integrato che vedi al centro.
Quelli su cui mi sono imbattuto sono 0x27 e 0x3F, non so se ce ne sono altri con indirizzo di default andora differenti.
Usi la libreria LiquidCrystal_I2C?
La inizializzi così?
LiquidCrystal_I2C lcd(0x3F, 16, 2);
o in un modo simile? Il primo parametro è appunto l'indirizzo a cui il dispositivo risponde.

EDIT:
mi sono sovrapposto, prova con 0x27 se non sei sicuro dell'indirizzo.
Oppure usa lo scan i2c per capire che indirizzo può avere il tuo dispositivo.
Lo scan è banale, fa un for provando tutti gli indirizzi, quindi da 0 a 127 e fa
Code: [Select]

    Wire.beginTransmission(address);
    byte error = Wire.endTransmission();

se trova qualcosa che risponde nel modo corretto error risulta a 0.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

vince59

...nessun problema di indirizzo. Funziona su altri programmi. inizializzazione gia sperimentata e funzionante

gpb01

#9
Dec 18, 2018, 12:21 pm Last Edit: Dec 18, 2018, 12:22 pm by gpb01
NON ho capito il problema ... ma .. non è che vuoi collegare in quel modo DUE LCD ? ? ?

Perché, in testa al programma vedo la #include <LiquidCrystal_I2C.h> con le sue cose e, scendendo, trovo una #include <LiquidCrystal.h> con le sue altre cose ... ::)

Mi confermi che se usi una elimini completamente tutto quello che è dell'altra ?

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

vince59

#10
Dec 18, 2018, 12:26 pm Last Edit: Dec 18, 2018, 12:30 pm by vince59
ciao Gug. Corretto ELIMINO quella che non viene utilizzata. Ho postato tutto il codice per completezza di informazione.
indirizzo 0x3f già verificato e LCD funzionante con altri progetti.
Come attivo le linee relative al I2C il programma si stranisce LCD non va e dati sballati.

@ maubarzi: i mod
uli I2C son quelli uno è montato di serie sul display l'altro l'ho montato io...ma ripeto NON funziona solo con questo programma

maubarzi

Ho letto male ho hai scritto che quello che scrivi nel setup esce e poi più nulla?
Questo taglierebbe la testa al toro riguardo l'inizializzazione del display e quindi il problema sarebbe sul loop.
Però sarebbe meglio postare il codice bacato e non quello funzionante, cioè quello con i2c e non l'altro
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

#12
Dec 18, 2018, 12:43 pm Last Edit: Dec 18, 2018, 12:44 pm by gpb01
>vince59: Mi fai uno schemino, anche a penna e poi lo fotografi, di tutti i collegamenti ?

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

vince59

#13
Dec 18, 2018, 02:53 pm Last Edit: Dec 18, 2018, 02:55 pm by vince59
intanto te lo descrivo:

LM 35 (sonda1): 5vdcc; gnd; pin A0 (input);
LM 35 (sonda2): 5vdcc; gnd; pin A1 (input);

LCD DISPLAY (20x4 - dal modulo I2C montato di serie):
5vdcc;
gnd;
SDA -> pin A4;
SCL -> pin A5.
Ho provato anche gli altri due piedini di Arduino (gli utlimi due dopo AREF) che da quanto leggo dovrebbero essere paralleli di A4 ed A5. Ho anche provatop a spostare gli ingressi su A1 ed A2.

Attenzione....se attivo le righe di codice "no I2C" alle linee 7 ed 8 del codice si blocca/sbarella, se invece attivo le linee 26 e 27 funziona (SEMPRE e SOLO su monitor seriale).

Fosse un problema di "sequenza interna"?

questo codice, ad esempio funziona benissimo:

Code: [Select]

//DT Studio
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello,DT Studio!");
}

void loop()
{
}

docdoc

questo codice, ad esempio funziona benissimo
Ok, ora però mostraci il codice che NON funziona, ossia come l'hai modificato per I2C e vediamo.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up