Non riesco ad aggiornare il dato sul LCD

Salve è la mia primissima domanda qui sul Forum, ed ho poca esperienza con Arduino, siate buoni :slight_smile:
Cercherò di spiegarmi il meglio che posso, questo è un progetto che si prefigge di muovere un ingranaggio con vite senza fine per ruotare una fotocamere reflex alla velocità siderale, in poche parole un inseguitore per fotografare il cielo stellato :slight_smile: se sarete interessati metterò anche i disegni meccanici quando pronti per realizzarlo completamente :wink: metto un paio di foto schema del progetto e la lista componenti.
A grandi linee il progetto si compone di un Arduino Nano, un driver per motori stopper che fa muovere un neme17 a 240" a giro che sono 75ms a impulso, ho aggiunto un potenziometro mappato che regola una variazione nel tempo dell’impulso da 70 a 80ms per aggiustare la velocità in base anche alle condizioni della serata, ho aggiunto sempre a questo scopo un termoresistore per fare da riferimento ed un giorno magari creare un codice di correlazione temperatura-velocità, ed in fine una lettura della tensione della batteria.
Il mio problema in questione e che ho tre dati da aggiornare sul LCD ed riesco ad aggiornare solo la posizione del potenziometro, quello che sul LCD si legge come “Precisione” la temperatura ed il voltaggio aggiornano soltanto al reset della scheda. :frowning:
Non sono sicuro che il codice vada postato così ma non ho trovato la giusta icona ;D

#define ORARIO  2
 #define ANTIOR  3
 #define STEP   11 
 #define DIR    10 
 #define MODE0  12
 // #define MODE1  11
 // #define MODE2  12
 #define ENABLE 13
 #include <LiquidCrystal.h>

 
 int POTENZ   = A0;
 int  ora     =  0; 
 int  ant     =  0;
 int VALORE01 =  0;
 int VALORE02 =  0;
 int i        =  0;
 int tempPin  = A1;
 int analogInput = A2;
 
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // inserire valore esatto resistenza R1 (100K) 
float R2 = 10000.0; // inserire valore esatto resistenza R2 (10K) 
int value = 0;
 
 //                BS  E D4 D5 D6 D7
  LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
 
void setup(){
  lcd.begin(16, 2);
  Serial.begin(   9600     );
  // Serial.println(F("Tempo in Millisecondi per impulso")); 
  pinMode( ENABLE , OUTPUT );
  pinMode( DIR    , OUTPUT );
  pinMode( STEP   , OUTPUT );
  pinMode( MODE0  , OUTPUT );
  //pinMode( MODE1  , OUTPUT );
  //pinMode( MODE2  , OUTPUT );
  pinMode(POTENZ  , INPUT  );
  pinMode(ORARIO  , INPUT  );
  pinMode(ANTIOR  , INPUT  );
  pinMode(tempPin , INPUT  );
  pinMode(analogInput, INPUT);
}

void loop(){
  
  value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0; 
   // inserire al posto di 5.0V l`uscita in volt tra i Pin 5V e GND del vostro Arduino
   vin = vout / (R2/(R1+R2)); 
   if (vin<0.09) {
   vin=0.0;
  } 
  int readPin = analogRead(POTENZ);
  int delayTime=map(readPin,0,1024,70,80);
  // Sensore temperatura e conversione
  int tempReading = analogRead(tempPin);
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Conversione Kelvin a Celsius
  float tempF = (tempC * 9.0)/ 5.0 + 32.0; // Conversione Celcius a Fahrenheit

  
  digitalWrite( DIR    , HIGH ); 
  digitalWrite( STEP   , LOW  );
  digitalWrite( MODE0  , HIGH );  
  //digitalWrite( MODE1  , HIGH );
  //digitalWrite( MODE2  , LOW  );
  
  
   
 for( i=0; i<1600; i++){ 
   digitalWrite( STEP, HIGH );
   delay( delayTime);
   digitalWrite( STEP, LOW  );
   delay( delayTime);
   VALORE01 =analogRead(POTENZ);
   VALORE02 =analogRead(value);
   // tempPin =analogRead(tempC);
   // Serial.println();

  lcd.setCursor(0, 0);
  lcd.print("Precisione      ");
  lcd.setCursor(11, 0);
  lcd.print(VALORE01);
  delay(1); 

      
  lcd.setCursor(0, 1);
  lcd.print("Temp      V     ");
  lcd.setCursor(4, 1);
  lcd.print(tempC);
  delay(1);

  
  lcd.setCursor(11, 1);
  // lcd.print("INPUT V= ");
  lcd.print(vin);
  delay(1);
  
  
  ora = digitalRead(ORARIO);
  ant = digitalRead(ANTIOR);

  if (ora == HIGH) {
  for( i=0; i<200; i++){}  
    digitalWrite( DIR   , HIGH); 
    digitalWrite( STEP, HIGH );
    delay( 1 );
    digitalWrite( STEP, LOW );
    delay( 1 );

  

}  
  if (ant == HIGH) {
  for( i=0; i<200; i++){}    
    digitalWrite( DIR   , LOW); 
    digitalWrite( STEP, HIGH );
    delay( 1 );
    digitalWrite( STEP, LOW );
    delay( 1 );


  
}
}
}

Comunque penso di aver fatto dei casini nel codice, se mi date una mano :kissing:

Grazie

>Cespe: ti ricordo che in conformità al regolamento, punto 7, il codice va racchiuso nei tag CODE (… quelli che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) e NON in quelli TABLE.

Per questa volta ho corretto io il tuo post, ma presta attenzione, Grazie.

Guglielmo

P.S.: Se poi riprendi il codice ed usi la funzione dell’IDE Tools → Auto Format, te lo “indenta” come si deve, rendendone migliore la leggibiltà e la ricerca di eventuali errori.
P.P.S: Anche una scrittura del post … un po’ più leggibile, non sarebbe male, magari separando i vari capoversi :wink:

Salve gpb01, credimi che ho cercato come postare il codice per bene, ma nel’esempio dava una icona che nel mio browser non compariva, grazie della correzione.

Ho provato il comando Formattazione automatica, ma in pratica non ha cambiato niente.
Ecco il codice modificato.

#define ORARIO  2
#define ANTIOR  3
#define STEP   11
#define DIR    10
#define MODE0  12
// #define MODE1  11
// #define MODE2  12
#define ENABLE 13
#include <LiquidCrystal.h>


int POTENZ   = A0;
int  ora     =  0;
int  ant     =  0;
int VALORE01 =  0;
int VALORE02 =  0;
int i        =  0;
int tempPin  = A1;
int analogInput = A2;

float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // inserire valore esatto resistenza R1 (100K)
float R2 = 10000.0; // inserire valore esatto resistenza R2 (10K)
int value = 0;

//                BS  E D4 D5 D6 D7
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(   9600     );
  // Serial.println(F("Tempo in Millisecondi per impulso"));
  pinMode( ENABLE , OUTPUT );
  pinMode( DIR    , OUTPUT );
  pinMode( STEP   , OUTPUT );
  pinMode( MODE0  , OUTPUT );
  //pinMode( MODE1  , OUTPUT );
  //pinMode( MODE2  , OUTPUT );
  pinMode(POTENZ  , INPUT  );
  pinMode(ORARIO  , INPUT  );
  pinMode(ANTIOR  , INPUT  );
  pinMode(tempPin , INPUT  );
  pinMode(analogInput, INPUT);
}

void loop() {

  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  // inserire al posto di 5.0V l`uscita in volt tra i Pin 5V e GND del vostro Arduino
  vin = vout / (R2 / (R1 + R2));
  if (vin < 0.09) {
    vin = 0.0;
  }
  int readPin = analogRead(POTENZ);
  int delayTime = map(readPin, 0, 1024, 70, 80);
  // Sensore temperatura e conversione
  int tempReading = analogRead(tempPin);
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius
  float tempF = (tempC * 9.0) / 5.0 + 32.0; // Convert Celcius to Fahrenheit


  digitalWrite( DIR    , HIGH );
  digitalWrite( STEP   , LOW  );
  digitalWrite( MODE0  , HIGH );
  //digitalWrite( MODE1  , HIGH );
  //digitalWrite( MODE2  , LOW  );



  for ( i = 0; i < 1600; i++) {
    digitalWrite( STEP, HIGH );
    delay( delayTime);
    digitalWrite( STEP, LOW  );
    delay( delayTime);
    VALORE01 = analogRead(POTENZ);
    VALORE02 = analogRead(value);
    // tempPin =analogRead(tempC);
    // Serial.println();

    lcd.setCursor(0, 0);
    lcd.print("Precisione      ");
    lcd.setCursor(11, 0);
    lcd.print(VALORE01);
    delay(1);


    lcd.setCursor(0, 1);
    lcd.print("Temp      V     ");
    lcd.setCursor(4, 1);
    lcd.print(tempC);
    delay(1);


    lcd.setCursor(11, 1);
    // lcd.print("INPUT V= ");
    lcd.print(vin);
    delay(1);


    ora = digitalRead(ORARIO);
    ant = digitalRead(ANTIOR);

    if (ora == HIGH) {
      for ( i = 0; i < 200; i++) {}
      digitalWrite( DIR   , HIGH);
      digitalWrite( STEP, HIGH );
      delay( 1 );
      digitalWrite( STEP, LOW );
      delay( 1 );



    }
    if (ant == HIGH) {
      for ( i = 0; i < 200; i++) {}
      digitalWrite( DIR   , LOW);
      digitalWrite( STEP, HIGH );
      delay( 1 );
      digitalWrite( STEP, LOW );
      delay( 1 );



    }
  }
}

