- プチモンテでuno,
- #include <Wire.h>
- // 外部割り込みの状態
- volatile int state = LOW;
- // RTCのレジスタテーブル(16byte)
- int RegTbl[16];
- // デバイスアドレス(スレーブ)
- // ※Arduinoの仕様では8bitのアドレスを右に1bitシフトした「7bit」を使用する
- // ※[8bit]Write : 0xA2 = 10100010 Read : 0xA3 = 10100011
- byte DEVICE_ADDRESS= 0x51;
- // 2進化10進数(BCD)を10進数に変換
- byte BCDtoDec(byte value){
- return ((value >> 4) * 10) + (value & 0x0F) ;
- }
- // 外部割り込みが発生した時に動作します。
- void myInterrupt() {
- state = !state;
- }
-
- void setup() {
- Serial.begin(9600);
- // タイマー割り込みの解除用
- pinMode(8,INPUT);
- // 2ピンの状態がLOWからHIGHに変化した場合に外部割り込みを発生させる
- attachInterrupt(digitalPinToInterrupt(2), myInterrupt, RISING);
- // マスタとしてI2Cバスに接続する
- Wire.begin();
- // I2Cスレーブに対して送信処理を開始する
- Wire.beginTransmission(DEVICE_ADDRESS);
-
- // レジスタのアドレスを指定する(0-15の内、先頭から)
- Wire.write(0x00);
-
- // ---------------------------------
- // コントロールレジスタ
- // ---------------------------------
- // [00]Control1
- Wire.write(0x00);
- // [01]Control2
- // 0x02:アラーム割り込み時に3ピン[INT]をLOWにする
- Wire.write(0x02);
-
- // ---------------------------------
- // 時計・カレンダーレジスタ
- // ---------------------------------
- // アドレスの[02-05]及び[08-11]は2進化10進数(BCD)で指定します。
-
- // [02]Seconds(15秒)
- Wire.write(0x15);
- // [03]Minutes(20分)
- Wire.write(0x20);
- // [04]Hours(12時)
- Wire.write(0x12);
- // [05]Days(25日)
- Wire.write(0x25);
- // [06]Weekdays(月)
- // 0:日 1:月 2:火 3:水 4:木 5:金 6:土
- Wire.write(0x01);
- // [07]Month/Century(21世紀の12月)
- // ・Month(01-12) BCD形式
- // ・Century(先頭bit 0:20世紀[19xx年代],1(0x80):21世紀[20xx年代])
- Wire.write(0x12 | 0x80);
- // [08]Years(2017年)
- Wire.write(0x17);
-
- // ---------------------------------
- // アラームレジスタ
- // ---------------------------------
- // 先頭bitに1がある場合(0x80)はアラーム対象外となる
-
- // 例)次のコードは「25日(月)12時21分」にアラームが設定されていますが、
- // 「25日」と「(月)」には0x80がありますので、実際のアラームは「12時21分」で毎日となります。
-
- // [09]Minutes alarm(21分)
- Wire.write(0x21);
- // [0A]Hours Alarm(12時)
- Wire.write(0x12);
- // [0B]Days Alarm(25日)
- Wire.write(0x25 | 0x80);
- // [0C]Weekdays Alarm(月)
- // 0:日 1:月 2:火 3:水 4:木 5:金 6:土
- Wire.write(0x01 | 0x80);
-
- // ---------------------------------
- // クロック出力レジスタ
- // ---------------------------------
-
- // [0D]CLKOUT Frequency
- // ・クロック出力機能を有効にする。
- // ※有効:0x80 無効 :0x00
- // ・クロック周波数は1Hz(1秒間に1回)とする
- // ※0x00:32768Hz, 0x01:1024Hz, 0x02:32Hz, 0x03:1Hz
- //
- // 次の設定だと2ピン[CLKOUT]から1秒に1回、クロック出力される
- Wire.write(0x80 | 0x03);
-
- // I2Cスレーブへの送信完了
- Wire.endTransmission();
-
- Serial.println("RTCの初期化完了。");
- }
-
- void loop(){
- int i;
-
- // 外部割込みが発生した場合
- if(state == HIGH){
- // レジスタのアドレスを先頭にする
- Wire.beginTransmission(DEVICE_ADDRESS);
- Wire.write(0x00);
- Wire.endTransmission();
-
- // I2Cスレーブに16byteのレジスタデータを要求する
- Wire.requestFrom(DEVICE_ADDRESS,16);
-
- // 16byteのデータを取得する
- for (i=0; i<16; i++){
- while (Wire.available() == 0 ){}
- RegTbl[i] = Wire.read();
- }
-
- // 現在日時
- Serial.print("現在:");
- Serial.print(String(BCDtoDec(RegTbl[8])+ 2000) + "年");
- Serial.print(String(BCDtoDec(RegTbl[7] & 0x1F)) + "月");
- Serial.print(String(BCDtoDec(RegTbl[5] & 0x3F)) + "日");
-
- switch(RegTbl[6] & 0x07){
- case 0 : Serial.print("(日)");break;
- case 1 : Serial.print("(月)");break;
- case 2 : Serial.print("(火)");break;
- case 3 : Serial.print("(水)");break;
- case 4 : Serial.print("(木)");break;
- case 5 : Serial.print("(金)");break;
- case 6 : Serial.print("(土)");break;
- }
- Serial.print(" ");
- Serial.print(String(BCDtoDec(RegTbl[4] & 0x3F)) + "時");
- Serial.print(String(BCDtoDec(RegTbl[3] & 0x7F)) + "分");
- Serial.print(String(BCDtoDec(RegTbl[2] & 0x7F)) + "秒");
-
- // アラーム日時
- Serial.print(" アラーム:");
- if((RegTbl[11] & 0x80) == 0){
- Serial.print(String(BCDtoDec(RegTbl[11] & 0x3F)) + "日");
- }
-
- if((RegTbl[12] & 0x80) == 0){
- switch(RegTbl[12] & 0x07){
- case 0 : Serial.print("(日) ");break;
- case 1 : Serial.print("(月) ");break;
- case 2 : Serial.print("(火) ");break;
- case 3 : Serial.print("(水) ");break;
- case 4 : Serial.print("(木) ");break;
- case 5 : Serial.print("(金) ");break;
- case 6 : Serial.print("(土) ");break;
- }
- }
-
- if((RegTbl[10] & 0x80) == 0){
- Serial.print(String(BCDtoDec(RegTbl[10] & 0x3F)) + "時");
- }
-
- if((RegTbl[9] & 0x80) == 0){
- Serial.print(String(BCDtoDec(RegTbl[9] & 0x7F)) + "分");
- }
-
- Serial.println("");
- state = !state;
- }
-
- // ボタン押下時にアラーム割り込みイベントをクリアする(LEDを消灯する)
- if(digitalRead(8) == HIGH){
- // レジスタのアドレスをControl2にする
- Wire.beginTransmission(DEVICE_ADDRESS);
- Wire.write(0x01);
-
- // アラーム割り込みが発生した際に
- // Control2の4bit目のAFフラグが「1」になるので「0」にする
- // それにより、3ピン[INT]がHIGHになりLEDが消灯します。
- Wire.write(0x02);
- Wire.endTransmission();
- }
- }
------------------手持ちの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::静電気、外気に弱い、保存は専用袋で! あまり持ち歩かない!
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 のデジタル温度計もあるが、あまりなじんでいない 今後の課題