Run two loop in one program

Hello,

I aim to give the consumption of led on a day I already made the program that calculates the consumption of the led in real time but I would like to press a button or second part of the lcd display I can display the consumption over the last twenty four hours

Thank you for your help

You have given us very little information. You have not even posted your existing program.

Rather than think of having two loop() functions think of having loop() call two other functions. Have a look at how it is done in Several Things at a Time

...R

Do you think you could possibly help us by showing us your complete code?

Use CTRL T to format your code.
Attach your complete current sketch between code tags
[code]Paste your sketch here[/code]

Sorry it's my first post and i'm french i don't a expert in forum but i send you my code

// inclure les librairie utile au code:
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Donnez un nom aux pin de l'arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Dire a l'arduino quelle pin il doit utiliser
double AcsOffset = 2.5; //Définir un offset de 2.5 a la sortie du capteur de courant
double Sensibl = 0.066; //Définir la valeur de la sensibilité du capteur de courant
double courant = 0; //Définir la variable
double tension = 0; //Définir la variable
double puissance = 0; //Définir la variable

void setup() {
  lcd.begin(16, 2); //Dire a l'arduino combien de ligne et colonne contient l'afficheur utilisé
}

void loop() {
  double ValeurLue = analogRead(A0); //Définir la variable ValeurLue sur la valeur obtenue en entré de A0
  tension = (ValeurLue * 5.0 / 1023); //Calcule qui convertie la ValeurLue obtenue a l'entrer de A0 a une tension entre 0V et 5V
  courant = (tension - AcsOffset) / Sensibl; //Calcule du courant
  puissance = (tension * courant); //Calcule de la puissance en W en utilisant P=U*I
  lcd.setCursor(0, 1); //Dire a l'arduino sur qu'elle ligne il doit écrire
  lcd.print("Cons="); //Ecrire Cons=
  lcd.print(puissance); //Ecrire la valeur obtenue en faisant le calcul de la puissance fait précedement
  lcd.print("W"); //Ecrire W a la suite de la valeur pour donner une une unité a la valeur transmise
  lcd.setCursor(0, 0); //Dire a l'arduino sur qu'elle ligne il doit écrire
  if (courant <= 0.05) { //Condition pour définir l'intensité d'allumage du circuit
    lcd.print("ETEINT");
  }
  else if ( (courant > 0.05) && (courant < 9.8)) {
    lcd.print("FAIBLE");
  }
  else if ( (courant > 9.8) && (courant < 14.8)) {
    lcd.print("MOYEN");
  }
  else if (courant > 14.8) {
    lcd.print("FORT");
  }
  lcd.print("                "); //Effacement de la première ligne pour éviter toutes erreurs d'affichage
  delay(500);
  lcd.setCursor(0, 1); //Dire a l'arduino d'ecrire a la deuxième ligne de l'afficheur
  lcd.print("                "); //Effacement de la deuxième ligne pour éviter toutes erreurs d'affichage après le delais pour ne pas avoir de blanc a la ligne dans le programme
}

Something like this, but you will have to accumulate a running average.

// inclure les librairie utile au code:
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Donnez un nom aux pin de l'arduino

const byte switchPin = 6;  //switch connected to pin 6 and ground, closing switch puts LOW on pin <------<<<<<

LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Dire a l'arduino quelle pin il doit utiliser
double AcsOffset = 2.5; //Définir un offset de 2.5 a la sortie du capteur de courant
double Sensibl = 0.066; //Définir la valeur de la sensibilité du capteur de courant
double courant = 0; //Définir la variable
double tension = 0; //Définir la variable
double puissance = 0; //Définir la variable



void setup()
{
  lcd.begin(16, 2); //Dire a l'arduino combien de ligne et colonne contient l'afficheur utilisé

  pinMode(switchPin, INPUT_PULLUP); //turn on pullup resistor to this pin   <------<<<<
}

