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
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
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
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...
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);
}
...
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!!
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 ).
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.
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
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
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);
}
}