[ RISOLTO ]Settare PWM da SerialMonitor + Bluetooth

Ciao a tutti, grazie all’aiuto di alcuni di voi sono riuscito a far comunicare il mio HC05 con arduino e Android.
Adesso ho un problema al quale non sono riuscito a trovare nulla in merito…vi spiego:
Con il modulo HC05 montato su Arduino e tramite un’app che ho creato appositamente per Android, riesco a comandare 3 Led in maniera facile! Adesso volevo integrare nel mio progetto un Led con intensità variabile (sarà regolato da uno slidebar).
Il mio problema è che arduino resta in “ascolto” sulla seriale e capta certi caratteri che vanno ad attivare le varie funzioni.
vi posto il codice di arduino:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);
int led1= 13;
int led2= 2;
int led3= 3;
int led4= 4;
int pwm1= 11;

void setup()
{
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(pwm1, OUTPUT);


   mySerial.begin(9600);
   Serial.println("Controllo LED Bluetooth - Home Control V1.0");
   delay(1000);
}


void loop()
{
   while (mySerial.available())
   {
       char dato= mySerial.read();
       switch(dato)
       {
          case 'XXXXXXX': /---------------------------------------DA QUI IL PROBLEMA
         {
  digitalWrite(pwm1, dato);
           mySerial.println("Led Blu Spento");
           break;/-------------------------------------A QUI
         }    
         case 'A':
         {
  digitalWrite(led2, HIGH);
            mySerial.println("Led Blu Acceso");
           break;
         }
         case 'a':
         {
  digitalWrite(led2, LOW);
           mySerial.println("Led Blu Spento");
           break;
         }    
              case 'B':
         {
  digitalWrite(led3, HIGH);
           mySerial.println("Led Giallo Acceso");
           break;
         } 
              case 'b':
         {
  digitalWrite(led3, LOW);
           mySerial.println("Led Giallo Spento");
           break;
          }
              case 'C':
         {
  digitalWrite(led4, HIGH);
           mySerial.println("Led Verde Acceso");
           break;
         } 
             case 'c':
         {
  digitalWrite(led4, LOW);
           mySerial.println("Led Verde Spento");
           break;
         }     
                     case '9':
         {
  digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
      digitalWrite(led4, HIGH);
           mySerial.println("Led Accesi");
           break;
         }     
                              case '0':
         {
  digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
      digitalWrite(led4, LOW);
           mySerial.println("Led Spenti");
           break;
         }   
       }       
   } 
}

Con il metodo “Case” vado a richiamare la funzione relativo al Byte ricevuto. Ora per poter trasmettere ad Arduino il valore (immaginiamo di poterlo digitare nel serial monitor…) come posso fare???
Vorrei mandare un comando “per intero” del tipo: pw-valore con valore uguale ad un numero che indica l’intensità…
Spero di essermi spiegato correttamente…
Confido in voi…grazie in anticipo

Devi imparare a gestire, invece che comandi di UN carattere, comandi di N caratteri la cui fine è indicata da un terminatore, es un carattere di CR (0x0D).

Ovvero, dovrai creare un buffer per un array di caratteri; dovrai gestire un loop NON bloccante in cui controlli se c'è un carattere sulla seriale; se c'è ed è diverso la CR lo lo dovrai memorizzare nell'array (... controllando che ci sia ancora spazio); se c'è ed è CR dovrai considerare concluso il comando ed iniziare ad esaminare la stringa che hai ricevuto per capire il comando ricevuto.

Non banalissimo, ma neanche complesso ... :wink:

Comincia a provare a buttarlo giù e vediamo ...

Guglielmo

Altrimenti ... puoi usare questa libreria QUI, che io trovo molto comoda e molto potente :wink:

Guglielmo

Ciao guglielmo. Intanto grazie per aver risposto, però devi considerare che non tutti, io compreso, riescono a comprendere cio che hai detto. ... utile sarebbe un esempio o un link dove viene spiegato in maniera semplice e comprensibile come si fa.

Hai un idea semplice da potermi proporre?

Se scarichi la libreria che ho indicato puoi ...

... uno, usarla così come è e già da sola funziona e gli fai fare quello che serve a te ( ... è spiegata QUI)

... due, guardare come è scritta ed all'interno c'è proprio una funzione (SerialCommand::readSerial()) che fa esattamente quello che ti ho descritto ... più tante altre cose :wink:

Per qualsiasi dubbio .. chiedi ...

Guglielmo

