Tengo un problema con un programa que estoy desarrollando pero no logro hacerlo funcionar con millis, agradecería a los que me puedan colaborar por favor me corrijan en lo que este mal o que linea me esta haciendo saltar la función:
Adjunto codigo:
const int ledPin = 3; // the number of the LED pin
int dato =0;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int interval = 500;
boolean ledState = LOW;
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop(){
// read the state of the pushbutton value:
SerialReceive();
if(dato == 'c'){
Serial.print("Conectado");
}
if(dato == '3'){
Serial.println("milis ready");
currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}
}
void SerialReceive(){
while(Serial.available()){
dato = Serial.read();
}
}
Hola bienvenido al foro de Arduino, te pido que leas las normas del foro y notaras que títulos como (Novato en apuros) no tiene nada útil con el problema que tengas.
Ahora no entiendo que es lo que quieres que haga el programa o cual es el error que se te está presentando podrías ser un poco mas descriptivo.
La función tiene que recibir un valor por bluetooth, (en este caso es 3).
Cuando el valor es 3, la función millis debería hacer un parpadeo de un led; en mi caso seria 133 msg encendido y 300 msg apagado; he intentado hacer esto de distintas maneras que he podido leer en el foro y por mi cuenta y no logro hacer que se ejecute la función.
Es decir: Cuando recibe el valor 3 lo único que muestra el monitor seria es la impresión que dice Millis Ready 3 veces cada msg sin ningún parpadeo en el led. Por eso digo que se esta saltando la función sin hacer nada.
Aumenté el numero del intervalo a 500 msg a ver si era por saturacion y no ocurre absolutamente nada.
Agradecería si me pueden ayudar en este problema, de antemano gracias por tomarse su tiempo para responderme.
Bueno en tu código veo uno que otro error, perdon por no explicarlos pero no tengo mucho tiempo, borre algunas cosas para simplificarlo, cualquier cosa no dudes en preguntar.
const byte
ledPin = 3; // the number of the LED pin
char
dato = 0;
bool
estadoLed = LOW;
unsigned long
tiempoActual = 0,
tiempoAnterior = 0;
const unsigned int
intervalo = 500;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT); // Establece al pin del led como salida
}
void loop() {
tiempoActual = millis();
if (Serial.available() > 0) {
dato = Serial.read();
switch (dato)
{
case '3':
Serial.println("Temporizador Preparado");
break;
}
}
switch (dato)
{
case '3':
if (tiempoActual - tiempoAnterior >= intervalo) {
tiempoAnterior = tiempoActual;
estadoLed = !estadoLed;
}
digitalWrite(ledPin, estadoLed);
break;
}
}
Swift:
Bueno en tu código veo uno que otro error, perdon por no explicarlos pero no tengo mucho tiempo, borre algunas cosas para simplificarlo, cualquier cosa no dudes en preguntar.
Muchas gracias Sr Swift me ha servido a la perfeccion, pero de cierto modo me cambiaste el planteamiento que yo tenia, comprendo como funciona este pero no entiendo como variar los tiempo de on/off si te fijas colocaba que tenia que mantenerlo 133 msg encendido y 300 msg apagado, eso antes lo lograba con una variable onTime y otra offTime, pero aca no se como aplicarlas.
Bueno agregue dos variables intervaloOff y intervaloOn en ellas puedes variar el tiempo que se mantendrá encendido y el de apagado, creo que asi era lo que necesitas.
const byte
ledPin = 3; // the number of the LED pin
char
dato = '3';
bool
estadoLed = LOW,
estadoOn = 0;
unsigned long
tiempoActual = 0,
tiempoAnteriorOff = 0,
tiempoAnteriorOn = 0;
const unsigned int
intervaloOff = 3000,
intervaloOn = 5000;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT); // Establece al pin del led como salida
}
void loop() {
tiempoActual = millis();
if (Serial.available() > 0) {
dato = Serial.read();
switch (dato)
{
case '3':
Serial.println("Temporizador Preparado");
break;
}
}
switch (dato)
{
case '3':
if (!estadoOn) {
if (tiempoActual - tiempoAnteriorOn >= intervaloOff) {
tiempoAnteriorOff = millis();
estadoOn = 1;
estadoLed = HIGH;
Serial.println("Encendido");
Serial.println(tiempoActual - tiempoAnteriorOn);
}
}
else
{
if (tiempoActual - tiempoAnteriorOff >= intervaloOn) {
tiempoAnteriorOn = millis();
estadoOn = 0;
estadoLed = LOW;
Serial.println("Apagado");
Serial.println(tiempoActual - tiempoAnteriorOff);
}
}
digitalWrite(ledPin, estadoLed);
break;
}
}
Perdon seguir el hilo luego de colocar [SOLUCIONADO] pero Sr Swift ¿esos ciclos se pueden hacer anidados? me explico.
paso 1 (5000msg){
enciende(130msg)
apaga(300msg)
}
No se si me doy a entender. es hacer un millis que me establezca un tiempo determinado para que los millis dentro de esa función se ejecuten en este caso que se enciendan y apaguen durante 5 seg.