Hola, compre un arduino UNO y un bluetooth HC-06, conecte un motor y un led, utilizo una app que manda texto por bluetooth, y en arduino utilizo Serial.read() para poder ejecutar las ordenes, el motor y el led pueden prender y apagar independientemente sin interrumpirse, pero quise hacer otro boton para el led para que cuando lo pulsara el led entrara en intermitente, primero lo intente con delay, pero ese frena todo el programa, no puedo usar el motor hasta que la secuencia del delay acaba, despues lo intente con millis pero solo me funciono si lo ponia fuera del bluetooth, el led se mantiene parpadeando, puedo controlar el motor con el bluethoot, tambien prender y apagar el led, pero las intermitentes siempre estan, cuando meto la misma orden dentro del if que uso para leer el texto que recibo de la app solo prende el led, sin intermitentes, queria saber si hay alguna forma de hacer que entre en intermitente sin que pierda el control del motor y que se pueda prender y apagar recibiendo texto del bluetooth. use este codigo
int ledPin = 6; // el número del pin conectado al LED
int der_a = 8;
// variables que cambiarán de valor.
int ledState = LOW; // ledState se usará para establecer el estado del LED
long previousMillis = 0; // almacenará la última vez que el estado del LED
//se actualizó
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
long interval = 1000; // intervalo del parpadeo (en milisegundos)
void setup()
{
// establece el pin digital como salida:
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode (der_a, OUTPUT);
}
void loop()
{
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.
char dato = Serial.read();
//encender
if (dato == 'a')
{
digitalWrite (der_a, HIGH);
}
if (dato == 'b')
{
digitalWrite (der_a, LOW);
}
if (dato == 'c')
{
digitalWrite (ledPin, HIGH);
}
if (dato == 'd')
{
digitalWrite (ledPin, LOW);
}
if (dato == 'w')
{
unsigned long currentMillis = millis(); // Se toma el tiempo actual
// se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (currentMillis - previousMillis > interval){
// Si se cumple la condición se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = currentMillis;
// Y ahora cambiamos de estado el LED, si está encendido a
// apagado o viceversa.
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
}
}
Prueba esto
const byte ledPin = 6; // el número del pin conectado al LED
const byte der_a = 8;
// variables que cambiarán de valor.
bool ledState = LOW; // ledState se usará para establecer el estado del LED
unsigned long previousMillis = 0; // almacenará la última vez que el estado del LED
//se actualizó
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000; // intervalo del parpadeo (en milisegundos)
void setup() {
// establece el pin digital como salida:
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode (der_a, OUTPUT);
}
void loop()
{
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.
if (Serial.available() >0) {
char dato = Serial.read();
if (dato != '\r' || dato != '\n')
char comando = dato;
//encender
switch(comando) {
case 'a': digitalWrite (der_a, HIGH);
break;
case 'b': digitalWrite (der_a, LOW);
break;
case 'c': digitalWrite (ledPin, HIGH);
break;
case 'd': digitalWrite (ledPin, LOW);
break;
case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (millis() - previousMillis > interval){
// Si se cumple la condición se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = millis();
// Y ahora cambiamos de estado el LED, si está encendido a
// apagado o viceversa.
ledState = !ledState;
// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
break;
}
}
}
Si necesitas que los comandos a,b,c,d, se ejecuten una vez coloca un comando = 0;
antes de cada break
Hola, muchas gracias por la respuesta, cuando quise verificar el programa me mando error que decia comando was not declared in the scope, lo agregue como int comando,cuando puse el comando = 0; antes de los break; me funciono igual que cuando meti los millis en el if del primer programa solo prende y apaga el led, no parpadea, no se si tenga que ver con el int que puse, de antemano gracias por la atencion, este es el codigo que use.
const byte ledPin = 6; // el número del pin conectado al LED
const byte der_a = 8;
// variables que cambiarán de valor.
bool ledState = LOW; // ledState se usará para establecer el estado del LED
unsigned long previousMillis = 0; // almacenará la última vez que el estado del LED
//se actualizó
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000; // intervalo del parpadeo (en milisegundos)
void setup() {
// establece el pin digital como salida:
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode (der_a, OUTPUT);
}
void loop()
{
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.
if (Serial.available() >0) {
char dato = Serial.read();
if (dato != '\r' || dato != '\n')
char comando = dato;
int comando = dato;
//encender
switch(comando) {
case 'a': digitalWrite (der_a, HIGH);
comando = 0;
//break;
case 'b': digitalWrite (der_a, LOW);
comando = 0;
break;
case 'c': digitalWrite (ledPin, HIGH);
comando = 0;
break;
case 'd': digitalWrite (ledPin, LOW);
comando = 0;
break;
case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (millis() - previousMillis > interval){
// Si se cumple la condición se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = millis();
// Y ahora cambiamos de estado el LED, si está encendido a
// apagado o viceversa.
ledState = !ledState;
// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
comando = 0;
//break;
}
}
}
POr lo visto no me expliqué bien o no me comprendiste bien porque yo escribí
surbyte:
Si necesitas que los comandos a,b,c,d, se ejecuten una vez coloca un comando = 0;
antes de cada break
Te dije que pusieras comando = 0 en a,b,c,d pero no en w o sea el intermitente.
Sino lo bloqueas.
hola amigo, gracias por la ayuda, ya lo intente quitando el comando=0; de la opción w, al principio pensé que solo prendía y apagaba, pero tenia que apretar el botón "w" 2 o 3 veces para que prendiera y apagara, después me di cuenta que si lo apretaba varias veces seguidas si es como si estuviera en intermitente, no se si hay forma de solo pulsarlo una vez. a si puse el codigo.
const byte ledPin = 6; // el número del pin conectado al LED
const byte der_a = 8;
// variables que cambiarán de valor.
bool ledState = LOW; // ledState se usará para establecer el estado del LED
unsigned long previousMillis = 0; // almacenará la última vez que el estado del LED
//se actualizó
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
unsigned long interval = 1000; // intervalo del parpadeo (en milisegundos)
void setup() {
// establece el pin digital como salida:
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode (der_a, OUTPUT);
}
void loop()
{
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.
if (Serial.available() >0) {
char dato = Serial.read();
if (dato != '\r' || dato != '\n')
char comando = dato;
int comando = dato;
//encender
switch(comando) {
case 'a': digitalWrite (der_a, HIGH);
comando = 0;
break;
case 'b': digitalWrite (der_a, LOW);
comando = 0;
break;
case 'c': digitalWrite (ledPin, HIGH);
comando = 0;
break;
case 'd': digitalWrite (ledPin, LOW);
comando =0;
break;
case 'w': // se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (millis() - previousMillis > interval){
// Si se cumple la condición se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = millis();
// Y ahora cambiamos de estado el LED, si está encendido a
// apagado o viceversa.
ledState = !ledState;
// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
break;
}
}
}
Bueno supuse que no tendrías que presionarlo mas de 1 vez pero algo no salió bien.
Déjame ver que esta mal.
Muchas gracias por la ayuda, ten una excelente tarde. =)