Grazie! Sono riuscito ad elaborare comandi con più lettere/numeri…adesso però…come posso fare per far scrivere via Bluetooth i comandi? Prima usavo la SoftwareSerial, ma non riesco ad implementarla con questo codice…

Posso scrivere (per capirsi) sulla serialmonitor via bluetooth??

Magari se posti il codice completo e ci fai capire come è fatto adesso .... forse riusciamo a dare delle risposte ... perché ora come ora ... non si capisce più bene come è fatto il tuo programma :wink:

Guglielmo

Il codice è quello che mi hai postato con qualche modifica

//EZB ezb = new EZB();
//ezb.Uart.SendSerial(Digital.DigitalPortEnum.D8, Uart.BAUD_RATE_ENUM.Baud_9600, "a");

// Demo Code for SerialCommand Library
// Steven Cogswell
// May 2011

#include <SerialCommand.h>



#define arduinoLED 13 // Arduino LED on board
int led1= 13;
int led2= 2;
int led3= 3;
int led4= 4;
int btcnt= 6;
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
int convar = 0;        // determina se il dispositivo è connesso

SerialCommand sCmd; // The demo SerialCommand object

void setup() {
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(btcnt, OUTPUT);

  digitalWrite(led2, LOW); // default to LED off
  digitalWrite(led3, LOW); // default to LED off
  digitalWrite(led4, LOW); // default to LED off
  digitalWrite(btcnt, LOW); // default to LED off

  Serial.begin(9600);

  // Setup callbacks for SerialCommand commands
  sCmd.addCommand("1", LED_A); // LED Blu on
  sCmd.addCommand("2", LED_a); // LED Blu off
   sCmd.addCommand("LED_B", LED_B); // LED Giallo on
  sCmd.addCommand("LED_b", LED_b); // LED Giallo off
   sCmd.addCommand("LED_C", LED_C); // LED Verde on
  sCmd.addCommand("LED_c", LED_c); // LED Verde off
  
  sCmd.addCommand("HELLO", sayHello); // Echos the string argument back
  sCmd.addCommand("P", processCommand); // Converts two arguments to integers and echos them back
  sCmd.setDefaultHandler(unrecognized); // Handler for command that isn't matched (says "What?")
  Serial.println("Ready");
}

void loop() {
  sCmd.readSerial(); // We don't do much, just process serial commands
  if (mySerial.available())
    Serial.write(mySerial.read());
    sCmd.addCommand = mySerial.read();
}

void LED_A() {
  Serial.println("LED Blu Acceso");
  digitalWrite(led2, HIGH);
}
void LED_a() {
  Serial.println("LED Blu Spento");
  digitalWrite(led2, LOW);
}
void LED_B() {
  Serial.println("LED Giallo Acceso");
  digitalWrite(led3, HIGH);
}
void LED_b() {
  Serial.println("LED Giallo Spento");
  digitalWrite(led3, LOW);
}
void LED_C() {
  Serial.println("LED Verde Acceso");
  digitalWrite(led4, HIGH);
}
void LED_c() {
  Serial.println("LED Verde Spento");
  digitalWrite(led4, LOW);
}


void sayHello() {
  char *arg;
  arg = sCmd.next(); // Get the next argument from the SerialCommand object buffer
  if (arg != NULL) { // As long as it existed, take it
    Serial.print("Hello ");
    Serial.println(arg);
  }
  else {
    Serial.println("Hello, whoever you are");
  }
}


void processCommand() {
  int aNumber;
  char *arg;

  Serial.println("We're in processCommand");
  arg = sCmd.next();
  if (arg != NULL) {
    aNumber = atoi(arg); // Converts a char string to an integer
    Serial.print("First argument was: ");
    Serial.println(aNumber);
  }
  else {
    Serial.println("No arguments");
  }

  arg = sCmd.next();
  if (arg != NULL) {
    aNumber = atol(arg);
    Serial.print("Second argument was: ");
    Serial.println(aNumber);
  }
  else {
    Serial.println("No second argument");
  }
}

// This gets set as the default handler, and gets called when no other command matches.
void unrecognized(const char *command) {
  Serial.println("What?");
}

non riesco a capire come posso fare per inviare comandi trramite modulo bluetooth…devo collegarlo al pin 0 e 1?

Aha … ok … quindi, se capisco bene, tu fino ad ora stavi usando la porta seriale mandando i comandi tramite la USB del PC … mentre ora li vorresti mandare tramite il bluetooth … giusto ?