Cespe: ... ma in pratica non ha cambiato niente.

Come non ha cambiato niente ? ? ? :o ... ha cambiato TUTTO, rendendo il codice correttamente "indentato" ed aumentandone moltissimo la leggibilità !!!

Certo ... mica crederai che ti corregge gli errori vero? :D Ti sistema l'aspetto del codice, ti segnala se ci sono parentesi '{' dispari, ma altro non fa.

E comunque quel codice si può pulire ancora togliendo tutte quelle inutili righe vuote ... che danno solo fastidio a chi lo esamina !

Guglielmo

Detto questo, mi sembra di vedere che tu, ad ogni ciclo del loop(), leggi tensione e temperatura, ma poi, dentro al loop(), hai una "for" che viene ripetuta per 1600 volte in cui detti valori NON mi sembra tu li legga più, mentre continui, sempre dentro detta "for", ad aggiornare il LCD, che, ovviamnete, mostra i vecchi ultimi valori letti all'inizio del loop() ...

Guglielmo

Grazie Mille Guglielmo ;D
Sono riuscito ad avere i dati aggiornati, e va tutto perfetto tranne che per l’inversione di marcia, che sembra essere ostacolata dall’altro verso e si compensa. :frowning:
Ecco il codice corretto.

#define ORARIO  2
#define ANTIOR  3
#define STEP   11
#define DIR    10
#define MODE0  12
// #define MODE1  11
// #define MODE2  12
#define ENABLE 13
#include <LiquidCrystal.h>

int POTENZ   = A0;
int  ora     =  0;
int  ant     =  0;
int VALORE01 =  0;
int VALORE02 =  0;
int i        =  0;
int tempPin  = A1;
int analogInput = A2;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // inserire valore esatto resistenza R1 (100K)
float R2 = 10000.0; // inserire valore esatto resistenza R2 (10K)
int value = 0;

//                BS  E D4 D5 D6 D7
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(   9600     );
  // Serial.println(F("Tempo in Millisecondi per impulso"));
  pinMode( ENABLE , OUTPUT );
  pinMode( DIR    , OUTPUT );
  pinMode( STEP   , OUTPUT );
  pinMode( MODE0  , OUTPUT );
  //pinMode( MODE1  , OUTPUT );
  //pinMode( MODE2  , OUTPUT );
  pinMode(POTENZ  , INPUT  );
  pinMode(ORARIO  , INPUT  );
  pinMode(ANTIOR  , INPUT  );
  pinMode(tempPin , INPUT  );
  pinMode(analogInput, INPUT);
}

void loop() {
  int readPin = analogRead(POTENZ);
  int delayTime = map(readPin, 0, 1024, 70, 80);
  digitalWrite( DIR    , HIGH );
  digitalWrite( STEP   , LOW  );
  digitalWrite( MODE0  , HIGH );

  for ( i = 0; i < 1; i++) {
    digitalWrite( STEP, HIGH );
    delay( delayTime);
    digitalWrite( STEP, LOW  );
    delay( delayTime);
    VALORE01 = analogRead(POTENZ);
    VALORE02 = analogRead(value);
    // tempPin =analogRead(tempC);
    // Serial.println();

    ora = digitalRead(ORARIO);
    ant = digitalRead(ANTIOR);
  }
  if (ora == HIGH) {
    for ( i = 0; i < 1; i++) {}
    digitalWrite( DIR   , HIGH);
    digitalWrite( STEP, HIGH );
    delay( 1 );
    digitalWrite( STEP, LOW );
    delay( 1 );
  }
  if (ant == HIGH) {
    for ( i = 0; i < 1; i++) {}
    digitalWrite( DIR   , LOW);
    digitalWrite( STEP, HIGH );
    delay( 1 );
    digitalWrite( STEP, LOW );
    delay( 1 );
  }
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  // inserire al posto di 5.0V l`uscita in volt tra i Pin 5V e GND del vostro Arduino
  vin = vout / (R2 / (R1 + R2));
  if (vin < 0.09) {
    vin = 0.0;
  }
  // Sensore temperatura e conversione
  int tempReading = analogRead(tempPin);
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius
  float tempF = (tempC * 9.0) / 5.0 + 32.0; // Convert Celcius to Fahrenheit

  lcd.setCursor(0, 0);
  lcd.print("Precisione      ");
  lcd.setCursor(11, 0);
  lcd.print(VALORE01);
  delay(1);

  lcd.setCursor(0, 1);
  lcd.print("Temp      V     ");
  lcd.setCursor(4, 1);
  lcd.print(tempC);
  delay(1);
  
  lcd.setCursor(11, 1);
  // lcd.print("INPUT V= ");
  lcd.print(vin);
  delay(1);
}