void loop()
{
  double ValeurLue = analogRead(A0); //Définir la variable ValeurLue sur la valeur obtenue en entré de A0
  tension = (ValeurLue * 5.0 / 1023); //Calcule qui convertie la ValeurLue obtenue a l'entrer de A0 a une tension entre 0V et 5V
  courant = (tension - AcsOffset) / Sensibl; //Calcule du courant
  puissance = (tension * courant); //Calcule de la puissance en W en utilisant P=U*I
  lcd.setCursor(0, 1); //Dire a l'arduino sur qu'elle ligne il doit écrire
  lcd.print("Cons="); //Ecrire Cons=
  lcd.print(puissance); //Ecrire la valeur obtenue en faisant le calcul de la puissance fait précedement
  lcd.print("W"); //Ecrire W a la suite de la valeur pour donner une une unité a la valeur transmise
  lcd.setCursor(0, 0); //Dire a l'arduino sur qu'elle ligne il doit écrire
  if (courant <= 0.05)   //Condition pour définir l'intensité d'allumage du circuit
  {
    lcd.print("ETEINT");
  }
  else if ( (courant > 0.05) && (courant < 9.8))
  {
    lcd.print("FAIBLE");
  }
  else if ( (courant > 9.8) && (courant < 14.8))
  {
    lcd.print("MOYEN");
  }
  else if (courant > 14.8)
  {
    lcd.print("FORT");
  }

  //is switch closed?                           <---------<<<<<
  if (digitalRead(switchPin) == LOW)
  {
    lcd.print("Cons="); //Ecrire Cons=
    lcd.print(puissance); //Ecrire la valeur obtenue en faisant le calcul de la puissance fait précedement
  }

  lcd.print("                "); //Effacement de la première ligne pour éviter toutes erreurs d'affichage
  delay(500);
  lcd.setCursor(0, 1); //Dire a l'arduino d'ecrire a la deuxième ligne de l'afficheur
  lcd.print("                "); //Effacement de la deuxième ligne pour éviter toutes erreurs d'affichage après le delais pour ne pas avoir de blanc a la ligne dans le programme

}

thank you but suddenly I how can I add a value that adds up according to the consumption of my previous values

Watts per hour calculation is needed.

W = Volts X Current

Assume:
LED voltage is 2.2V
LED current is 20ma

If your LED is on for 1 hour 2.2V * .020amps = .044watt hour

If on for 24 hours, .044W * 24 = 1.056W/hrs

yes I agree with you only I have 3 led and all do not work at the same time and therefore the value of W / h changes regularly

Do the timing with seconds.

~86400 seconds in a day here :wink:

Yes, but I think that I have not expressed the problem correctly and that I wish I could continuously add the value in W / h over a period of one day but as the value in W / h varies I can not use a constant value and therefore give a fixed consumption every day

Yes, but I think that I have not expressed the problem correctly

Yes you have but maybe you have not understood the answers.

To accumulate in a variable a running total use a construct like this:-

totalPower += powerForLastTimeIncerment;
// or you could use:-
totalPower = totalPower + powerForLastTimeIncerment;

Okay I got you right so what I did was that I created the function but now I think I'm doing badly but I can not do it with my interrupt display instead of what is already showing I do not know if it's clear enough but basically my interrupt does not work I put you my program

 // inclure les librairie utile au code:
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Donnez un nom aux pin de l'arduino
const byte BoutonCons = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Dire a l'arduino quelle pin il doit utiliser
double AcsOffset = 2.5; //Définir un offset de 2.5 a la sortie du capteur de courant
double Sensibl = 0.066; //Définir la valeur de la sensibilité du capteur de courant
double courant = 0; //Définir la variable
double tension = 0; //Définir la variable
double puissance = 0; //Définir la variable
double ConsIncrement = 0;
double PuissanceTotal = 0;

void setup() {
  lcd.begin(16, 2); //Dire a l'arduino combien de ligne et colonne contient l'afficheur utilisé
  pinMode(BoutonCons, INPUT_PULLUP);
}

void loop() {
  double ValeurLue = analogRead(A0); //Définir la variable ValeurLue sur la valeur obtenue en entré de A0
  tension = (ValeurLue * 5.0 / 1023); //Calcule qui convertie la ValeurLue obtenue a l'entrer de A0 a une tension entre 0V et 5V
  courant = (tension - AcsOffset) / Sensibl; //Calcule du courant
  puissance = (tension * courant); //Calcule de la puissance en W en utilisant P=U*I
  lcd.setCursor(0, 1); //Dire a l'arduino sur qu'elle ligne il doit écrire
  lcd.print("Cons="); //Ecrire Cons=
  lcd.print(puissance); //Ecrire la valeur obtenue en faisant le calcul de la puissance fait précedement
  lcd.print("W"); //Ecrire W a la suite de la valeur pour donner une une unité a la valeur transmise
  lcd.setCursor(0, 0); //Dire a l'arduino sur qu'elle ligne il doit écrire
  PuissanceTotal += (puissance / 7200);
  attachInterrupt(digitalPinToInterrupt(BoutonCons), LireCons, LOW);
  if (courant <= 0.05) { //Condition pour définir l'intensité d'allumage du circuit
    lcd.print("ETEINT");
  }
  else if ( (courant > 0.05) && (courant < 9.8)) {
    lcd.print("FAIBLE");
  }
  else if ( (courant > 9.8) && (courant < 14.8)) {
    lcd.print("MOYEN");
  }
  else if (courant > 14.8) {
    lcd.print("FORT");
  }
  lcd.print("                "); //Effacement de la première ligne pour éviter toutes erreurs d'affichage
  delay(500);
  lcd.setCursor(0, 1); //Dire a l'arduino d'ecrire a la deuxième ligne de l'afficheur
  lcd.print("                "); //Effacement de la deuxième ligne pour éviter toutes erreurs d'affichage après le delais pour ne pas avoir de blanc a la ligne dans le programme
}

