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);

}


0 件のコメント:

コメントを投稿