Library Konflikt Heltec CubeCell und BlueDot BME 280

Hallo,

ich habe einen Heltec CubeCell HTTC AB-02 und binde diesen bei TTN per LoRaWAN ein. Momentan sende ich fixe Werte für Temperatur und Feuchte, möchte dies aber in Zukunft mit einem BME 280 Sensor machen (mit einem ESP32 habe ich den Sensor mit seiner Bibliothek bereits erfolgreich getestet).

Hier das Script:

#include <LoRaWan_APP.h>
#include <Arduino.h>
//#include <Wire.h>
//#include <BlueDot_BME280.h>

// Create the bme280 object
//BlueDot_BME280 bme280 = BlueDot_BME280();

/*
set LoraWan_RGB to Active,the RGB active in loraWan
RGB red means sending;
RGB purple means joined done;
RGB blue means RxWindow1;
RGB yellow means RxWindow2;
RGB green means received done;
*/

// OTAA parameters
uint8_t devEui[] = {0x70, 0xB3, ...};
uint8_t appEui[] = {0x49, 0x85, ...};
uint8_t appKey[] = {0x9E, 0x92, ...};

// ABP parameters
uint8_t nwkSKey[] = {};
uint8_t appSKey[] = {};
uint32_t devAddr = (uint32_t )0x260...;

// LoraWan channelsmask, default channels 0-7
uint16_t userChannelsMask[6] = {0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000};

// LoraWan region, select in arduino IDE tools
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;

// LoraWan Class, Class A and Class C are supported
DeviceClass_t loraWanClass = LORAWAN_CLASS;

// The application data transmission duty cycle. value in [ms].
uint32_t appTxDutyCycle = 15000;

// OTAA or ABP
bool overTheAirActivation = LORAWAN_NETMODE;

// ADR enable
bool loraWanAdr = LORAWAN_ADR;

// set LORAWAN_Net_Reserve ON, the node could save the network info to flash, when node reset not need to join again.
bool keepNet = LORAWAN_NET_RESERVE;

// Indicates if the node is sending confirmed or unconfirmed messages.
bool isTxConfirmed = LORAWAN_UPLINKMODE;

// Application port
uint8_t appPort = 2;

// Number of trials to transmit the frame, if the LoRaMAC layer did not receive an acknowledgment.
uint8_t confirmedNbTrials = 4;


void setup() {
  
  Serial.begin(115200);
  #if(AT_SUPPORT)
    enableAt();
  #endif
  deviceState = DEVICE_STATE_INIT;
  LoRaWAN.ifskipjoin();
}

void loop() {

  switch(deviceState) {

    case DEVICE_STATE_INIT: {
      #if(LORAWAN_DEVEUI_AUTO)
        LoRaWAN.generateDeveuiByChipID();
      #endif
      #if(AT_SUPPORT)
        getDevParam();
      #endif
      printDevParam();
      LoRaWAN.init(loraWanClass,loraWanRegion);
      deviceState = DEVICE_STATE_JOIN;
    break;
    }

    case DEVICE_STATE_JOIN: {
      LoRaWAN.join();
    break;
    }

    case DEVICE_STATE_SEND: {
      prepareTxFrame(appPort);
      LoRaWAN.send();
      deviceState = DEVICE_STATE_CYCLE;
    break;
    }

    case DEVICE_STATE_CYCLE: {
      // Schedule next packet transmission
      txDutyCycleTime = appTxDutyCycle + randr(0, APP_TX_DUTYCYCLE_RND);
      LoRaWAN.cycle(txDutyCycleTime);
      deviceState = DEVICE_STATE_SLEEP;
    break;
    }

    case DEVICE_STATE_SLEEP: {
      LoRaWAN.sleep();
    break;
    }

    default: {
      deviceState = DEVICE_STATE_INIT;
    break;
    }
  }
}

// Prepares the payload of the frame
static void prepareTxFrame(uint8_t port) {

  float temperature = 19.55;  // fixer Wert
  float humidity = 62.5;  // fixer Wert

  int int_temp = temperature * 100;
  int int_hum = humidity * 10; 

  appDataSize = 4;
  appData[0] = int_temp >> 8;
  appData[1] = int_temp;
  appData[2] = int_hum >> 8;
  appData[3] = int_hum;
}

Wie oben zu sehen ist, sind die zusätzlich erforderlichen Bibliotheken noch auskommentiert. So funktioniert das Script. Sobald ich die Bibliotheken jedoch einbinde, bekomme ich beim Kompilieren die folgenden Fehlermeldungen:

/Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp: In member function 'uint8_t BlueDot_BME280::init()':
/Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp:58:7: error: 'class SPIClass' has no member named 'setBitOrder'; did you mean '_bitOrder'?
   SPI.setBitOrder(MSBFIRST);        //Most significant Bit first
       ^~~~~~~~~~~
       _bitOrder
/Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp:59:7: error: 'class SPIClass' has no member named 'setClockDivider'
   SPI.setClockDivider(SPI_CLOCK_DIV4);     //Sets SPI clock to 1/4th of the system clock (i.e. 4000 kHz for Arduino Uno)
       ^~~~~~~~~~~~~~~
/Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp:59:23: error: 'SPI_CLOCK_DIV4' was not declared in this scope
   SPI.setClockDivider(SPI_CLOCK_DIV4);     //Sets SPI clock to 1/4th of the system clock (i.e. 4000 kHz for Arduino Uno)
                       ^~~~~~~~~~~~~~
/Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp:60:7: error: 'class SPIClass' has no member named 'setDataMode'; did you mean '_dataMode'?
   SPI.setDataMode(SPI_MODE0);        //Set Byte Transfer to (0,0) Mode
       ^~~~~~~~~~~
       _dataMode
In file included from /Users/martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.h:9,
                 from /Users/Martin/Documents/Arduino/libraries/BlueDot_BME280_Library/BlueDot_BME280.cpp:10:
/Users/martin/Library/Arduino15/packages/CubeCell/hardware/CubeCell/1.5.0/cores/asr650x/Wire/Wire.h: In member function 'uint8_t BlueDot_BME280::readByte(byte)':
/Users/martin/Library/Arduino15/packages/CubeCell/hardware/CubeCell/1.5.0/cores/asr650x/Wire/Wire.h:117:13: note: candidate 1: 'uint8_t TwoWire::requestFrom(int, int)'
     uint8_t requestFrom(int address, int size);
             ^~~~~~~~~~~
/Users/martin/Library/Arduino15/packages/CubeCell/hardware/CubeCell/1.5.0/cores/asr650x/Wire/Wire.h:115:13: note: candidate 2: 'uint8_t TwoWire::requestFrom(uint8_t, uint8_t)'
     uint8_t requestFrom(uint8_t address, uint8_t size);
             ^~~~~~~~~~~

exit status 1

Compilation error: exit status 1

Sehe ich das richtig, dass die Bibliotheken hier nicht wirklich kompatibel sind, oder gibt es eine Lösung für das Problem?

P.S.: Ich hatte das Script bereits fix und fertig für die Messung der Daten, habe die Änderungen dann aber rückgängig gemacht, da ich die Fehlermeldungen nicht verstanden habe und fange quasi am Anfang neu mit dem Einbinden der Bibliotheken an ..

Vielen Dank!
Martin

Dein Blue dot bme ist doch i2c nix mit SPIund was für modul ist das?

Doch, der hat bereits:

https://www.amazon.de/gp/aw/d/B072N8DJD5?psc=1&ref=ppx_pop_mob_b_asin_title

Kann auch i2c also normalle BME lib nechmen, dazu 2
Stripen gespart
SDI=SDA
SCK=SCL
BME ist und bleibt BME

Hallo,

danke. Ich habe jetzt ein Script gefunden, welches angeblich mit dem CubeCell funktionieren soll. Zumindest gibt es hier keine Probleme mit den anderen Bibliotheken.
Wenn ich nur dieses Script testweise auf das Bord hochlade, passiert jedoch gar nichts. Nicht eine einzige Ausgabe auf dem seriellen Port:

