Go Down

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

maubarzi

Come dice mio figlio... ancora non capisco!
L'ultimo codice che hai postato funziona. Bene. Se aggiungi il loop non più?
Ma cosa aggiungi nel loop?

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).
Qui mi perdo, perchè non hai postato anche tutta questa parte? Così uno che legge si trova il codice da analizzare e ci può ragionare sopra.
Scusa se sono così "tardo" ma non ho mica trovato le due righe 7 e 8 e non ho nemmeno capito ancora cosa vuol dire in pratica "blocca/sbarella".
Nessuna buona azione resterà impunita!

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

gpb01

... 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 ...
Perdona, queste sono prove "senza senso", fatte a caso e non è così che si risolvono i problemi ...

A0 ed A1 vanno bene per le due sonde di temperatura, A4 ed A5 vanno bene per il bus I2C, quindi, se i collegamenti sono fatti bene (... senza falsi contatti), l'hardware è a posto ed il problema è altrove.

Come dice "docdoc" metti il codice esatto che utilizzi con il modulo LCD I2C.

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

vince59

#17
Dec 18, 2018, 04:54 pm Last Edit: Dec 18, 2018, 04:55 pm by vince59
Mi scuso per non essere chiaro a tutti.
Questo è il codice che NON gira i nquanto iserite le linee relative a display I2C-
1. l'LCD mostra solo la schermata di setup. Lampeggia un paio di volte e poi rimane acceso senza alcuna scritta.
2. l'output su monitor seriale "sbarell"...i dati escono non nell'ordine delle linee di comando e si blocca.
@ baumarzi...l'ultimo codice era relativo ad hello world era per dimostarre che le linee di codeice relative al display I2C in quel programma funzionano

Code: [Select]


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

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

const int NRLETTURE = 10;    
const int NRLETTURE2 = 10;
const int SensorPin = A0;    
const int SensorPin2 = A1;  

float valori[NRLETTURE];    
float valori2[NRLETTURE2];

int T_campionamento = 25;    
int T_campionamento2 = 25;

float sommaGradi, mediaGradi, sommaGradi2, mediaGradi2;

long previousMillis = 0;
long interval = 500;

//#include <LiquidCrystal.h>            
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
 lcd.init();        
 lcd.backlight();
   lcd.begin(20, 4);
  lcd.print("Created by: ");
  lcd.setCursor(0,2);
  lcd.print("ppregeo");
  Serial.begin(9600);    
 // 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;
    //float temperature = (voltage - .5) * 100;
    float temperature = (sensorVal * 4.30)/10;
    valori[i] = temperature;
    delay(T_campionamento);

    }
  sommaGradi = 0;                      
  for( int i = 0; i<=NRLETTURE; i++)    
  {
    sommaGradi = sommaGradi + valori[i];   //sommaGradi2 = sommaGradi2 + valori[i];
  // }
  mediaGradi = sommaGradi / NRLETTURE;  
  }
  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;      
 }

  Serial.print ("Temp mandata:    ");            
  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);              
  lcd.setCursor(0,1);
  lcd.print("Out ");
  lcd.print(mediaGradi2);
  lcd.setCursor(0,2);
  lcd.print("d ");
  lcd.print(mediaGradi - mediaGradi2);
}


docdoc

Allora, da un'occhiata "al volo" (magari stasera da casa posso vedere meglio), potrei anche sbagliare qualcosa, ma direi due cose:

1) ma tu nel loop() non hai alcun delay(), quindi fai cld.clear() e tutto il resto ad una velocità che il display non regge. Scrivi su lcd solamente quando qualcosa CAMBIA, non tutto di seguito alla massima velocità! Considera che il display non è affatto veloce a seguire i cambiamenti (a parte la sua interfaccia I2C che ha comunque dei limiti) generalmente regge, nel senso che si "vede" quello che cambia, un paio di update al secondo o poco più. Per me tu qui ne fai MIGLIAIA al secondo. Intanto prova a mettere un delay(500) ad esempio e vedi che succede.

