Arduino Progetto Flussometro e altro [pag. 38]

Capitano di Fregata
marcop20 (autore)
Mi piace
- 371/470
a me funziona...... prova un altro arduino.....

oppure.....

prova ad usare gli sketch nella cartella degli esempi per l'eeprom e vedi come si comporta
Sergente
it9ozs
Mi piace
- 372/470
Proverò un esempio...
Disponibile ho solo un arduino pro-mini, ma non ho il programmatore
Ranieri Stargate Limited Edition, mercruiser 4.3 L 190 cv
Sergente
it9ozs
Mi piace
- 373/470
marcop20 ha scritto:
a me funziona...... prova un altro arduino.....

oppure.....

prova ad usare gli sketch nella cartella degli esempi per l'eeprom e vedi come si comporta


Che storia....allora....ho provato gli sketch eeprom get, eeprom put ed eeprom read....
La prima prova in assoluto l'ho fatta con read e non è andata a buon fine...mi ha dato un errore.

Ho provato con put, il monitor seriale mi riportava poi ad eeprom get per vedere se i valori fossero stati correttamente memorizzati. E così è stato.

Ho ricaricato lo sketch del contalitri e i litri totali anzichè nun mi spunta 123.46 che sarebbe il dato memorizzato dallo sketch di prova.
A questo punto provo con il flussometro e segna tutto, ma al riavvio mi accorgo che non ha memorizzato il nuovo valore!

Spunta sempre 123.46
Ranieri Stargate Limited Edition, mercruiser 4.3 L 190 cv
Capitano di Fregata
marcop20 (autore)
Mi piace
- 374/470
premetto che l'arduino pro mini ha un atmega 168 e non un 328P ed io non ho mai avuto modo di provarlo
Ma penso che le allocazioni di memoria siano le stesse
Capitano di Fregata
marcop20 (autore)
Mi piace
- 375/470
Salvo.......
Non ho avuto modo di provare il codice, ma così ti dovrebbe funzionare.....

Le variabili t_min e t_max in realtà dovresti associarle al periodo minimo e massimo degli impulsi che dovresti leggere con il tuo flussometro, ma in questo caso le ho solo dichiarate come come variabili globali espresse in millisecondi e poi moltiplicate per 1000 perchè interagisco con micros() nell'interrupt.

Codice:

//include la libreria per le funzionalità dell'LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

volatile float time = 0;
volatile float time_last = 0;
volatile float impulsi_array[5] = {0,0,0,0,0};
int pin5V = 3;
int pingnd = 10;

int t_min = 2000;
int t_max = 300;

//includo la libreria per le impostazioni dell'eeprom
#include <EEPROM.h>


//All'accensione imposto a 0 le variabili
float impulsi = 0;
float consumo_istantaneo = 0;


void setup()

{
pinMode (3, OUTPUT); //uscita a 5v per sensore
pinMode (10, OUTPUT); //uscita GND per sensore
attachInterrupt(0, interrupt, FALLING); //Pin 2 interrupt 0 impostato come ingrsso digitale interrupt (Arduino UNO/MEGA)
digitalWrite(2, HIGH); // abilito una resistenza di pull up sul pin 2 (Arduino UNO/MEGA)


//Impostazione LCD
lcd.begin(16, 2);

lcd.setCursor(0, 0);
lcd.print("LT");

lcd.setCursor(9, 0);
lcd.print("LP");

lcd.setCursor(0, 1);
lcd.print("LH");
}


