Fusion porgramme Arduino

Bonjour, je suis élève en T°STI2D et j'ai pour projet de BAC de faire un kart électrique. Dans ce projet je suis en charge de créer un programme Arduino permettant de mesurer la tension des batteries et la vitesse de rotation moteur et du kart. J'ai fais les 2 programmes qui fonctionnent parfaitement indépendamment. Cependant mon but est de les fusionner dans un seul programme. J'ai essayé mais le programme ne fonctionne pas. Pouvez-vous m'aider ? Merci

Programme tension :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//----- Adressage matériel -----
// En cas de non fonctionnement, mettez la ligne 8 en
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);
//LiquidCrystal_I2C lcd(0x3F,20,4);
float vPow = 4.7;
float r1 = 30000;
float r2 = 7500;

void setup()
{
 lcd.init(); // initialisation de l'afficheur
  Serial.begin(9600);
  Serial.println("-----------------------");
  Serial.println("Theo");
  Serial.println("-----------------------");
  Serial.println("DC Voltmetre");
  Serial.println("Tension Maximum: ");
  Serial.print((int)(vPow / (r2 / (r1 + r2))));
  Serial.println("V");
  Serial.println("-----------------------");
  Serial.println("");

  delay(2000);
  
}
void loop()
{
  float v = (analogRead(0) * vPow) / 1024.0;
  float v2 = v / (r2 / (r1 + r2));

  Serial.print(v2);
  Serial.println("V");
  delay(2000);
  
 lcd.backlight();
 // Envoi du message
 lcd.setCursor(0, 0);  // Positionnement à la première ligne
 lcd.print("Tension:"); // Afficher tensio devant la valeur
 lcd.print(v2); lcd.write(byte(0));  // Affichage de la tension.
}

Programme Vitesse :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int cbon = 1;
int tempo = millis();
int temp;
int freqN;
int deltat;
int trmin;
int vroueang;
int vrouems;
int vrouekmh;
int vitang;
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() 
{
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  lcd.init();
}

void loop() {
  if (digitalRead(2) == LOW) {
    if (cbon) {
      cbon = 0 ;
      temp = millis() ;
      deltat = temp - tempo ;
      tempo = temp ;
      freqN = 60000/deltat ;
      trmin = freqN*11/85 ;
      vitang = freqN/60 ;
      vroueang = vitang*27/2 ;
      vrouems = vroueang*27/100 ;
      vrouekmh = vrouems*36/100 ;
      Serial.print("deltat ms : ");
      Serial.println(deltat);
      Serial.print(" N : ");
      Serial.println(freqN) ;
      Serial.print("tour/min : ") ;
      Serial.println(trmin) ;
      Serial.print("km/h : ") ;
      Serial.println(vrouekmh) ;
      Serial.print("m/s : ") ;
      Serial.println(vrouems) ;
    }
    digitalWrite(13, HIGH) ;
  } else {
    cbon = 1 ;
    digitalWrite(13, LOW) ;
    }
    {
      lcd.backlight();
      lcd.setCursor(0,0);
      lcd.print("Vitesse tr/min:");
      lcd.print(trmin);
      lcd.setCursor(0,1);
      lcd.print("Vitesse km/h:");
      lcd.print(vrouekmh);
      
    }
  }

Programmes réunis :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int cbon = 1;
int tempo = millis();
int temp;
int freqN;
int deltat;
int trmin;
int vroueang;
int vrouems;
int vrouekmh;
int vitang;
LiquidCrystal_I2C lcd(0x27, 20, 4);
float vPow = 4.7;
float r1 = 30000;
float r2 = 7500;

void setup()
{
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Serial.println("-----------------------");
  Serial.println("Theo");
  Serial.println("-----------------------");
  Serial.println("DC Voltmetre");
  Serial.println("Tension Maximum: ");
  Serial.print((int)(vPow / (r2 / (r1 + r2))));
  Serial.println("V");
  Serial.println("-----------------------");
  Serial.println("");

  delay(2000);

  lcd.init();
  
}

void loop()
{
  float v = (analogRead(0) * vPow) / 1024.0;
  float v2 = v / (r2 / (r1 + r2));

  Serial.print(v2);
  Serial.println("V");
  delay(2000);

  if (digitalRead(2) == LOW) {
    if (cbon) {
      cbon = 0 ;
      temp = millis() ;
      deltat = temp - tempo ;
      tempo = temp ;
      freqN = 60000/deltat ;
      trmin = freqN*11/85 ;
      vitang = freqN/60 ;
      vroueang = vitang*27/2 ;
      vrouems = vroueang*27/100 ;
      vrouekmh = vrouems*36/100 ;
      Serial.print("deltat ms : ");
      Serial.println(deltat);
      Serial.print(" N : ");
      Serial.println(freqN) ;
      Serial.print("tour/min : ") ;
      Serial.println(trmin) ;
      Serial.print("km/h : ") ;
      Serial.println(vrouekmh) ;
      Serial.print("m/s : ") ;
      Serial.println(vrouems) ;
  
}
digitalWrite(13, HIGH) ;
  } else {
    cbon = 1 ;
    digitalWrite(13, LOW) ;
    }
    {
      lcd.backlight();
      // Envoi du message
      lcd.setCursor(0,0);
      lcd.print("Vitesse tr/min:");
      lcd.print(trmin);
      lcd.setCursor(0,1);
      lcd.print("Vitesse km/h:");
      lcd.print(vrouekmh);
      lcd.setCursor(0, 2);  // Positionnement à la première ligne
      lcd.print("Tension:"); // Afficher tensio devant la valeur
      lcd.print(v2);  // Affichage de la tension.
      
    }
  }

