2022年6月26日日曜日

micropython(esp8266,esp32-dht,sdc,neoxiel etc,esp32-ap-deepsleep,esptool, cf xiao rp2040)

https://micropython-docs-ja.readthedocs.io/ja/latest/esp8266/tutorial/intro.html

にてespr developperにもまずerase-flashしてインスト成功 しかもhttps getもでけた!

https://blog.goediy.com/?p=262 でwifiコネクト

https://blog.boochow.com/article/454341667.html でhttp get of json なども参考に

以下のコードが成功した!!esp32と一緒のはず、たぶん

(arduino言語でhttp getできるので試す必要がほとんどないので。。。。)

import network

import urequests

sta_if = network.WLAN(network.STA_IF)

if not sta_if.isconnected():

        print('connecting to network...')

        sta_if.active(True)

        sta_if.connect(ssid,pswd)

        while not sta_if.isconnected():

            pass

print('network config:', sta_if.ifconfig())

r = urequests.get('https://fseigojp.web.fc2.com/')

print(r.text)



-----------------esp32-------------------------------

MicroPython: ESP32/ESP8266 with DHT11/DHT22 Temperature and Humidity Sensor | Random Nerd Tutorials どうもesp32にはdhtライブラリがビルトインされてるらしい

neopixel,rtc,timer,deeepsleepも同様にビルトインだった

