BME280 I2C от LCTECH

Тема в разделе "Флудилка", создана пользователем parovoZZ, 24 май 2018.

  1. parovoZZ

    parovoZZ Гуру

    Здарова!

    Приехал ко мне сабж. Так как к его приезду был не готов, то решил проверить его по-быстренькому. Подключил к нано, залил библу от адафрита. Залил пример. Не пошло. Ладно. Подключил к лео, залил пример. Опять не пошло.
    Модуль такой
    [​IMG]
    Вообще, хотел SPI выписать, но что-то тупанул или во сне был. Купил I2C.
    Вот не понимаю - то ли сборка полевиков умерла, то ли с адресом замуты. Кто работал с таким? Я сейчас другим проектом занят - разбираться некогда. ыыыыы
     
  2. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Взял тут:
    https://mysku.ru/blog/aliexpress/52057.html

    Добавлено. Как оказалось, есть версия платы от sparkfun, которая имеет дефолтный I2C адрес: 0x77. При её использовании нужно в скетче раскомментировать строчку «BME280I2C bme(0x1, 0x1, 0x1, 0x1, 0x5, 0x0, false, 0x77);»

    и вот:
    Код (C++):
    /*
    Vin (Voltage In)    ->  3.3V
    Gnd (Ground)        ->  Gnd
    SDA (Serial Data)   ->  A4 on Uno/Pro-Mini
    SCK (Serial Clock)  ->  A5 on Uno/Pro-Mini
    */


    #include <BME280I2C.h>
    #include <OLED_I2C.h>

    #define PLOT_LEN      100
    #define STORAGE_TIME  270

    OLED  myOLED(SDA, SCL, 8);
    BME280I2C bme;

    // Temperature Oversampling Rate, Humidity Oversampling Rate, Pressure Oversampling Rate, Mode, Standby Time, Filter, SPI Enable, BME280 Address
    // BME280I2C bme(0x1, 0x1, 0x1, 0x1, 0x5, 0x0, false, 0x77); // Version for SparkFun BME280
     
    extern uint8_t BigNumbers[];
    extern uint8_t SmallFont[];

    struct {
      byte temp = 0;
      byte hum = 0;
      byte pres = 0;
    } infoArr[PLOT_LEN];

    struct {
      float temp = 0;
      float hum = 0;
      float pres = 0;
      int counter = 0;
    } avrg;

    byte wait_cnt = 0;
    bool fastMode = true;

    void setup() {
      myOLED.begin();
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, HIGH);
      delay(100);
      digitalWrite(LED_BUILTIN, LOW);

      while (!bme.begin()) {
        // if bme280 not found - blink LED
        delay(500);
        digitalWrite(LED_BUILTIN, HIGH);
        delay(500);
        digitalWrite(LED_BUILTIN, LOW);
      }
      delay(500);
    }

    void loop() {
      bool metric = true;
      float temp(NAN), hum(NAN), pres(NAN);
      uint8_t pressureUnit(0); // unit: B000 = Pa, B001 = hPa, B010 = Hg, B011 = atm, B100 = bar, B101 = torr, B110 = N/m^2, B111 = psi

      bme.read(pres, temp, hum, metric, pressureUnit);
    //  temp -= 0.3; // correct temp
      pres /= 133.3; // convert to mmHg

      myOLED.setBrightness(10);
      myOLED.clrScr();
      myOLED.setFont(BigNumbers);
      myOLED.print(String(temp, 1), 0, 0);
      myOLED.print(String(hum, 0), 92, 0);
      myOLED.print(String(pres, 1), 42, 40);

      myOLED.setFont(SmallFont);
      myOLED.print("~C", 56, 0);
      myOLED.print("%", 122, 0);
      myOLED.print("MM", 114, 58);
      myOLED.update();

      avrg.temp += temp;
      avrg.hum += hum;
      avrg.pres += pres;
      avrg.counter++;

      if (fastMode && avrg.counter >= STORAGE_TIME) {
        fastMode = false;
        for (int i = 0; i < PLOT_LEN - 1; i++) {
          infoArr[i].temp = 0;
          infoArr[i].hum = 0;
          infoArr[i].pres = 0;
        }
      }

      if (fastMode || avrg.counter >= STORAGE_TIME) {
        if (avrg.counter >= STORAGE_TIME) {
          temp = avrg.temp / avrg.counter;
          hum = avrg.hum / avrg.counter;
          pres = avrg.pres / avrg.counter;
          avrg.temp = 0;
          avrg.hum = 0;
          avrg.pres = 0;
          avrg.counter = 0;
        }
        for (int i = 1; i < PLOT_LEN; i++) {
          infoArr[i - 1] = infoArr[i];
        }
        infoArr[PLOT_LEN - 1].temp = round(temp) + 50;
        infoArr[PLOT_LEN - 1].pres = round(pres) - 650;
        infoArr[PLOT_LEN - 1].hum = round(hum);
      }
      delay(1000);

      /*
        Graph
      */


      if (wait_cnt > 3) {
        wait_cnt = 0;
        myOLED.clrScr();

        byte minTemp = 255;
        byte minHum = 255;
        byte minPres = 255;
        byte maxTemp = 0;
        byte maxHum = 0;
        byte maxPres = 0;

        for (int i = PLOT_LEN - 1; i >= 0 ; i--) {
          if (infoArr[i].temp == 0 && infoArr[i].hum == 0 && infoArr[i].pres == 0) break;

          if (infoArr[i].temp < minTemp) minTemp = infoArr[i].temp;
          if (infoArr[i].hum < minHum) minHum = infoArr[i].hum;
          if (infoArr[i].pres < minPres) minPres = infoArr[i].pres;

          if (infoArr[i].temp > maxTemp) maxTemp = infoArr[i].temp;
          if (infoArr[i].hum > maxHum) maxHum = infoArr[i].hum;
          if (infoArr[i].pres > maxPres) maxPres = infoArr[i].pres;
        }
        if (maxTemp - minTemp < 10) maxTemp = minTemp + 10;
        if (maxHum - minHum < 10) maxHum = minHum + 10;
        if (maxPres - minPres < 10) maxPres = minPres + 10;


        myOLED.setFont(SmallFont);
        myOLED.print(String(minTemp - 50), 0, 12);
        myOLED.print(String(maxTemp - 50), 0, 2);

        myOLED.print(String(minHum), 0, 34);
        myOLED.print(String(maxHum), 0, 24);

        myOLED.print(String(minPres + 650), 0, 56);
        myOLED.print(String(maxPres + 650), 0, 46);

        int x = 24;
        for (int i = 0; i < PLOT_LEN - 1; i++) {
          if (infoArr[i].temp == 0 && infoArr[i].hum == 0 && infoArr[i].pres == 0) continue;

          myOLED.drawLine(x, map(infoArr[i].temp, minTemp, maxTemp, 18, 0), x + 1, map(infoArr[i + 1].temp, minTemp, maxTemp, 18, 0));
          myOLED.drawLine(x, map(infoArr[i].hum, minHum, maxHum, 40, 22), x + 1, map(infoArr[i + 1].hum, minHum, maxHum, 40, 22));
          myOLED.drawLine(x, map(infoArr[i].pres, minPres, maxPres, 62, 44), x + 1, map(infoArr[i + 1].pres, minPres, maxPres, 62, 44));

          x++;
        }

        myOLED.update();

        delay(2000);
      }

      wait_cnt++;

    }
     
     
    arkadyf нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Да, оказался на 76 адресе, зараза. Показания, только, смущают - 31 процент влажности на кухне. Такого быть не может.