2022年4月30日土曜日

obniz memo②two-obniz, arducam-mini, ifttt, periodic run,sleep,uart/uno

<!-- HTML Example -->
<html>

<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.com/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.3.0/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>Dial to Servo(two obniz)</h1>

<script>
var obnizA = new Obniz("");
obnizA.onconnect = async function () {
var obnizB = new Obniz("");
obnizB.onconnect = async function(){
var meter = obnizA.wired("Potentiometer", {pin0:0, pin1:1, pin2:2});
var servo = obnizB.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
meter.onchange = function(position) {
servo.angle(position * 180);
};
}
}
</script>
</body>
</html>

これで、片方のポテンショをまわすとサーボがうごく おもろい

-------------------- arducam mini plus ----------------------------------------

https://iot-gym.com/arducammini-obniz/ を基本とするがakizukiの取り扱い品が

mini-2m から mini-2m-plusになっていたので、以下のサイトを参照する

https://qiita.com/y-hira/items/0a1f4a69f1b1e858a916  繰り返すが本修正が必須! 

なお本サイトではvccが省略されていて、外部電源仕様だからそれが必須!

ストリーム表示でも同様だ!

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@latest/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<img id="image">

<script>
var obniz = new Obniz("4998-4317"); //obnizIDを入力する
obniz.onconnect = async function () {
var cam = obniz.wired("ArduCAMMini", { cs:0, mosi:1, miso:2, sclk:3, gnd:4, vcc:5, sda:6, scl:7 });
await cam.startupWait();
const data = await cam.takeWait('320x240'); // これでも写真がでるのが結構遅い
 //'160x120'or'176x144'or'320x240'or'352x288'or'640x480'or'800x600'or'1024x768'or'1280x960'or'1600x1200'を指定する
data.unshift(255); // ここが重要!
console.log("image size = " + data.length + " bytes");
const base64 = cam.arrayToBase64(data);
document.getElementById("image").src = "data:image/jpeg;base64, " + base64;
}
</script>
</body>
</html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>

<script src="https://unpkg.com/obniz@latest/obniz.js"></script>

</head>

<body>

<div id="obniz-debug"></div>

<img id="image">

<script>

var obniz = new Obniz("5312-1232");  //obnizIDを入力する

obniz.onconnect = async function () {

  var cam = obniz.wired("ArduCAMMini", { cs:0, mosi:1, miso:2, sclk:3, gnd:4, sda:6, scl:7 });

  await cam.startupWait();

  while (true) { //これでストリームとなる

  const data = await cam.takeWait('160x120'); //'160x120'or'176x144'or'320x240'or'352x288'or'640x480'or'800x600'or'1024x768'or'1280x960'or'1600x1200'を指定する

   data.unshift(255); 

  console.log("image size = " + data.length + " bytes");

  const base64 = cam.arrayToBase64(data);

  document.getElementById("image").src = "data:image/jpeg;base64, " + base64;

 }

}

</script>

</body>

</html>

これでストリームもいけた

ーーIFTTTーーー 

https://qiita.com/y-hira/items/de7e8d5c2e8e4c1c4acdでやってみた

一応セットアップすると1回は保存されたが、一度ブラウザとじないと

10分ごとの記録にならない 要注意!  temp-check-iftttに保存

ーーブロックプログラムで定期実行の注意点 ----ーーーー

https://qiita.com/youtoy/items/668ffd93f6dea3d7a2de 

webhookで実行されるブロックプログラムができた、スイッチが押されると実行もできた

定刻実行や、ハードオンで実行も多分OK

  javascript/htmlのウエブアプリとちがい、block-programmingのウエブアプリは

最後にクラウドで実行中なら。。。のブロックが必要 キモは一旦アプリを終わること!

あとは10分ごとに自動実行される!


ーーーーーーーーースリープ機能ーーーーーー
例題のhtml/jsアプリは勝手に電源オフとなり、以後定期的にオンとなる
https://blog.obniz.com/maketag/obniz-board-1y に詳しい ブロックアプリでも、
上記block-programのあとにsleepをいれて、定期実行と組み合わせるとOK

ーーーーーーーーfrom obniz docs ーーーーーーーーーーーーーーーー
obniz.onconnect = async function(){
var baud = 115200; // configration for UNO
obniz.uart0.start({tx: 0, rx: 1, baud:baud });
obniz.uart0.onreceive = async function(data, text) {
console.log(text);
}
}

xiaoOnRp2040-attiny85-13a-44a-usbasp esp32-cam latest memo

-------------------------xiaopico as arduino------------------------------------

