Comment mettre l'heure par Bluetooth dans une variable Arduino

Bonjour, je voudrais mettre dans deux variables H et M, heures et minutes envoyées à une horloge Arduino.
Pour l'instant je me contente de ce code qui fonctionne bien:

if (Serial.available() > 0)
  {
    int data = Serial.read(); 

    switch (data)
    {
      case '1': {    //si je reçois '1' j'ajoute 1 à la variable h (qui sont les heures)
          h ++;
        }
        break;

      case '2':  {    //si je reçois '2'  j'ajoute 5 à la variable h 
          h = h + 5;
        }
        break;
        case '3': {    //si je reçois '3'  j'ajoute 1 à la variable m (minutes)
          m = m ++;
        }
        break;

Et ainsi de suite.

Pour ne pas passer par toutes ces manipulations, je voudrais envoyer les heures et les minutes réelles et les introduire dans les variables respectives.
J'ai déjà beaucoup cherché sur internet mais sans succès.
Merci à celui qui pourrait m'aider.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Bonjour dgloris

Quel est le programme qui envoie ces valeurs?

A+
Cordialement
jpbbricole

Hello,

Si j'ai bien compris le problème, voici une fonction qui permet de récupérer l'heure depuis les caratères envoyés.
Tu dois envoyer l'heure au format HHhMM avec HH les heures bien sûr et MM les minutes
Exemple : 15h36

Voici la fonction :

void lireHeureDepuisString(String timeStr)
{
  int hIndex = timeStr.indexOf('h');
  if (hIndex != -1 && hIndex >= 1 && hIndex <= 2 && timeStr.length() >= hIndex + 3)
  {
    String heureStr  = timeStr.substring(0, hIndex);
    String minuteStr = timeStr.substring(hIndex + 1);

    h = heureStr.toInt();
    m = minuteStr.toInt();
  }
}

Et pour l'utiliser :

if (Serial.available())
{
  String input = Serial.readStringUntil('\n');  // lit jusqu'à un retour à la ligne
  lireHeureDepuisString(input);

  // Debug : Affiche les valeurs pour vérifier
  Serial.print("Heures : ");
  Serial.println(h);
  Serial.print("Minutes : ");
  Serial.println(m);
}

A noter que les variables h et m doivent être accessible depuis la fonction lireHeureDepuisString() bien sûr. A toi de gérer le scope ou faire un passage par référence.

Bonjour et merci de répondre.

Je l'envoie avec un petit programme que j'ai réalisé avec app Inventor mais ça marche aussi avec Sera Bluetooth.
En fait il s'agit d'envoyer un seul chiffre à la fois et le code arduino sait ce qu'il doit faire en reçevant ces chiffres.

Salutations
Loris

Bonjour, merci de cette réponse.
Je ne pourrai pas tester rapidement étant assez occupé mais dès que je pourrai le faire j'essayerai le code proposé

Encore merci
Loris

Bonjour dgloris

Depuis MIT, envoies d'un coup HHhMM et je t'indiquerais comment réceptionner ces 2 variables

Autre option, mets Le fichier AIA de ton programme (à zipper)

A+
jpbbricole

Désolé j'ai fait une erreur d'écriture:
Je i'envoie aussi avec le terminal de Serial Bluetooth

Pas de souci

A l'avenir, il est préférable d'éditer ton post plutôt que d'en faire un nouveau et d'envoyer une notif à tout le monde pour "si peu".

Si on avait eu un souci de compréhension, on t'aurait demandé d'expliquer ce que tu entendais par

Voilà, j'ai trouvé un peu de temps pour l'essai. J'ai recopié tel quel le code en déclarant les variables en tête pour qu'elles soient toujours disponibles.
Quand j'envoie (12h20 par exemple), la réception est bonne mais dans le moniteur série les heures et les minutes sont toujours à zéro.
Ai-je commis une erreur ?

int m;
int h;

void setup() {
  Serial.begin(115200);
}

void loop() {
  
  if (Serial.available())
  {
    String input = Serial.readStringUntil('\n');  // lit jusqu'à un retour à la ligne
    lireHeureDepuisString(input);

    // Debug : Affiche les valeurs pour vérifier
    Serial.print("Heures : ");
    Serial.println(h);
    Serial.print("Minutes : ");
    Serial.println(m);
  }
}

void lireHeureDepuisString(String timeStr)
{
  int hIndex = timeStr.indexOf('h');
  if (hIndex != -1 && hIndex >= 1 && hIndex <= 2 && timeStr.length() >= hIndex + 3)
  {
    String heureStr  = timeStr.substring(0, hIndex);
    String minuteStr = timeStr.substring(hIndex + 1);

    h = heureStr.toInt();
    m = minuteStr.toInt();
  }
}

Est-ce que tu peux me donner l'output de ce code ? Pour vérifier

int m;
int h;

void setup() {
  Serial.begin(115200);
}

void loop() {
  
  if (Serial.available())
  {
    String input = Serial.readStringUntil('\n');  // lit jusqu'à un retour à la ligne

    Serial.print("Message reçu : ");
    Serial.println(input);

    lireHeureDepuisString(input);

    // Debug : Affiche les valeurs pour vérifier
    Serial.print("Heures : ");
    Serial.println(h);
    Serial.print("Minutes : ");
    Serial.println(m);
  }
}

void lireHeureDepuisString(String timeStr)
{
  int hIndex = timeStr.indexOf('h');
  if (hIndex != -1 && hIndex >= 1 && hIndex <= 2 && timeStr.length() >= hIndex + 3)
  {
    String heureStr  = timeStr.substring(0, hIndex);
    Serial.print("Heure détectée : ");
    Serial.println(heureStr);

    String minuteStr = timeStr.substring(hIndex + 1);
    Serial.print("Minutes détectées : ");
    Serial.println(minuteStr);

    h = heureStr.toInt();
    m = minuteStr.toInt();
  }
}

Tu veux dire la sortie sur le terminal série ?

Heures : 0
Minutes : 0

C'est le résultat avec n'importe quelle heure et la bonne syntaxe comme tu as indiqué

Un gran merci

Je t'ai envoyé un code qui print bien plus de choses que ça dans le post#11
Tu peux l'utiliser stp ?

J'ai recopié le code tel quel et voici le résultat

J'envoie les heures avec le "terminal de Serial Bluetooth"

Message reçu :
Heures : 0
Minutes : 0

Je ne sais pas ce que c'est que ça mais manifestement tu ne reçois rien.
Encore plus simple:

void setup() {
  Serial.begin(115200);
  Serial.println("Début");
}

void loop() {
  
  if (Serial.available())
  {
    Serial.print(Serial.read());
  }
}

Est-ce que tu obtiens quelque chose sur le port série ?

Oui, je reçois bien "Début" mais directement.
si j'envoie quelquechose par BT il s'inscrit une série de zeros

Je pourrais peut être aussi envoyer en deux fois les heures et minutes ensuite ?

Voilà, ça marche !!!!!!! voici la sortie:

Message reçu : 13h20

Heure détectée : 13
Minutes détectées : 20

Heures : 13
Minutes : 20

J'ai juste essayé de changer la vitesse de transmission à 9600 au lieu de 115200

Merci pour ta patience et merci pour le code qui est parfait

Loris

Avec plaisir ! Tant mieux pour toi

Hésite pas à mettre le topic en résolu !

Bonne continuation :wink:

1 Like

Je serais ravi de marquer que ce topic est résolu mais après avoir épluché touttes les actions possibles sur cette page je n'ai finalement pas trouvé comment le faire...
Je suis désolé d'encore revenir vers vous, c'est ma premiere fois :sad_but_relieved_face:

Sous chaque post tu as un bouton avec écrit "solution"
Tu sélectionnes le post le plus approprié et tu cliques sur ce fameux bouton :slight_smile: