Arduino Progetto Flussometro e altro [pag. 19]

Capitano di Vascello
SparusAurata
Mi piace
- 181/466
Ciao Nabucodor,
se stai utilizzando un display su I2C, quindi seriale, e la libreria che stai utilizzando è questa: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
allora la riga

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

non è corretta.

Questa la sinstassi dichiarata nella libreria:
LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t charsize)
{
_addr = lcd_addr;
_cols = lcd_cols;
_rows = lcd_rows;
_charsize = charsize;
_backlightval = LCD_BACKLIGHT;
}

quindi per te dovrebbe essere (ipotizzando un display 20x4):

LiquidCrystal_I2C lcd(0x27, 20, 4); // Set the LCD I2C address.

Utilizza il collegamento standard di SCL e SDA in arduino uno.
Molto probabile che il 4 nell'istruzione lcd(.........) disturbava il 4 dell'assegnazione CS della SD.

Prova e fammi sapere.

Ciao
Chi ama il mare sarà sempre libero!

Fatti un regalo!
https://www.gommonauti.it/donazione.php
Guardiamarina
nabucodor
Mi piace
- 182/466
ciao la libreria che stoutilizzando l'ho presa sa qui:
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
in quanto il chip I2C è pcf 8574 le altre liberire i2c non funzionavano... comunque la sd per ora la voglio sospedere ed optare per la memoria 24lc512 secondo te quando riesce a memorizzare? e poi come dovrei cambiare il codice per per inserire la memoria e memorizzare i dati??
in secondo luogo secondo te cosa conviene memorizzare il consumo totale ogni quanto? ed anche i consumi parziali con riferimento al tempo?
senza il codice della sd card funziona: ti allego il codice:
mi faresti un piacere se compilassi la parte relativa alla 24lc512.
grazie a tutti comunque. non appena finisco posto qualche immagine.

/*-----( Import needed libraries )-----*/
#include <Wire.h> // Comes with Arduino IDE
// Get the LCD I2C Library here:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
// I assume you know how to connect the DS1302 and LCD.
// DS1302: CE pin -> Arduino Digital 9
// I/O pin -> Arduino Digital 8
// SCLK pin -> Arduino Digital 7
#include <DS1302.h>
// Init the DS1302
//DS1302(ce, data, clock);
DS1302 rtc(9,8,7);

#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x20 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

#include <SoftwareSerial.h> // import the Arduino serial library
SoftwareSerial BTFuel(6, 5); // Define the Pins of the HC-05 Bluetooth device. RX, TX
volatile float time = 0;
volatile float time_last = 0;
volatile int impulsi_array[5] = {0,0,0,0,0};
float sensor_pulse = 2173.91;
//includo la libreria per le impostazioni dell'eeprom
//#include <EEPROM.h>
//int litri_tot = EEPROM.read(0);

//All'accensione imposto a 0 le variabili
float litri_tot = 0;
volatile float impulsi = 0;
int litri_parziali = 0;
volatile float consumo_istantaneo = 0;


void setup()
{

// Togliere i commenti per la prima programmazione del DS1302
//Set the clock to run-mode, and disable the write protection
//rtc.halt(false);
//rtc.writeProtect(false);
//Setup LCD to 20×4 characters
// The following lines can be commented out to use the values already stored in the DS1302
//rtc.setDOW(THURSDAY); // Set Day-of-Week to FRIDAY
//rtc.setTime(01, 10, 0); // Set the time to 17:22:00 (24hr format)
//rtc.setDate(20, 11, 2014); // Set the date to March 28th, 2014


BTFuel.begin(9600); // Initiate serial connection to Bluetooth device

//Pin 2 impostato come ingrsso digitale interrupt
attachInterrupt(0, interrupt, FALLING);

//Impostazione LCD
lcd.begin(20, 4); // definizione display

lcd.setCursor(0, 2); // posizionamento cursore riga e indice da visualizzare Litri totali
lcd.print("L-T");

lcd.setCursor(11, 2); //posizionamento cursore riga e indice da visualizzare Litri totali
lcd.print("L/H");

//lcd.setCursor(0, 2);
//lcd.print("L/H");

// abilito una resistenza di pull up sul pin 2
digitalWrite(2, HIGH);
}

//Main Loop
void loop()

{
consumo_istantaneo = 0;
while(1){
//Tempo di aggiornamento LCD
delay(100);
//Aggiorno il consumo_istantaneo

if (time > 0)
{
//5 array per calcolare la media sulle letture del cosumo istantaneo
impulsi_array[0] = impulsi_array[1];
impulsi_array[1] = impulsi_array[2];
impulsi_array[2] = impulsi_array[3];
impulsi_array[3] = impulsi_array[4];
impulsi_array[4] = 60*(sensor_pulse / (time));

consumo_istantaneo = (impulsi_array[0] + impulsi_array[1] + impulsi_array[2] + impulsi_array[3] + impulsi_array[4]) / 5;
//Visualizza litri parziali con due cifre decimali
float litri_parziali;
litri_parziali = ((float)impulsi / sensor_pulse);


//Visualizza litri totali
litri_tot = (impulsi/2173.91);
BTFuel.println(litri_parziali,4); // Sends liters per second to Bluetooth

//Visualizzo su LCD i litri totali consumati
lcd.setCursor(4, 2);
lcd.print(litri_tot);

//Visualizzo su LCD il consumo istantaneo
lcd.setCursor(15, 2);
lcd.print(consumo_istantaneo);

//Visualizzo su LCD i litri totali consumati
//lcd.setCursor(8, 2);
//lcd.print(litri_parziali);

lcd.setCursor(4, 1);
lcd.print(rtc.getTimeStr());

// Display abbreviated Day-of-Week in the lower left corner
lcd.setCursor(0, 0);
lcd.print(rtc.getDOWStr(FORMAT_SHORT));

// Display date in the lower right corner
lcd.setCursor(4, 0);
lcd.print(rtc.getDateStr(FORMAT_SHORT));

// Wait one second before repeating Smile
//delay (1000);



}


} //chiusura while


}


//Lettuara degli interrupt
void interrupt()
{
impulsi = impulsi ++;
time = (micros() - time_last);
time_last = micros();
}
Capitano di Fregata
marcop20 (autore)
Mi piace
- 183/466
Come tutte le memorie eeprom anche questa ha un ciclo vitale utile oltre il quale non funzionerebbe più
Per non esagerare nelle scritture e quindi avere una morte prematura della tua eeprom io propenderei per un auto salvataggio dei dati in fase di spegnimento del dispositivo.
Guardiamarina
nabucodor
Mi piace
- 184/466
marcop20 ha scritto:
Come tutte le memorie eeprom anche questa ha un ciclo vitale utile oltre il quale non funzionerebbe più
Per non esagerare nelle scritture e quindi avere una morte prematura della tua eeprom io propenderei per un auto salvataggio dei dati in fase di spegnimento del dispositivo.


Hai ragione ma ho fatto un ragionamento se ha il ciclo vita teorico di 100.000 registrazioni teoricamente registrando ogni 3 minuti si ha un tempo di utilizzo di 5000 ore....che sono stante poi il costo del cip 24lc512 è di circa 2 euro.... 5000 ora sono tante.... se utilizzavo una sdcard il problema c'era comunque....quindi se basta la memoria meglio la 24lc512 cosa ne pensi? o magari una 1024
i problemi che ho riscontrato nel mio codice sono:
1 i litri istantanei non tornano a zero quando il flusso è fermo.... sai come risolvere siccome il codice software di partenza è il tuo...
2sia tu che SparusAurata potresti darmi una mano ad ottimizzarlo ed a scrivere la parte di codice che integra la eprom?
Capitano di Fregata
marcop20 (autore)
Mi piace
- 185/466
Se leggi bene il codice noti che il consumo istantaneo visualizzato sull'lcd prende in considerazione sempre le ultime 5 letture, quindi anche se il flussometro sarà fermo visualizzerà sempre l'ultimo array di 5 letture.

per farlo tornare a zero in pratica devi inserire una condizione dove se entro un tot tempo non si verificano interrupt porta la variabile consumo istantaneo a 0
Capitano di Fregata
marcop20 (autore)
Mi piace
- 186/466
Il mio codice purtroppo l'ho modificato in modo radicale per cui nel tuo non sarebbe implementabile, puoi però modificare un po le condizioni di lettura della variabile "time"

in pratica......


if (time > 0)
{
//.......
//........
//........
// .......
}
else if (time = 0)
consumo_istantaneo = 0;
}
Capitano di Vascello
SparusAurata
Mi piace
- 187/466
Ciao,
partiamo dal fatto che la eeprom ha vita breve.
Potresti far memorizzare il dato o i dati, quando il flusso di carburante è basso, prossimo a zero.
Se stati navigando a velocità di 20 nodi, ad esempio, memorizzerei anche ogni 20 minuti.
Con i tuoi conti, 5000 ore sono un anno di funzionamento. Siccome non sempre sono 100.000 scritture, ti consiglio di valutare periodi più lunghi.

Relativamente al codice, ti consiglio di strutturarlo con chiamate a funzioni dedicate. Mi spiego meglio.

void memorizzazione(void) {
........
}

void page1LCD (void) {
........
}

Poi nel setup lascia le istruzioni base e nel loop lavora con le chiamate alle funzioni create.
Questa cosa ti sarà molto utile a 360°.

Ci aggiorniamo per le altre cose. Ora vado al lavoro.

Ciao
Chi ama il mare sarà sempre libero!

Fatti un regalo!
https://www.gommonauti.it/donazione.php
Guardiamarina
nabucodor
1 Mi piace
- 188/466
aggiornamento....
Finalmente tutto funziona ho finito il progetto in due versioni una per Arduino mega con Bluetooth dove un applicazione android ti da altre info tipo consumo a miglio ecc...
ed una ltra versione senza bluetooth... comunque non mi rmane da installarlo sul mio fuoribordo un elpto 90 mercury e vedere i consumi.. ed anche quelli del mio yamaha F6 4tempi...
il flussometro mi da i litri totali consumi e quelli istantanei in più scrive tutto su una memory card ( sdcard) un file con giorno ora e consumi....
ma vi diro maggiori dettagli inseguito...
un ringraziamento particolare lo faccio ad Oronzo SparusAurata per il supporto su alcune problematiche di programmazione...
Capitano di Corvetta
pescatoreinprova
Mi piace
- 189/466
Bravi. Apprezzo molto la dedizione e passione che state mettendo in questo progetto.
Applause Applause Applause Thumb Up
Bisogna avere sempre tanta pazienza!
Ammiraglio di squadra
Gulliver
Mi piace
- 190/466
È il momento di passare alla sfida successiva: mettere in rete nmea2000 i dati delle centraline pre lan

Vi prego!
Sailornet