https://learn.adafruit.com/rp2040-arduino-with-the-earlephilhower-core?view=all 

を参考にindex.jsonファイルを指定 あとは指示どうりにボードをインスト

https://mashigure.hateblo.jp/entry/2022/05/07/194808 ではボード選びのキモが記載

つまりRaspicoのなかのseeed xiao rp2040を選ぶと外部ピン(D0,A0...)がつかえる! 

https://qiita.com/MergeCells/items/73273dac1d1327cfa3f2 は2種のLEDのつかいわけ

https://aloseed.com/it/xiao_rp2040/ はRGBのLチカでレインボー(混色不良だが)

red,green,blueの番号が16,17,25でありLOWで光るので全部消すにはHIGH!

https://aloseed.com/it/qt_py_rp2040/#toc6 でneopixelもいけた 混色良好

コインサイズ Arduino互換機 Seeeduino XIAO を使ってみた - Qiita にあるように

D6,D7のTx、RxはSerial1で用いる 以下を参照のこと!

#define LEDpin D1

 int BTint = 0; 本当は char BTintとしたほうが以下のコードと整合的

 void setup() 

{

  pinMode(LEDpin,OUTPUT);

   Serial1.begin(9600);  // serial1 !

}

 void loop()

{

     if (Serial1.available())

     {  

         BTint = Serial1.read();

         if(BTint == '1'){          

           digitalWrite(LEDpin,HIGH);

         } else if(BTint == '0'){

           digitalWrite(LEDpin,LOW);

         }

     }

 delay(500);

}

ー--------------------------------------------------------------------

attiny85で動かしたがattiny13aでもいけるはず

ちなみにattiny44aでPA0~7は0~7,PB2は8でいけた、PBはリセットと水晶発振で

占められており、使えるのはPB2のみである

#define LED_BUILTIN 0

#define PIR 1

// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED_BUILTIN, OUTPUT);

  pinMode(PIR, INPUT);

}


// the loop function runs over and over again forever

void loop() {

  if (digitalRead(PIR)==HIGH) {

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

  delay(1000);                       // wait for a second

  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW

  delay(1000);                       // wait for a second

  }  else {

    digitalWrite(LED_BUILTIN, LOW);

  }

}

---------------esp32-cam latest---------------------------------------

 https://randomnerdtutorials.com/esp32-cam-video-streaming-face-recognition-arduino-ide/  一番くわしいが英語

https://shinog.jp/computer/arduino/esp32-cam-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/ がベスト

https://enjoy-life-fullest.com/2020/08/16/post-467/ も重要

https://shigeru-orikura.com/2020/05/09/esp32-cam_setting/ もそこそこ

usb-serial は5v連結にしてつかうこと!(Unoクローンと一緒)

2022年4月24日日曜日

esp32⑤(dht11, spi:sdc,i2c::bme280, rtc, RTC/LCD,RTC/BME/LCD )

ESP32 DevKitCにDHT11つけてみた - Qiita

--------------------------------------------------------------

SDCはSPIでバイブルどうり

---------------BME280------------------

注意!i2cレベルシフタで5v,sda,sclを3v,sda,sclでうけても稼働Vを受けてるわけじゃない

よって、bmeのvccに3.3vを供給する必要がある!

 https://wak-tech.com/archives/1642#i-2 でbme280に成功,バイブルと回路少し違う

要注意だ 3v駆動なので5v駆動のlcd,rtc,sdcと組み合わせるのは。。。。

http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc201/doc20103.html では

可能なようでもあるが。。。。

---------------------RTC--------------------------------------------

http://jh7ubc.web.fc2.com/arduino/Arduino_RTC_DS1307.html 

でamazon手持ちをテストして成功

4月28日18時36分、木曜(4)、2022年でセットした 電池切れとか外れに注意

#include <Wire.h>

#define RTC_address 0x68

char *week[] = {"日","月","火","水","木","金","土"};

uint8_t REG_table[7]; // データ表示用

void setup() {

Wire.begin();

Serial.begin(115200);

//RTCにデータを書き込む

Wire.beginTransmission(RTC_address);

Wire.write(0x00);//Register 先頭アドレス この手続きの意義は不明

Wire.write(0x36);//second 16進表記で年月日時分秒をBCD表現

Wire.write(0x36);//minute

Wire.write(0x18);//hour

Wire.write(0x04);//week

Wire.write(0x28);//day

Wire.write(0x04);//month

Wire.write(0x22);//year

Wire.endTransmission();

}