(ESP32 用クイックリファレンス — MicroPython 1.19.1 ドキュメント (micropython-docs-ja.readthedocs.io) によるとsdcもあるげなが、defaultのそれではだめだった!

ESP32 – Micro SD Card Interface : 7 Steps - Instructablesにでてくるsdcard.pyを

いれてやっと成功した! 

上記の英語サイトにssd1306,US,BME280,lcd1602もあったが未体験、今後の課題 

[備忘録]ESP32 MicroPythonサンプルコード - Qiita 

filenameはSETTING_TXTと大文字! fileがesp32内にできる!

------------------access-point/deep sleep---------------------

MicroPython: ESP32/ESP8266 Access Point (AP) | Random Nerd Tutorials

MicroPython: ESP32 Deep Sleep and Wake Up Sources | Random Nerd Tutorials

--------------------------esp32----------------------------

https://qiita.com/sirius1000/items/4b4e6380c4942f347dd9 を参考に

 esptool.py --port /dev/ttyUSB0 erase_flash

esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-idf3-20210202-v1.14.bin    でインスト

https://zenn.dev/kotaproj/articles/d969fb39100da443f41f で実施のあれこれ


であれこれする
----------------------------------------------------------------------------------------------

以下はxiao rp2040の詳述である

XIAO RP2040 x Expansion boardのMicroPythonサンプル - Seeed K.K. エンジニアブログ  dht11.pyはうまくいかんかったので、ラズピコの該当品dht.pyを流用した!

xiao rp2040でuartする場合,arduinoIDEの場合とことなりuart1などとせんでよい!

当該ライブラリのservo.py,ssd1306.py,dht.py,ws2811.pyも普通につかえたが

lcd1602はgrove仕様にて難儀した、esp8266_i2c_lcd.py,lcd_api.pyをラズピコより導入

以下のように成功! ちなみに、i2c定義で0をつかうとBadPinとなる!

ssd1306の例のように1をつかうと成功した!

import machine

form esp8266_i2c_ld import I2cLcd

I2C_ADDR=0x27

i2c=machine.I2C(1,scl=machine.Pin(7),sda=machine.Pin(6),freq=400000)

lcd=I2cLcd(i2c,I2C_ADDR,2,16)

lcd.putstr("it works\nsecond line")

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

ラズピコ用のds1307.pyを流用できた! やはりi2cはチャンネル1!

from machine import I2C,Pin

from ds1307 import DS1307

i2c=machine.I2C(1,scl=machine.Pin(7),sda=machine.Pin(6),freq=400000)

rtc=ds1307(i2c)

print(rtc.datetime()) 

ただ、ラズピコと違い、i2cは1チャンネルだけみたいなのでlcd/oledと併用は難儀そう

将来の宿題とする、当面はsdcard(spi)に書き込めればよい。。。。。

bleでuartして時間などを表示させる手もあると思う

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ラズピコ用のbme280.pyを流用して成功!やはりi2cはチャンネル1! !!3V仕様!!

import machine

form bme280 import BME280

i2c=machine.I2C(1,scl=machine.Pin(7),sda=machine.Pin(6),freq=200000)

bme=BME280(i2c=i2c)

print(bme.temperature or bme.humidtiy or bme.pressure).....

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

sdcard.py::カードの相性があるげな、エレコムで失敗、キオクシアで成功!5v使用!

https://github.com/StereoRocker/micropython/tree/rp2-sdcard/drivers 

ラズピコ用だが流用できた すばらしい! 注:最後にos.umount('sd')を忘れずに!

from machine import Pin, SPI
import os, sdcard

spi = SPI(0, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
sd = sdcard.SDCard(spi, Pin(28))

os.mount(sd, '/sd')
os.chdir('sd')
print(os.listdir())
print()
print(open('README.txt').read()) 

ーーーー ws2811 ラズピコはインラインアセンブリをもちいるのでむしろ難儀ーーーーーー

builitinのuser-3color-ledsはやはり変則!  ネオピクセルはピンの11,12が関係!

switch=Pin(11,Pin.OUT)

switch.value(1) 

led=WS2811(12,1) # (pin_num,led_count)  これでneoxielが光りだす

ビルトインled(3kind)は以下の通りで、

ledr=Pin(17,Pin.OUT) # led-r はつかえないledrはつかえる要注意

ledr.value(1)  #  全部1で消灯 全部0で点灯

ledg=Pin(16,Pin.OUT) # led-g はつかえないledgはつかえる要注意

ledg.value(1)  #  全部1で消灯 全部0で点灯

ledb=Pin(25,Pin.OUT) # led-b はつかえないledbはつかえる要注意

ledb.value(1)  #  全部1で消灯 全部0で点灯


from machine import Pin,UART  # this code is for xiao rp2040
import time

uart=UART(0,9600,tx=Pin(0),rx=Pin(1))
led = machine.Pin(3,Pin.OUT)
led.value(1) 
IN1=Pin(6,Pin.OUT)
IN2=Pin(28,Pin.OUT)

while True:
      c = uart.readline()
      if c == b'f':
            print("foward")
            IN1.value(1)
            IN2.value(0)
            time.sleep(0.5)
       
            print("stop")
            IN1.value(0)
            IN2.value(0)
            time.sleep(0.5)
          
      else:
          if c == b'b':
            print("back")
            IN1.value(0)
            IN2.value(1)
            time.sleep(0.5)
           
            print("stop")        
            IN1.value(0)
            IN2.value(0)
            time.sleep(0.5)


--------builtin neopixel led--------------------------------------------------------

from machine import Pin from ws2812 import WS2812 import time switch = Pin(11, Pin.OUT) switch.value(1) #これでまず消える BLACK = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 150, 0) GREEN = (0, 255, 0) CYAN = (0, 255, 255) BLUE = (0, 0, 255) PURPLE = (180, 0, 255) WHITE = (255, 255, 255) COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE) #WS2812(pin_num,led_count) led = WS2812(12,1) print("fills") for color in COLORS: led.pixels_fill(color) led.pixels_show() time.sleep(1)

--------builtin neopixel-----------------------------------------------------------------------
from ws2812 import WS2812
from machine import Pin
import time

switch = Pin(11, Pin.OUT, value=1) #pin11がneopixelのpwr制御しているようだ
led = WS2812(12, 1) #pin12がneopixelそのものみたい

while True:
    colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255))
    for color in colors:
        led.pixels_set(0, color)
        led.pixels_show()
        time.sleep(1.0)

