Comment gérer le système? Fabrication d’un banc de mesure.

Rapidement lors de nos discussions il a été évident que nous réaliserions la gestion du système avec des microcontroleurs. Cela nous permettrait de gérer les sondes de températures mais aussi la température elle même.

Notre choix s’est porté vers le système arduino pour commencer et faire nos tests. Nous avions des composants dans les fonds de tiroir et nous pouvions déjà jouer sur cette partie. Bien entendu nous devions en parallèle avancer sur la partie biologie de l’abeille, conditions de chauffement (lent ou rapide?) l’hydrométrie … il reste du travail…

Nous avons donc décidé de monter dans un premier temps un banc de mesure avec une arduino, 2 i2C 1wire, un LM35 et un BME280 pour analyser la température dans les différents endroits de la ruche.

Les sondes 1wire sont basées sur des DS18B qui sont relativement fiables et précises à 0,5°c.

Photo de TheEngineeringProjects.com

Le LM35 quand à lui n’est pas connectable en I2C mais s’interface très bien avec l’arduino.

Et pour finir le très connu BME280 qui va nous permettre de mesurer la température mais aussi l’hydrométrie…

Ce qui nous donne cela :

De façon à exploiter cela, nous envoyons les données collectées sur le port série qui grace à l’outil putty nous permet d’enregistrer les données en format csv utilisable sous libreoffice.

Le LCD nous permet de suivre l’évolution des 4 capteurs de température pendant la mesure pour s’assurer que tout fonctionne et aussi, avouons le, nous sommes curieux 😉

Avec comme code source:

                                //Compatible with the Arduino IDE 1.0
//Library version:1.1
// #############################
//librairie ecran lcd
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//Libraries temperature
#include <OneWire.h> 
#include <DallasTemperature.h>

//###############################
//Configuration
//ecran
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

//sondes temperature
// Data wire is plugged into pin 2 on the Arduino 
#define ONE_WIRE_BUS 2 
// Setup a oneWire instance to communicate with any OneWire devices  
// (not just Maxim/Dallas temperature ICs) 
OneWire oneWire(ONE_WIRE_BUS); 
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
float Capteur1;
float Capteur2;
float BME280temperature;
float difference;
float differenceLM35;

/* LM35 analog temperature sensor with Arduino example code. More info: https://www.makerguides.com */
// Define to which pin of the Arduino the output of the LM35 is connected:
#define sensorPin A0


//BME280
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>


#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C


unsigned long delayTime;


void setup()
{
  Serial.begin(9600);           //  setup serial
  lcd.init();                      // initialize the lcd 
 sensors.begin();                // initialize the sensor

  // Print a message to the LCD.
  lcd.backlight();
   lcd.setCursor(1,0);
  lcd.print("Banc de mesure");
  lcd.setCursor(1,1);
  lcd.print("Version 1.3");
  delay (1000);



  //bme280
  bool status;
  
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  status = bme.begin(0x76); 


//########### CALIBRATION ###########"
 // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures(); 
  /// get temperatures from I2C DS18B
    //tempC = sensors.getTempCByIndex(i);
    Capteur1 = sensors.getTempCByIndex(0);
    Capteur2 = sensors.getTempCByIndex(1);
    BME280temperature = bme.readTemperature();

    // Get a reading from the temperature sensor LM35:
  int LM35reading = analogRead(sensorPin);
  // Convert the reading into voltage:
  float LM35voltage = LM35reading * (5000 / 1024.0);
  // Convert the voltage into the temperature in degree Celsius:
  float LM35temperature = LM35voltage / 10;

  //harmonize temperature
float Tempmoyenne = (Capteur1 + Capteur2)/2;
difference = BME280temperature - Tempmoyenne;
differenceLM35 = LM35temperature - Tempmoyenne;
  

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Calibration...");
  lcd.setCursor(0,1);
  lcd.print("calcul moyenne");
   delay (1000);
   
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("1:");
  lcd.print(Capteur1);
  lcd.print(" 2:");
  lcd.print(Capteur2);
  lcd.setCursor(0,1);
  lcd.print("==> moy:");
  lcd.print(Tempmoyenne);
  delay (6000);
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Calibration BME");
  lcd.setCursor(0,1);
  lcd.print("bme280-moy=");
  lcd.print(difference);
  delay (2000);

  lcd.clear();
  lcd.print("Calibration LM");
  lcd.setCursor(0,1);
  lcd.print("LM35");
  lcd.setCursor(0,1);
  lcd.print("LM35-moy=");
   lcd.print(differenceLM35);

  delay (2000);
 

  

}


void loop()
{

  
 // Send command to all the sensors for temperature conversion
  sensors.requestTemperatures(); 
  
  /// get temperatures from I2C DS18B
    //tempC = sensors.getTempCByIndex(i);
    Capteur1 = sensors.getTempCByIndex(0);
    Capteur2 = sensors.getTempCByIndex(1);

// Get a reading from the temperature sensor LM35:
  int LM35reading = analogRead(sensorPin);
  // Convert the reading into voltage:
  float LM35voltage = LM35reading * (5000 / 1024.0);
  // Convert the voltage into the temperature in degree Celsius:
  float LM35temperature = LM35voltage / 10;
  LM35temperature = LM35temperature - differenceLM35;



  //BME280
  float BME280temperature = bme.readTemperature();
  float BME280humidity = bme.readHumidity();

  //harmonize temperature
BME280temperature = BME280temperature - difference;

// ################### DISPLAY SERIAL   ###################

    //I2C+LM35
      Serial.print(Capteur1);
      Serial.print(";");
Serial.print(Capteur2);
Serial.print(";");
Serial.print(LM35temperature);
Serial.print(";");
Serial.print(BME280temperature);
Serial.print(";");
Serial.print(BME280humidity);
Serial.print(";");
  Serial.println(); 
     
// ###### DISPLAY LCD ###############

     
 lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("1:");
  lcd.print(Capteur1);
  lcd.print(" 3:");
  lcd.print(LM35temperature);

  lcd.setCursor(0,1);
  lcd.print("2:");
  lcd.print(Capteur2);
  lcd.print(" 4:");
  lcd.print(BME280temperature);



  delay(1000);

} 

Laisser un commentaire