/*
 * bme280_example.ino
 * Example sketch for bme280
 *
 * Copyright (c) 2016 seeed technology inc.
 * Website    : www.seeedstudio.com
 * Author     : Lambor
 * Create Time:
 * Change Log :
 *
 * The MIT License (MIT)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#include "Seeed_BME280.h"
#include <Wire.h>

BME280 bme280;

void setup()
{
  Serial.begin(115200);
  
  if(!bme280.init()){
    Serial.println("Device error!");
  }
  else {
    Serial.println("BME ready");
  }
}

void loop()
{
  float pressure;

  //get and print temperatures
  Serial.print("Temp: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//The unit for  Celsius because original arduino don't support speical symbols

  //get and print atmospheric pressure data
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure());
  Serial.println("Pa");

  //get and print altitude data
  Serial.print("Altitude: ");
  Serial.print(bme280.calcAltitude(pressure));
  Serial.println("m");

  //get and print humidity data
  Serial.print("Humidity: ");
  Serial.print(bme280.getHumidity());
  Serial.println("%");

  delay(1000);
}

Dan stelle mall deine IDE ein.

Und ist der BME auf I2C ungeklemmt ? Seeed_BME ist reine I2C Lib.

Danke, aber daran liegt es nicht. Ich habe jetzt mal die Setup Funktion so verändert:

void setup()
{
  Serial.begin(115200);
  Serial.println("Ready");
  
  if(!bme280.init()){
    Serial.println("Device error!");
  } else {
    Serial.println("Device ok!");
  }
}

Dann erscheint schon mal das Ready :slight_smile:

Ja, nutze nur I2C.

Beim CubeCell wird normalerweise pin 39 = SCL mit SCK vom BME und pin 40 = SDA mit SDI vom BME verbunden wenn ich das richtig sehe ..

Keine Warnung nix bei Kompilieren?
Vermute das die Libs wollen nicht mit deiner MCU,

Nein

Ja, denke ich auch, aber in den CubeCell Foren wird berichtet, dass es mit dieser Bibliothek gehen soll, andere empfehlen auch es mit dieser zu versuchen:

https://github.com/HelTecAutomation/CubeCell-Arduino/blob/master/libraries/LoRa/examples/LoRaWAN/LoRaWAN_Sensors/LoRaWan_HDC1080/LoRaWan_HDC1080.ino

versuch mall mit Ada, ist ziemlich universal aber nicht das Gelbe vom EI

HDC1080 ist ganz anderer Sensor, hat nur Temp und Hum, kein Druck.

Ich habe noch eine Lib für Attiny ist sehr schlank ohne Schnickschnack :wink:
Ist auch ein versuch wert.

Danke, Adafruit habe ich schon probiert. Passiert auch gar nix, keine einzige Zeile im seriellen Monitor. Ich vermute, ich muss erst mal checken ob die Pins richtig zugeordnet sind und die I2C Adresse stimmt. Ich melde mich wenn ich weiter gekommen bin :slight_smile:

Mit dem I2C Tester aus den CubeCell Beispielen ergibt sich schon mal “no I2C device found”, was seltsam ist. Ich prüfe weiter ..

Ist eine Möglichkeit das Display abklemmen ? Er hängt auch auf I2C wie ich im Pinout gesehen habe

Im Datenblatt des CubeCell steht ganz klar drin, dass ich neben den SCL und SDA Pins für das Display auch noch GPIO8 und 9 für I2C mit externen Geräten nutzen kann. Wenn ich das Display nicht nutze, sollten die Standard-Pins doch auch für einen Sensor funktionieren, oder?

In der Variante HTTC AB-02S wird der zweite I2C Zugang (Pins 8 und 9) vom GPS genutzt.

Abklemmen kann und will ich erst mal nichts .. Habe beide Varianten s.o. bereits ausprobiert.

In den Foren wird aber auch immer wieder über I2C Probleme bei den Heltec Boards berichtet.
Ich taste mich da mal langsam ran ..

Nicht unbedingt man weis nicht was die Pins machen wen nicht benutzt.
Ich habe mal I2C LCD mit 2 Nanos angesteuert funktionierte wunderbar solange beide "Saft" hatten war eine aus wa Finito :wink:
Du kannst den zweiten Port nutzen in dem du Wire die Pins zuweist

Wire.begin(SDA, SCL);

So wird es gemacht bei ESP wen man nicht die definierte Pins nutzt.
Danach sollte der Scanner den finden, und funktionieren