------------------builtin neopixel and dcmotor-----------------
# bluetooth module のvccも、DC用の電池でなく、xiaoの5vからとったほうが安定動作した
from machine import Pin,UART
import time
from ws2812 import WS2812

uart=UART(0,9600,tx=Pin(0),rx=Pin(1))
IN1=Pin(26,Pin.OUT)
IN2=Pin(27,Pin.OUT)
switch = Pin(11, Pin.OUT, value=1)
led = WS2812(12, 1)
colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255))
for color in colors:
    led.pixels_set(0, color)
    led.pixels_show()
    time.sleep(1.0)
led.pixels_set(0, (0,0,0))
led.pixels_show()
while True:
      c = uart.readline()
      if c == b'f':
            print("foward")
            IN1.value(1)
            IN2.value(0)
            time.sleep(0.5)
       
            print("stop")
            IN1.value(0)
            IN2.value(0)
            time.sleep(0.5)
           
      else:
          if c == b'b':
            print("back")
            IN1.value(0)
            IN2.value(1)
            time.sleep(0.5)
           
            print("stop")
           
            IN1.value(0)
            IN2.value(0)
            time.sleep(0.5)

2022年6月14日火曜日

keyestudio ks0308drv and 37 in one

ギアードモータ両側使用 前進、後退、回転を関数で

(function (receivedNumber) {
if (receivedNumber == 1) {
basic.showIcon(IconNames.Heart)
前進()
basic.pause(500)
停止()
} else {
if (receivedNumber == 0) {
basic.showIcon(IconNames.No)
後退()
basic.pause(500)
停止()
} else {
basic.showIcon(IconNames.Pitchfork)
回転()
basic.pause(500)
停止()
}
}
})
input.onButtonPressed(Button.A, function () {
radio.sendNumber(1)
basic.showIcon(IconNames.Yes)
})
function 後退 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
}
function 回転 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
}
function 前進 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
}
input.onButtonPressed(Button.AB, function () {
radio.sendNumber(2)
basic.showIcon(IconNames.Pitchfork)
})
input.onButtonPressed(Button.B, function () {
radio.sendNumber(0)
basic.showIcon(IconNames.No)
})
function 停止 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
}
radio.setGroup(1)
pins.digitalWritePin(DigitalPin.P14, 1)

ギアードモータ両側使用 前進、後退を関数で
radio.onReceivedNumber(function (receivedNumber) {
if (receivedNumber == 1) {
basic.showIcon(IconNames.Heart)
前進()
basic.pause(500)
停止()
} else {
basic.showIcon(IconNames.No)
後退()
basic.pause(500)
停止()
}
})
input.onButtonPressed(Button.A, function () {
radio.sendNumber(1)
basic.showIcon(IconNames.Yes)
})
function 後退 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
}
function 前進 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
}
input.onButtonPressed(Button.B, function () {
radio.sendNumber(0)
basic.showIcon(IconNames.No)
})
function 停止 () {
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
}
radio.setGroup(1)
pins.digitalWritePin(DigitalPin.P14, 1)

ギアードモータ両側使用

radio.onReceivedNumber(function (receivedNumber) {
if (receivedNumber == 1) {
basic.showIcon(IconNames.Heart)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
} else {
basic.showIcon(IconNames.No)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
}
})
input.onButtonPressed(Button.A, function () {
radio.sendNumber(1)
basic.showIcon(IconNames.Yes)
})
input.onButtonPressed(Button.B, function () {
radio.sendNumber(0)
basic.showIcon(IconNames.No)
})
radio.setGroup(1)
pins.digitalWritePin(DigitalPin.P14, 1)

--------------37 sensor in one --------------------------------

microbit用とあるも、じつはarduinoUnoでも動いた!

alcohol,gas,vibration::febrile! ultraviolete::can work

Ks0204 keyestudio GUVA-S12SD 3528 Ultraviolet Sensor - Keyestudio Wiki

なぜか3Vに電源がなっている(5Vでもうごくが)曇りの室内では表示0だった

いろんな天気で測定が必要

