conteo de tiempo de una señal de led activo

hola que tal buenas tardes, soy nuevo en el foro queria ver si me ayudaban en un problemita, tengo un programa que quiero que me cuente cuanto tiempo se encuentra encendido y que pare el conteo cuando se desactive, el tiempo ya esta establecido( 10 segundo encendido y medio segundo apagado pero quiero que me lo muestre en serial.print, aparte lo implementare para otros 3 señales mas pero ahorita estoy haciendo pruebas con solo una señal, espero y me puedan ayudar o guiar en esta situación. les dejo el programa para que lo chequen ,... gracias! saludos!

//conteo de led encendido 

const int ledPin = 13;    //configuración pin del led
int ledState = LOW        //se establece el led
long previousMilles = 0  //almacenara el tiempo del led

long intervalOn = 10000;  //diez segundos on
long intervalOff = 500;    // medio segundo off

void setup ()
{
pinMode(ledPin, OUTPUT);   //declaro ledPin como salida
}

void loop()
{
unsigned long currentMillis = millis();
if (ledState == LOW)
{
if(currentMillis - previousMillis > intervalOn)
{
previousMillis = currentMillis;
ledState = LOW;}
}
digitalWrite(ledPin, ledState);
}

Oye, para qué hacer dos hilos de exactamente el mismo tema?

Lo único que tenías que hacer, era editar el anterior… (poner código entre los tags generados por el botón </> )

lo siento es que soy nuevo en el foro, y pues tuve que hacer nuevo post .

Bueno pero no sé en cuál responderte... ese es el dilema. :confused:

Ya cerré el otro, el que está en proyectos!

¡Ehhh gracias! ¡Dilema resuelto! jejeje :D

Bueno... prueba esto y me cuentas... ;)

//conteo de led encendido

const int ledPin = 13;    //configuración pin del led
int ledState = LOW;        //se establece el led
unsigned long previousMillis = 0;  //almacenara el tiempo del led

const unsigned int intervalOn = 10000;  //diez segundos on
const unsigned int intervalOff = 500;    // medio segundo off

void setup ()
{
  Serial.begin(9600); // Inicia la comunicación serial
  pinMode(ledPin, OUTPUT);   //declaro ledPin como salida
  previousMillis = millis(); // guardo los millis antes de que inicie el loop
}

void loop()
{
  if (ledState == LOW) // Si el LED está apagado
  {
    if (millis() - previousMillis >= intervalOff) // Si ya sobrepasó el intervalo de apagado
    {
      ledState = HIGH; // Encender LED
      previousMillis = millis(); // Guardar el momento
    } else { // Sino
      Serial.print("Off time: ");
      Serial.println(millis() - previousMillis);
      // Imprimir el tiempo que lleva apagado
    }
  } else {
    if (millis() - previousMillis >= intervalOn) // Si ya sobrepasó el intervalo de encendido
    {
      ledState = LOW; // Apagar LED
      previousMillis = millis(); // Guardar el momento
    } else {
      Serial.print("On time: ");
      Serial.println(millis() - previousMillis);
      // Imprimir el tiempo que lleva encendido
    }
  }
  digitalWrite(ledPin, ledState); // Actualizar ledState al LED físico
  delay(1);
  // Un delay aún demasiado corto puede ayudar a evitar problemas con el monitor serie;
  // si no, es posible que este pueda rezagarse y fallar en imprimir algunas lecturas.
  // Este delay no puede ser muy largo, o el programa se entorpecerá
}

Hola Lucario448, muchas gracias por tu ayuda :slight_smile: :slight_smile: :slight_smile: esta muy bien el código si me sirvió, le di al delay mas tiempo pero me lo entorpece para que se viera un poco mas lento, ahora hay un programa que me marca los segundos y segundos acumulados, en este caso es posible que se pueda añadir al código anterior, para que cuando el led encienda empiece a contar y cuando lo apague con un interruptor se corte el conteo y me diga cuantos segundos fueron???
te pongo el codigo y me cuentas vale!!! n :slight_smile: :slight_smile:

#include <EEPROM.h>
byte cuenta = 0;
byte boton_reset_temp = 3;

long ultimo_reg = 0;
int seg = 0;
long seg_acum = 0;

void setup()
{
    pinMode(boton_reset_temp, INPUT);
    Serial.begin(9600);
}

void loop()
{ 
     if (millis() - ultimo_reg >= 1000) {
         seg++;
         seg_acum++;
         ultimo_reg = millis();
         if (seg == 60){
            seg = 0;
         }
      }
     cuenta++;
     delay(10);
 if (cuenta>100) {
     cuenta = 0;
     Serial.print("Seg: ");
     Serial.print(seg);
     Serial.println();
     Serial.print("Seg_acum: ");
     Serial.print(seg_acum);
     Serial.println();

    }
}

