Arduino mi va lento ...

Premesse:

-Ho appena comprato da due giorni Arduino 2009
-Non ho mai compilato niente!
-Ci capisco poco

Il progetto:

Devo costruire un tester per lampadine. Il tester è composto da due pulsanti che schiacciati contemporaneamente azionano una luce verde, se invece non vengono schiacciati contemporaneamente ne azionano una rossa.
Detto questo tutto bene (spero), il problema è sorto quando ho provato ad includere un LCD… …Quello che prima funzionava ora va ad una lentezza allucinante. Perchè?
Dove ho sbagliato?

Eventualmente posso usare arduino per calcolare la potenza che usa una lampadina?

Allego lo Sketch:

#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 5, 4, 3, 2);  
#define intermittenza 1
#define Ledrosso 9
#define Pulsante 7
#define Pulsante2 6
#define Ledverde 12
int Valore = 0;

void setup() 
{
  pinMode(Ledrosso, OUTPUT);  
  pinMode(Pulsante, INPUT); 
  pinMode(Ledverde,OUTPUT);
  pinMode(Pulsante2, INPUT);
  pinMode(intermittenza, OUTPUT);
  lcd.begin(16, 2);
  lcd.print("Prova la lampadina");}

void loop(){
{
  digitalWrite(intermittenza, HIGH);   // set the LED on
  delay(1000);                  // wait for a second
  digitalWrite(intermittenza, LOW);    // set the LED off
  delay(1000);                  // wait for a second
}

//Funzione Pulsante  1+2 =VERDE
Valore = digitalRead(Pulsante);
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledverde, HIGH);}
 else
{digitalWrite(Ledverde, LOW);}

//Funzione Pulsante 1 =Rosso 
Valore = digitalRead(Pulsante);
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledrosso, HIGH);}
 else 
{digitalWrite(Ledrosso, LOW);}

//Funzione Pulsante 2 -0Rosso 
Valore = digitalRead(Pulsante2);
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == LOW) 
{digitalWrite(Ledrosso, HIGH);}
 else 
{digitalWrite(Ledrosso, LOW);}

}

4 cose: *Nella funzione loop(), all inizio hai messo 2 volte di seguito le parentesi graffe. perché? *non usare il pin 1 perché serve per la seriale. *non serve "Valore = digitalRead(Pulsante);" perché non usi la variabile. * ci credo che risponde lento:

digitalWrite(intermittenza, HIGH);   // set the LED on
  delay(1000);                  // wait for a second
  digitalWrite(intermittenza, LOW);    // set the LED off
  delay(1000);                  // wait for a second

al inizio dell loop aspetti 2 secondi prima di leggere i tasti.

Puoi risolvere: http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Ciao Uwe

Grazie per avere risposto!

Ho fatto come hai detto tu, problema risolto!

Ora ho corretto così, ma ho come la netta sensazione che il display non si setti così…
…anche perchè mi rimangono le vecchie scritte, come ovviare?

Grazie anticipatamente

#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 5, 4, 3, 2);  
#define Ledrosso 9
#define Pulsante 7
#define Pulsante2 6
#define Ledverde 12


void setup() 
{
  pinMode(Ledrosso, OUTPUT);  
  pinMode(Pulsante, INPUT); 
  pinMode(Ledverde,OUTPUT);
  pinMode(Pulsante2, INPUT);
 
 // Accensione macchina (LCD)
 lcd.begin(16, 2);
 lcd.print("  Made by");
 lcd.setCursor(0, 1);
 lcd.print("Alex Branchi");
 for (int positionCounter = 0; positionCounter < 13; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 29; positionCounter++) 
  {lcd.scrollDisplayRight(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 16; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
    delay(2000);
 lcd.noDisplay();}

void loop(){

//Funzione Pulsante  1+2 =VERDE
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledverde, HIGH);
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("   EROGAZIONE");
 lcd.setCursor(0, 1);
 lcd.print("      ENERGIA ");}
 else
{digitalWrite(Ledverde, LOW);
 lcd.noDisplay();}

//Funzione Pulsante 1 =Rosso 
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledrosso, HIGH);
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("  TASTO DESTRO");}
 else 
{digitalWrite(Ledrosso, LOW);
 lcd.noDisplay();}