Ks0037 keyestudio Vibration Sensor - Keyestudio Wikib大変あやしい そもそも

手持ちとgnc,vccが逆だった その通りにつなぐと高熱を発した!危険!

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

Ks0203 keyestudio Steam Sensor - Keyestudio Wiki

ふれないと1000前後、指で覆うと500前後になる 使用法が思いつかん

Ks0038 keyestudio Reed Switch Module - Keyestudio Wiki reed switchはマグネットが

ちかづくとswitch本体のLEDが光り、出力はLOWとなる つまりBUILTIN_LED OFF!

① Ks0032 keyestudio RGB LED Module - Keyestudio Wiki 混色不調だが一応動いた

Ks0050 keyestudio Line Tracking Sensor - Keyestudio Wiki

光でさえぎれんときは1、さえぎられたら0

Ks0051 keyestudio Infrared Obstacle Avoidance Sensor - Keyestudio Wiki

赤外線センサの入力値は、障害物未検出で「1」、検出すると「0」になるので

当該コードでは障害あるとLED13が消灯する

Ks0309 Keyestudio Thin-film Pressure Sensor (Black and Eco-friendly) - Keyestudio Wiki  無圧で100前後、圧がかかると500以上となる

Ks0033 keyestudio Analog Temperature Sensor - Keyestudio Wiki 

いわゆるサーミスタの補正コードが載っている

https://wiki.keyestudio.com/Ks0052_keyestudio_PIR_Motion_Sensor 

安定するまでに10秒はまつこと

https://wiki.keyestudio.com/KS0035_Microphone_Sound_Sensor_with_Potentiometer 左にまわすと感度がおち、かなりの大声を要する

Ks0098 keyestudio TEMT6000 Ambient Light Sensor - Keyestudio Wiki

携帯のフラッシュあてて1000となる、裏にすると10前後に減少

https://wiki.keyestudio.com/Ks0008_keyestudio_Joystick_Module

Zはデジタルで押す離すを表現、X,Yは0から1000でデフォルト位置が500

https://wiki.keyestudio.com/Ks0014_keyestudio_Analog_Rotation_Sensor

いわゆるポテンショ:振り切り左がゼロ、振り切り右が1000

https://wiki.keyestudio.com/Ks0021_keyestudio_Collision_Sensor

押すとデジタルLOWになる モジュル本体のLEDはひかる

https://wiki.keyestudio.com/Ks0031_keyestudio_Capacitive_Touch_Sensor 

Amazon手持ちとちがい、確実にタッチせんといかんかった

https://wiki.keyestudio.com/Ks0029_keyestudio_Digital_Push_Button 

押すとLOWになる

https://wiki.keyestudio.com/Ks0022_keyestudio_LM35_Linear_Temperature_Sensor すこし高めに出る

https://wiki.keyestudio.com/Ks0009_keyestudio_Photo_Interrupter_Module 

スリットにいれるものはなんでもOK

https://wiki.keyestudio.com/Ks0028_keyestudio_Photocell_Sensor O

値は0から1000で変動する

Ks0020 keyestudio Hall Magnetic Sensor - Keyestudio Wiki

凸の表面でないフラットな裏面にマグネットをちかづけないと作動しない

Ks0036 keyestudio Flame Sensor - Keyestudio Wiki 

購入したのはVとGの位置が逆だった、炎でLOWになる

Ks0048 keyestudio Water Sensor - Keyestudio Wiki  いずれも

Ks0049 keyestudio Soil Humidity Sensor - Keyestudio Wiki  アナログ出力

Ks0025 keyestudio Digital Tilt Sensor - Keyestudio Wiki デジタルだ、当然だが

Ks0011 keyestudio 5V Relay Module - Keyestudio Wiki 

この回路で成功 つまり13ピンはリレーを経由してLEDシグナルにつながっている

13ピンは常時HIGHにしており、8ピンでリレー操作して、LEDオンオフを実現している




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 のデジタル温度計もあるが、あまりなじんでいない 今後の課題