Pages

dimanche 18 mars 2018

un arduino uno et sur un promini pour la suite, un dht22, une i2c eeprom 24lc256 et voilà un datalogger temperature humidité, on ne trouve que des datalogger a base de sdcard sur le net.
la contrainte c'est qu'il faut ouvrir une console série sur le PC pour lire les enregistrements stockés dans la mémoire.  Le ds1615 sans mémoire annexe, enregistrait la temperature, il fallait un max232 et se branchait sur la rs232 db9 d'un pc, le programme gratuit de dallas convertissait automatiquement en graphique. Ici on n'a que les data en mode texte, il faut les recopier dans un fichier txt ou csv, pour les afficher sous excel, en prévoyant les bons délimiteurs.
Le mieux serait un affichage sur un tft ou lcd 20x4, je cherche un croquis arduino+afficheur directement adressable en série, qui remplace le moniteur série arduino du pc.
Le croquis est tiré de hackable n°15 avec de nombreuses modificatins. 
Il va falloir que j'aille faire un tour du coté de wordpress parce que je ne vois pas comment intégré un croquis arduino sur ce blog.

  Valeur actuelle du compteur: 33
18/03/2018 11:24:47;
temperature : 19.30
humidite : 30.70
18/03/2018 11:25:48;
temperature : 19.30
humidite : 30.60
18/03/2018 11:26:48;
temperature : 19.30
humidite : 30.70
18/03/2018 11:27:49;
temperature : 19.20
humidite : 30.60
18/03/2018 11:28:49;
temperature : 19.20
humidite : 30.80
18/03/2018 11:29:50;
temperature : 19.20
humidite : 31.20
18/03/2018 11:30:50;
temperature : 19.20
humidite : 30.90
18/03/2018 11:31:51;
temperature : 19.20
humidite : 30.70
18/03/2018 11:32:52;
temperature : 19.20
humidite : 30.70
18/03/2018 11:33:52;
temperature : 19.20
humidite : 30.60
18/03/2018 11:34:53;
temperature : 19.20
humidite : 30.70

exemple de relevé

croquis arduino
  
/* 18/03/18 : enregistre temp/hum dht22 dans l eeprom 24c32
 *  d'un  module ds3231 +24c32
 *  affichage sur moniteur série
 *  source de base : hackable n15 croquis
 *  https://github.com/Hackable-magazine/Hackable15/tree/master/enregistreur
 *  a faire : utiliser une 24lc256/512 externe
 *  afficher en temps réel les data sur un lcd 20x4/nokia/tft spi (voire glcd avec un mega)
 *  6 pins lcd, nokia, 3 pins pour commande dump, compteur, reinit
 *  ide 1.8.4
 */

#include <Wire.h>
#include <extEEPROM.h>
#include <DS3232RTC.h>
//#include <Adafruit_Sensor.h>
//#include <Adafruit_BME280.h>
#include <TimeLib.h>
#include <SPI.h>
#include "dht.h" // lib dhtstable robtillaert

#define DHT22_PIN 4
dht DHT;

// Notre format de données d'enregistrement
struct MesInfo {
  time_t horo;
  float temp;
  float humi;
                };

// stockage du temps
// c'est un unsigned long dans Time/TimeLib.h
time_t myTime;

// Variable pour nos données
MesInfo mesdata;

// Atmel 24C256 SANS suffixe A B C : A2 non connecté i2c 0x50 a 0x53 (datasheet)
//extEEPROM eep(kbits_256, 1, 64, 0x50); //24c256 atmel 2.7v-5v
extEEPROM eep(kbits_256, 1, 64, 0x54);//24lc256 A2 reliéau +vcc
//extEEPROM eep(kbits_512, 1, 128, 0x54);// 24lc512
//extEEPROM eep(kbits_32, 1, 32, 0x57); // 24c32 module ds3231
// gestion des intervalles de mesure
unsigned long previousMillis = 0;

// Affichage d'une valeur sur deux chiffres
void print2digits(int val, Stream &sortie) {
  // si <10 alors on préfixe d'un 0
  sortie.print(val < 10 ? "0" : "");
  sortie.print(val, DEC);
}