int tempo = millis(); n'est certainement pas au bon endroit. au mieux, il ne sert à rien...

D'accord merci, où devrais-je le mettre ?

uint32_t tempo=0, dt, temp;
en variables globales; (verifiez le type de sortie de millis()

vous évitera de perdre 2 octets sur la représentation du temps (millis() renvoye des entiers non signés sur 32 bits : si vous en faites des entiers signés, votre plus longue temporisation portera sur 32xxx millisecondes, une demi minute.... ). Je ne sais pas si ça règle votre problème, mais c'est une source de désordre à terme.

hello

ton prg fonctionne, après quelques rectifications
l1/ l'entrée D2 en pullup
2/ le serial en 115200 pour ne pas perdre de temps
3/ les variables de temps en unsigned long
4/ chez moi lcd.begin et non lcd.init
5/ suppression de la tempo de 2 secondes qui bloque la scrutation de D2

donc ton prg fonctionne, mais il n'est pas capable de remplir la fonction tachymetre pour la vitesse de rotation du moteur.
c'est pourquoi je te l'ai corrigé. pour t'aider à ne pas perdre du temps.

pour un sujet bac, il faut refaire ton prg.

imagine qu'un moteur de kart monte dans les tours. tel que ton prg est conçu, il va forcément rater des tours.

penses aux interruptions.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int cbon = 1;
//int tempo = millis();
unsigned int tempo =0;
//int temp;
unsigned int temp=0;
int freqN;
//int deltat;
unsigned int delta=0;
int trmin;
int vroueang;
int vrouems;
int vrouekmh;
int vitang;

float vPow = 4.7;
float r1 = 30000;
float r2 = 7500;

void setup()
{
  //pinMode(2, INPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  //Serial.begin(9600);
  Serial.begin(115200);
  Serial.println("-----------------------");
  Serial.println("Theo");
  Serial.println("-----------------------");
  Serial.println("DC Voltmetre");
  Serial.println("Tension Maximum: ");
  Serial.print((int)(vPow / (r2 / (r1 + r2))));
  Serial.println("V");
  Serial.println("-----------------------");
  Serial.println("");

  delay(2000);
lcd.begin();
  //lcd.init();
 
}

void loop()
{
  float v = (analogRead(0) * vPow) / 1024.0;
  float v2 = v / (r2 / (r1 + r2));

  Serial.print(v2);
  Serial.println("V");
  //delay(2000);

  if (digitalRead(2) == LOW) {
    if (cbon) {
      cbon = 0 ;
      temp = millis() ;
      deltat = temp - tempo ;
      tempo = temp ;
      freqN = 60000/deltat ;
      trmin = freqN*11/85 ;
      vitang = freqN/60 ;
      vroueang = vitang*27/2 ;
      vrouems = vroueang*27/100 ;
      vrouekmh = vrouems*36/100 ;
      Serial.print("deltat ms : ");
      Serial.println(deltat);
      Serial.print(" N : ");
      Serial.println(freqN) ;
      Serial.print("tour/min : ") ;
      Serial.println(trmin) ;
      Serial.print("km/h : ") ;
      Serial.println(vrouekmh) ;
      Serial.print("m/s : ") ;
      Serial.println(vrouems) ;
 
}
digitalWrite(13, HIGH) ;
  } else {
    cbon = 1 ;
    digitalWrite(13, LOW) ;
    }
    {
      lcd.backlight();
      // Envoi du message
      lcd.setCursor(0,0);
      lcd.print("Vitesse tr/min:");
      lcd.print(trmin);
      lcd.setCursor(0,1);
      lcd.print("Vitesse km/h:");
      lcd.print(vrouekmh);
      lcd.setCursor(0, 2);  // Positionnement à la première ligne
      lcd.print("Tension:"); // Afficher tensio devant la valeur
      lcd.print(v2);  // Affichage de la tension.
     
    }
  }

dfgh:
hello

ton prg fonctionne, après quelques rectifications
l1/ l'entrée D2 en pullup
2/ le serial en 115200 pour ne pas perdre de temps
3/ les variables de temps en unsigned long
4/ chez moi lcd.begin et non lcd.init
5/ suppression de la tempo de 2 secondes qui bloque la scrutation de D2

donc ton prg fonctionne, mais il n'est pas capable de remplir la fonction tachymetre pour la vitesse de rotation du moteur.
c'est pourquoi je te l'ai corrigé. pour t'aider à ne pas perdre du temps.

pour un sujet bac, il faut refaire ton prg.

imagine qu'un moteur de kart monte dans les tours. tel que ton prg est conçu, il va forcément rater des tours.

penses aux interruptions.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int cbon = 1;
//int tempo = millis();
unsigned int tempo =0;
//int temp;
unsigned int temp=0;
int freqN;
//int deltat;
unsigned int delta=0;
int trmin;
int vroueang;
int vrouems;
int vrouekmh;
int vitang;

float vPow = 4.7;
float r1 = 30000;
float r2 = 7500;

void setup()
{
  //pinMode(2, INPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  //Serial.begin(9600);
  Serial.begin(115200);
  Serial.println("-----------------------");
  Serial.println("Theo");
  Serial.println("-----------------------");
  Serial.println("DC Voltmetre");
  Serial.println("Tension Maximum: ");
  Serial.print((int)(vPow / (r2 / (r1 + r2))));
  Serial.println("V");
  Serial.println("-----------------------");
  Serial.println("");

delay(2000);
lcd.begin();
  //lcd.init();

}

void loop()
{
  float v = (analogRead(0) * vPow) / 1024.0;
  float v2 = v / (r2 / (r1 + r2));

Serial.print(v2);
  Serial.println("V");
  //delay(2000);

if (digitalRead(2) == LOW) {
    if (cbon) {
      cbon = 0 ;
      temp = millis() ;
      deltat = temp - tempo ;
      tempo = temp ;
      freqN = 60000/deltat ;
      trmin = freqN11/85 ;
      vitang = freqN/60 ;
      vroueang = vitang
27/2 ;
      vrouems = vroueang27/100 ;
      vrouekmh = vrouems
36/100 ;
      Serial.print("deltat ms : ");
      Serial.println(deltat);
      Serial.print(" N : ");
      Serial.println(freqN) ;
      Serial.print("tour/min : ") ;
      Serial.println(trmin) ;
      Serial.print("km/h : ") ;
      Serial.println(vrouekmh) ;
      Serial.print("m/s : ") ;
      Serial.println(vrouems) ;

}
digitalWrite(13, HIGH) ;
  } else {
    cbon = 1 ;
    digitalWrite(13, LOW) ;
    }
    {
      lcd.backlight();
      // Envoi du message
      lcd.setCursor(0,0);
      lcd.print("Vitesse tr/min:");
      lcd.print(trmin);
      lcd.setCursor(0,1);
      lcd.print("Vitesse km/h:");
      lcd.print(vrouekmh);
      lcd.setCursor(0, 2);  // Positionnement à la première ligne
      lcd.print("Tension:"); // Afficher tensio devant la valeur
      lcd.print(v2);  // Affichage de la tension.
   
    }
  }

Super merci beaucoup pour ton aide !
Je vais l'essayer demain matin en cours si possible.
Merci aux autres également, je tiens compte de tout les commentaires ^^

Un LCD prend quelques millisecondes pour afficher, disons entre 5 & 10 selon le modèle et ce qu'on affiche. Donc 100 à 200 messages par seconde, je ne sais pas si tes mesures sont précises. C'est quoi le capteur branché sur A0 ?

" Donc 100 à 200 messages par seconde,"
Il faut avoir une rétine de course et un nerf optique à haut débit pour lire 100 à 200 messages par seconde (avec beaucoup de cafeine, peut être que le cerveau suivrait, mais dans quel état)

bonsoir ,
juste pour faire un peu "ch..." le monde ,
j' ai toujours cru naïvement que sur l’Arduino uno

on pouvait pas avoir dans le mème prog
de l'i2c et de la conversion analogique ,numérique .

la si le programme fonctionne chapeau
ps :mais pcf8591T me servent a rien..

Le problème ne tient pas à la vitesse de l'affichage mais au fait qu'il bloque le code pendant ces précieuses millisecondes. S'il doit mesurer un régime moteur à cette cadence, surtout pour un kart, la mesure ne sera pas précise

Il faut mettre les variables de temps en unsigned long (ou uint32_t), et non en unsigned int (risque de problème avec temporisation > une demi minute)
Il est parfaitement possible d'utiliser A4 et A5 pour le TWI (le reliquat restant utilisable comme voltmètres, ou comme entrées sorties digitales)

Merci à tous le programme fonctionne !!!

non, il fonctionne mais pas pour faire ce qui t'es demandé.

dès que le moteur montera dans les tours, ton comptage sera faux, archi faux.

pour un projet de bac, implique toi davantage, pour l'instant ta note c'est 2/20.

regarde les interruptions.

dfgh:
non, il fonctionne mais pas pour faire ce qui t'es demandé.

dès que le moteur montera dans les tours, ton comptage sera faux, archi faux.

pour un projet de bac, implique toi davantage, pour l'instant ta note c'est 2/20.

regarde les interruptions.

Ok je vais continuer d'y travailler.
Merci