void loop() {

Wire.beginTransmission(RTC_address);

Wire.write(0x00);//Register 先頭アドレス この意義は不明

Wire.endTransmission();

//RTCデータの読み込み

Wire.requestFrom(RTC_address,7); 

for(int i=0;i<=7;i++){

REG_table[i]=Wire.read();

}


//RTCデータ表示

Serial.print("20");

Serial.print(REG_table[6],HEX);//year

Serial.print("/");

Serial.print(REG_table[5],HEX);//month

Serial.print("/");

Serial.print(REG_table[4],HEX);//day

Serial.print("(");

Serial.print(week[REG_table[3]]);//week

Serial.print(") ");

Serial.print(REG_table[2],HEX);//hour

Serial.print(":");

Serial.print(REG_table[1],HEX);//minute

Serial.print(":");

Serial.print(REG_table[0],HEX);//second

Serial.println();

delay(1000);

}

附:ESP32でRTCモジュールを使う - すいすいSwift (swiswiswift.com)  

単に読むだけ、上記セットが成功したら、こちらのほうが簡単かもしれない

//<DS1307RTC.h>を一番上に持ってくる

#include <DS1307RTC.h>

#include <Wire.h>


void setup() {

  Serial.begin(115200);


  //set SDA and SCL port

  //SDA:21 SCL:22 is default

  //Some ports can not be used?

  //SDAとSCLを設定する。

  //SDA:21 SCL:22がデフォルトらしい

  //Wire.begin(SDA,SCL) でSDAとSCLの番号を変える

  //動くポート番号と動かないポート番号がある?

  Wire.begin(21,22);   // ArduinoUnoは4,5がデフォルトにて記載不要だった

}


void loop() {

  tmElements_t tm;


  if (RTC.read(tm)) {

    Serial.print("Ok, Time = ");

    print2digits(tm.Hour);

    Serial.write(':');

    print2digits(tm.Minute);

    Serial.write(':');

    print2digits(tm.Second);

    Serial.print(", Date (D/M/Y) = ");

    Serial.print(tm.Day);

    Serial.write('/');

    Serial.print(tm.Month);

    Serial.write('/');

    Serial.print(tmYearToCalendar(tm.Year));

    Serial.println();

  } else {

    if (RTC.chipPresent()) {

      Serial.println("The DS1307 is stopped.  Please run the SetTime");

      Serial.println("example to initialize the time and begin running.");

      Serial.println();

    } else {

      Serial.println("DS1307 read error!  Please check the circuitry.");

      Serial.println();

    }

    delay(9000);

  }

  delay(1000);

}


void print2digits(int number) {

  if (number >= 0 && number < 10) {

    Serial.write('0');

  }

  Serial.print(number);

}

ーーーーーーーーーーーーーRTC LCD ーーーーーーーーーーーーーーーーーーーーーーー

http://www.picfun.com/c15.html カスケードは、これがくわしいが。。。

https://burariweb.info/electronic-work/arduino-learning/arduino-rtc-ds3231-i2c-module.html はI2cを二本別々にとりrtc,lcdを動かしている あかんやろカスケードない

https://monolizm.com/sab/pdf/%E7%AC%AC16%E5%9B%9E_%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99(IC2%E9%80%9A%E4%BF%A1%E7%B7%A8).pdf?fbclid=IwAR3bnU4N7YxnjvUmqZJmc7kHeYbOxtmHM23XNxgC8RvWAdomOoBuSGjKu9Y 意味がいまいちわからん

http://physics.cocolog-nifty.com/weblog/2022/01/post-f0bdfd.html これはいいかも

http://yohaku6066.blog.fc2.com/blog-entry-57.html これもよさげ

一応、rtc,lcdではうまくいった(5v駆動同士)

----------------------RTC/BME/LCD--------------------------

ESP8266では、RTCがうまくいかんかった レベルシフトなしの直付けカスケードで

BME/LCDはうまくいった たぶん、手持ちの20文字4行のLCDが3Vでもうごくためか?

VOUTの5Vだと文字が濃くなったがリスクありと考え3V接続にした

さてESP32だが、LCD/RTCを5V駆動として、5V,SDA,SCLをスイッチサイエンスの

I2Cレベルシフタで3V,SDA,SCLにシフトしてBMEにつなぎ、最終的に21、22ピンに!

以下は途中経過。。。。

#include <DS1307RTC.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#include <LiquidCrystal_I2C.h>

Adafruit_BME280 bme;

#include <Wire.h>;

float temp;

float pressure;

float humid;

LiquidCrystal_I2C lcd(0x27,20,4); 