Tre sono le strade …

  1. la più semplice e banale … carichi il programma, stacchi la USB e colleghi il bluetooth ai pin 0 e 1 … ovvero sempre alla Serial. Praticamente non cambia nulla.

  2. un po’ più complesso (ma non tanto), devi vedere come fa la SerialCommand a leggere una stringa comando (invece di UN carattere) e implementare tu la stessa logica leggendo il bluetooth dalla SoftwareSerial

  3. più complesso, modificare la SerialCommand affinché usi la SoftwareSerial e non la Serial. Ti avviso che, con Arduino, non è banale cercare di usare un’altra libreria all’interno di una libreria … ci sono thread aperti come QUESTO dove te ne puoi rendere conto …

Vedi tu … :wink:

Guglielmo

Ok credo che opterò per la 2^.... la 1^ però devo avvisarti che non funziona comunque...non lampeggiano nemmeno RX e TX su Arduino all'invio del segnale...

Niente da fare anche per la seconda opzione!
Quello che mi chiedo è: come mai se scollego USB e collego HC05 al pin 0 e 1 non funziona la serial???

dxcoco2:
Quello che mi chiedo è: come mai se scollego USB e collego HC05 al pin 0 e 1 non funziona la serial????

Questo è strano ...
... se il modulo bluetooth sei già riuscito a farlo funzionare e sai che è connesso e se il programma con la seriale del PC funziona ... salvo problemi di velocità (... impostata correttamente la velocità della seriale ?) DEVE funzionare uguale.

Occhio, se usi la SerialCommand, DEVI inviare il carattere terminatore (... se ben ricordo CR) anche via Bluetooth eh ... altrimenti non funziona !!!

Guglielmo

Riporto la domanda di dxcoco2 messa in un altro thread ma pertinente a questo …

dxcoco2:
Ciao a tutti. Ho un problema che non riesco a risolvere. Secondo voi come posso verificare se i pin 0 e 1 di arduino funzionano? Vi spiego meglio!
Ho un modulo HC05 che con la libreria software serial va benissimo. Ma se lo collego ai pin 0 e 1 riesco solo a ricevere quello che viene scritto in risposta dal serial monitor.
Quindi se mando un comando (es “1”) non accade nulla…come mai??

Potresti chiarire cosa intendi con questa affermazione ?

dxcoco2:
Ma se lo collego ai pin 0 e 1 riesco solo a ricevere quello che viene scritto in risposta dal serial monitor.

Cioè, esattamente cosa succede ??? Cosa ricevi ? Dove ? Il PC è collegato o meno alla USB ? Il serial monitor dell'IDE è aperto ?

Senza tutte queste informazioni è difficile capire quello che succede ...

Guglielmo

ho cancellato il topic doppio.

@dxcoco2 che modello di Arduino usi?
Ciao Uwe

dxcoco2:
Quello che mi chiedo è: come mai se scollego USB e collego HC05 al pin 0 e 1 non funziona la serial????

Semplice, staccando l'usb non stacchi la connessione seriale tra il convertitore usb/seriale ed il micro :wink:
quello che vuoi fare tu puoi farlo solo sui modelli di arduino che non hanno il convertitore, tipo Arduino ProMini

@Testato :
Credo che comunque i pin 0 e 1 possano essere usati come seriale anche sullo UNO, difatti, la scheda del prodotto riporta chiaramente :

Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data. These pins are connected to the corresponding pins of the ATmega8U2 USB-to-TTL Serial chip.

... ma non dice che NON li puoi usare, anzi ... dice solo che sono in parallelo e quindi di fare attenzione :wink:

Guglielmo

giglielmo attenzione su cosa ? parliamo della seriale, non accetta due connessioni contemporaneamente, non si puo’ usare

Se proprio vuoi farlo con la Uno la soluzione c’e’, togli il micro dallo zoccolo e con molta delicatezza pieghi i due piedini che ti servono e ci saldi direttamente due cavetti verso il Bluetooth

Certo che NON contemporaneamente, o mandi i dati via USB o li mandi sui pin 0 e 1, ma non devi dissaldare/piegare nulla, devi solo non collegare la USB :wink:

Guglielmo

ma la connessione lato seriale tra il 16u2 ed il 328p non viene instaurata anche senza l'usb inserita ?
non ho mai provato, ad esempio quando si vuole usare arduino come convertitore seriale/usb si toglie il micro, ma al contrario non si puo' fare, cioe' non si puo' togliere il 16u2
non so come il 16u2 gestisce la cosa, se non instaura la connessione potrebbe andare anche come dici te