Ciao a tutti ragazzi, sono nuovo nel forum percui presumo la presentazione sia d'obbligo, sono vlady di arezzo.
Vi presento anche il mio problema, desideravo fare per la mia macchina un lettore de pressione per il turbo ed il gasolio. allora ho pensato di creare con arduino ed uno schermo lcd 20x4 con driver hd44870 un grafico doppio, cioè:
riga 1: engine load: (carico motore, pressione gasolio)
riga 2: >>>>>>>>>>>>>>>>>>>>>>>>(bargraph che varia in base alla lettura del sensore che varia da 0-5v)
riga 3:turbo load: (sensore pressione collettore aria)
riga 4: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>(idem riga2)
...sono riuscito a fare tutto meno che l'ultimo grafico. praticamente non riesco a creare due instanze Lbg. per il tutto ho usato l'esempio display gia presente nel software arduino più ho installato la libreria Lbg(lcdbargraph) scaricata da qui.
mi potete dare una mano cortesemente, sono ai primi passi :)? grazie a tutti
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - Megatopic - Arduino Forum
- qui le pinout delle varie schede by xxxPighi: Pinout Diagram - Megatopic - Arduino Forum
- qui una serie di link utili: Link utili elettronica - Megatopic - Arduino Forum
In Playground Arduino Playground - LcdBarGraph Library trovi la spiegazione della libreria in questione.
Credo che nel tuo caso dovresti fare due assegnazioni per le due righe che desideri creare:
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
LiquidCrystal LCD(12, 11, 5, 4, 3, 2); // -- creating LCD instance
LcdBarGraph GAS(&LCD, 20, 0, 1); // barra su seconda riga display (1) che inizia in prima colonna (0)
LcdBarGraph AIR(&LCD, 20, 0, 3); // barra su quarta riga display (3) che inizia in prima colonna (0)
void setup() {
LCD.begin(4, 20); // -- initializing the LCD
...
}
void loop() {
...
GAS.drawValue(analogRead(GASPin), 1024);
AIR.drawValue(analogRead(AIRPin), 1024);
}
Ciao di nuovo a tutti e grazie per la vostra disponibilità. ringrazio anche a te cyberhs peri il tuo immenso aiuto. funziona tutto...o quasi, l'unica cosa che mi è rimasta da fare e che non riesco e la calibrazione...praticamente a motore spento, chiave pos marcia il display mi fa vedere questo:
engine load:
.fine display
turbo load:.fine display.
vi posto inoltre anche il codice che ho usato.
// include the library code:
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
byte lcdNumCols = 20; // -- number of columns in the LCD
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LcdBarGraph lbg0(&lcd, 20, 0, 1);
LcdBarGraph lbg1(&lcd, 20, 0, 3);
byte i0 = 0;
byte i1 = 1;
void setup() {
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print("Identificazione");
lcd.setCursor(0, 1);
lcd.print("veicolo in corso...");
delay(1000);
lcd.setCursor(0, 2);
lcd.print("AlfaRomeo 156 1.9JTD");
delay(500);
lcd.setCursor(0, 3);
lcd.print("-Software by DVlady-");
delay(2000);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" Avviamento sistema ");
delay(1000);
lcd.setCursor(0, 2);
lcd.print(" Check OK. Avvio... ");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Engine load:");
lcd.setCursor(0, 2);
lcd.print("Turbo load:");
}
void loop()
{
lbg0.drawValue( analogRead(i0), 980);
lbg1.drawValue( analogRead(i1), 980);
delay(1);
}
io ho provato vari esempi che ho trovato in giro sul web ma senza successo....forse sbaglio qualcosa io....grazie mille
Non hai inserito nel loop la stampa dei valori di GAS ed AIR.
Ti consiglio, inoltre, di fare riferimento ai pin degli ingressi analogici con le costanti A0 ed A1 per evitare confusione.
scusa la mia ignoranza ma non ci riesco...io ho provato a mettere all'inizio quanto segue:
int sensorMin = 1023; // minimum sensor value
int sensorMax = 0; // maximum sensor value
ma senza successo, praticamente rimane invariato, ho provato a cambiare i valori nell loop:
lbg0.drawValue( analogRead(i0), 980);
lbg1.drawValue( analogRead(i1), 980);
da 1024 a inferiore però mi va a modificare solo la fine del grafico......sicuramente sarà una cavolata che mi scappa...puoi essere più esplicito? ti ringrazio
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
float GASVal = 0,0;
float AIRVal = 0,0;
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
LcdBarGraph GAS(&LCD, 20, 0, 1);
LcdBarGraph AIR(&LCD, 20, 0, 3);
void setup() {
pinMode(A0, INPUT)
pinMode(A1, INPUT)
pinMode(2, OUTPUT)
pinMode(3, OUTPUT)
pinMode(4, OUTPUT)
pinMode(5, OUTPUT)
pinMode(11, OUTPUT)
pinMode(12, OUTPUT)
LCD.begin(20, 4);
LCD.setCursor(0, 0);
LCD.print("Identificazione");
LCD.setCursor(0, 1);
LCD.print("veicolo in corso...");
delay(1000);
LCD.setCursor(0, 2);
LCD.print("AlfaRomeo 156 1.9JTD");
delay(500);
LCD.setCursor(0, 3);
LCD.print("-Software by DVlady-");
delay(2000);
LCD.clear();
LCD.setCursor(0, 1);
LCD.print(" Avviamento sistema ");
delay(1000);
LCD.setCursor(0, 2);
LCD.print(" Check OK. Avvio... ");
delay(2000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Engine load:");
LCD.setCursor(0, 2);
LCD.print("Turbo load:");
}
void loop() {
GASVal = analogRead(A0);
AIRVal = analogRead(A1);
LCD.setCursor(13, 0);
LCD.print(GASVal, 2);
GAS.drawValue(GASVal , 1024));
LCD.setCursor(13, 2);
LCD.print(AIRVal, 2);
AIR.drawValue(AIRVal, 1024));
}
Abbi pazienza....sicuramente sono io che non ho le conoscenze necessarie , quando inserisco il codice mi da i seguenti errori:
sketch_may18a:4: error: expected unqualified-id before numeric constant
sketch_may18a:5: error: expected unqualified-id before numeric constant
sketch_may18a.ino: In function 'void setup()':
sketch_may18a:13: error: expected ;' before 'pinMode' sketch_may18a.ino: In function 'void loop()': sketch_may18a:54: error: expected ;' before ')' token
sketch_may18a:59: error: expected `;' before ')' token
ho copiato il codice come lo hai scritto te...aiutami per favore...dimmi dove sbaglio
Ho commesso qualche errore di sintassi ed ecco il motivo dell'elenco del compilatore.
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
float GASVal = 0.0; // qui c'era una virgola come separatore decimale (punto)
float AIRVal = 0.0; // stesso errore
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
LcdBarGraph GAS(&LCD, 20, 0, 1);
LcdBarGraph AIR(&LCD, 20, 0, 3);
void setup() {
pinMode(A0, INPUT); // qui mancava il terminatore di istruzione ";"
pinMode(A1, INPUT); // stesso errore
pinMode(2, OUTPUT); // stesso errore
pinMode(3, OUTPUT); // stesso errore
pinMode(4, OUTPUT); // stesso errore
pinMode(5, OUTPUT); // stesso errore
pinMode(11, OUTPUT); // stesso errore
pinMode(12, OUTPUT); // stesso errore
LCD.begin(20, 4);
LCD.setCursor(0, 0);
LCD.print("Identificazione");
LCD.setCursor(0, 1);
LCD.print("veicolo in corso...");
delay(1000);
LCD.setCursor(0, 2);
LCD.print("AlfaRomeo 156 1.9JTD");
delay(500);
LCD.setCursor(0, 3);
LCD.print("-Software by DVlady-");
delay(2000);
LCD.clear();
LCD.setCursor(0, 1);
LCD.print(" Avviamento sistema ");
delay(1000);
LCD.setCursor(0, 2);
LCD.print(" Check OK. Avvio... ");
delay(2000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Engine load:");
LCD.setCursor(0, 2);
LCD.print("Turbo load:");
}
void loop() {
GASVal = analogRead(A0);
AIRVal = analogRead(A1);
LCD.setCursor(13, 0);
LCD.print(GASVal, 2);
GAS.drawValue(GASVal, 1024));
LCD.setCursor(13, 2);
LCD.print(AIRVal, 2);
AIR.drawValue(AIRVal, 1024));
}
Ti ringrazio, il codice funziona alla perfezione, sei un mito...ormai però me ne aprofitto di te fino in fondo (dopo ti devo una birra),
mi aiuti anche a tarare i 2 sensori?
...praticamente il primo grafico dovrebbe cominciare al valore 280 e finire a 1000, ed il secondo dovrebbe cominciare a 360 e finire sempre a 1000. perchè i sensori la lettura a vuoto non la fanno da 0 v ad un massimo di 5 v ma cominciano da circa 1,3 v ad un massimo di 4,8-4,9 v, praticamente anche con letture a vuoto il display mi va a indicare una cosa che non c'è, prechè con motore spento(sensore che dovrebbe dare 0 v, ed invece da 1,3 v) vedo un pezzo di grafico acceso fisso....
grazie mille
Non hai specificato la marca ed il modello dei sensori di pressione.
Fornisci il link.
ho impazzito per trovarli ma non c'è nulla in giro...comunque non mi interessa sia una cosa precisa, basta che non sia come adesso, cioè che a motore spento il grafico mi dia un valore inesistente...ho letto in giro che i valori vanno da 0 a 1023 su un voltaggio da 0 - 5 v, cosa che mi sembra equivale a 4,5 mV....se non mi sbaglio...io ho bisogno che la scala del sensore non cominci da 0 v ma da 1,3 v....
Senza le caratteristiche dei due sensori è difficile indovinare i parametri della funzione di trasferimento.
I valori che ottieni devono soddisfare due condizioni: la linearità o meno del sensore ed almeno un paio di punti del grafico di cui si conosca i valori di tensione e pressione.
Il tutto ovviamente rispettando il cablaggio elettrico consigliato.
Ammessa la linearità dei sensori, perciò, si deve conoscere il valore esatto della tensione a pressione zero e il valore della tensione con una certa pressione (di solito la pressione massima ammissibile).
Poi la formula diventa una semplice interpolazione valori lineari.
il sensore di pressione dell`aria e questo:
http://www.ebay.it/itm/SENSORE-PRESSIONE-ALFA-ROMEO-156-Sportwagon-1-9-JTD-932B2B-932B2C-85KW-/151150226123?pt=Ricambi_automobili&hash=item2331416acb
ed il sensore di pressione del common rail dovrebbe essere questo:
http://www.ebay.it/itm/ALFA-156-147-FIAT-PUNTO-MULTIPLA-LANCIA-SENSORE-PRESSIONE-CARBURANTE-46779638-/180830221293?pt=Ricambi_automobili&hash=item2a1a5233ed
Allora a questo punto oltre la taratura dei sensori posso fare anche la visualizzazione della pressione in valori numerici? ![]()
Ecco a voi tutto fin'ora:
dicevo apposto dei valori che arduino legge che vanno da 0 a 1024 e che mi fa vedere dopo engine load e turbo load, se potevo sostiruirli con i rispettivi valori in bar
....
siete troppo mitici ragazzi, mi toccherà fare il mutuo per quante birre vi devo ![]()
Da quanto si vede sui grafici, queste sono le equazioni caratteristiche dei due sensori dopo aver riportato in ascissa la tensione ed in ordinata la pressione:
GAS
A = (X1; Y1) = (0.5 V; 0 bar) 1° punto
B = (X2; Y2) = (4.5 V; 1500 bar) 2° punto
M = (Y2 - Y1) / (X2 -X1) coefficiente angolare
V = M * (P -X1) + Y1 = M * P - M * X1 + Y1AIR
A = (X1; Y1) = (0.4 V; 0.2 bar) 1° punto
B = (X2; Y2) = (4.5 V; 1.5 bar) 2° punto
M = (Y2 - Y1) / (X2 -X1) coefficiente angolare
V = M * (P -X1) + Y1 = M * P - M * X1 + Y1
come faccio a inserirli su arduino? ![]()
Io ti ho dato gli strumenti per affrontare il problema da solo, ora tocca a te!
Comunque ho fatto un errore...
non
V = M * (P -X1) + Y1 = M * P - M * X1 + Y1
ma bensì
P = M * (V -X1) + Y1 = M * V - M * X1 + Y1
Colpito e affondato....riconosco che per le mie conoscenze è già troppo anche quello che sono riuscito a fare...ci capisco poco di quello che hai scritto te ma è da stamattina dalle 8 che ci provo a metterle nello sketch.....siccome al pronto soccorso ieri mi hanno dato 3 giorni di riposo non vorrei spenderli tutti provandoci
......spiegami per cortesia....