void setup(){

  Wire.begin(21,22);

  bool status;

  status = bme.begin(0x76);  

  while (!status) {

    Serial.println("BME280 sensor縺御スソ縺医∪縺帙s");

    delay(1000);

  }

  lcd.init(); // Print a message to the LCD.

  lcd.backlight();

  lcd.setCursor(3,0);

  lcd.print("Hello, world!");

  Serial.begin(9600);}


void loop() {

   

  temp=bme.readTemperature();

  pressure=bme.readPressure() / 100.0F;

  humid=bme.readHumidity();

  Serial.print("貂ゥ蠎ヲ ;");

  Serial.print(temp);

  Serial.println(" ツーC");

   

  Serial.print("豌怜悸 ;");

  Serial.print(pressure);

  Serial.println(" hPa");

  Serial.print("貉ソ蠎ヲ ;");

  Serial.print(humid);

  Serial.println(" %");

  Serial.println();

  delay(1000);

  tmElements_t tm;


  if (RTC.read(tm)) {

    

    Serial.print("Ok, Time = ");

    print2digits(tm.Hour);

    Serial.write(':');

    print2digits(tm.Minute);

    Serial.write(':');

    print2digits(tm.Second);

    Serial.print(", Date (D/M/Y) = ");

    Serial.print(tm.Day);

    Serial.write('/');

    Serial.print(tm.Month);

    Serial.write('/');

    Serial.print(tmYearToCalendar(tm.Year));

    Serial.println();

  } else {

    if (RTC.chipPresent()) {

      Serial.println("The DS1307 is stopped.  Please run the SetTime");

      Serial.println("example to initialize the time and begin running.");

      Serial.println();

    } else {

      Serial.println("D n S1307 read error!  Please check the circuitry");

      Serial.println();

    }

    delay(9000);

  }

  delay(1000);

}


void print2digits(int number) {

  if (number >= 0 && number < 10) {

    Serial.write('0');

  }

  Serial.print(number);

}


2022年4月16日土曜日

raspico/raspi::dcmotor, microbit::keyestudio ks0308,maqueen memo

 https://hellobreak.net/raspberry-pi-pico-dc-motor/  と以下を参考に

https://www.radical-dreamer.com/programming/raspberry-pi-pwm-motordriver/

TB67H450 SINGLE DC-MOTOR DRIVER  つかってOK vrefはラズピコの5vに繋ぐ

------ non-pwm は以下の通り

import machine

import utime

IN1 = machine.Pin(1, machine.Pin.OUT)

IN2 = machine.Pin(2, machine.Pin.OUT)

while True:

    # 正転

    IN1.value(1)

    IN2.value(0)

    utime.sleep(0.5) # この時間が正転時間をきめる

    # 停止

    IN1.value(0)

    IN2.value(0)

    utime.sleep(3)

     # 逆転

    IN1.value(0)

    IN2.value(1)

    utime.sleep(1)

    # 停止

    IN1.value(0)

    IN2.value(0)

    utime.sleep(3)

-------------------------------- pwmは以下の通り

from machine import PWM, Pin
import utime

IN1 = PWM(Pin(1))
IN2 = PWM(Pin(2))
IN1.freq(100)
IN2.freq(100)

max_duty = 65025

while True:
    # 正転
    IN2.duty_u16(0)
    for i in range(50,53):
        IN1.duty_u16(int(max_duty*i*0.01))
        utime.sleep(0.1)
        # 停止
    IN1.duty_u16(0)
    IN2.duty_u16(0)
    utime.sleep(2)
    
    # 逆転
    IN1.duty_u16(0)
    for i in range(50,53):
        IN2.duty_u16(int(max_duty*i*0.01))
        utime.sleep(0.1)
        
    # 停止
    IN1.duty_u16(0)
    IN2.duty_u16(0)
    utime.sleep(2)

-----------------------------------------------------------------

https://www.radical-dreamer.com/programming/raspberry-pi-pwm-motordriver/ :: bt rpi

https://craft-gogo.com/raspberrypi-pwm-motor/ :: by pigpio  以下はクジラのコード

TB67H450 SINGLE DC-MOTOR DRIVER (VMに6Vの電池ボックスから供給必要)簡潔!

import RPi.GPIO as GPIO

from time import sleep

# GPIOのポートを指定 --- (*1)

R_VREF = 13 

R_IN1 = 19

R_IN2 = 26

GPIO.setmode(GPIO.BCM)

GPIO.setup([R_VREF,R_IN1,R_IN2], GPIO.OUT)

# モーターを回す

# 回転速度を指定 --- (*2)

pwm_r = GPIO.PWM(R_VREF, 50) # 50hz