Hola. Prueba esto y me cuentas:

// #include <EEPROM.h> // Librería en desuso
// byte cuenta = 0; // No la uso porque no entiendo su función
const byte boton_reset_temp = 3;

unsigned long ultimo_reg = 0;
byte seg = 0; // Si se reinicia cada 60, entonces no hay peligro de que sea tipo byte
unsigned long seg_acum = 0;
boolean contar = true; // Cambia a false si el conteo debe parar

void setup()
{
  pinMode(boton_reset_temp, INPUT);
  Serial.begin(9600);
}

void loop()
{
  if (contar) { // Si está permitido seguir el conteo
    if (millis() - ultimo_reg >= 1000) {
      seg++;
      seg_acum++;
      ultimo_reg = millis();
      if (seg == 60) {
        seg = 0; // reiniciarse cada
      }
    }
    // cuenta++; // No entiendo su función
    // delay(10); // Los datos se imprimen solo cuando se presione el botón; por lo tanto, no es necesario parar el programa por el monitor serie
    if (digitalRead(boton_reset_temp)) { // Si en la entrada hay voltaje. Esta verificación del if puede variar según la conexión del botón al Arduino
      // cuenta = 0; // No entiendo su función
      Serial.print("Seg: ");
      Serial.print(seg);
      Serial.println();
      Serial.print("Seg_acum: ");
      Serial.print(seg_acum);
      Serial.println();
      contar = false; // Una vez pulsado el botón, se detiene el conteo; y no se contará ya más hasta que se reinicie el Arduino.
    }
  }
}

En los comentarios está la explicación de los cambios que he hecho.

Ahora nada más de esperar la respuesta tuya :wink:

Que tal Lucario448, como estas?.. ya estuve checando el programa y es de mucha ayuda, ahora le agrege un led para que simulara la señal y quise usar el mismo boton_reset_temp para al momento que lo presione se active y cuando lo vuelva a presionar se apague y me corte el tiempo, y tambien que cuando lo vuelva a presionar y se active vuelva a contar de 0 y vuelva presionar y apagar y corte nuevamente el tiempo y me lo registre… pero no me dejo con el mismo push, tuve que meter otro push como entrada para el led pero no encuentro como relacionarlos el del y el primero boton, sin usar el que agrege… te dejo lo que le agrege y me comentas vale!!! espero tu respuesta y muchas gracias…
saludos!

// #include <EEPROM.h> // Librería en desuso
// byte cuenta = 0; // No la uso porque no entiendo su función
const byte boton_reset_temp = 3;
int ledPin = 13;    //configuracion del pin
int boton_reset_temP = 4;      //configuracion de un push mas, no puedo hacerlo con el mismo push

unsigned long ultimo_reg = 0;
byte seg = 0; // Si se reinicia cada 60, entonces no hay peligro de que sea tipo byte
unsigned long seg_acum = 0;
boolean contar = true; // Cambia a false si el conteo debe parar

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(boton_reset_temP, INPUT);
  pinMode(boton_reset_temp, INPUT);
  Serial.begin(9600);
}

void loop()
{
  if (contar) { // Si está permitido seguir el conteo
    if (millis() - ultimo_reg >= 1000) {
      seg++;
      seg_acum++;
      ultimo_reg = millis();
      if (seg == 60) {
        seg = 0; // reiniciarse cada
      }
    }
    // cuenta++; // No entiendo su función
    // delay(10); // Los datos se imprimen solo cuando se presione el botón; por lo tanto, no es necesario parar el programa por el monitor serie
    if (digitalRead(boton_reset_temp)) { // Si en la entrada hay voltaje. Esta verificación del if puede variar según la conexión del botón al Arduino
      // cuenta = 0; // No entiendo su función
      Serial.print("Seg: ");
      Serial.print(seg);
      Serial.println();
      Serial.print("Seg_acum: ");
      Serial.print(seg_acum);
      Serial.println();
      contar = false; // Una vez pulsado el botón, se detiene el conteo; y no se contará ya más hasta que se reinicie el Arduino.
    }
  }
  boton_reset_temP = digitalRead(4);     //lee el estado del boton.
  if (boton_reset_temP == HIGH)   {      //si el estado es activado
  digitalWrite(ledPin, HIGH);                 //led prende
  }
else {                                               // si no es pulsado  
digitalWrite(ledPin, LOW);                    // led se apaga
}
}

Aún no tengo código hasta que me aclares la siguiente duda:

Pretendías encender el LED cuando la cuenta esté activa o cómo es? El uso de un segundo pulsador me confundió :confused:

