librerie I2C che bloccano il codice

@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

vince59:
Ora provo un LCD RGB...vediamo che succede

... altra prova a "pene di segugio" :smiling_imp:

Guglielmo

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

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...

... senza inventarti NULLA ... carica uno degli esempi della libreria e vedi se funziona :smiling_imp:

Guglielmo

vince59:
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.

..nulla >:(

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

//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()
{

}

vince59:
@ 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 ... :smiling_imp:

Guglielmo

non proprio identiche, vedo un delay(4000); che dà tempo al display di displayare, mi sa.
Per me resta il maggiore indiziato :wink:

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

PCF8574_HD44780_I2C.zip (503 KB)

@ maubarzi: mi riferivo alle linee di attivazione LCD

@ Gug: eseguo e riferisco

Gug...come prima. Inserisco linee I2C e sfarfalla.

(Ovviamente)... avevo già provato quanto da te suggerito....UN nuovo CODICE CON LOOP VUOTO funziona nel senso che mostra a display quanto richiesto nel setup...ma anche il mio codice lo fa...la il setup è eseguito correttamente.

#include <Wire.h>;
#include <PCF8574_HD44780_I2C.h>

PCF8574_HD44780_I2C lcd(0x3f,20,4);

void setup()
{
 lcd.init();        
 lcd.backlight();
  // lcd.begin(20, 4); 
  lcd.print("Created by: ");
  lcd.setCursor(0,2);
  lcd.print("porcamiseria");
  Serial.begin(9600);     
 // analogReference(INTERNAL);  
 //delay(3000);
}
void loop() {
  // put your main code here, to run repeatedly:
}

vince59:
@ maubarzi: mi riferivo alle linee di attivazione LCD

il delay(4000) lo hai messo si nella setup ma creando un loop come loop ma senza usare loop.

vince59:
... Inserisco linee I2C e sfarfalla.

non insisto ulteriormente....

>vince59: ... mi conosci bene ... o fai ESATTAMEMENTE quanto ti chiedo e segui passo passo i vari step o ... non posso aiutarti. ::slight_smile:

Quindi, mi fai vedere vedere il codice con la sola inizializzazione, la scritta "Pronto" e ... NULL'ALTRO nemmeno commentato !

Dopo che l'hai fatto, mi dici se la scritta appare bene ed è stabile. :slight_smile:

Guglielmo

Eccolo...scritta stabile

#include <Wire.h>;
#include <PCF8574_HD44780_I2C.h>

PCF8574_HD44780_I2C lcd(0x3f,20,4);

void setup()
{
  lcd.init();        
  lcd.backlight();
  lcd.print("PRONTO");
}

void loop() {

}

Bene, ora, senza scrivere sul LCD, ma solo per vedere se da problemi, inseriamo le due analogRead() ...

In testa al programma aggiungi:

const uint8_t SensorPin  = A0;
const uint8_t SensorPin2 = A1;
//
int SensorValue, Sensor2Value;

dopo di che nel loop() aggiungi:

delay(500);
Sensorvalue  = analogRead(SensorPin);
delay(500);
Sensor2Value = analogRead(SensorPin2);

e vedi se la scritta sul display rimane stabile (come dovrebbe essere).

Naturalmente ripubblica il codice ... :wink:

Guglielmo

yes...stabile

PS mi sono permesso di aggiunger nel loop la visualizzazione dei valori e della differenza...funziona

const uint8_t SensorPin  = A0;
const uint8_t SensorPin2 = A1;
//
int SensorValue, Sensor2Value;

#include <Wire.h>;
#include <PCF8574_HD44780_I2C.h>

PCF8574_HD44780_I2C lcd(0x3f,20,4);

void setup()
{
 lcd.init();        
 lcd.backlight();
 lcd.print("PRONTO");
}
void loop()
{
delay(500);
SensorValue = analogRead(SensorPin);
delay(500);
Sensor2Value = analogRead(SensorPin2);
  
}

Quindi, come vedi, il fatto di fare delle analogRead() su quei due pin NON infastidisce minimamente il LCD (... e ci mancherebbe altro).

Ora, riesci da solo a modificare il codice aggiungendo i due cicli FOR di N letture che ti servono ed ha salvare solamente il valore nei due array? SENZA usare il LCD.

Dichiara, per il momento, le varibili che ti servono, globali, come ho fatto io, quindi ... fuori, prima del setup().

Metti il codice aggiornato e dimmi come si comporta :wink:

Guglielmo

_P:S.: Per pulizia, le #include si mettono in testa, prima dei vari const o delle varie variabili ... _

Ah, dimenticavo, poi mi spiegherai che cavolo usi a fare degli array per memorizzare le varie letture, se alla fine, li usi SOLO per fare la media ... ::slight_smile:

Le singole letture ti servono o no ? E, se non ti servono, ma ti occorre solo la media, che cavolo salvi a fare le letture in un array ? ? ? :o

Guglielmo

EDIT:

Gug...ho RI-provato. Sembra girare...ho dichiarato le variabili tutte globali incluso quelle che erano nel cilco for.

eccoil codice

PS: le array furono un esperimento di tanto tempo fa per imparare ad usarle...tra una cazziata e l'altra.

const uint8_t SensorPin  = A0;
const uint8_t SensorPin2 = A1;
//
int SensorValue, Sensor2Value;
int T_campionamento = 25;

const int NRLETTURE = 10;
const int NRLETTURE2 = 10;

float valori[NRLETTURE], sommaGradi, mediaGradi, valori2[NRLETTURE2], sommaGradi2, mediaGradi2;

#include <Wire.h>;
#include <PCF8574_HD44780_I2C.h>
PCF8574_HD44780_I2C lcd(0x3f, 20, 4);

void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.print("PRONTO");
}
void loop()
{
//  delay(250);
//  SensorValue = analogRead(SensorPin);
//  delay(250);
//  Sensor2Value = analogRead(SensorPin2);

  // -------- misurazione 1 ---------------------

  analogRead(SensorPin2);

  for ( int i = 0; i <= NRLETTURE; i++)
  {
    SensorValue = analogRead(SensorPin);
    //float voltage = (sensorVal /1024.0) * 5.0;
    //float temperature = (voltage - .5) * 100;
    temperature = (SensorValue * 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;

  // ------------ misurazione2 ----------------------

  analogRead(SensorPin);

  for ( int i = 0; i <= NRLETTURE2; i++)
  {
    Sensor2Value = analogRead(SensorPin2);
    //float voltage = (sensorVal /1024.0) * 5.0;
    //float temperature = (voltage - .5) * 100;
    temperature2 = (Sensor2Value * 4.30) / 10;
    valori2[i] = temperature2;
    delay(T_campionamento);
  }
  sommaGradi2 = 0;

  for ( int i = 0; i <= NRLETTURE2; i++)
  {
    sommaGradi2 = sommaGradi2 + valori2[i];   //sommaGradi2 = sommaGradi2 + valori[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("T mandata  ");
  lcd.print(mediaGradi);
  lcd.setCursor(0, 1);
  lcd.print("T ritorno  ");
  lcd.print(mediaGradi2);
  lcd.setCursor(0, 2);
  lcd.print("diff       ");
  lcd.print(mediaGradi - mediaGradi2);

  //delay(200);
*/
}