Go Down

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

vince59

@ maubarzi: mi riferivo alle linee di attivazione LCD

@ Gug: eseguo e riferisco

vince59

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.

Code: [Select]

#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:
}

maubarzi

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


... Inserisco linee I2C e sfarfalla.
non insisto ulteriormente....
Nessuna buona azione resterà impunita!

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

gpb01

#33
Dec 18, 2018, 09:56 pm Last Edit: Dec 18, 2018, 09:56 pm by gpb01
>vince59: ... mi conosci bene ... o fai ESATTAMEMENTE quanto ti chiedo e segui passo passo i vari step o ... non posso aiutarti. ::)

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

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

vince59

#34
Dec 18, 2018, 10:00 pm Last Edit: Dec 18, 2018, 10:01 pm by gpb01
Eccolo...scritta stabile

Code: [Select]

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

}

gpb01

#35
Dec 18, 2018, 10:04 pm Last Edit: Dec 18, 2018, 10:09 pm by gpb01
Bene, ora, senza scrivere sul LCD, ma solo per vedere se da problemi, inseriamo le due analogRead() ...

In testa al programma aggiungi:

Code: [Select]
const uint8_t SensorPin  = A0;
const uint8_t SensorPin2 = A1;
//
int SensorValue, Sensor2Value;

dopo di che nel loop() aggiungi:

Code: [Select]
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 ... ;)

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

vince59

#36
Dec 18, 2018, 10:11 pm Last Edit: Dec 18, 2018, 10:17 pm by vince59
yes...stabile

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


Code: [Select]


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);
  
}

gpb01

#37
Dec 18, 2018, 10:19 pm Last Edit: Dec 18, 2018, 10:22 pm by gpb01
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 ;)

Guglielmo

P:S.: Per pulizia, le #include si mettono in testa, prima dei vari const o delle varie variabili ... 
Search is Your friend ... or I am Your enemy !

gpb01

#38
Dec 18, 2018, 10:27 pm Last Edit: Dec 18, 2018, 10:27 pm by gpb01
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 ... ::)

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
Search is Your friend ... or I am Your enemy !

vince59

#39
Dec 18, 2018, 10:40 pm Last Edit: Dec 18, 2018, 11:25 pm by vince59
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.

Code: [Select]


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);
*/
}

vince59


Patrick_M

#41
Dec 18, 2018, 11:27 pm Last Edit: Dec 18, 2018, 11:28 pm by Patrick_M
Quote
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.
:D
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

gpb01

#42
Dec 19, 2018, 06:56 am Last Edit: Dec 19, 2018, 06:56 am by gpb01
... le array furono un esperimento di tanto tempo fa per imparare ad usarle...tra una cazziata e l'altra.
Ok, se gira (... e DEVE girare), si comincia ad ottimizzare ...

1. elimina quegli array e fai le medie sulle misure provenienti dall'analogRead() e solo dopo calcoli il relativo float (che come fai tu ti porti dietro un sacco di altri errori dovuti agli arrotondamenti). Ti ricordo che se sommi direttamente X letture ed alla fine dividi per X ... hai fatto la media :D

2. il display NON serve che lo aggiorni in continuazione, ma conviene che usi una qualche tecnica per aggiornarlo solo se qualche cosa è cambiata

3. la lettura degli LM35 (e quindi della temperatura) è inutile che la fai a raffica, il variare del valore è cosa che comunque richiede tempo e quindi falla in funzione di cosa stai misurando (... se è la temperatura ambiente, anche se la fai una volta ogni 30 secondi, va più che bene).

Come sempre ... un passo alla volta, verifica che funzioni correttamente e passi al passo successivo ;)

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

gpb01

#43
Dec 19, 2018, 12:18 pm Last Edit: Dec 19, 2018, 12:19 pm by gpb01
Ti allego una mia versione del tuo programma ... prova a guardarla ed a provarla (io non l'ho fatto, ho solo compilato e visto che non dava errori, ma ... è tutta da verificare sul campo) ...

Code: [Select]
#include <Wire.h>
#include <PCF8574_HD44780_I2C.h>

#define SENSOR1   A0          // Pin sensore 1
#define SENSOR2   A1          // Pin sensore 2
#define NLETTURE1 10          // Numero letture x media sensore 1
#define NLETTURE2 10          // Numero letture x media sensore 2

#define PERIODO1  1000UL      // Intervallo letture sensore 1
#define PERIODO2  1000UL      // Intervallo letture sensore 2
#define PERIODOL  2000UL      // Intervallo aggiornamneto LCD
#define DELAYREAD   50

int   valSensor1, valSensor2;
float temp1, temp2;

unsigned long lastP1, lastP2, lastL;

PCF8574_HD44780_I2C lcd(0x3f, 20, 4);

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

void loop()
{
   int i;
   
   // -------- misurazione 1 ---------------------
   if (millis() - lastP1 > PERIODO1)
   {
      valSensor1 = 0;
      for (i = 0; i < NLETTURE1; i++)
      {
         valSensor1 += analogRead(SENSOR1);
         delay(DELAYREAD);
      }
      valSensor1 /= NLETTURE1;
      temp1 = valSensor1 * 0.48875;
      //
      lastP1 += PERIODO1;
   }
   
   // -------- misurazione 2 ---------------------
   if (millis() - lastP2 > PERIODO2)
   {
      valSensor2 = 0;
      for (i = 0; i < NLETTURE2; i++)
      {
         valSensor2 += analogRead(SENSOR2);
         delay(DELAYREAD);
      }
      valSensor2 /= NLETTURE2;
      temp2 = valSensor2 * 0.48875;
      //
      lastP2 += PERIODO2;   
   }
   
   // -------- aggiorna LCD e scrive su seriale --
   if (millis() - lastL > PERIODOL)
   {
      lcd.clear();
      lcd.print("T mandata  ");
      lcd.print(temp1);
      lcd.setCursor(0, 1);
      lcd.print("T ritorno  ");
      lcd.print(temp2);
      lcd.setCursor(0, 2);
      lcd.print("diff       ");
      lcd.print(temp1 - temp2);
      //
      Serial.print ("Temp mandata:    ");
      Serial.println (temp1);
      Serial.print ("Temp ritorno:    ");
      Serial.println (temp2);
      Serial.print ("differenza:      ");
      Serial.println (temp1 - temp2);
      Serial.println ("---------------------------------------------");
      //
      lastL += PERIODOL;
   }
   
   // Qui, nel frattempo, si possono fare altre cose ...

}

... fammi sapere.

Guglielmo

P.S.: ... se qualche cosa è poco chiara, chiedi ;)
Search is Your friend ... or I am Your enemy !

gpb01

Ah ... come vedi ho previsto la possibilità di tempistiche diverse per la lettura di Sensor1 e Sensor2.  Probabilmente, per le tue necessità, questo non serve e si potrebbe anche fare la lettura dei sensore in un nuco blocco e l'aggiornamneto del LCD in un altro o ... come meglio credi ... quello sopra è solo un "esercizio" per mostrare UNA tra le tante possibilità.

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

Go Up