siii, el segundo pulsador lo añadi porque no me dejaba relacionar el primero boton_reset_temp con el led, y añadi el segundo boton_reset_temP....... y si pretendia que empezara a contar cuando el led se activara con el boton, y al presionar nuevamente el boton se desactivara y cortara el conteo.

Digo yo, y que aportas @car_more03 al código? porque solo leo que agregas algo (un pulsador) y le pides a @Lucario448 que lo haga.

Antonio, borra tu ultimo mensaje, abre un nuevo topic y de paso lee las normas del foro. Así no se postea un código por favor.

Saludos

hola que tal, como estan??

ya logre relacionar el primer push con el led y que se pare el serial.print…
pero ahora mi problema es que cuando esta apagado aun sigue contando los segundos, y lo que quiero es que solo cuando este encendido empiece el conteo para cuando se apague vuelva empezar de cero el conteo otra ves…
si me pudieran ayudar nuevamente o decirme que es lo que le debo de agregar a mi codigo para hacer esa instruccion, cuando este terminado el codigo lo voy a subir para que si a alguien le interese o tenga algo parecido que hacer …
que tengan buenas tardes!1
saludos…

#include <EEPROM.h>   //libreria de uso
const int boton_led_conteo = 3;      //configuración de pin push
int ledPin = 13;        //configuracion del pin led
unsigned long seg_acum = 0;
unsigned long ultimo_reg = 0;
byte seg = 0;                      //se reinicia cada 60 seg.
boolean contar = true;              //cambia false si el conteo debe parar
byte minuto = 0;
int estadoBoton_led_conteo = 0;

void setup()
{
pinMode(boton_led_conteo, INTPUT_PULLUP);          //SE CONFIGURA la entrada con las resistencias pullup
   pinMode(ledPin, OUTPUT);
                     //se configura la salida
Serial.begin(9600);
}

void loop()
{

if (millis() - ultimo_reg >= 1000) {
seg++;
seg_acum++;
if (seg == 60) {
minuto++;
EEPROM.write (1, minuto);
seg = 0;
}
}
delay (10);

if (digitalRead(boton_led_conteo) == !LOW && estadoBoton_led_conteo == 0 ) {
estadoBoton_led_conteo = 1;
Serial.print("Seg: ");
Serial.print(seg);
Serial.println();
Serial.print("Min: ");
Serial.print(minuto);
Serial.println();
Serial.print("Seg_acum: ");
Serial.print(seg_acum);
Serial.println();
contar = false;             
digitalWrite(ledPin, Low);
delay(500);
}

if (digitalRead(boton_led_conteo) == HIGH) {
estadoBoton_led_conteo = 0;
digitalWrite(ledPin, HIGH);
delay(500);
}
}

hola que tal buenas tardes. por fin solucione
el problema de mi codigo, les dejo mi programa para quien lo necesite o tenga algun problema similar.

saludos…!

#include <EEPROM.h>      //libreria en uso
const int boton_led_conteo = 3;    //configuracion de pin 13 para el switch.
unsigned long seg_acum = 0;     //Se toma como variable largo y almacena.
unsigned long ultimo_reg = 0;      //variable largo y almacena.
byte seg = 0;
boolean contar = true;
byte minuto = 0;
int estadoBoton_led_conteo = 0;       // Estado del switch.
byte reset = 3;      //Se toma como lectura
const int automatico = 8;         //se configura el pin del Switch automatico.
boolean activado = true;


void setup()
{
pinMode(boton_led_conteo, INPUT);
pinMode(automatico, INPUT);
Serial.begin(9600);
}


void loop()
{
while(digitalRead(automatico) == HIGH) {           //mientras este activado el automatico va arrancar el programa
activado = 1;
}

if (millis() - ultimo_reg >= 1000) { 
seg++;                                                  
seg_acum++;

if (seg == 60) {
minuto++;
EEPROM.write (1, minuto);
seg = 0;
}
}
delay(10);
if (digitalRead(boton_led_conteo) == !LOW && estadoBoton_led_conteo == 0) {
estadoBoton_led_conteo = 1;
Serial.print("Seg: ");
Serial.print(seg);
Serial.println();
Serial.print("MIN: ");
Serial.print(minuto);
Serial.println();
Serial.print("Seg_acum: ");
Serial.print(seg_acum);
Serial.println();
contar = false;
delay(500);
}
if (digitalRead(boton_led_conteo) == HIGH) {
estadoBoton_led_conteo = 0;
delay(500);
}
if (digitalRead(reset) == LOW) {
minuto = 0;
EEPROM.write (1, minuto);
Serial.println("BORRAR DATOS.");
delay(2000);
seg = 0;
seg_acum = 0;
}
{