lentezza programma...

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

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 :slight_smile:

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 :wink: aspetta ma io ti conosco? ;D