La Comunicazione Seriale

 

 

Documentazione:

 
 
 

 

Per testare la comunicazione seriale ho allestito un circuito piuttosto semplice che consiste in un led ed un potenziometro a scorrimento lineare (non logaritmico). Qui sotto lo schema:

 

 

Funzionamento: Lato Arduino - Muovendo il potenziometro il led varia la sua luminosità da spento alla massima. Lato pc - Ho realizzato una interfaccia grafica in linguaggio Java che mi permette di:

  1. visualizzare i valori espressi in volt al variare del potenziometrio
  2. accendere e spengere il led
  3. attivare il blinking
  4. impostare la velocità di blinking

Qui abbiamo il codice Arduino:

  int ledPin = 9;
  int potPin = A0; 
  int valPot, numPot;
  int x=0, pot=0;
  byte cmd; 
  int dly=500;
  byte tch; //contiene il carattere letto
  unsigned long tempMillis;
  byte car;
  
  void setup(){
    Serial.begin(115200);
    pinMode(ledPin, OUTPUT);
    pinMode(potPin, INPUT);
  }
  
  void loop(){
    if (Serial.available()>0) {
       cmd = Serial.read(); //leggo il primo byte
       Serial.print("cmd: ");
       Serial.println(cmd);
    }   
   switch (cmd) {       
    case '0':                 //LED OFF
      digitalWrite(9, LOW);
      x=0;
      break;
      
    case '1':                 //LED ON
      digitalWrite(9, HIGH);
      x=0;
      break;
      
    case '2':                 //LED BLINK  
      digitalWrite(9, HIGH);
      delay(dly);
      digitalWrite(9, LOW);
      delay(dly);
      x=0;  
      break;
      
    case '3':                 //POT ON
      x=1;
      Serial.println("tre");    
      break;
   
    case '4':                 //POT OFF
      x=0;
      break;
    
    case 'w':                 //Imposta il Delay     
         dly = 0;
         tempMillis = millis();
         car = 0;
         //mi servono altri car
         do {
           if (Serial.available()>0) {                     
             tch = Serial.read();
             car++;
             if ((tch >= 48) && (tch <= 57)) { //è un numero? ok
               dly = (dly * 10) + (tch - 48);           
             }else if((tch == 13)) {
               cmd=0;
               //con invio e/o nuova linea esco
               break;
             }
           }
           cmd=0;         
         } while((millis() - tempMillis <500) && (dly <= 2000) && (car < 10));
         
      x=0;
      break;
  
      case 's':
        pot=0;      
          do {
            if (Serial.available()>0) {                              
              tch = Serial.read();                                  
               if(tch>47 && tch<58){  //se è un numero
                  pot = (pot * 10) + (tch - 48);//forma il numero 
               }else if((tch == 13)) {                        
                  x=2;
                  cmd=0;              
                  break;     
               }
            }
           }while(true);                 
      break;
      //svuoto il buffer da eventuali altri caratteri che non mi servono più
      while (Serial.available()) {
        byte a = Serial.read();
      }       
  }//fine switch 
      
    if(x==1){
      valPot=analogRead(potPin);
      numPot = map(valPot,0,1023,0,255);  
      analogWrite(ledPin,numPot);//Accendi il led
      Serial.println(valPot);//invia  
    }
   
    else if(x==2){   
      analogWrite(ledPin,pot);   
      x=0;
    }
  }