pwm_r.start(30) # デューティ比 30%

try:

    while True:

        # 時計回りにモーターを回す --- (*3)

        print("時計回り");

        GPIO.output(R_IN1, GPIO.HIGH)

        GPIO.output(R_IN2, GPIO.LOW)

        sleep(1)

        # モーターを停止する

        print("停止")

        GPIO.output(R_IN1, GPIO.LOW)

        GPIO.output(R_IN2, GPIO.LOW)

        sleep(1)

        # 逆時計回りにモーターを回す

        print("逆回り")

        GPIO.output(R_IN1, GPIO.LOW)

        GPIO.output(R_IN2, GPIO.HIGH)

        sleep(1)

except KeyboardInterrupt:

    pass

GPIO.cleanup()

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

https://www.micro-bit.info/archives/1141

以下をいれ、モータBにとりつけるだけ、前進せんかったら逆につけるだけ  イチにも二にも水漏れ対策につきる

ーーーーーmaqueen cotnroller for v1ーーーーーボタンAでオンオフトグル操作ー

nput.onButtonPressed(Button.A, function () {
動作中 = !(動作中)
})
let 操舵 = 0
let M2の速度 = 0
let M1の速度 = 0
let 速度 = 0
let 左右の傾き = 0
let 前後の傾き = 0
let 動作中 = false
radio.setGroup(36)
動作中 = false
let LED点灯中 = false
basic.showIcon(IconNames.Happy)
basic.forever(function () {
if (動作中) {
前後の傾き = input.acceleration(Dimension.Y)
左右の傾き = input.acceleration(Dimension.X)
速度 = Math.map(前後の傾き, -1023, 1023, 255, -255)
M1の速度 = 速度
M2の速度 = 速度
操舵 = Math.map(左右の傾き, -1023, 1023, -21, 21)
if (操舵 < 0) {
M1の速度 = Math.trunc(M1の速度 * ((操舵 + 11) / 10))
} else if (操舵 > 0) {
M2の速度 = Math.trunc(M2の速度 * ((操舵 - 11) / -10))
}
} else {
M1の速度 = 0
M2の速度 = 0
}
radio.sendValue("M1", M1の速度)
radio.sendValue("M2", M2の速度)
basic.pause(100)
})
---------------- maqueen-car for v2 --------拡張機能必要--------------
radio.onReceivedValue(function (name, value) {
if (name == "M1") {
M1の速度 = value
if (M1の速度 > 0) {
maqueen.motorRun(maqueen.Motors.M1, maqueen.Dir.CW, M1の速度)
} else if (M1の速度 < 0) {
maqueen.motorRun(maqueen.Motors.M1, maqueen.Dir.CCW, Math.abs(M1の速度))
} else {
maqueen.motorStop(maqueen.Motors.M1)
}
} else if (name == "M2") {
M2の速度 = value
if (M2の速度 > 0) {
maqueen.motorRun(maqueen.Motors.M2, maqueen.Dir.CW, M2の速度)
} else if (M2の速度 < 0) {
maqueen.motorRun(maqueen.Motors.M2, maqueen.Dir.CCW, Math.abs(M2の速度))
} else {
maqueen.motorStop(maqueen.Motors.M2)
}
}
})
let M2の速度 = 0
let M1の速度 = 0
M1の速度 = 0
M2の速度 = 0
radio.setGroup(36)
basic.showIcon(IconNames.Happy)
-------------------------------------------------

2022年4月8日金曜日

raspico ④ (joystick,rtc,ble, with espr2,lcd-dht,bme280)

【Raspberry Pi Pico】Joystickで入力方向を読み取る方法まとめ | しかくと時々パソコン (shikakupc.com) このブログのとおり37sensor for microbitも3vにつないで正解だった!

-----------------------------------------------------------------------------

DIY Digital clock with RTC DS1307 and Raspberry Pi PICO - IoT Starters

にあるコードをゲットしたらds1307.pyなどとともに使い方が書いている

datetimeセットするためにデコメント実行したあとはコメントアウトしなおして使う

(year,month,date,day,hour,minute,second,p1)=rtc.datetime()

でp1はレジスタ内容の最期0を示すが内容はないので無視できる

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

bleは単なるUARTでOK

------------------------------------------

Raspberry Pi Picoに無線機能を付けてみました - 自由に工作中 (hatenablog.com)

ーーーーーlcd dht11 ーーーーーーーーーーーーーーーーーーー

import time
import machine
from esp8266_i2c_lcd import I2cLcd
I2C_ADDR=0x27
from machine import Pin
import utime as time
from dht import DHT11,InvalidChecksum

