Convertir mes données en mémoire EEPROM en fichier pour excel via bluetooth

Bonjour,

J'aurais souhaité savoir si c'était possible, une fois les données sauvegardées dans la mémoire EEPROM, si c'était possible de les récupérer via le modem bluetooth que j'ai installé et que ce fichier soit en .xlsx

Je vous mets mon code ci-dessous

#include <EEPROM.h> // cette librairire permet d'implantation de la mémoire EEPROM dans le programme
#include <SoftwareSerial.h> // Ce programme permet de faire fonctionner correctement le modem bluetooh
#include <DHT.h> // Cette librairie permet de faire fonctionner correctement le capteur de temperature/humidité

#define DHTPIN A0 // definit la pin A0 pour le capteur de température
#define DHTTYPE DHT21 // définit le type de capteur que c'est

DHT dht(DHTPIN, DHTTYPE); // définit le type et la pin du capteur

float temp; // création de la varibable flottante pour la température
float hum; // création de la varibable flottante pour l'humidité
int i = 0; // Création variable "i" pour avoir le numéro d'adresse pour le EEPROM
int valeur_eeprom; // Récupere la valeur de température du capteur
int valeur_eeprom2; // Récupere la valeur de l'humidité du capteur
int bytemax = 4096; // Nombre maximum d'octet que peut supporter la carte
const unsigned long TIME_INTERVAL = 12000;
unsigned long previousMillis;



SoftwareSerial bluetooth(10, 11); // définit les pins 10 et 11 pour le modem bluetooh

void setup()
{
  Serial.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  dht.begin(); // Démarre le début des mesures pour le capteur de température/humidité
  bluetooth.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  previousMillis = millis();
}
void loop()
{
  hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur
  temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur

  bluetooth.print(temp); // Affiche la température sur le téléphone
  bluetooth.print(" *C"); // Affiche le texte "*C" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure
  bluetooth.print(hum);// Affiche l'humidité sur le téléphone
  bluetooth.print(" %"); // Affiche le texte "%" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure}

if (millis() - previousMillis >= TIME_INTERVAL)
{
  previousMillis = millis();



  for (i = 0; i < 4096; i++)// boucle for qui permet d'incrémenter 1 à i jusqu'a atteindre 4096
  {
    hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur
    temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur

    Serial.print("Humidite: "); // Affiche le texte "Humidité" dans le moniteur série
    Serial.print(hum);// Affiche la valeur prise par le capteur pour l'humidité
    Serial.print("%,  Temperature: "); // Affiche le texte "Température" dans le moniteur série
    Serial.print(temp); // Affiche la valeur prise par le capteur pour la température
    Serial.println(" Celsius"); // Affiche le texte "Celsius" dans le moniteur série
    ;


    valeur_eeprom2 = dht.readHumidity(); // Incrémente la valeur de l'humidité relevée par le capteur
    valeur_eeprom = dht.readTemperature(); // Incrémente la valeur de la température relevée par le capteur
    ;

    Serial.print("ecriture a l'adresse : "); Serial.print(i); // Affiche dans le moniteur série du texte et le numéro de l'adresse à laquelle on est
    Serial.print(" de la valeur => "); Serial.print(temp) && Serial.print("*C")&& Serial.print(" ; ")&& Serial.print(hum) && Serial.println(" %"); // Affiche dans le moniteur série  du texte, la température et l'humidité

    EEPROM.put (i, valeur_eeprom); // Permet de stocker la valeur de l'humidité dans la mémoire EEPROM
    EEPROM.get (i , valeur_eeprom); // Permet de lire la valeur de l'humidité stockée dans la mémoire EEPROM

    EEPROM.put ( i , valeur_eeprom2) ;// Permet de stocker la valeur de l'humidité dans la mémoire EEPROM
    EEPROM.get (i , valeur_eeprom2);// Permet de lire la valeur de l'humidité stockée dans la mémoire EEPROM


    Serial.print(i);
    Serial.print("\t");
    Serial.print(valeur_eeprom);
    Serial.println();


    Serial.print(i);
    Serial.print("\t");
    Serial.print(valeur_eeprom2);
    Serial.println();

    break;
  }

  if (i == bytemax)
  {
    exit(0);

  }
}
  }
EEPROM.get(hum);
EEPROM.put(hum),

Bonjour @SaucisseMan

-renseignes-toi sur le format CSV compris par tous les tableurs, il est beaucoup plus simple à générer que le
format XLS

-sur ton terminal (ordinateur, tablette...) installes un utilitaire ou application permettant de sauver sous forme de fichier des données reçues octet pat octet sur un port série , éventuellement Bluetooth, il en existe pour tous les systèmes d'exploitation.