//Funzione Pulsante 2 -0Rosso 
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == LOW) 
{digitalWrite(Ledrosso, HIGH);
lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO SINISTRO");}
 else 
{digitalWrite(Ledrosso, LOW);
 lcd.noDisplay();}

}

Forse dovresti pulire ogni tanto i caratteri:

lcd.clear();

dove lo metto di preciso?

Dove ti serve.... :P

Ho fatto così ma mi sembra che non ci siamo proprio…

#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 5, 4, 3, 2);  
#define Ledrosso 9
#define Pulsante 7
#define Pulsante2 6
#define Ledverde 12


void setup() 
{
  pinMode(Ledrosso, OUTPUT);  
  pinMode(Pulsante, INPUT); 
  pinMode(Ledverde,OUTPUT);
  pinMode(Pulsante2, INPUT);
 
 // Accensione macchina (LCD)
 lcd.begin(16, 2);
 lcd.print("  Made by");
 lcd.setCursor(0, 1);
 lcd.print("Alex Branchi");
 for (int positionCounter = 0; positionCounter < 13; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 29; positionCounter++) 
  {lcd.scrollDisplayRight(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 16; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
    delay(2000);
 lcd.noDisplay();}

void loop(){

//Funzione Pulsante  1+2 =VERDE
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledverde, HIGH);
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("EROGAZIONE");
 lcd.setCursor(0, 1);
 lcd.print("ENERGIA ");}
 else
{digitalWrite(Ledverde, LOW);
 lcd.clear();
 lcd.noDisplay();}

//Funzione Pulsante 1 =Rosso 
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledrosso, HIGH);
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO DESTRO");}
 else 
{digitalWrite(Ledrosso, LOW);
 lcd.clear();
 lcd.noDisplay();}

//Funzione Pulsante 2 -0Rosso 
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == LOW) 
{digitalWrite(Ledrosso, HIGH);
lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO SINISTRO");}
 else 
{digitalWrite(Ledrosso, LOW);
 lcd.clear();
 lcd.noDisplay();}

}

Forse, potrebbe essere utile che tu descriva il comportamento attuale e quello atteso, a seconda degli stati, altrimenti sono costretto cablarmi un circuito come il tuo per debuggarlo...

Cosa dovrebbe succedere…

-messaggio iniziale prima del loop

schiaccio pulsante uno= Messaggio errore +luce rossa
schiaccio pulsante due= Messaggio errore +luce rossa

Schiaccio pul. 1+2 = Conferma erogazione +luce verde

Cosa succede:

Messaggio iniziale senza sfarfallio e nitido
quando schiaccio un pulsante solo a caso si faticano a vedere le scritte e sfarfalla leggermente il display.
Se premo tutti e due i pulsanti contemporaneamente una linea trasparente sale e scende oscurando il messaggio in questione.

Spero di essermi spiegato bene.

Grazie ancora.
ciao

Io ho una teoria, pero' potrei sbagliarmi. Il fatto che tu prema un pulsante si traduce ad esempio in una condizione vera in un certo punto del tuo codice. Se la condizione e' vera allora scrive il testo sul display e lo aggiorna (con chiamate che non uso mai, tipo .display() e .nodisplay() ma che intuisco servono per accendere o spegnere l'lcd)

A questo punto, se tu tieni premuto un bottone, questa condizione si verifica no stop e arduino ri-scrive un disastro di volte il tuo lcd causando il fliker.

Io di solito adotto il sistema di cambio di stato di un pulsante, salvo la variabile, e in caso il bottone sia stato premuto allora cambio il display. Dovrebbe risolvere anche a te.

http://arduino.cc/en/Tutorial/ButtonStateChange

Il tuo codice è infarcito di "else" quindi TUTTE le volte che non si verifica la condizione dell'"if" viene comunque eseguita la condizione dell'else, che è sempre una pulizia del display. In questo modo, come ha detto Fede, il display flichera perché viene cancellato continuamente.

Gli else li devi usare o in abbinamento ad un altro if per verificare una condizione alternativa e non TUTTE le condizioni alternative al controllo principale.