void Read_DHT22()
{
int chk = DHT.read22(DHT22_PIN);
}
// Enregistrement d'un relevé
void enreg() {
  // code retour de l'écriture
  int ret = 0;
 
  // lecture du compteur
  int compteur = 0; // pourquoi = 0 ?
  eep.read(0, (byte *) &compteur, sizeof(compteur));

  // remplissage de notre structure

  mesdata.horo=RTC.get();
 // mesdata.temp=bme.readTemperature();
  //mesdata.hygro=bme.readHumidity();
 // mesdata.pression=bme.readPressure()/100.0F;
  mesdata.temp=(DHT.temperature);
  mesdata.humi=(DHT.humidity);
 

  // écriture en EEPROM

  ret = eep.write(sizeof(compteur)+sizeof(mesdata)*compteur, (byte *) &mesdata, sizeof(mesdata));
  delay(10);
  // Une erreur ?
  if(ret != 0)
    return;

  // incrémentation du compteur

  compteur++;
  // mise à jour du compteur
  eep.write(0, (byte *) &compteur, sizeof(compteur));
  delay(10);
}

// fonction d'affichage des données
void dump() {
  int compteur;
  // lecture du compteur à la position 0 de l'EEPROM
  eep.read(0, (byte *) &compteur, sizeof(compteur));
  if(!compteur) {
    Serial.println("Pas de data");
    return;
  }

  // On boucle sur les enregistrements

  for(int i=0; i<compteur; i++) {
    eep.read(sizeof(compteur)+i*sizeof(mesdata), (byte *) &mesdata, sizeof(mesdata));

    // Affichage

    print2digits(day(mesdata.horo), Serial);
    Serial.print("/");
    print2digits(month(mesdata.horo), Serial);
    Serial.print("/");
    print2digits(year(mesdata.horo), Serial);
    Serial.print(" ");
    print2digits(hour(mesdata.horo), Serial);
    Serial.print(":");
    print2digits(minute(mesdata.horo), Serial);
    Serial.print(":");
    print2digits(second(mesdata.horo), Serial);
    Serial.println(";");
    Serial.print("temperature : ");
    Serial.println(mesdata.temp);
    Serial.print("humidite : ");
    Serial.print(mesdata.humi);
    Serial.println("");
    //Serial.print(mesdata.pression);
    //Serial.println("");  
  }
}

// Affichage de la valeur du compteur
// C'est le numéro du dernier enregistrement en mémoire
void printcompteur() {
  int compteur;
  eep.read(0, (byte *) &compteur, sizeof(compteur));
  Serial.print(F("Valeur actuelle du compteur: "));
  Serial.println(compteur);
}

// Effacement de l'EEROM
void reinit() {
  int compteur;
  eep.read(0, (byte *) &compteur, sizeof(compteur));
  Serial.print(F("Valeur actuelle du compteur: "));
  Serial.println(compteur);

  // Uniquement si broche 2 à la masse : cavalier en place

  if(!digitalRead(2)) {
    compteur=0;
    Serial.println(F("Effacement compteur"));
    eep.write(0, (byte *) &compteur, sizeof(compteur)); // ligne croquis original
    delay(10); // utile ?
    eep.read(0, (byte *) &compteur, sizeof(compteur));
    Serial.print("Valeur actuelle du compteur: ");
    Serial.println(compteur);
  } else {
    Serial.println(F("Effacement interdit ! Mauvais mode: mesures en cours"));
    Serial.println(F("Placez le cavalier pour autoriser l'effacement"));
  }
}

// configuration
void setup() {
 
  //Wire.begin();
  Serial.begin(19200);
  //while (!Serial) {} // pour leonardo
  // Cavalier
  pinMode(2, INPUT_PULLUP);

  // initialisation gestion EEPROM

  if (eep.begin(extEEPROM::twiClock400kHz)) {
    Serial.print(F("extEEPROM erreur"));
    while (1);
  }
}

void loop() {
  unsigned long currentMillis = millis();
  String commande;
  Read_DHT22();
  delay (3000);
  // Gestion des intervalle sans delay()
  if (currentMillis - previousMillis >= 60000) {
    previousMillis = currentMillis;
    // Cavalier ?
    if(digitalRead(2))
      enreg();
    else
      Serial.println(F("Cavalier en place: pas d'enregistrement"));
  }

  // récupération d'une chaîne via le moniteur série

  while (Serial.available() > 0) {
    commande = Serial.readStringUntil('\n');
  }

  // Analyse des commandes

  // affichage des données
  if(commande == "dump")
    dump();
  // affichage du compteur
  if(commande == "compteur")
    printcompteur();
  // Effacement EEPROM
  if(commande == "reinit")
    reinit();
}

voilà pour aujourd'hui, je vais tester sur un promini et remplacer le dht22 par un bme280

Aucun commentaire:

Enregistrer un commentaire