Go Down

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

vince59

...rieccomi ma tra dormire, colazione,pranzo e mogliechedevefaragiri rimane poco per i giochini.

Gug, e gli altri, grazie per i suggerimenti. Io sto imparando con un processo bottom-up che mi rende difficile talvolta capire la natura del problema.
Vado per punti.
L'utilizzo dell'array era a scopo didattico e sono consapevole degli errori "trascinati" così come degli altri aspetti da te evindenziati.
Dalle prove effettuate stamattina ho potuto rilevare che il problema risiede nel diverso utilizzo delle variabili nei cicli for.
Di seguito riporto il codice commentando le linee incriminate.

PS: Gug il tuo codice gira benissimo, è molto stabile ed mostra le temperature più vicine a quelle reali rispetto agli altri codici. Devo lavorare sui valori dell'algortimo per avere letture che diano le temperature effettive. Evidentemente voltaggi, tolleranze e errori che si trascinano inducono variazioni.

Code: [Select]

const uint8_t SensorPin  = A0;
const uint8_t SensorPin2 = A1;
//
int T_campionamento = 50;
int T_campionamento2 = 50;
int SensorValue = 0;
int Sensor2Value = 0;

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

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

float sommaGradi, mediaGradi, sommaGradi2, mediaGradi2, temperature, temperature2;

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

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.print("PRONTO");
  Serial.begin(9600);
  delay(1000);
}
void loop()
{

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

  analogRead(SensorPin2);

  for ( int i = 0; i <= NRLETTURE; i++)
  {
    SensorValue = analogRead(SensorPin);               // linea che non da problemi
    temperature = SensorValue * 0.48875;               // linea che non da problemi
    //temperature = analogRead(SensorPin) * 0.48875;   // linea che interferisce con il codice
    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);         // linea che non da problemi
    temperature2 = Sensor2Value * 0.48875;         // linea che non da problemi
    //temperature2 = analogRead(SensorPin2) * 0.48875; // linea che interferisce con il codice
    valori2[i] = temperature2;
    delay(T_campionamento2);
  }
  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("differenza  ");
  lcd.print(mediaGradi - mediaGradi2);
}



gpb01

#46
Dec 19, 2018, 03:51 pm Last Edit: Dec 19, 2018, 03:52 pm by gpb01
PS: Gug il tuo codice gira benissimo, è molto stabile ed mostra le temperature più vicine a quelle reali rispetto agli altri codici. Devo lavorare sui valori dell'algortimo per avere letture che diano le temperature effettive. Evidentemente voltaggi, tolleranze e errori che si trascinano inducono variazioni.
Studiatelo bene, ci sono dentro varie cosette che puoi imparare ad utilizzare ;)

Relativamente ai "voltaggi", riportando un vecchio commento di "Astrobeed" ...
... gli LM35 sono sensori non raziometrici e come tali sono insensibili alle variazioni di tensione.
Dentro gli LM35 c'è un generatore a corrente costante, usato per la misura, che li rende indipendenti dalla tensione di alimentazione, che può essere compresa tra 4 e 30 V, e anche al rumore sulla stessa se non è troppo alto. Il problema è invece l'ADC del micro che richiede un riferimento di tensione preciso e noto, più gli eventuali problemi legati al rumore, su Aref e l'alimentazione del ADC, che possono causare notevoli fluttuazioni nella misura.

Infine, per quelle due righe che hai commentato ... non capisco che influenza possono avere ... ::)

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

vince59

Si Gug, lo studierò attentamente!!!

Per le righe incasinatrici...è un mistero davvero.

Alla prossima!!

Go Up