void loop()
{

float f = 0; //Variabile dove è memorizzata il dato float nella EEPROM.
int eeAddress = 0; //Indirizzo della EEPROM dove inizia il dato float
EEPROM.get(eeAddress, f); //Leggo dalla EEPROM e assegno il valore ad una variabile

digitalWrite (3, HIGH);
digitalWrite (10, LOW);

while(1){

if (digitalRead(2))
{
time = 0;
}

//Tempo di aggiornamento LCD
delay(200);


//Visualizza litri parziali con due cifre decimali
float litri_parziali = (impulsi/2500);

//Visualizzo su LCD i litri parziali consumati
lcd.setCursor(12, 0);
lcd.print(litri_parziali);

//Visualizzo su LCD i litri totali consumati
lcd.setCursor(3, 0);
lcd.print(f + litri_parziali, 2);

//Visualizzo su LCD il consumo istantaneo
lcd.setCursor(3, 1);
lcd.print(" ");
lcd.setCursor(3, 1);
lcd.print(consumo_istantaneo);



  //Aggiorno il consumo_istantaneo
  //se ricevo impulsi e rispetto le condizioni di tempo....
  if ((digitalRead(2) == 0)&AMP;&AMP;(time <= (t_min*1000))&AMP;&AMP;(time >= (t_max*1000)))
{
//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] = 10*(60*(2500/time));

consumo_istantaneo = (impulsi_array[0] + impulsi_array[1] + impulsi_array[2] + impulsi_array[3] + impulsi_array[4]) / 5;
}

/*************************************************************************************************************************************/

  ////se ricevo impulsi e non rispetto le condizioni di tempo....
  else if ((digitalRead(2) == 0)&AMP;&AMP;(time > (t_min*1000)))
  {
    lcd.setCursor(9, 1);
    lcd.print("<< min");
  }

  //se ricevo impulsi e non rispetto le condizioni di tempo....
  else if (((digitalRead(2) == 0)&AMP;&AMP;(time < (t_max*1000))))
  {
    lcd.setCursor(9, 1);
    lcd.print(">> max");
  }                                   

  //se non ricevo impulsi per un tempo = (timer)               
  //else if ((digitalRead(2) == 1)&AMP;&AMP;(currentMillis - previousMillis > t_min))   
  else if (digitalRead(2) == 1)
  {
    delay(500);
    if (consumo_istantaneo == 0)
      {
        float somma = (f + litri_parziali); //max 32767
        EEPROM.put(eeAddress, somma); //Scrivo la somma dei litri nella EEPROM
      }
  }

/*************************************************************************************************************************************/

 

} //chiusura while
}

//Lettuara degli interrupt
void interrupt()
{
impulsi = ++ impulsi;
time = (micros() - time_last);
time_last = micros();
}
Sergente
it9ozs
Mi piace
- 376/470
Ciao Marco,
Grazie...proverò il codice o più tardi oppure domani che sarò nuovamente di servizio...Comunque ti farò sapere.

Grazie sempre
Ranieri Stargate Limited Edition, mercruiser 4.3 L 190 cv
Sottocapo di 1° Classe Scelto
pronaga
Mi piace
- 377/470
Salve ragazzi, seguo attentamente tutti i vostri post, e vista la competenza in materia vi chiedo un aiuto considerata la mia scarsa capacità e conoscenza della programmazione di arduino. La mia idea è collegare un sensore di flusso tramite arduino alla rete nmea2000 per visualizzare i dati dei consumi (orari, totali, etc) sul mio Lowrance che è già predisposto a livello software a ciò, come la maggior parte degli ecoscandagli in commercio. Il tutto per non avere ulteriori strumenti posizionati sulla consolle della barca.
Grazie in anticipo per chi mi vorrà aiutare. Preciso che le librerie nmea2000 per arduino sono facilmente reperibili sul web.
Capitano di Fregata
marcop20 (autore)
Mi piace
- 378/470
Si, ci sto lavorando io.......

Ma visto che sai dell'esistenza di quelle librerie ti dico anche di non impazzirci più di tanto......
Sono un ottimo punto di partenza, ma il progetto è molto vecchio e ha tantissime lacune
Sergente
it9ozs
Mi piace
- 379/470
Quoto...sto cercando di approfondire la questione è credo che alla fine non sia poi proibitivo da fare...

Marco...ho fatto un macello....mia figlia si è messa a smanettare sul tablet ed ha cancellato la cartella con tutti gli sketch!!.. Embarassed

Sto recuperando tutto....speriamo
Ranieri Stargate Limited Edition, mercruiser 4.3 L 190 cv
Sottocapo di 1° Classe Scelto
pronaga
Mi piace
- 380/470
- Ultima modifica di pronaga il 19/09/17 15:24, modificato 1 volta in totale
Grazie per le risposte! Non so se parliamo delle stesse librerie. Io mi riferivo a quelle trovate a questo link: https://github.com/ttlappalainen/NMEA2000 . Ho seguito il tutorial fornito dall'autore e con un arduino mega ho provato gli esempi di Sketch forniti (es. invio temperatura o tensione batteria) e con il lettore Actisense nmea Reader sul PC tramite seriale si leggevano tranquillamente i valori. Quindi le librerie a quanto sembra funzionano, lo testimoniano inoltre molti frequentatori del forum arduino: https://forum.arduino.cc/index.php?topic=50893.0 .
Sailornet

Argomenti correlati