Ciao a tutti, sono nuovo del forum, mi presento...
Mi chiamo Marco e sono di Grosseto, ho 37 e la mia passione e' l'elettronica ed i computer...ma non ho mai fatto scuole a riguardo.
bando alle ciance vengo subito al mio problema, ho visto e conosciuto arduino poche settimane fa', mi sono messo a fare un piccolo computer di bordo per la macchina il quale mi deve controllare temp. aria e acqua, voltmetro, livello acqua e accensioni fari.
Sto usando la libreria floattostring.h e un 4094 per pilotare l'lcd con 3 fili, ovviamente l'lcd e' un HD44780 compatibile 16x2....nel display vengono visualizzati al momento 3 valori, aria, acqua, volt...a mio avviso mi pare che sia molto lento nel visualizzare tutto il display.
Possibile che impieghi poco meno di 2 secondi per fare questo ?
Io provengo dal mondo del mitico C64 dove con 1 Mhz si faceva tutto e in questo momento mi trovo un arduino a 16Mhz che fatica a leggere 3 sensori e visualizzarli su LCD...dove mi sbaglio ???
Come riprova della lentezza dell'esecuzione del programma per poter monitorare la pressione di un pulsante ho dovuto ripetere tale funzione svariate volte nel programma, e' normale tutto cio' ???
usa i delay il meno possibile
non ci sono delay, l'unico delay che ce' e' in una funzione che viene chiamata solo in caso di una condizione...devo capire come si allega un file almeno mettere il codice
Prova con il copiare il codice che stai lavorando.
poi sul forum scrivi
[ code ]"Incolla"[ /code ]
Hai un bottoncino con # .... se preferisci usa quello.
prova a postare il codice magari si possono abbreviare i tempi =)
ecco qua il codice che uso...premetto che non sono esperto ma proprio per niente di C++...quindi se avete degli accorgimenti o consigli da darmi sono ben accetti
P.s. il programma non e' ancora completo ma funzionale.
#include <LCD3Wire.h>
// Arduino pins
#define LCD_LINES 2 // number of lines in your display
#define DOUT_PIN 11 // Dout pin
#define STR_PIN 12 // Strobe pin
#define CLK_PIN 10 // Clock pin
// variabili
int ass = 0;
int tempe = 0;
int light = 0;
int livello = 0;
int tasto = 0;
int memtasto = 0;
// ingressi analogici
int pin1 = 1; // pin analogico 1 per lettura livello acqua
int pin2 = 2; // pin analogico 2 per lettura valore luce ambiente /accensione-spengimento luci
int pin3 = 3; // pin analogico 3 per lettura voltaggio
int pin4 = 4; // pin analogico 4 per lettura temperatura acqua
int pin5 = 5; // pin analogico 5 per lettura temperatura aria
//create object to control an LCD.
LCD3Wire lcd = LCD3Wire(LCD_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
//Function converts float to char array to display on LCD
char * floatToString(char * outstr, float value, int places, int minwidth, bool rightjustify);
void setup(void) {
// initialize LCD3Wire
lcd.init();
pinMode(9, OUTPUT); // led controllo luci accese
pinMode(8, OUTPUT); // led allarme temperatura acqua
pinMode(2, OUTPUT); // rele' luci
pinMode(3, INPUT); // pulsante accensione ventola radiatore
pinMode(4, OUTPUT); // rele' per ventola radiatore
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
blinkLED(8, 10, 20);
}
void loop(void) {
float temp; //variabile per misurazione temperatura ed altro
char buff[5]; //buffer per funzione floatToString
// voltmetro
lcd.cursorTo(1,0);
lcd.printIn("Vcc ");
temp = analogRead(pin3);
temp = temp / 204.8; // 1024 (range ing. anal. / 5 (volt max ing. anal.) = 204.8 1 volt...
temp = temp * 5; // il partitore divide per 5 la tensione 'ingresso analogico' 3
lcd.printIn(floatToString(buff,temp,1,0,false));
if (temp <= 9.99) { // se volt inferiore a 10
lcd.cursorTo(1,7); //la virgola si sposta e pulisco posizione LCD
lcd.printIn(" ");
}
// fine routine per voltmetro
keypressed();
// temperatura acqua
lcd.cursorTo(1,9);
lcd.printIn("H2o ");
temp = analogRead(pin4); //legge temperatura su ingresso analogico 4
temp = (5.0 * temp * 100.0)/1024.0;
//temp = temp--; eventuale correzione di errore
if (temp <= 9) { // se la temperatura e' inferiore a 10
lcd.cursorTo(1,14); //la virgola si sposta e pulisco posizione LCD
lcd.printIn(" ");
}
lcd.cursorTo(1,13); //muove il cursore, 1 riga 13 carattere
lcd.printIn(floatToString(buff,temp,0,0,false)); //scrive temperatura acqua su LCD
if (temp >= 30){
// lcd.clear();
lcd.leftScroll(20, 50);
lcd.clear();
digitalWrite(4, HIGH); //accende ventola radiatore acqua
for (ass = 30; temp > ass;) {
blinkLED(8, 10, 20);
lcd.cursorTo(1,1);
lcd.printIn("ALLARME ACQUA");
lcd.cursorTo(2,6);
temp = analogRead(4);
temp = (5.0 * temp * 100.0)/1024.0;
lcd.printIn(floatToString(buff,temp,1,0,false)); //scrive temperatura acqua su LCD
if (temp < 30 ) {
lcd.clear();
digitalWrite(4, LOW);
break;
}
lcd.cursorTo(1,1);
lcd.printIn(" ");
//digitalWrite(4, LOW);
}
}
// fine temp. acqua
keypressed();
// temperatura aria
temp = analogRead(pin5); //legge temperatura su ingresso analogico 5
temp = (5.0 * temp * 100.0)/1024.0;
//temp = temp--; eventuale correzione di errore
lcd.cursorTo(2,0);
lcd.printIn("Air");
if (temp <= 9) { // se la temperatura e' inferiore a 10
lcd.cursorTo(2,5); //la virgola si sposta e pulisco posizione LCD
lcd.printIn(" ");
}
lcd.cursorTo(2,4); //muove il cursore, 2 riga 4 carattere
lcd.printIn(floatToString(buff,temp,0,0,false)); //scrive temperatura aria su LCD
//lcd.print(0xDF); // simbolo gradi
//lcd.print('C'); // Centigradi
// fine temperatura aria
keypressed();
// controllo livello acqua
livello = analogRead(pin1);
//Serial.println(livello);
lcd.cursorTo(2,7);
lcd.printIn("Liv ");
lcd.print('x');
// fine livello acqua
keypressed();
// controllo accensione luci
light = analogRead(pin2);
light = map(light, 0, 1023, 0, 10);
if (light < 4 ){
lcd.cursorTo(2,13);
lcd.printIn(" ON");
digitalWrite(2, LOW);
digitalWrite(9, HIGH);
}
else
{
lcd.cursorTo(2,13);
lcd.printIn("OFF");
digitalWrite(2, HIGH);
digitalWrite(9, LOW);
//fine routine per controllo luci accese o spente
}
}
// funzione per lampeggio led
// di Robert Faludi
// rob@faludi.com
void blinkLED(int targetPin, int numBlinks, int blinkRate) {
// this function blinks the an LED light as many times as requested
for (int i=0; i<numBlinks; i++) {
digitalWrite(targetPin, HIGH); // sets the LED on
delay(blinkRate); // waits for a second
digitalWrite(targetPin, LOW); // sets the LED off
delay(blinkRate);
}
}
void keypressed() {
//keypressed();
tasto = digitalRead(3);
if (tasto == 0) {
if (digitalRead(4) == 0)
digitalWrite(4, HIGH);
else
digitalWrite(4, LOW);
}
}
// floatToString.h
//
// Tim Hirzel
// tim@growdown.com
// March 2008
// float to string
//
char * floatToString(char * outstr, float value, int places, int minwidth, bool rightjustify) {
// this is used to write a float value to string, outstr. oustr is also the return value.
int digit;
float tens = 0.1;
int tenscount = 0;
int i;
float tempfloat = value;
int c = 0;
int charcount = 1;
int extra = 0;
// make sure we round properly. this could use pow from <math.h>, but doesn't seem worth the import
// if this rounding step isn't here, the value 54.321 prints as 54.3209
keypressed();
// calculate rounding term d: 0.5/pow(10,places)
float d = 0.5;
if (value < 0)
d *= -1.0;
// divide by ten for each decimal place
for (i = 0; i < places; i++)
d/= 10.0;
// this small addition, combined with truncation will round our values properly
tempfloat += d;
keypressed();
// first get value tens to be the large power of ten less than value
if (value < 0)
tempfloat *= -1.0;
while ((tens * 10.0) <= tempfloat) {
tens *= 10.0;
tenscount += 1;
}
if (tenscount > 0)
charcount += tenscount;
else
charcount += 1;
if (value < 0)
charcount += 1;
charcount += 1 + places;
minwidth += 1; // both count the null final character
if (minwidth > charcount){
extra = minwidth - charcount;
charcount = minwidth;
}
if (extra > 0 and rightjustify) {
for (int i = 0; i< extra; i++) {
outstr[c++] = ' ';
}
}
keypressed();
// write out the negative if needed
if (value < 0)
outstr[c++] = '-';
if (tenscount == 0)
outstr[c++] = '0';
for (i=0; i< tenscount; i++) {
digit = (int) (tempfloat/tens);
itoa(digit, &outstr[c++], 10);
tempfloat = tempfloat - ((float)digit * tens);
tens /= 10.0;
}
// if no places after decimal, stop now and return
keypressed();
// otherwise, write the point and continue on
if (places > 0)
outstr[c++] = '.';
// now write out each decimal place by shifting digits one by one into the ones place and writing the truncated value
for (i = 0; i < places; i++) {
tempfloat *= 10.0;
digit = (int) tempfloat;
itoa(digit, &outstr[c++], 10);
// once written, subtract off that digit
tempfloat = tempfloat - (float) digit;
}
if (extra > 0 and not rightjustify) {
for (int i = 0; i< extra; i++) {
outstr[c++] = ' ';
}
}
outstr[c++] = '\0';
return outstr;
}
ancora nulla ?
per evitare il problema del ripetere il controllo del pulsante usa un interrupt
quando premi il pulsante blocca il programma ed esegue ciò che metti nella funzione che richiama
cerca sul playground è abbastanza ben spiegato e se hai problemi chiedi
usa un condensatore in parallelo al pulsante sennò la corrente oscilla quando premi il pulsante e esegue l'interrupt più volte...
la lentezza potrebbe derivare dal fatto che usi un multiplexer per pilotare lcd penso che rallenti abbastanza l'esecuzione del codice
il codice è abbastanza complesso ma non dovrebbe rallentare così tanto...
ok ti ringrazio per la tua risposta, prendero' in considerazione l'uso degli interrupt per il multiplexer pare strano anche a me che rallenti cosi, ho visto progetti con arduino dove pilotano lcd grafici abbinati a gps e risultano piu' veloci del mio.
muccapazza, ho visto che sei di grosseto anche te, non è che ti farebbe voglia di darmi una mano con questo interessante arduino?
...scusate se ho tirato su questo relativamente vecchio 3d!!
se vieni a Firenze qualche dritta te la posso dare pure io aspetta ma io ti conosco? ;D