sda=machine.Pin(0)
scl=machine.Pin(1)
i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)
lcd=I2cLcd(i2c,I2C_ADDR,2,16)
lcd.putstr("hello")

time.sleep(1)
dht11=DHT11(Pin(15))
while True:
    try:
        lcd.clear()
        lcd.move_to(0,0)
        temp="temp:{}".format(dht11.temperature)
        humid="humid:{}".format(dht11.humidity)
        weather=temp+"\n"+humid
        lcd.putstr(weather)
    except InvalidChecksum:
        print("invalid checksum")
    time.sleep(2)

----------------bme280---------------------- 

https://gist.github.com/futureshocked/287606dd7556a82c90f86473a6cf2ed0

をbme280.pyとなづけ、トップレベルにおく 以下のように用いる

(https://blog.goo.ne.jp/jh7ubc/e/07755b250db432675611dff9f9ea1144仕様の結線

CSBはどこにもつながない!)


from machine import I2C,Pin

from bme280 import BME280

import utime


i2c=I2C(0,sda=Pin(16),scl=Pin(17),freq=400000)

bme=BME280(i2c=i2c)


while True:

    print("temperatue,humidity,pressure")

    print(bme.temperature)

    print(bme.humidity)

    print(bme.pressure)

    utime.sleep(10)

ーーーーーーーbme280.pyーーgithubよりーーーーーーーーーーーーーーーーーーーーー

from machine import I2C

import time


# BME280 default address.

BME280_I2CADDR = 0x76


# Operating Modes

BME280_OSAMPLE_1 = 1

BME280_OSAMPLE_2 = 2

BME280_OSAMPLE_4 = 3

BME280_OSAMPLE_8 = 4

BME280_OSAMPLE_16 = 5


# BME280 Registers


BME280_REGISTER_DIG_T1 = 0x88  # Trimming parameter registers

BME280_REGISTER_DIG_T2 = 0x8A

BME280_REGISTER_DIG_T3 = 0x8C


BME280_REGISTER_DIG_P1 = 0x8E

BME280_REGISTER_DIG_P2 = 0x90

BME280_REGISTER_DIG_P3 = 0x92

BME280_REGISTER_DIG_P4 = 0x94

BME280_REGISTER_DIG_P5 = 0x96

BME280_REGISTER_DIG_P6 = 0x98

BME280_REGISTER_DIG_P7 = 0x9A

BME280_REGISTER_DIG_P8 = 0x9C

BME280_REGISTER_DIG_P9 = 0x9E


BME280_REGISTER_DIG_H1 = 0xA1

BME280_REGISTER_DIG_H2 = 0xE1

BME280_REGISTER_DIG_H3 = 0xE3

BME280_REGISTER_DIG_H4 = 0xE4

BME280_REGISTER_DIG_H5 = 0xE5

BME280_REGISTER_DIG_H6 = 0xE6

BME280_REGISTER_DIG_H7 = 0xE7


BME280_REGISTER_CHIPID = 0xD0

BME280_REGISTER_VERSION = 0xD1

BME280_REGISTER_SOFTRESET = 0xE0


BME280_REGISTER_CONTROL_HUM = 0xF2

BME280_REGISTER_CONTROL = 0xF4

BME280_REGISTER_CONFIG = 0xF5

BME280_REGISTER_PRESSURE_DATA = 0xF7

BME280_REGISTER_TEMP_DATA = 0xFA

BME280_REGISTER_HUMIDITY_DATA = 0xFD



