Activar un motor 1/2 HP cada 12 hora o diariamente sin RTC

Hola, Un gran saludos

de varios ejemplos de creado este codigo para usarlo como un temporizador , usando la libreria timerOne, mi pregunta seria ?? lo he probado con tiempo pequeños cada 1 minuto activa rele y al 1y 5 eg apague, y se resetee a cero, pero el uso que quiero es q cada 12 hora haga lo mismo active dure 5 seg y apaga y asi sucesivamente

Tengo mis misma pregunta
si el arduino se deseneregiza despues de haber empezado el contador , continua donde quedo o desde cero ,
se alaragaria el tiempo fijado

el tema del desboramiento en arduino

o que me recomendarian para hacer esta funcion , se podra crear para no usar rtc

#define LED 13 // LED

#include <TimerOne.h>
//Variable para la interrupción
volatile long int Time = 0;
volatile long int ONTime = 30;  // 43200; // 12 HORAS
volatile long int OFFTime = 35; // 43205; // 12 + 5 seg
//volatile unsigned int Time = 0;



void setup()
{
  Serial.begin(9600);
  Timer1.initialize(1000000);      //Configura el TIMER en 1 Segundo
  Timer1.attachInterrupt(Temporizador) ; //Configura la interrupción del Timer 1
}
void loop() {

  // put your main code here, to run repeatedly:

}


void Temporizador(void)   //Función de la Interrupción cuando se ejecuta el TIMER
{

  Time++;   //Incremento

  if (Time == ONTime) {

    digitalWrite(LED, HIGH);
    // Time = 0;
  
  }

  if (Time == OFFTime ) {
    digitalWrite(LED, LOW);
    Time = 0;   //Resetea el contador

  }

  Serial.print("\n");
  Serial.print("\t");
  Serial.print(Time);
}

Si arduino se desenergiza, lo que ocurre es que todo comienza de nuevo, asi que ya tienes tu respuesta.
En este caso usado en setup() eso se ejecuta una sola vez, ojo con el detalle aunque supongo que lo tienes claro.

El otro detalle es que timerOne usa microsegundos y tmb usa unsigned long o sea
maximo posible es 2^32 = 4.294.967.296 useg = 4294.9 segundos para 12 hs tendras problemas no?
Para algo tan largo que mejor que usar un simple millis() tampoco lo que haces es tan complejo.
Mira los tutoriales sobre millis() en documentación.

Ahora, el otro tema, que pasa cuando se corte la alimentación? Bueno, tienes dos caminos.

  1. Armas un sistema de backup o una UPS o SAI como le llamen en tu pais y permites que el arduino siga trabajando. La cuestion es que controlas, y si tendras energía para hacerlo cuando no haya justamente energía y dependas de la batería.
  2. la otra opcion es detectar que te quedas sin energia, almacenar el dato del tiempo ON o OFF en EEPROM y restablecer la situacion cuando vuelva la energía.
    Para ello hay metodos, pero uno de los mas simples es con un capacitor de gran valor permitir que el Arduino complete una operación de escritura en EEPROM lo que se logra en menos de 5mseg y eso es fácilmente alcanzable con un capacitor de valor importante.

Olvidé lo mas importante.
TimeOne es una librería que usa TIMERs qué novedad!! Y por ello no fue pensada para tiempos grandes sino para tener precisión y control sobre eventos rápidos.

ah ok entiendo , no necesito precision pero si que hiciera como un test diario lo mas importante , eso es para una bomba de 1/2 de agua por que el problema es que cuando pasan muchos dias la bomba se queda pegada , y para evita eso lo quise automatizar y tomando esto como base agregaria otras cosa mas.

en el codigo pasaria mas tiempo apagada que prendida , 5 seg on , 20 seg off , tome ese tiempo como ejemplo usando millis


const unsigned int onTime = 5000;
const unsigned int offTime = 20000;


unsigned long previousMillis = 0;

int interval = onTime;

boolean LED13state = true;


void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {

  digitalWrite(13, LED13state);

  unsigned long currentMillis = millis();


  if ((unsigned long)(currentMillis - previousMillis) >= interval) {

    if (LED13state) {

      interval = offTime;
    } else {

      interval = onTime;
    }

    LED13state = !(LED13state);

    previousMillis = currentMillis;

  }

}

Pero te preocupan entonces posibles cortes de energía?
Error 1:

if ((unsigned long)(currentMillis - previousMillis) >= interval) {

interval debe ser unsigned long
como vas a definir un unsigned long y luego asignar a un int? El compilador debio decirte algo al menos un warning.

unsinged long interval = onTime;

No hace falta el typecast o sea con esto suficiente

if ( currentMillis - previousMillis >= interval) {

yo creo q no afectaria los cortes de energia , por que no tendria una hora especifica , lo importante es que lo haga diario una vez durante el dia

Tiene razon , Correjido lo voy a probar a ver

gracias


const unsigned int onTime = 5000;
const unsigned int offTime = 20000;


unsigned long previousMillis = 0;

unsigned long interval = onTime; // correjido

boolean LED13state = true;


void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {

  digitalWrite(13, LED13state);

  unsigned long currentMillis = millis();


  if (currentMillis - previousMillis >= interval) {
    if (LED13state) {
      interval = offTime;
    } else {
      interval = onTime;
    }
    LED13state = !(LED13state);
    previousMillis = currentMillis;
  }

}

saludos, este seria el codigo que pudiera funcionar , se pudiera hacer en 3 veces cada " 8 horas " o 12 por si hay cortes de luz creo q lo haria una vez al dia ..



int ledPin =  13;
int ledState = LOW;
unsigned long previousMillis = 0;
long OnTime = 5000;
long OffTime = 43200000;// millisegundo off-time // 12horas

void setup()
{

  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop()
{

  unsigned long currentMillis = millis();

  if ((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
  {
    ledState = LOW;  
    previousMillis = currentMillis;
    digitalWrite(ledPin, ledState);
  }
  else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
  {
    ledState = HIGH;
    previousMillis = currentMillis;
    digitalWrite(ledPin, ledState);
  }
  Serial.print("\n");
  Serial.print("\t");
  Serial.print(millis());
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.