Quelques problèmes par ici.

  • valeur_eeprom et valeur_eeprom2 sont des int donc la valeur est codée sur 2 octets. Si tu avances l'adresse en mémoire de 1 à chaque itération, tu écris la nouvelle valeur sur le second octet de la première.
  • tu écris valeur_eeprom et valeur_eeprom2 à la même adresse. Donc la seconde valeur écrite écrase la première
  • si tu écrivais aux bonnes adresses, comme tu dois écrire 4 octets à chaque itération de ta boucle tu ne pourrais stocker que 1024 paires de mesures.

Autrement, concernant ta question sur une sortie en fichier xlsx.
Ta carte, dont tu ne précises pas le type, communique uniquement par la liaison série à ce qu'il parait. Donc c'est l'application qui reçoit les données qui devrait mettre celles-ci en forme pour générer un fichier de données.
A savoir le format xlsx est un format propriétaire et les données dans celui-ci ne sont pas en clair donc ce n'est pas évident de le générer. Il est beaucoup plus simple de générer un fichier csv. Le format csv est simple à constituer puisque c'est du texte séparé par des virgules (ou point-virgule). Le format csv est très bien géré par Excel qui peut importer les données pour les exploiter ensuite.

Bonjour SaucisseMan

Si la liaison Bluetooth n'est pas obligatoire, il serait possible de passer, via une liaison série, directement sur un PC et directement dans une feuille Excel.

Cordialement
jpbbricole

Bonjour merci de votre réponse,

Je travaille sur une arduino mega 2560, pour le probleme des adresses, si je fais une infrastructure comme ceci, est ce que ma sauvegarde de donnée se fera correctement ?

i = 0
i2 = 1

boucle for pour (i=0, etc, I++)
programme

