• Microcontrôleur

    Project Arduino

    Voici le listing d’un petit logiciel qui m’occupe ces derniers jours… A la base c’etait pour tester un capteur de pression atmosphérique/température BMP280 et un petit écran OLED sur un microcontrôleur PIC en langage BASIC (sous ProtonIDE). Comme il existe des bibliothèques toutes prêtes sur Arduino j’ai utilisé un Arduino UNO et quelques fils sur une plaque d’essai pour mon montage. J’ai remarqué que la température était plus élevée de deux degrés que la valeur lue de mon thermomètre , j’ai aussi utilisé un capteur DS18B20 qui semble plus précis. Voici le listing du code et quelques photos du montage…

    /*
     * Arduino with SSD1306 OLED display (128x64 Pixel) and
     * BMP280 barometric pressure & temperature sensor.
     * Ajout capteur ds18B20  par Carlos Pires Serra 
     */
     
    #include <Wire.h>              // include Arduino wire library (required for I2C devices)
    #include <Adafruit_SSD1306.h>  // include Adafruit SSD1306 OLED display driver
    #include <Adafruit_BMP280.h>   // include Adafruit BMP280 sensor library
    #include <OneWire.h>           // bibliotheque OneWire
    #include <DS18B20.h>           // bibliotheque DS18B20
     
    #define OLED_RESET  4          // define display reset pin
    Adafruit_SSD1306 display(OLED_RESET);  // initialize Adafruit display library
     
    // define device I2C address: 0x76 or 0x77 (0x77 is library default address)
    #define BMP280_I2C_ADDRESS  0x76
    #define ONE_WIRE_BUS 2          // Pin D2 pour le bus onewire
    OneWire oneWire(ONE_WIRE_BUS);  // initialisation des
    DS18B20 sensor(&oneWire);       // bibliotheques
    Adafruit_BMP280  bmp280;  // initialize Adafruit BMP280 library
     
    void setup(void)
    {
      delay(1000);            // wait a second
      sensor.begin();         // Demarrage capteur ds18B20
     
      // initialize the SSD1306 OLED display with I2C address = 0x3C
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
     
      // clear the display buffer.
      display.clearDisplay();
     
        display.setTextSize(1);              // text size = 1
        display.setTextColor(WHITE, BLACK);  // set text color to white and black background
        display.setCursor(0, 0);             // move cursor to position (15, 0) pixel
     // display.println("BMP280 SENSOR");
        display.display();                   // update the display
     
      // initialize the BMP280 sensor
      if( bmp280.begin(BMP280_I2C_ADDRESS) == 0 )
      {  // connection error or device address wrong!
        display.setTextSize(1);              // text size = 1
        display.setCursor(0, 0);
        display.println("Connection");
        display.print("Error");
        display.display();                   // update the display
        while(1);                            // stay here
      }
     
      display.display();                     // update the display
     
     
    }
     
    char _buffer[9];
     
    void loop()
    {    
      display.clearDisplay();
      display.setCursor(0, 0);
      sensor.requestTemperatures();
      while (!sensor.isConversionComplete());  // wait until sensor is ready
      
      // get temperature and pressure from library
      float temp     = bmp280.readTemperature();   // get temperature
      float pressure = bmp280.readPressure();      // get pressure
     
      // print data on the LCD
      // 1: print temperature
      if(temp < 0)
        sprintf(_buffer, "-%02u.%02u C", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
      else
        sprintf(_buffer, " %02u.%02u C", (int)temp, (int)(temp * 100) % 100 );
      display.print("Temperature:");
      display.println(_buffer);
     
     
      // 2: print pressure
      sprintf(_buffer, "%04u.%02u", (int)(pressure/100), (int)((uint32_t)pressure % 100));
      display.print("Pression: ");
      display.print(_buffer);
      display.println(" hPa");
      display.println();
      
      display.print("Temp_18B20 : ");               // Affichage Temperature du DS18B20
      display.print(sensor.getTempC());
      display.println(" C");
     
      
      // update the display
      display.display();
      
     
      delay(2500);  // Attente 2.5 secondes pour la prochaine lecture
     
    }