class Device:

  """Class for communicating with an I2C device.

  Allows reading and writing 8-bit, 16-bit, and byte array values to

  registers on the device."""


  def __init__(self, address, i2c):

    """Create an instance of the I2C device at the specified address using

    the specified I2C interface object."""

    self._address = address

    self._i2c = i2c


  def writeRaw8(self, value):

    """Write an 8-bit value on the bus (without register)."""

    value = value & 0xFF

    self._i2c.writeto(self._address, value)


  def write8(self, register, value):

    """Write an 8-bit value to the specified register."""

    b=bytearray(1)

    b[0]=value & 0xFF

    self._i2c.writeto_mem(self._address, register, b)


  def write16(self, register, value):

    """Write a 16-bit value to the specified register."""

    value = value & 0xFFFF

    b=bytearray(2)

    b[0]= value & 0xFF

    b[1]= (value>>8) & 0xFF

    self.i2c.writeto_mem(self._address, register, value)


  def readRaw8(self):

    """Read an 8-bit value on the bus (without register)."""

    return int.from_bytes(self._i2c.readfrom(self._address, 1),'little') & 0xFF


  def readU8(self, register):

    """Read an unsigned byte from the specified register."""

    return int.from_bytes(

        self._i2c.readfrom_mem(self._address, register, 1),'little') & 0xFF


  def readS8(self, register):

    """Read a signed byte from the specified register."""

    result = self.readU8(register)

    if result > 127:

      result -= 256

    return result


  def readU16(self, register, little_endian=True):

    """Read an unsigned 16-bit value from the specified register, with the

    specified endianness (default little endian, or least significant byte

    first)."""

    result = int.from_bytes(

        self._i2c.readfrom_mem(self._address, register, 2),'little') & 0xFFFF

    if not little_endian:

      result = ((result << 8) & 0xFF00) + (result >> 8)

    return result


  def readS16(self, register, little_endian=True):

    """Read a signed 16-bit value from the specified register, with the

    specified endianness (default little endian, or least significant byte

    first)."""

    result = self.readU16(register, little_endian)

    if result > 32767:

      result -= 65536

    return result


  def readU16LE(self, register):

    """Read an unsigned 16-bit value from the specified register, in little

    endian byte order."""

    return self.readU16(register, little_endian=True)


  def readU16BE(self, register):

    """Read an unsigned 16-bit value from the specified register, in big

    endian byte order."""

    return self.readU16(register, little_endian=False)


  def readS16LE(self, register):

    """Read a signed 16-bit value from the specified register, in little

    endian byte order."""

    return self.readS16(register, little_endian=True)


  def readS16BE(self, register):

    """Read a signed 16-bit value from the specified register, in big

    endian byte order."""

    return self.readS16(register, little_endian=False)



