準備
コンパイル
I2Cというシリアルバスで通信を行います。
その時に必要になるアドレス(特定のチップを特定するためのアドレス)を設定しなければいけません。
これはBME280のSDO端子をGNDに接続するか、それともVINに接続するかで2とおりの設定が可能です。
今回はGNDに接続して、0x76としています。
モジュールによって異なりますが、今回上記で示したBME280のモジュールの場合、BME280チップの左下にある部分の左側をハンダでブリッジすれば0x76となります。
(なにも手を加えない状態で左と中央がブリッジした状態になっているものもあるようで、逆にアドレスを0x77にする場合は、左と中央の間をカッター等で切断する作業が必要になります。入手したモジュールの当該部分を拡大して確認する必要があります)

老眼になりかけの私には辛い作業...
ESP32の凄いところはピンアサインやプルアップ、プルダウン状態をプログラムで変更したりできることです。 このため、ブレットボートでよく見るジャンパーワイヤーが乱れ咲きになることを極力さけ、美しく(?)仕上げることができます。
BME280モジュールとESP32の接続は4箇所です。
本来、SDA, SCLは3.3Vにプルアップする必要がありますが、ESP32で内部的にプルアップするようにしていますので、たぶんプルアップ抵抗は不要です。
適当なGPIOを探して、BME280を接続してください。
私の場合、物理的な場所の関係から25,26を使いましたが、素直に21,22を使った方がいいかもしれません。
I2Cとして利用できるGPIOは、原則、4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27らしいです。ボードによっては、他の用途に既に使われているかもしれません。 21,22であれば、間違いなくI2C用に空けてあると思います。
WiFiを使う場合は25は使えないとのことなのですが、なぜか私の場合、動いています。 ん???DACを使わなければ大丈夫ということなのかな? この辺がよく理解できていない自分...(後で調べます)


※念のため、プルアップ抵抗を入れています(笑)
M5Stackは、3.3V, GND, SDA(21), SCL(22)がお行儀よく(?)並んでいますので、そこを利用します。 私が今回購入したBME280のモジュールはピンの並びが Vin(3.3V), GNS, SCL, SDAとなっていてM5StackとはSCL, SDAの並びが逆になっていますが、これはプログラム上でSDAとSCLを入れ替えればいいので、問題ありません。 M5Stackの場合、内蔵している機器(LCD, アンプなど)に既に利用されている場合があるので、その他ピンを利用する場合は、関連資料を調べてください。


M5Stackの上部にBME280モジュールを直接させますが、M5Stackの発熱の影響を受け、数度気温が高い状態で測定されてしまいます。 したがって、ジャンパーワイヤー(オスメスの4線) を使って、適度にM5StackとBME280を離す必要があります。
必要に応じて、 LEDを電流制御用の抵抗を入れてどこかのGPIOとGNDに接続してください。なくても構いません。
ESP32は発熱が大きく、その影響が気温(結果として湿度にも)影響がでますので、次のような対策が必要です。