2022年6月3日金曜日

weather-esp32 rtc-uno,lcd-bme-rtc-sdc,sdc,bme280,sht31,dht11,lm61/35,etc

  1. プチモンテでuno,
  2. #include <Wire.h> 
  3. // 外部割り込みの状態
  4. volatile int state = LOW;
  5. // RTCのレジスタテーブル(16byte)
  6. int RegTbl[16];
  7. // デバイスアドレス(スレーブ)
  8. // ※Arduinoの仕様では8bitのアドレスを右に1bitシフトした「7bit」を使用する
  9. // ※[8bit]Write : 0xA2 = 10100010 Read : 0xA3 = 10100011
  10. byte DEVICE_ADDRESS= 0x51;
  11. // 2進化10進数(BCD)を10進数に変換
  12. byte BCDtoDec(byte value){
  13. return ((value >> 4) * 10) + (value & 0x0F) ;
  14. }
  15. // 外部割り込みが発生した時に動作します。
  16. void myInterrupt() {
  17. state = !state;
  18. }
  19.  
  20. void setup() {
  21. Serial.begin(9600);
  22. // タイマー割り込みの解除用
  23. pinMode(8,INPUT);
  24. // 2ピンの状態がLOWからHIGHに変化した場合に外部割り込みを発生させる
  25. attachInterrupt(digitalPinToInterrupt(2), myInterrupt, RISING);
  26. // マスタとしてI2Cバスに接続する
  27. Wire.begin();
  28. // I2Cスレーブに対して送信処理を開始する
  29. Wire.beginTransmission(DEVICE_ADDRESS);
  30. // レジスタのアドレスを指定する(0-15の内、先頭から)
  31. Wire.write(0x00);
  32.  
  33. // ---------------------------------
  34. // コントロールレジスタ
  35. // ---------------------------------
  36. // [00]Control1
  37. Wire.write(0x00);
  38. // [01]Control2
  39. // 0x02:アラーム割り込み時に3ピン[INT]をLOWにする
  40. Wire.write(0x02);
  41. // ---------------------------------
  42. // 時計・カレンダーレジスタ
  43. // ---------------------------------
  44. // アドレスの[02-05]及び[08-11]は2進化10進数(BCD)で指定します。
  45. // [02]Seconds(15秒)
  46. Wire.write(0x15);
  47. // [03]Minutes(20分)
  48. Wire.write(0x20);
  49. // [04]Hours(12時)
  50. Wire.write(0x12);
  51. // [05]Days(25日)
  52. Wire.write(0x25);
  53. // [06]Weekdays(月)
  54. // 0:日 1:月 2:火 3:水 4:木 5:金 6:土
  55. Wire.write(0x01);
  56. // [07]Month/Century(21世紀の12月)
  57. // ・Month(01-12) BCD形式
  58. // ・Century(先頭bit 0:20世紀[19xx年代],1(0x80):21世紀[20xx年代])
  59. Wire.write(0x12 | 0x80);
  60. // [08]Years(2017年)
  61. Wire.write(0x17);
  62. // ---------------------------------
  63. // アラームレジスタ
  64. // ---------------------------------
  65. // 先頭bitに1がある場合(0x80)はアラーム対象外となる
  66. // 例)次のコードは「25日(月)12時21分」にアラームが設定されていますが、
  67. // 「25日」と「(月)」には0x80がありますので、実際のアラームは「12時21分」で毎日となります。
  68. // [09]Minutes alarm(21分)
  69. Wire.write(0x21);
  70. // [0A]Hours Alarm(12時)
  71. Wire.write(0x12);
  72. // [0B]Days Alarm(25日)
  73. Wire.write(0x25 | 0x80);
  74. // [0C]Weekdays Alarm(月)
  75. // 0:日 1:月 2:火 3:水 4:木 5:金 6:土
  76. Wire.write(0x01 | 0x80);
  77.  
  78. // ---------------------------------
  79. // クロック出力レジスタ
  80. // ---------------------------------
  81. // [0D]CLKOUT Frequency
  82. // ・クロック出力機能を有効にする。
  83. // ※有効:0x80 無効 :0x00
  84. // ・クロック周波数は1Hz(1秒間に1回)とする
  85. // ※0x00:32768Hz, 0x01:1024Hz, 0x02:32Hz, 0x03:1Hz
  86. //
  87. // 次の設定だと2ピン[CLKOUT]から1秒に1回、クロック出力される
  88. Wire.write(0x80 | 0x03);
  89.  
  90. // I2Cスレーブへの送信完了
  91. Wire.endTransmission();
  92. Serial.println("RTCの初期化完了。");
  93. }
  94.  
  95. void loop(){
  96. int i;
  97. // 外部割込みが発生した場合
  98. if(state == HIGH){
  99. // レジスタのアドレスを先頭にする
  100. Wire.beginTransmission(DEVICE_ADDRESS);
  101. Wire.write(0x00);
  102. Wire.endTransmission();
  103. // I2Cスレーブに16byteのレジスタデータを要求する
  104. Wire.requestFrom(DEVICE_ADDRESS,16);
  105. // 16byteのデータを取得する
  106. for (i=0; i<16; i++){
  107. while (Wire.available() == 0 ){}
  108. RegTbl[i] = Wire.read();
  109. }
  110. // 現在日時
  111. Serial.print("現在:");
  112. Serial.print(String(BCDtoDec(RegTbl[8])+ 2000) + "年");
  113. Serial.print(String(BCDtoDec(RegTbl[7] & 0x1F)) + "月");
  114. Serial.print(String(BCDtoDec(RegTbl[5] & 0x3F)) + "日");
  115. switch(RegTbl[6] & 0x07){
  116. case 0 : Serial.print("(日)");break;
  117. case 1 : Serial.print("(月)");break;
  118. case 2 : Serial.print("(火)");break;
  119. case 3 : Serial.print("(水)");break;
  120. case 4 : Serial.print("(木)");break;
  121. case 5 : Serial.print("(金)");break;
  122. case 6 : Serial.print("(土)");break;
  123. }
  124. Serial.print(" ");
  125. Serial.print(String(BCDtoDec(RegTbl[4] & 0x3F)) + "時");
  126. Serial.print(String(BCDtoDec(RegTbl[3] & 0x7F)) + "分");
  127. Serial.print(String(BCDtoDec(RegTbl[2] & 0x7F)) + "秒");
  128. // アラーム日時
  129. Serial.print(" アラーム:");
  130. if((RegTbl[11] & 0x80) == 0){
  131. Serial.print(String(BCDtoDec(RegTbl[11] & 0x3F)) + "日");
  132. }
  133. if((RegTbl[12] & 0x80) == 0){
  134. switch(RegTbl[12] & 0x07){
  135. case 0 : Serial.print("(日) ");break;
  136. case 1 : Serial.print("(月) ");break;
  137. case 2 : Serial.print("(火) ");break;
  138. case 3 : Serial.print("(水) ");break;
  139. case 4 : Serial.print("(木) ");break;
  140. case 5 : Serial.print("(金) ");break;
  141. case 6 : Serial.print("(土) ");break;
  142. }
  143. }
  144. if((RegTbl[10] & 0x80) == 0){
  145. Serial.print(String(BCDtoDec(RegTbl[10] & 0x3F)) + "時");
  146. }
  147. if((RegTbl[9] & 0x80) == 0){
  148. Serial.print(String(BCDtoDec(RegTbl[9] & 0x7F)) + "分");
  149. }
  150. Serial.println("");
  151. state = !state;
  152. }
  153.  
  154. // ボタン押下時にアラーム割り込みイベントをクリアする(LEDを消灯する)
  155. if(digitalRead(8) == HIGH){
  156. // レジスタのアドレスをControl2にする
  157. Wire.beginTransmission(DEVICE_ADDRESS);
  158. Wire.write(0x01);
  159. // アラーム割り込みが発生した際に
  160. // Control2の4bit目のAFフラグが「1」になるので「0」にする
  161. // それにより、3ピン[INT]がHIGHになりLEDが消灯します。
  162. Wire.write(0x02);
  163. Wire.endTransmission();
  164. }
  165. }

