continua a ripetere la prima println ("Che cosa vuoi fare")

il programma appena entra nella loop continua ad eseguire la prima istruzione all’infinito ( la println (“Che cosa vuoi fare: 1-scrivi la tabella 2-modifica una riga 3-acquisire una t 4-visualizzo t su LCD”) senza darmi la possibilità di inserire un numero e quindi decidere che operazione svolgere.
Vi ho postato tutto il codice ma mi interessava la prima parte della void loop (prima degli if) .

 #include <EEPROM.h>
#include <LiquidCrystal.h>

int i=1;
int temperatura;
float pinLettura=A0;
float tensioneLetta;
int BH; 
int BL; 
float rapporto;
int cont=0;
float diff;
float diffmin;
int posmin;
float rapporto2;
int a;
int riga;


void setup () {
  Serial.begin(9600);
  pinMode (pinLettura, INPUT);
  LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // setto i pin per collegare arduino al display
}

void loop () {
  Serial.println ("Cosa vuoi fare ? : 1-scrivi la tabella 2-modifica una riga 3-acquisire una t 4-visualizzo t su LCD ");
  i=Serial.read();
  
  if (i==1){
    // inserisco temperature nella tabella
    
    while (cont<15){
    Serial.print("Inserisci la temperatura : ");
    temperatura=Serial.read();
    EEPROM.write(cont,temperatura); // scrivo nella eeprom di posto cont la temperatura
    cont=cont+3; // nelle 2 celle seguenti inserirò il valore di R/R(25)
    }
    cont=0;
    
    
    
    while (cont<15){
      Serial.print("Inserisci il rapporto R/R(25°) : ");
      rapporto=Serial.read();
      a=rapporto*10000; // modifico il numero da float ad intero 
      BH=highByte(a); // la funzione highByte in questo caso mette la parte più significativa del numero rapporto nella variabile BH
      BL=lowByte(a); 
      EEPROM.write(cont+1,BH); 
      EEPROM.write(cont+2,BL); 
      cont=cont+3;
    }
 }
 
 
 cont=0;
 if (i==2){
   // modifica di una riga
   Serial.print ("Inserisci quale riga vuoi modificare :");
   riga=Serial.read();
   cont=riga*3; // va alla posizione che mi serve
   Serial.print ("Inserisci la temperatura ");
   temperatura = Serial.read();
   EEPROM.write (cont,temperatura);
   Serial.print ("Inserisci il rapporto tra resistenze : ");
   rapporto = Serial.read();
   a=rapporto*10000;
   BH=highByte(a);
   EEPROM.write (cont+1,BH);
   BL=lowByte(a);
   EEPROM.write (cont+2,BL);
 }
 
 if (i==3)
 {
     float Rt;
     float rappCalcolato; // rapporto Rt(reale)/Rt(150°C)
     float Vab;
     float Va;
     float Vb;
     float diffprov;
     
     tensioneLetta=analogRead (pinLettura);
     
     Vab=tensioneLetta/5.55; // 5.55 è il guadagno dell'operazionale
     Vb=(5*470)/(470+150); // trovo Vb applicando il partitore di tensione:  Vb=VCC*R2/(R1+R2)
     Va=Vab-Vb; 
     Rt=((5*470)/Va) -470;   
     rappCalcolato=Rt/150;
     
     posmin=0;
     BH=EEPROM.read (1);
     BL=EEPROM.read(2);
     rapporto=BH*256+BL;
     diff=rappCalcolato-rapporto;
     if (diff<0)
     {
       diff=diff*(-1);
     }
     cont=3;
     while (cont<15)
     {
         BH=EEPROM.read (cont+1);
         BL=EEPROM.read(cont+2);
         rapporto=BH*256+BL;
         diffprov=rappCalcolato-rapporto;
         if (diffprov<0)
         {
           diffprov=diffprov*(-1);
         }
         if (diffprov<diff)
         {
           diff=diffprov;
           posmin=cont;
         }
         cont=cont+3;
     }
     // in posmin c'è la cella di EEPROM che contiene la temperatura 
 }
     
     
     
     if (i==4);
     {
       // visualizzare temp su LCD.
       // stampare contenuto posmin
        //lcd.print (EEPROM.read (posmin));
     }

     
     
 }

Primo, manca la Serial.available() quindi ... non ti chiedi MAI se c'è veramente qualche cosa da leggere, secondo ... attento che "i" non conterrà il numero 1, 2, ecc. ma il carattere '1', '2', ecc. (... se, come immagino, stai digitando tu da tastiera il numero).

Ti consiglio un attento studio (...e non semplicemente uno sguardo) delle funzioni relative alla Serial per capire come funzionano ! :wink:

Guglielmo

L'istruzione Serial.read non è bloccante, se nella seriale non c'è nulla, esce restituendo -1.
Quindi il codice passa di lì, riceve -1 e ripete all'infinito.
Devi mettere un while facendo un check con Serial.available() per verificare l'effettiva presenza di dati sulla seriale e DOPO leggerli:

Serial.println(messaggio);
while (!Serial.available()); //blocca qui finché non c'è nulla sulla seriale
i=Serial.read(); //leggo il 1° byte
ecc..

ho messo questo comando prima delle Serial.read()

while (Serial.avaible()<0)
{}

Purtroppo il problema persiste: ho sbagliato qualcosa/come risolvo?

gpb01:
attento che "i" non conterrà il numero 1, 2, ecc. ma il carattere '1', '2', ecc. (... se, come immagino, stai digitando tu da tastiera il numero).
Guglielmo

Rileggiti questa considerazione di @Guglielmo. E' qui il tuo secondo problema.

Modifica il programma sostituendo gli IF con uno switch case
Qui un esempio --> http://arduino.cc/en/Tutorial/SwitchCase2

Rileggiti questa considerazione di @Guglielmo. E' qui il tuo secondo problema.

Questo problema l'ho sistemato sostituendo if (i==1) con if (i=='1') così che compara un carattere ad un altro carattere e questa parte di codice sembra funzionare

Argo_Fra:
Questo problema l'ho sistemato sostituendo if (i==1) con if (i=='1') così che compara un carattere ad un altro carattere e questa parte di codice sembra funzionare

Tutte le IF le devi fare tra caratteri, anche 2=>'2' e 3=>'3'

si si gli if sono ok.
Però adesso mi stavo chiedendo: il mio programma arriva al punto in cui devo inserire dei numeri, quindi fa la Serial.print ("inserisci temperatura"); a questo punto aspetta circa 1,5 secondi e poi continua scrivendo (giustamente, da programma ne devo inserire 5) "inserisci temperatura". Se io inserisco i numeri in quel tempo di 1,5 secondi me lo prende?

Argo_Fra:
si si gli if sono ok.
Però adesso mi stavo chiedendo: il mio programma arriva al punto in cui devo inserire dei numeri, quindi fa la Serial.print ("inserisci temperatura"); a questo punto aspetta circa 1,5 secondi e poi continua scrivendo (giustamente, da programma ne devo inserire 5) "inserisci temperatura". Se io inserisco i numeri in quel tempo di 1,5 secondi me lo prende?

Ma è una domanda o un indovinello? :stuck_out_tongue_closed_eyes:
Se è il tuo programma, saprai come agisce, no? :smiley: