Problema codice

void setup() {
  Serial.begin(9600);
  pinMode(4, OUTPUT);     
  pinMode(5, OUTPUT);    
}

void loop() {
  int RPM = Serial.read();
  if((RPM>=0)&&(RPM<=180)){
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW);
  }

  if((RPM>180)&& (RPM<=220)){
    digitalWrite(4, HIGH); 
    digitalWrite(5, LOW);
  }

  if((RPM>220)&&(RPM<=245)){
    digitalWrite(4, HIGH); 
    digitalWrite(5, HIGH);
  }

  if(RPM>245){
    digitalWrite(4, HIGH); 
    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(4, LOW); 
    digitalWrite(5, LOW);
  }

}

Non accade nulla però... se dall' IDE scrivo nel serial port uno dei valori nel range non succede nulla :-[ :-[

ho fatto serialprint rpm e mi da fisso -1 quando non scrivo

Piccolo passo avanti!... qualsiasi numero scrivo dal' IDE me lo restituisce come valore serial.println(RPM) intorno al 50 e se metto ad esempio nel codice 50 al posto di 245 funziona :-? :-? :-?

lol stai facendo un casino della madonna :slight_smile:
i numeri che stai leggendo NON sono i numeri che scrivi tu, ma ogni cifra (carattere) codificata in numero secondo la tabella ascii: unix-manuals.com - This website is for sale! - unix manuals Resources and Information.
quindi se tu scrivi 50
al tuo programma arriva prima 35 e poi 30
quindi ci sono 2 soluzioni: o invii il carattere ascii corrispondente (non sempre facile)
oppure scrivi una routine che legge vari valori dalla serial, li concatena (la fine stringa per la seriale di solito è \n) e ne estrapola dai caratteri il valore decimale... ;D

Da questo post pero' non si capisce ne' cosa vuoi fare ne' quali sono i presupposti...

Eh mi sa che non hai capito molto bene la classe Serial...
Guardati gli esempi inclusi nell'IDE
Ciao

ho un programma sul pc che si chiama X-Sim che estrapola da un videogioco i vari valori ( velocità, marcia , giri/min o RPM ... etc )
lui li manda poi via COM ad arduino.

Semplicemente nel caso degli RPM lui invia un valocre che va da 0 a 255 e io con quello sketch volevo interfacciarlo con dei led :stuck_out_tongue:

Ad esempio ora ho messo uno schermo lcd che con la stringa lcd.writeSerial.read() mi mostra i valori che invia il pc e appunto mi compaiono da 50 a 255...

le parentesi, cribbio! xD
lcd.write( Serial.read() );

mo vedo che riesco a combinare

Niente :-X :-X

ma perchè l'lcd lo legge bene?

:-/

Ciao Nikka93

Il display non legge bene perché tu invii valori numerici e li interpreti come codici Ashii e percui mette sul display dei caratteri a caso e non il valore.

Non sarebbe il caso di aspettare se ci sono dati sulla seriale disponibili e solo in quel momento leggerli e impostare le uscite.