boucle for pour (i2 = 1, etc, I2++
programme

J'ai modifié le code comme convenue, est ce que maintenant, le probleme avec valeur_eeprom est résolu ? car maintenant, mon compteur pour i et i2 ne se fait plus dans mon for

#include <EEPROM.h> // cette librairire permet d'implantation de la mémoire EEPROM dans le programme
#include <SoftwareSerial.h> // Ce programme permet de faire fonctionner correctement le modem bluetooh
#include <DHT.h> // Cette librairie permet de faire fonctionner correctement le capteur de temperature/humidité

#define DHTPIN A0 // definit la pin A0 pour le capteur de température
#define DHTTYPE DHT21 // définit le type de capteur que c'est

DHT dht(DHTPIN, DHTTYPE); // définit le type et la pin du capteur

float temp; // création de la varibable flottante pour la température
float hum; // création de la varibable flottante pour l'humidité
int i; // Création variable "i" pour avoir le numéro d'adresse pour le EEPROM
int i2 = 1;
int valeur_eeprom; // Récupere la valeur de température du capteur
int valeur_eeprom2; // Récupere la valeur de l'humidité du capteur
int bytemax = 4096; // Nombre maximum d'octet que peut supporter la carte
const unsigned long TIME_INTERVAL = 1000;
const unsigned long TIME_INTERVAL2 = 1200;
unsigned long previousMillis;



SoftwareSerial bluetooth(10, 11); // définit les pins 10 et 11 pour le modem bluetooh

void setup()
{
  Serial.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  dht.begin(); // Démarre le début des mesures pour le capteur de température/humidité
  bluetooth.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  previousMillis = millis();
}
void loop()
{
  hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur
  temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur

  bluetooth.print(temp); // Affiche la température sur le téléphone
  bluetooth.print(" *C"); // Affiche le texte "*C" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure
  bluetooth.print(hum);// Affiche l'humidité sur le téléphone
  bluetooth.print(" %"); // Affiche le texte "%" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure}

  if (millis() - previousMillis >= TIME_INTERVAL)
  {
    previousMillis = millis();



    for (i = 0; i < 4096; i = i+1)// boucle for qui permet d'incrémenter 1 à i jusqu'a atteindre 4096
    {

      temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur

      Serial.print("Temperature: "); // Affiche le texte "Température" dans le moniteur série
      Serial.print(temp); // Affiche la valeur prise par le capteur pour la température
      Serial.println(" Celsius"); // Affiche le texte "Celsius" dans le moniteur série
      ;



      valeur_eeprom = dht.readTemperature(); // Incrémente la valeur de la température relevée par le capteur
      ;

      Serial.print("ecriture a l'adresse : "); Serial.print(i); // Affiche dans le moniteur série du texte et le numéro de l'adresse à laquelle on est
      Serial.print(" de la valeur => "); Serial.print(temp) && Serial.println("*C"); // Affiche dans le moniteur série  du texte, la température et l'humidité

      EEPROM.put (i, valeur_eeprom); // Permet de stocker la valeur de l'humidité dans la mémoire EEPROM
      EEPROM.get (i , valeur_eeprom); // Permet de lire la valeur de l'humidité stockée dans la mémoire EEPROM



      Serial.print(i);
      Serial.print("\t");
      Serial.print(valeur_eeprom);
      Serial.println();



      break;
    }
  }

  if (millis() - previousMillis >= TIME_INTERVAL2);

  for (i2 = 1; i2 < 4096; i=i2+1)// boucle for qui permet d'incrémenter 1 à i jusqu'a atteindre 4096
  {
    hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur


    Serial.print("Humidite: "); // Affiche le texte "Humidité" dans le moniteur série
    Serial.print(hum);// Affiche la valeur prise par le capteur pour l'humidité



    valeur_eeprom2 = dht.readHumidity(); // Incrémente la valeur de l'humidité relevée par le capteur



    Serial.print("ecriture a l'adresse : "); Serial.print(i2); // Affiche dans le moniteur série du texte et le numéro de l'adresse à laquelle on est
    Serial.print(" de la valeur => "); Serial.print(hum) && Serial.println(" %"); // Affiche dans le moniteur série  du texte, la température et l'humidité

    EEPROM.put ( i2 , valeur_eeprom2) ;// Permet de stocker la valeur de l'humidité dans la mémoire EEPROM
    EEPROM.get (i2 , valeur_eeprom2);// Permet de lire la valeur de l'humidité stockée dans la mémoire EEPROM


    Serial.print(i2);
    Serial.print("\t");
    Serial.print(valeur_eeprom2);
    Serial.println();
    break;
  }

}



Je pense que tu as mal lu ce que j'ai expliqué
Chacune des variables que tu veux sauvegarder occupe 2 octets
Donc si tu as un compteur i qui fais avancer les adresses:

  • tu écris valeur_eeprom à l'adresse 0
  • comme la variable occupe 2 octets tu avances l'adresse de 2
  • tu écris valeur_eeprom2 à l'adresse 2
  • comme la variable occupe 2 octets tu avances l'adresse de 2
    À l'itération suivante
  • tu écris valeur_eeprom à l'adresse 4
  • comme la variable occupe 2 octets tu avances l'adresse de 2
  • tu écris valeur_eeprom2 à l'adresse 6
  • comme la variable occupe 2 octets tu avances l'adresse de 2
    et ainsi de suite

Donc l'indice i dans ta boucle for doit avancer de 4 en 4 et tu écris

  • valeur_eeprom à l'adresse i
  • valeur_eeprom2 à l'adresse i+2

Au passage, regarde bien la structure de ton programme.

  • Tu fais une mesure
  • Tu attends 12s
  • Une fois le temps écoulé tu entres dans la boucle for où tu fais 4096 écritures d'un coup. Donc tu écris 2048 fois la même température et 2048 fois la même humidité.

Je ne pense pas que c'est ce que tu avais en tête au départ.

par rapport à votre autre post que j'ai fermé (merci de ne pas faire plusieurs posts sur le même projet) voici un code d'exemple et la simulation wokwi

#include <EEPROM.h>
const uint16_t nbEchantillons = 10;

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

  // on remplit l'EEPROM
  Serial.println(F("Début Stockage en EEPROM"));
  for (uint16_t adresse = 0; adresse < nbEchantillons * sizeof(int); adresse += sizeof(int)) {
    int val = analogRead(A0);
    EEPROM.put(adresse, val);
  }
  Serial.println(F("Fin Stockage en EEPROM\n"));

  // on lit l'EEPROM
  Serial.println(F("Lecture de l'EEPROM"));
  Serial.println(F("@\tvaleur"));
  for (uint16_t adresse = 0; adresse < nbEchantillons * sizeof(int); adresse += sizeof(int)) {
    int val ;
    EEPROM.get(adresse, val);
    Serial.print(adresse);
    Serial.write('\t');
    Serial.println(val);
  }
}

void loop() {}

Bonjour

merci pour vos réponses, j'en ai pris compte et essayé de corriger mes erreurs, voila mon nouveau programme :

#include <EEPROM.h> // cette librairire permet d'implantation de la mémoire EEPROM dans le programme
#include <SoftwareSerial.h> // Ce programme permet de faire fonctionner correctement le modem bluetooh
#include <DHT.h> // Cette librairie permet de faire fonctionner correctement le capteur de temperature/humidité

#define DHTPIN A0 // definit la pin A0 pour le capteur de température
#define DHTTYPE DHT21 // définit le type de capteur que c'est

DHT dht(DHTPIN, DHTTYPE); // définit le type et la pin du capteur