2) Se scrivi tanta roba sulla seriale fai Serial.begin(115200); se metti solo 9600 potresti avere problemi (non c'è handshake hardware, se fai overflow del buffer ti perdi byte)
 
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

maubarzi

#19
Dec 18, 2018, 05:15 pm Last Edit: Dec 18, 2018, 05:25 pm by maubarzi
Mentre se usi la libreria non I2C funziona, giusto?
Hai la doppia cablatura sempre attiva giusto?
Puoi postare un esempio di output seriale per capire esattamente cosa vuol dire che escono in ordine strano?

Se non ho letto male il codice, il loop dovrebbe girare alla velocità della luce (ogni 50 millisecondi), non è che lcd.clear(); prevale su tutto il resto?
Mi pareva di essere incappato anche io in un problema analogo tempo fa e poi ho evitato il clear, semplicemente andavo sopra senza sbiancare sempre tutto.

EDIT:
@docdoc ci siamo sovrapposti, mi sa che abbiamo beccato il problema nel tuo punto 1.

Però questo significa che senza la libreria I2C non funzionasse lo stesso.

EDIT 2:
Io comunque non scrivevo sull'lcd alla velocità della luce ma un paio di volte al secondo al massimo e quando c'era qualcosa da aggiornare e non a raffica incontrollata.
Nessuna buona azione resterà impunita!

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

vince59

@maubarzi: si se attivo le linee I2C si blocca e gira a "minchia".

Doppia cablatura non mi è chiaro...se ti riferisci al cabalggio LCD->arduino, ho SOLO la cablatura dall'LCD ad arduino con 5vdc/GND/SDA/SC i 4 collegamenti canonici I2C.

Ho provato a mettere il delay...nulla.

Ripeto in un altro codice la configurazione display utilizzata FUNZIONA.

Qui no.

Ora provo un LCD RGB...vediamo che succede

gpb01

#21
Dec 18, 2018, 06:18 pm Last Edit: Dec 18, 2018, 06:19 pm by gpb01
Ora provo un LCD RGB...vediamo che succede
... altra prova a "pene di segugio:smiley-twist:

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

vince59

...si Gug lo so...che è tale...ma sto strunz...funziona anche con l'RGB anch'esso I2C

maubarzi

visto che abbiamo scomodato il segugio prendendolo per il naso o giu di li... prova ad eliminare il lcd.clear() mettendo alla fine del loop il delay 500 o anche 1000 visto che si sta provando...
Nessuna buona azione resterà impunita!

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

gpb01

#24
Dec 18, 2018, 06:29 pm Last Edit: Dec 18, 2018, 06:30 pm by gpb01
... senza inventarti NULLA ... carica uno degli esempi della libreria e vedi se funziona  :smiley-twist:

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

maubarzi

Doppia cablatura non mi è chiaro...se ti riferisci al cabalggio LCD->arduino, ho SOLO la cablatura dall'LCD ad arduino con 5vdc/GND/SDA/SC i 4 collegamenti canonici I2C.
Scusa avevo interpretato che se lo provavi con i collegamenti diretti andava, se invece provavi con interfaccia I2C no.
Nessuna buona azione resterà impunita!

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

vince59

..nulla  >:(

@ Gug. Il codice che segue funziona benissimo...come vedi le linee sono le stesse

Code: [Select]

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

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
 
LiquidCrystal_I2C lcd(0x3f,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.backlight();
 
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  lcd.home();
 
  lcd.print("Hello world...");
  lcd.setCursor(0, 1);
  lcd.print(" i ");
  lcd.printByte(3);
  lcd.print(" arduinos!");
  delay(5000);
  displayKeyCodes();
 
}

// display all keycodes
void displayKeyCodes(void) {
  uint8_t i = 0;
  while (1) {
    lcd.clear();
    lcd.print("Codes 0x"); lcd.print(i, HEX);
    lcd.print("-0x"); lcd.print(i+16, HEX);
    lcd.setCursor(0, 1);
    for (int j=0; j<16; j++) {
      lcd.printByte(i+j);
    }
    i+=16;
   
    delay(4000);
  }
}

void loop()
{

}

gpb01

#27
Dec 18, 2018, 08:49 pm Last Edit: Dec 18, 2018, 08:50 pm by gpb01
@ Gug. Il codice che segue funziona benissimo...come vedi le linee sono le stesse
... e nulla, tutto il thread precedente NON ti ha insegnato che occorre avanzare passo passo eh !!!

Scrivi un programma che inizialmente ha solo il LCD I2C, lo inizializza e, nel setup(), scrive una sola riga: "PRONTO". Il loop() lo lasci vuoto !

A questo scheletro funzionante, aggiungeremo via via il resto, ma intanto voglio vedere questo ...  :smiley-evil:

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

maubarzi

non proprio identiche, vedo un delay(4000); che dà tempo al display di displayare, mi sa.
Per me resta il maggiore indiziato ;)
Nessuna buona azione resterà impunita!

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

gpb01

#29
Dec 18, 2018, 08:53 pm Last Edit: Dec 18, 2018, 08:54 pm by gpb01
Ah, un altra cortesia, per il LCD I2C usa la libreria che ti allego ... la ritengo superiore alle altre e so, per certo, che funziona perfettamente !

Guarda gli esempi allegati per vedere come si usa (... c'è ben poco da modificare) ...

Guglielmo

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

Go Up