raga non capisco l'errore di questo sketch un po' lunghetto
sapete dirmi che errore c'è? magari controllatelo con il vostro programma arduino
l'ho preso da un sito e modificato un po'
/* PROGRAMMA DI PROVA DI INTERFACCIA SERIALE BIDIREZIONALE
Il programma riceve comandi dalla seriale e spedisce
letture e stati sullo stesso canale.
Per provare lo sketch, collegare un LED al pin 9
con un resistore adeguato ed una tensione in ingresso
al pin A0.
Caricato lo sketch sull'Arduino, aprire il monitor seriale
dell'IDE di Arduino con velocità di 19200 bps.
I comandi accettati sono i seguenti:
l - lettura: legge il valore della tensione in ingresso al pin analogico
a - accedi LED: accende il LED
s - spengi LED: spenge il LED
q - richiede lo stato del LED. Verrà spedito lo stato del pin
a cui è collegato il LED. Possibili risposte:
LED acceso/spento/pilotato con PWM impostato a xxx
w xxx - scrive un valore di PWM sul pin 9. Possibili
valori per "xxx" vanno da 0 a 255. Gli spazi sono ignorati.
I caratteri accettati sono solo quelli numerici (da 0 a 9).
*/
//pin
const byte inputPin = A0; //pin analogico di ingresso
const byte outputPin = 2; //pin di output
const byte outpitPin = 3;
const byte outpotPin = 4;
//variabili globali
byte statoLed = 0; //contiene il valore sul pin 9
byte statLed = 0;
byte staLed = 0;
void setup() {
Serial.begin(19200); // apro la seriale
delay(1000); //attendo che l'utente faccia altrettanto
Serial.println(F("Pronto")); //sono pronto
}
//programma principale
void loop() {
int lettura; //contiene il valore di PWM letto dalla seriale
unsigned long tempMillis; //serve per il timeout sulla ricezione del valore di PWM
byte caratteri; //contiene il numero di caratteri ricevuti
byte tempChar; //contiene il carattere letto
//controllo se c'è qualcosa in arrivo sulla seriale
if (Serial.available()) {
byte command = Serial.read(); //leggo il primo byte
switch (command) { //controllo che sia un comando valido
case 'l': //lettura
//invio la lettura dell'ingresso
Serial.print(F("Lettura ingresso: "));
Serial.println(analogRead(inputPin));
break;
case 'a1': //accendo il LED
statoLed = 255;
analogWrite(outputPin, statoLed);
Serial.println(F("LED blu acceso"));
break;
case 'a2':
statLed = 255;
analogWrite(outpitPin, statoLed);
Serial.println(F("LED rosso acceso"));
break;
case 'a3':
staLed = 255;
analogWrite(outpotPin, statoLed);
Serial.println(F("LED verde acceso"));
break;
case 's1': //spengo il led
statoLed = 0;
analogWrite(outputPin, statoLed);
Serial.println(F("LED blu spento"));
break;
case 's2': //spengo il led
statLed = 0;
analogWrite(outpitPin, statoLed);
Serial.println(F("LED rosso spento"));
break;
case 's3': //spengo il led
staLed = 0;
analogWrite(outputPin, statoLed);
Serial.println(F("LED verde spento"));
break;
case 'q1': //l'utente vuole lo stato del LED
Serial.print(F("LED blu "));
if (statoLed == 0) {
Serial.println(F("spento"));
} else if (statoLed == 255) {
Serial.println(F("acceso"));
} else {
Serial.print(F("pilotato con PWM impostato a "));
Serial.println(statoLed, DEC);
}
break;
case 'q2': //l'utente vuole lo stato del LED
Serial.print(F("LED rosso"));
if (statLed == 0) {
Serial.println(F("spento"));
} else if (statLed == 255) {
Serial.println(F("acceso"));
} else {
Serial.print(F("pilotato con PWM impostato a "));
Serial.println(statLed, DEC);
}
break;
case 'q3': //l'utente vuole lo stato del LED
Serial.print(F("LED verde"));
if (staLed == 0) {
Serial.println(F("spento"));
} else if (staLed == 255) {
Serial.println(F("acceso"));
} else {
Serial.print(F("pilotato con PWM impostato a "));
Serial.println(staLed, DEC);
}
break;
case 'w1': //imposto il PWM sul LED
lettura = 0;
tempMillis = millis();
caratteri = 0;
//mi servono altri caratteri
do {
if (Serial.available()) {
tempChar = Serial.read();
caratteri++;
if ((tempChar >= 48) && (tempChar <= 57)) { //è un numero? ok
lettura = (lettura * 10) + (tempChar - 48);
} else if ((tempChar == 10) || (tempChar == 13)) {
//con invio e/o nuova linea esco
break;
}
}
//esco per timeout, per un valore di PWM maggiore di 255
//oppure per troppi caratteri senza senso ricevuti
} while((millis() - tempMillis < 500) && (lettura <= 255) && (caratteri < 10));
//se il valore di PWM è valido, lo imposto sul pin
if (lettura <= 255) {
statoLed = lettura;
analogWrite(outputPin, statoLed);
Serial.print(F("LED blu acceso con PWM impostato a "));
Serial.println(statoLed, DEC);
}
break;
}
case 'w2': //imposto il PWM sul LED
lettura = 0;
tempMillis = millis();
caratteri = 0;
//mi servono altri caratteri
do {
if (Serial.available()) {
tempChar = Serial.read();
caratteri++;
if ((tempChar >= 48) && (tempChar <= 57)) { //è un numero? ok
lettura = (lettura * 10) + (tempChar - 48);
} else if ((tempChar == 10) || (tempChar == 13)) {
//con invio e/o nuova linea esco
break;
}
}
//esco per timeout, per un valore di PWM maggiore di 255
//oppure per troppi caratteri senza senso ricevuti
} while((millis() - tempMillis < 500) && (lettura <= 255) && (caratteri < 10));
//se il valore di PWM è valido, lo imposto sul pin
if (lettura <= 255) {
statLed = lettura;
analogWrite(outpitPin, statLed);
Serial.print(F("LED rosso acceso con PWM impostato a "));
Serial.println(statLed, DEC);
}
break;
case 'w3': //imposto il PWM sul LED
lettura = 0;
tempMillis = millis();
caratteri = 0;
//mi servono altri caratteri
do {
if (Serial.available()) {
tempChar = Serial.read();
caratteri++;
if ((tempChar >= 48) && (tempChar <= 57)) { //è un numero? ok
lettura = (lettura * 10) + (tempChar - 48);
} else if ((tempChar == 10) || (tempChar == 13)) {
//con invio e/o nuova linea esco
break;
}
}
//esco per timeout, per un valore di PWM maggiore di 255
//oppure per troppi caratteri senza senso ricevuti
} while((millis() - tempMillis < 500) && (lettura <= 255) && (caratteri < 10));
//se il valore di PWM è valido, lo imposto sul pin
if (lettura <= 255) {
staLed = lettura;
analogWrite(outpotPin, staLed);
Serial.print(F("LED verde acceso con PWM impostato a "));
Serial.println(staLed, DEC);
}
break;
}
}
//svuoto il buffer da eventuali altri caratteri che non mi servono più
while (Serial.available()) {
byte a = Serial.read();
}
}
}