...
void loop() {
  if (Serial.available() > 0) {
  int RPM = Serial.read();
  if((RPM>=0)&&(RPM<=180)){
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
   }
...

Ciao Uwe

Uwe il display li legge bene i dati che il pc invia, il programma invece no!

:-X

ah ma allora i dati che ti arrivano sono già codificati in char!
allora per fare quello che dici tu devi leggere i valori char e trasformarli in numero(l'inverso di quello che ti ho scritto)!
oppure legge l'intero numero (composto da 1 o più char), metterlo in un oggetto stringa e confrontarlo con la stringa 0 oppure 180 ecc...!!! oppure....
;D

edit: ho guardato attentamente la schermata del programma... per fare quello che vuoi tu col tuo codice devi impostare "binary output", solo che allora devi usare il procedimento che ti ho spiegato nell'altro post per far funzionare l'lcd!! :smiley:

Dal tuo entusiasmo immagino sia una cosa buona ma non so cosa sia il char e non è che abbia capito molto di ciò che tu hai scritto ;D

Non so se mi sono spiegato bene.

Io devo far funzionare i led tramite il programma.

Poi ora per verificare i valori ho montato anche LCD che mi mostra i dati inviati dal pc ad arduino ed effettivamente sono valori che vanno da 0 a 255 :-/

quello contro tu stai combattendo sono 2 modi diversi per rappresentare la stessa informazione.
un numero, come per esempio 125 può essere scritto in vari modi, quelli che ti interessano sono 2:
come byte(o rappresentazione binaria):
un bite raccoglie valori da 0 (00000000) a 254 (11111111).
come char:
il char rappresenta UN carattere secondo la tabella ascii. quindi 125 si scrive con 4 byte, il primo rappresenta l'1, il secondo il 2, il terzo il 5 e l'ultimo è il segnale di fine numero (per non mischiare le cifre con quelle del numero successivo!). Questo array di byte viene spesso chiamato stringa.

Ora per fare un if (x==125) devi usare il valore espresso come byte, invece se vuoi stamparlo nell'LCD devi usare una stringa!
Quindi o converti il valore della stringa che leggi in byte, oppure verifichi ogni char uno per uno con degli if annidati. (la prima soluzione è migliore dal punto di vista didattico)

IMHO il modo più comodo che puoi usare è ovviamente il terzo: impostare il tuo programma sul pc come ti dicevo in binario, perchè così invia un solo byte anzichè (caso peggiore) 4 byte, rendendo la comunicazione 4 volte più veloce e 4 volte più sicura ( ciò che non viene scritto non può errare :slight_smile: ).
Un altro buon motivo è che leggendo una stringa devi aspettare che arrivi tutta, e quindi o prendi in considerazione il fatto che ogni loop puoi non avere un dato su cui lavorare, oppure rendi la lettura della stringa bloccante, ovvero mentre leggi la stringa non viene eseguito altro codice (tranne gli interrupt ma son cose moolto più avanzate).
A questo punto il dato letto può essere direttamente usato in if e nella parte "logico-matematica" del programma. Poi però prima di inviare il valore all'LCD lo devi convertire in stringa. Ci sono vari modi, io te ne ho scritto uno ma se cerchi sul forum ce ne sono altri.

L'importante è che tu abbia capito che esistono più modi per rappresentare la stessa informazione, e non esiste un modo "giusto" o uno "universale" ma dipende tutto da quello che devi fare.

Ok capito grazie della spiegazione!

Però ho ancora un dubbio....

Perchè l' LCD legge i valori corretti mentre "lo sketch" in ascii?

Infatti con quello sketch se premo ù i led funzionano

quindi per far interpretare allo sketch i valori cosa dovrei scrivere? c'è un tutorial?

Perché per fare i confronti col tuo programma devi convertire la stringa che invia il PC in un numero.
Prova con atoi().
La descrizione di questa funzione la trovi nella documentazione dell'AVR-C
Ciao

e l' ultimo carattere di una stringa deve essere 0 (in parole il numero zero) perché atoi() funzioni.
Ciao Uwe

So che è tremendamente rozzo. So che non funziona per numeri superiori alle 3 cifre. So che la conversione da float ad int non è delle migliori, ma per il momento, almeno fino a 3 cifre, funziona :slight_smile:

void setup() 
 {
  Serial.begin(9600);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
 }


int ordine = 3; // Indica quante cifre considerare



int getSerialInt()
{
  
  int cifre[ ordine ]; 
  
  int x = 0;  //
  int a = -1; // contatori
  
  float result=0;
  
  while ( a == -1 )
   a = Serial.read();
   
  while ( ( a != -1 ) && ( x < ordine ) )
    {
      a -= 48;
      cifre[x] = a;
      
      a =  Serial.read();
      x++;
    }  
    
    
  
 x--;
 a=0;


  for (  ; x>=0; x-- )
      
   {    
      result +=  cifre[a] * pow(10,x) ;
      
      a++;
   }
   
      
   
   return  int(result);   
       
  
  
}



void loop() 
 {
   
  int RPM = getSerialInt();
  
   
  
  
  if ( RPM > 245 )
   {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
   }
  
  else if ( RPM > 220 )
   {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
   }
   
   else if ( RPM > 180 )
   {
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
   }
  
   else if ( RPM >= 0 )
   {
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
   }

  

 

  

}