void LireCons() {
  if (digitalRead(BoutonCons) == LOW)
  {
    lcd.print("                "); //Effacement de la première ligne pour éviter toutes erreurs d'affichage
    lcd.print(PuissanceTotal);
    delay(3000);
  }
}

Thanks

I don’t understand what you are saying but there are many things with your code.

so what I did was that I created the function

That is not causing any trouble.

Listen very carefully do the attach interrupts only only once *
So that means put it in the setup function.

You can not have a delay in an interrupt routine, it will hang up. You can not do a serial print in an interrupt routine so I don’t think you can do an LCD.print.

Double and float variable types are exactly the same in an Arduino.

  • sorry a parody from Hello Hello, British comedy about the French resistance.
    During WW2

Well here's a problem.

You do not know what "interrupts" are.

You need to forget about using "interrupts"; then you can make some working code.

Okay so I understand the interruptions is not the right solution in my case do you have another to propose me to succeed?

Just don't use interrupts, look at the button when you want to in the code.

I have work in my programm and i have find other solution i have don't use button but i have create a cycle for 2 second i let you see but now i need to reset value when she come 24 hours

// inclure les librairie utile au code:
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Donnez un nom aux pin de l'arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Dire a l'arduino quelle pin il doit utiliser
double AcsOffset = 2.5; //Définir un offset de 2.5 a la sortie du capteur de courant
double Sensibl = 0.066; //Définir la valeur de la sensibilité du capteur de courant
double courant = 0; //Définir la variable
double tension = 0; //Définir la variable
double puissance = 0; //Définir la variable
double ConsIncrement = 0;
double PuissanceTotal = 0;

void setup() {
  lcd.begin(16, 2); //Dire a l'arduino combien de ligne et colonne contient l'afficheur utilisé
}

void loop() {
  double ValeurLue = analogRead(A0); //Définir la variable ValeurLue sur la valeur obtenue en entré de A0
  tension = (ValeurLue * 5.0 / 1023); //Calcule qui convertie la ValeurLue obtenue a l'entrer de A0 a une tension entre 0V et 5V
  courant = (tension - AcsOffset) / Sensibl; //Calcule du courant
  puissance = (tension * courant); //Calcule de la puissance en W en utilisant P=U*I
  lcd.setCursor(0, 1); //Dire a l'arduino sur qu'elle ligne il doit écrire
  lcd.print("Cons="); //Ecrire Cons=
  lcd.print(puissance); //Ecrire la valeur obtenue en faisant le calcul de la puissance fait précedement
  lcd.print("W"); //Ecrire W a la suite de la valeur pour donner une une unité a la valeur transmise
  lcd.setCursor(0, 0); //Dire a l'arduino sur qu'elle ligne il doit écrire
  PuissanceTotal += (puissance / 7200) * 8;
  if (courant <= 0.05) { //Condition pour définir l'intensité d'allumage du circuit
    lcd.print("ETEINT");
  }
  else if ( (courant > 0.05) && (courant < 9.8)) {
    lcd.print("FAIBLE");
  }
  else if ( (courant > 9.8) && (courant < 14.8)) {
    lcd.print("MOYEN");
  }
  else if (courant > 14.8) {
    lcd.print("FORT");
  }
  delay(2000);
  lcd.clear();
  lcd.print ("Cons sur 24h :");
  lcd.setCursor(0, 1); //Dire a l'arduino sur qu'elle ligne il doit écrire
  lcd.print (PuissanceTotal);
  lcd.print (" W/h");
  delay(2000);
  lcd.clear();
}

Krummy57:
Okay so I understand the interruptions is not the right solution in my case do you have another to propose me to succeed?

Have you carefully studied the code in the link in Reply #1 ?

...R