Invocar una función cada cierto tiempo

Buenas tardes, estoy intentando un proyecto en el cual se invoque una función cada 30 minutos en Arduino. Estoy probando la función MIllis() para hacer el llamado pero no logro hacerlo para el tiempo establecido. Les muestro el código:

//inicio del código

const int boton = 3; const int led = 13; int contador, k = 0; int estadoAnteriorBoton = 0; int valorBoton = 0; float kwh; float bs; const long interval = 180000; unsigned long previousMillis = 0; // Tiempo anterior 0

void envío(contador) // esto es una prueba { Serial.printl("Aquí va el envío"); k = contador * 2; Serial.println(k); }

void setup() { Serial.begin(9600); pinMode(boton,INPUT); pinMode(led,OUTPUT); // digitalWrite(boton, LOW); }

void loop() { unsigned long currentMillis = millis(); valorBoton=digitalRead(boton);

if(valorBoton!=estadoAnteriorBoton) { if (valorBoton==LOW) { contador++; Serial.println(contador); kwh = (float)contador / 1600; //cálculo de kwh consumido 1 kwh = 1600 pulsos //Serial.println(kwh,4); bs = (float)kwh * 0.19; // costo de consumo Serial.println(bs,4); digitalWrite(led,LOW); } if(valorBoton==HIGH) { digitalWrite(led,HIGH); } }

estadoAnteriorBoton=valorBoton;

if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; //envío cada 30 min = 180000 millis { envío(contador); contador=0; delay(100); } }

Normas del Foro

foxtrot2342: Buenas tardes, estoy intentando un proyecto en el cual se invoque una función cada 30 minutos en Arduino. Estoy probando la función MIllis() para hacer el llamado pero no logro hacerlo para el tiempo establecido. Les muestro el código:

//inicio del código

const int boton = 3; const int led = 13; int contador, k = 0; int estadoAnteriorBoton = 0; int valorBoton = 0; float kwh; float bs; const long interval = 180000; unsigned long previousMillis = 0; // Tiempo anterior 0

void envío(contador) // esto es una prueba { Serial.printl("Aquí va el envío"); k = contador * 2; Serial.println(k); }

void setup() { Serial.begin(9600); pinMode(boton,INPUT); pinMode(led,OUTPUT); // digitalWrite(boton, LOW); }

void loop() { unsigned long currentMillis = millis(); valorBoton=digitalRead(boton);

if(valorBoton!=estadoAnteriorBoton) { if (valorBoton==LOW) { contador++; Serial.println(contador); kwh = (float)contador / 1600; //cálculo de kwh consumido 1 kwh = 1600 pulsos //Serial.println(kwh,4); bs = (float)kwh * 0.19; // costo de consumo Serial.println(bs,4); digitalWrite(led,LOW); } if(valorBoton==HIGH) { digitalWrite(led,HIGH); } }

estadoAnteriorBoton=valorBoton;

if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; //envío cada 30 min = 180000 millis { envío(contador); contador=0; delay(100); } }

30 min* 60s = 1800 segundos * 1000 ms = 1800000 // este es el tiempo para 30 minutos

Ese no es el tag que debes usar. debes usar este </> y no Quote como usaste. Tampoco debes VOLVER a poner lo mismo que esta mal en el primero SINO Editar el que esta mal, que sigue MAL.

Ve a More, luego Modify y Edita el primero y borra el Quote del segundo que no hace falta.

Aca va mi respuesta a tu consulta.

//inicio del código

const int boton = 3;
const int led = 13;
int contador, k = 0;
int estadoAnteriorBoton = 0;
int valorBoton = 0;
float kwh;
float bs;
const long interval = 180000;
unsigned long previousMillis = 0;  // Tiempo anterior 0

void envío(contador) // esto es una prueba
{
  Serial.println("Aquí va el envío");
  k = contador * 2;
  Serial.println(k);
}

void setup() {
  Serial.begin(9600);
  pinMode(boton,INPUT);
  pinMode(led,OUTPUT);
  // digitalWrite(boton, LOW);
  previousMillis = millis(); 
}

void loop() {
  valorBoton = digitalRead(boton);
  if (valorBoton != estadoAnteriorBoton) {
    if (valorBoton == LOW)  {
      contador++;
      Serial.println(contador);
      kwh = (float)contador / 1600;    //cálculo de kwh consumido 1 kwh = 1600 pulsos
      //Serial.println(kwh,4);
      bs = (float)kwh * 0.19; // costo de consumo
      Serial.println(bs,4);
      digitalWrite(led,LOW);
    }
    if (valorBoton==HIGH) {
       digitalWrite(led,HIGH);
    }
  }
  estadoAnteriorBoton = valorBoton;
  
  if (millis() - previousMillis >= interval) { 
     //envío cada 30 min = 180000 millis
     envío(contador);
     contador=0;
     // delay(100); // dELAY USANDO MILLIS() MAL
     previousMillis = millis();   
  }

A ver si ahora funciona mejor?