float temp; // création de la varibable flottante pour la température
float hum; // création de la varibable flottante pour l'humidité
int i; // Création variable "i" pour avoir le numéro d'adresse pour le EEPROM
int value = hum; // Récupere la valeur de température du capteur
int value2 = temp; // Récupere la valeur de l'humidité du capteur
int bytemax = 4096; // Nombre maximum d'octet que peut supporter la carte
const unsigned long TIME_INTERVAL = 3600000;
unsigned long previousMillis;
int address;
int compt = 1;
int moyhum;
int moytemp;
int tothum;
int tottemp;



SoftwareSerial bluetooth(10, 11); // définit les pins 10 et 11 pour le modem bluetooh

void setup()
{
  Serial.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  dht.begin(); // Démarre le début des mesures pour le capteur de température/humidité
  bluetooth.begin(9600); // Fixe le débit de communication en nombre de caractères par seconde
  previousMillis = millis();
  Serial.print ("Le nombre maximal de stockage pour l'EEPROM est de ");
  Serial.println(EEPROM.length());



}
void loop()
{
  hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur
  temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur
  moyhum = (moyhum + dht.readHumidity());
  moytemp = (moytemp + dht.readTemperature());
  tothum = moyhum/compt;
  tottemp = moytemp/compt;
  

  bluetooth.print(temp); // Affiche la température sur le téléphone
  bluetooth.print(" *C"); // Affiche le texte "*C" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure
  bluetooth.print(hum);// Affiche l'humidité sur le téléphone
  bluetooth.print(" %"); // Affiche le texte "%" sur le téléphone
  bluetooth.print(";"); //Permet de retourner à la ligne pour chaque valeurs
  delay(2000); // Mets une temporisation de deux secondes à chaque mesure}

  if (millis() - previousMillis >= TIME_INTERVAL)
  {
    previousMillis = millis();



    if (i; i < 4096)// boucle for qui permet d'incrémenter 1 à i jusqu'a atteindre 4096
    {
      temp = dht.readTemperature(); // définit la variable "temp" à la mesure prise par le capteur
      hum = dht.readHumidity(); // définit la variable "hum" à la mesure prise par le capteur

      EEPROM.update (address, tothum);
      value = EEPROM.read(address);
      Serial.print("Addresse n. :");
      Serial.print(String(address));
      Serial.print (" Humidité:");
      Serial.print(value);
      Serial.println(" %");
      delay(100);

      address = address + 2;
      delay(100);

      EEPROM.update (address, tottemp);
      Serial.print("Addresse n. :");
      Serial.print(String(address));
      Serial.print (" Température:");
      Serial.print(temp);
      Serial.println(" *C");
      address = address + 2;

      delay(100);
      Serial.print ("La moyenne de la température est de ");
      Serial.print(tottemp);
      Serial.println(" *C");
      delay(100);
      Serial.print ("La moyenne de l'humidité est de ");
      Serial.print(tothum);
      Serial.println( "%");
      delay(100);

    }
  }
  if (address == bytemax)
  {
    exit(0);
  }
  compt++;

}

Si vous voyez des problèmes n'hésitez pas à me le dire et du coup je reviens à mon probleme de base, est ce que c'est possible de créer un fichier texte et de récolter les données de la mémoire eeprom dedans et si oui, comment ?

Merci

Un if n’est pas une boucle… que fait ce i tout seul avant le test ??

Ou voulez vous créer le fichier? Sur l’Arduino (vous avez une carte SD ou un système de fichier en tête ?) ou sur le PC attaché à votre Arduino ?

Merci de votre réponse,

Non je n'ai pas de carte SD, je sauvegarde tout dans la mémoire EEPROM.
J'ai comme projet de laisser ma carte arduino tourner sans pc et, quand je veux, récolter ces données par bluetooh sur mon pc via un module bluetooh HC-05

Est ce possible ?

Bonjour

oui c'est possible, mais dans l'EEPROM les données mémorisées ne le seront pas sous forme de fichier.
Pour les transmettre par Bluetooth il faudra une à une les récupérer dans l'EEPROM en utilsant leur adresse.

vous faites une petite interface de commande par BT. Lorsque l'arduino reçoit la commande appropriée il va lire ce qui est stocké dans l'EEPROM et imprime tout sur le port série BT. à vous de vous débrouiller côté PC pour mettre cela dans un fichier - soit avec un petit programme python ou autre qui se charge de parler à l'Arduino (attention ouvrir le port série sur une MEGA reboote la MEGA) et de récupérer les données ou alors simplement en ouvrant une application terminal série et en envoyant "à la main" la commande puis en faisant un copier coller ou un enregistrement de ce qui revient. On peut aussi gérer cela (au moins sur Mac et Linux) à la ligne de commande.