------------------手持ちのAmazonより購入rtcを使用------------------------

lcd-bme-rtc-sdc/esp32 

#include <DS1307RTC.h>

#include <Wire.h>;

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#include <LiquidCrystal_I2C.h>

#include <SD.h>

int cs_SD = 5;

const char* f_name = "/test1.txt";

File myFile;

Adafruit_BME280 bme;


float temp;

float pressure;

float humid;

LiquidCrystal_I2C lcd(0x27,20,4); 

void setup(){

  Wire.begin(21,22); // sda,scl

  bool status;

  status = bme.begin(0x76);  

  while (!status) {

    Serial.println("BME280 sensor not connected");

    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("temp: ");

  Serial.print(temp);

  Serial.println("*c");

  Serial.print("pressure: ");

  Serial.print(pressure);

  Serial.println(" hPa");

  Serial.print("humid: ");

  Serial.print(humid);

  Serial.println(" %");

  Serial.println();

  lcd.clear();

  lcd.setCursor(0,0);

  lcd.print("temp:");

  lcd.print(temp);

  lcd.print(" *c");

  lcd.setCursor(0,1);

  lcd.print("pressure:");

  lcd.print(pressure);

  lcd.print(" hPa");

  lcd.setCursor(0,2);

  lcd.print("humid:");

  lcd.print(humid);

  lcd.print(" %");

  delay(1000);

  if(SD.begin(cs_SD)){

    Serial.println("card ok");

    myFile=SD.open(f_name,FILE_APPEND);

    if(myFile){

      myFile.println("");

      myFile.println(temp);

      myFile.println(pressure);

      myFile.println(humid);

      myFile.close();

      Serial.println("kakikomi done");

    }else{

      Serial.println("kakikomi shippai");

    }

    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("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');  }

}

---------------sdc esp32--------------------------------------------------------

esp32でSDcardに書き込んでみる | ラズベリーパン (nomad-life.net)    5v以外は

この配線で sda 21,scl 22,   mosi 23,miso 19, sck 18 

(11 12 13 はアルディーノ) 5vでないと動きません ラズピコはvsys、メタエレ参照

#include <SD.h>
int cs_SD = 5;
const char* f_name = "/test1.txt"; // "/"は必須で、あらかじめて作っておくこと!
File myFile;
int bangou = 0;
void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);
}
void loop() {
  SD.begin(cs_SD);
  Serial.println("sd connect...");
  delay(10);
  if (!SD.begin(cs_SD)){
    Serial.println("Card failed");
  }
  if(SD.begin(cs_SD)){
    Serial.println("card ok");
    myFile=SD.open(f_name,FILE_APPEND); // for append mode
    bangou++;
    if(myFile){
      myFile.println("");
      myFile.print(bangou);
      myFile.print(" : test kakimoki");
myFile.close();
      Serial.println("");
      Serila.prin(bangou);
      Serial.println(" kakikomi done");
    }else{
      Serial.println(" kakikomi shippai");
    }
    delay(1000);
  }
}

 
   

---------------------------- bme server as softap/esp32 ----------------------------

https://qiita.com/MuAuan/items/da7fcb91582111d32876 を元ネタにして

http://mukujii.sakura.ne.jp/esp2.html を参考にSoftApを作成した

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#include <WiFi.h>

#include <WebServer.h>

Adafruit_BME280 bme;

const String sokutei_jp[] = { "気圧", "温度", "湿度" };

float temp,pressure,humid;

const char ssid[] = "ESP32AP-WiFi";

const char pass[] = "esp32apwifi";

const IPAddress ip(192,168,30,3);

const IPAddress subnet(255,255,255,0);

WebServer server(80);


void setup()

{

    Serial.begin(115200);

    WiFi.softAP(ssid,pass);

    delay(100);

    WiFi.softAPConfig(ip,ip,subnet);


    bool status;

    status = bme.begin(0x76);  

    while (!status) {

      Serial.println("BME280 sensorが使えません");

      delay(1000);

    }


    server.on("/", handleRoot);

    server.begin();

}


void loop() {

  //web出力

  server.handleClient();

  delay(1000);  

}


void handleRoot() {

  String html;

  int i;

  char text_gP[20], text_gT[20], text_gH[20];


  temp=bme.readTemperature();

  pressure=bme.readPressure() / 100.0F;

  humid=bme.readHumidity();

  Serial.print("temp ");

  Serial.println(temp);

  Serial.print("pressure ");

  Serial.println(pressure);

  Serial.print("humid ");

  Serial.println(humid);

  sprintf(text_gP, " %d Pa", int(pressure));

  sprintf(text_gT, " %3.2f C", temp);

  sprintf(text_gH, " %3.2f %", humid);


  // HTMLを組み立てる

  html = "<!DOCTYPE html>";

  html += "<html>";

  html += "<head>";

  html += "<meta charset=\"utf-8\">";

  html += "<title>測定する</title>";

  html += "</head>";

  html += "<body>";

  html += "<p>現在の測定値</p>";

  html += "<ul>";

  for (i = 0; i < 3; i++) {

    html += "<li>";

    html += sokutei_jp[i];

    if (i==0){

      html += text_gP;

    }

    if (i==1){

      html += text_gT;

    }

    if (i==2){

      html += text_gH;

    }    

    html += "</a></li>";

  }

  html += "</ul>";

  html += "</body>";

  html += "</html>";

  // HTMLを出力する

  server.send(200, "text/html", html);

}

--------------sht31-------------------------------------------- 

sht31::静電気、外気に弱い、保存は専用袋で! あまり持ち歩かない!

// Javascript Example addressmode=5は秋月より購入したsht31の仕様である!
var sensor = obniz.wired("SHT31", {vcc:0, sda:1, scl:2, adr:3, gnd:4, addressmode:5});
var data = await sensor.getAllWait();
console.log('temperature:' + data.temperature);
console.log(
'humidity:' + data.humidity);

ーーーーdfrobot dht11ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

dfrobotのdht11は3vでも5vでもうごく  普通は5vでつかおう

緑がシグナル、赤が電源、黒がグランド

アルディーノUNOは以下のコード

#include <DHT.h>              // ライブラリのインクルード

#define DHT_PIN 7             // DHT11のDATAピンをデジタルピン7に定義

#define DHT_MODEL DHT11       // 接続するセンサの型番を定義する(DHT11やDHT22など)

  DHT dht(DHT_PIN, DHT_MODEL);  // センサーの初期化 

 void setup() {

    Serial.begin(9600);         // シリアル通信の開始

     dht.begin();                // センサーの動作開始

}

 

 void loop(){ 

   delay(2000);                // センサーの読み取りを2秒間隔に

   float Humidity = dht.readHumidity();          // 湿度の読み取り

   float Temperature = dht.readTemperature();    // 温度の読み取り(摂氏)

   if (isnan(Humidity) || isnan(Temperature)) {  // 読み取りのチェック

     Serial.println("ERROR");

     return;

   }

 

// シリアルモニタに温度&湿度を表示  

   Serial.print("温度: ");

   Serial.print(Temperature);

   Serial.print("[℃]");

 

   Serial.print("  湿度: "); 

   Serial.print(Humidity);  

   Serial.println("[%]");

 

}

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

sht31はオブニズ目当てに購入 取り扱い注意

dht11はesp32で使う場合dhtesp.hをもちいる

温湿度センサ DHT11 on arduino-esp32 - Qiita を参照

lm61/lm35::間違った配線で熱暴走!最悪、壊れる!

i2c / spi のデジタル温度計もあるが、あまりなじんでいない 今後の課題

0 件のコメント:

コメントを投稿