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.
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.
... 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
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
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 …
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.
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
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 …
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...
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 !!!
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??
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
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
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
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