class BME280:

  def __init__(self, mode=BME280_OSAMPLE_1, address=BME280_I2CADDR, i2c=None,

               **kwargs):

    # Check that mode is valid.

    if mode not in [BME280_OSAMPLE_1, BME280_OSAMPLE_2, BME280_OSAMPLE_4,

                    BME280_OSAMPLE_8, BME280_OSAMPLE_16]:

        raise ValueError(

            'Unexpected mode value {0}. Set mode to one of '

            'BME280_ULTRALOWPOWER, BME280_STANDARD, BME280_HIGHRES, or '

            'BME280_ULTRAHIGHRES'.format(mode))

    self._mode = mode

    # Create I2C device.

    if i2c is None:

      raise ValueError('An I2C object is required.')

    self._device = Device(address, i2c)

    # Load calibration values.

    self._load_calibration()

    self._device.write8(BME280_REGISTER_CONTROL, 0x3F)

    self.t_fine = 0


  def _load_calibration(self):


    self.dig_T1 = self._device.readU16LE(BME280_REGISTER_DIG_T1)

    self.dig_T2 = self._device.readS16LE(BME280_REGISTER_DIG_T2)

    self.dig_T3 = self._device.readS16LE(BME280_REGISTER_DIG_T3)


    self.dig_P1 = self._device.readU16LE(BME280_REGISTER_DIG_P1)

    self.dig_P2 = self._device.readS16LE(BME280_REGISTER_DIG_P2)

    self.dig_P3 = self._device.readS16LE(BME280_REGISTER_DIG_P3)

    self.dig_P4 = self._device.readS16LE(BME280_REGISTER_DIG_P4)

    self.dig_P5 = self._device.readS16LE(BME280_REGISTER_DIG_P5)

    self.dig_P6 = self._device.readS16LE(BME280_REGISTER_DIG_P6)

    self.dig_P7 = self._device.readS16LE(BME280_REGISTER_DIG_P7)

    self.dig_P8 = self._device.readS16LE(BME280_REGISTER_DIG_P8)

    self.dig_P9 = self._device.readS16LE(BME280_REGISTER_DIG_P9)


    self.dig_H1 = self._device.readU8(BME280_REGISTER_DIG_H1)

    self.dig_H2 = self._device.readS16LE(BME280_REGISTER_DIG_H2)

    self.dig_H3 = self._device.readU8(BME280_REGISTER_DIG_H3)

    self.dig_H6 = self._device.readS8(BME280_REGISTER_DIG_H7)


    h4 = self._device.readS8(BME280_REGISTER_DIG_H4)

    h4 = (h4 << 24) >> 20

    self.dig_H4 = h4 | (self._device.readU8(BME280_REGISTER_DIG_H5) & 0x0F)


    h5 = self._device.readS8(BME280_REGISTER_DIG_H6)

    h5 = (h5 << 24) >> 20

    self.dig_H5 = h5 | (

        self._device.readU8(BME280_REGISTER_DIG_H5) >> 4 & 0x0F)


  def read_raw_temp(self):

    """Reads the raw (uncompensated) temperature from the sensor."""

    meas = self._mode

    self._device.write8(BME280_REGISTER_CONTROL_HUM, meas)

    meas = self._mode << 5 | self._mode << 2 | 1

    self._device.write8(BME280_REGISTER_CONTROL, meas)

    sleep_time = 1250 + 2300 * (1 << self._mode)


    sleep_time = sleep_time + 2300 * (1 << self._mode) + 575

    sleep_time = sleep_time + 2300 * (1 << self._mode) + 575

    time.sleep_us(sleep_time)  # Wait the required time

    msb = self._device.readU8(BME280_REGISTER_TEMP_DATA)

    lsb = self._device.readU8(BME280_REGISTER_TEMP_DATA + 1)

    xlsb = self._device.readU8(BME280_REGISTER_TEMP_DATA + 2)

    raw = ((msb << 16) | (lsb << 8) | xlsb) >> 4

    return raw


  def read_raw_pressure(self):

    """Reads the raw (uncompensated) pressure level from the sensor."""

    """Assumes that the temperature has already been read """

    """i.e. that enough delay has been provided"""

    msb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA)

    lsb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA + 1)

    xlsb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA + 2)

    raw = ((msb << 16) | (lsb << 8) | xlsb) >> 4

    return raw


  def read_raw_humidity(self):

    """Assumes that the temperature has already been read """

    """i.e. that enough delay has been provided"""

    msb = self._device.readU8(BME280_REGISTER_HUMIDITY_DATA)

    lsb = self._device.readU8(BME280_REGISTER_HUMIDITY_DATA + 1)

    raw = (msb << 8) | lsb

    return raw


  def read_temperature(self):

    """Get the compensated temperature in 0.01 of a degree celsius."""

    adc = self.read_raw_temp()

    var1 = ((adc >> 3) - (self.dig_T1 << 1)) * (self.dig_T2 >> 11)

    var2 = ((

        (((adc >> 4) - self.dig_T1) * ((adc >> 4) - self.dig_T1)) >> 12) *

        self.dig_T3) >> 14

    self.t_fine = var1 + var2

    return (self.t_fine * 5 + 128) >> 8


  def read_pressure(self):

    """Gets the compensated pressure in Pascals."""

    adc = self.read_raw_pressure()

    var1 = self.t_fine - 128000

    var2 = var1 * var1 * self.dig_P6

    var2 = var2 + ((var1 * self.dig_P5) << 17)

    var2 = var2 + (self.dig_P4 << 35)

    var1 = (((var1 * var1 * self.dig_P3) >> 8) +

            ((var1 * self.dig_P2) >> 12))

    var1 = (((1 << 47) + var1) * self.dig_P1) >> 33

    if var1 == 0:

      return 0

    p = 1048576 - adc

    p = (((p << 31) - var2) * 3125) // var1

    var1 = (self.dig_P9 * (p >> 13) * (p >> 13)) >> 25

    var2 = (self.dig_P8 * p) >> 19

    return ((p + var1 + var2) >> 8) + (self.dig_P7 << 4)


  def read_humidity(self):

    adc = self.read_raw_humidity()

    # print 'Raw humidity = {0:d}'.format (adc)

    h = self.t_fine - 76800

    h = (((((adc << 14) - (self.dig_H4 << 20) - (self.dig_H5 * h)) +

         16384) >> 15) * (((((((h * self.dig_H6) >> 10) * (((h *

                          self.dig_H3) >> 11) + 32768)) >> 10) + 2097152) *

                          self.dig_H2 + 8192) >> 14))

    h = h - (((((h >> 15) * (h >> 15)) >> 7) * self.dig_H1) >> 4)

    h = 0 if h < 0 else h

    h = 419430400 if h > 419430400 else h

    return h >> 12


  @property

  def temperature(self):

    "Return the temperature in degrees."

    t = self.read_temperature()

    ti = t // 100

    td = t - ti * 100

    return "{}.{:02d}C".format(ti, td)


  @property

  def pressure(self):

    "Return the temperature in hPa."

    p = self.read_pressure() // 256

    pi = p // 100

    pd = p - pi * 100

    return "{}.{:02d}hPa".format(pi, pd)


  @property

  def humidity(self):

    "Return the humidity in percent."

    h = self.read_humidity()

    hi = h // 1024

    hd = h * 100 // 1024 - hi * 100

    return "{}.{:02d}%".format(hi, hd)