■目的

 サーバー室内の環境(温度、湿度)をマイコンで取得、mqttで情報を送信する。

■有線適用背景
 PICO-Wでmqttなどをテストしてきましたが、当然Wifiが必要です。

 現場ではWifiがあるとは限らず、しかし有線LANを使用可能な場合もあります。

 速度は状況次第ですが、一般的に有線LANは安定的に接続動作可能と思います。
 そこで有線LAN接続可能かつ手慣れたPICOとコンパチである

   W5100S-EVB-Pico

 を適用します。
 これをうまく使えると、たぶんにW5500モデュール+PICOでも動くでしょう。

■適用部品

 「W5100S-EVB-Pico」

 ・有線LANアダプタWIZNET社W5100を実装済

 ・ピンアサイン:ラズパイPICOコンパチ、SPI0接続済

 ・購入先:スイッチサイエンス。片側20Pのロングピン付属(要はんだ付け)

 

■参考情報
【出典1】W5100S-EVB-Pico [Micropython] - MQTT
https://www.hackster.io/louis_m/w5100s-evb-pico-micropython-mqtt-1a55ac

・全体の流れやピンアサインが参考になりました。
・UF2のリンクが切れていました。
 →【出典2】

  ラズパイ公式でMicropythonのRP2040からW5100-EVS-PICOを選び、

  ダンロードしました↓

 

・出典1にはライブラリの説明がありません。
 →PICO-Wでのumqttライブラリを使えます。
・出典1のサンプルコードのままではnic自体が動きません。
 →nicをアクティブにする手続きが設け、そのあとにIPアドレス設定を行います。
 →SPIのボーレートの値のなかの不要文字(アンダーバー)を削除して使います。
・W5100S-EVB-Picoは最初からW5100とPICOがSPI接続されていますので、
 下記のピンがW5100専用になっています。
  GPIO16    W5100SのMISOに接続
  GPIO17    W5100SのCSn に接続
  GPIO18    W5100SのSCLK に接続
  GPIO19    W5100SのMOSI に接続
  GPIO20    W5100SのRSTnに接続
  GPIO21    W5100SのINTn に接続
  GPIO25    ユーザーLEDに接続
 

【出典3】MicroPythonのWiFi設定を整える
・https://blog.goediy.com/?p=297
・PICO-W用(Wifi用)ですが、nicをアクティブにする手順が参考になりました。

 

■結線状態

・ブレッドボード上に部品を配置しました。

 PICO専用のピンアサイン表示付きロングピンソケットをそのまま使えます。

 

・kabapython(私)の場合、GP16、17はI2C0に使うことに決めていますが、

 今回の基盤ではSPI0に持っていかれてますのでGP0と1をI2C0に適用しています。

・SPI以外に使用するGPIO

  GP0、GP1:I2C0

  GP2〜GP5 :ディップスイッチ(デバイスアドレス設定用)

  GP6〜GP8 :ディップスイッチ(動作モード選択用)

  GP5はブレッドボード都合で使わず。

・I2C接続センサー

  RTC:DS3231(3.3V動作、充電回路除去済)

  温湿度センサー:AHT20

 

■動作テスト

所要ライブラリ

・umqtt

・ds3231

・ahtx0

いずれもライブラリ入手先は過去記事ご参照ください。


【動作テストコード】

・ベタで載せます。

・参照URLの改行異常有無にご留意のうえ適宜調整ください。

・取り急ぎmqtt無しのテストです。mqtt部分は後日追記、別記事化します。

 

###### server room monitor ######
# version 0.1
# required W5100-EVB-PICO
# required UF2 for W5100-EVB-PICO
#   https://micropython.org/download/W5100S_EVB_PICO/
# required rtc DS3231
# required labrary for mqtt
# get simple.py from as bellows;
# https://github.com/micropython/micropython‐lib/blob/master/micropython/umqtt.simple/umqtt/simple.py
# set simple.py in umqtt folder
# get robust.py from as bellows;
# https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.robust
# set robust.py in umqtt folder
# robust.py adds auto-reconnect facilities for some of networking errors.
from umqtt.simple import MQTTClient

#typical UF2 for PICO has no network-library
#so,required UF2 for W5100-EVB-PICO
import network

#set libraries

#library for AHT20 as Humidity and Temperature Sensor
from ahtx0 import AHT20

#ds3231 require special library
# arranged by kabayon 241111
from ds3231 import DS3231

#ssd1306 oled-dsiplay require special library
#import ssd1306
#今回は使っていませんが、あったほうがよいかも。。。

from machine import Pin
from machine import SoftI2C
from time import sleep_ms
import time

# スイッチ(入力)オブジェクト設定
as01 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)
as02 = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_UP)
as03 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP)
as04 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP)
ms01 = machine.Pin(7, machine.Pin.IN, machine.Pin.PULL_UP)
ms02 = machine.Pin(8, machine.Pin.IN, machine.Pin.PULL_UP)
ms03 = machine.Pin(9, machine.Pin.IN, machine.Pin.PULL_UP)

sts_as01 = as01.value()
sts_as02 = as02.value()
sts_as03 = as03.value()
sts_as04 = as04.value()
dec_address = 8*sts_as01 + 4*sts_as02 + 2*sts_as03 + sts_as04
bit_address = str(sts_as01) + str(sts_as02) + str(sts_as03) + str(sts_as04)
sts_ms01 = ms01.value()
sts_ms02 = ms02.value()
sts_ms03 = ms03.value()
dec_mode = 4*sts_ms01 + 2*sts_ms01 + sts_ms03
bit_mode = str(sts_ms01) + str(sts_ms02) + str(sts_ms03)
#print("address - ",bit_address,dec_address,"  mode - ",bit_mode,dec_mode)

#set i2c0
sda_i2c0 = 0
scl_i2c0 = 1
freq_i2c0= 400000
i2c0 = SoftI2C(scl=Pin(scl_i2c0), sda=Pin(sda_i2c0), freq=freq_i2c0) 

#set AHT20-object
aht21 = AHT20(i2c0)

#set RTC-object
rtc_ds3231 = DS3231(i2c0)

#set_time_rtc ・・・時刻手動設定用。1回設定したら以後は必要時のみ。
#year_set=2024
#month_set=11
#day_set=11
#hour_set=17
#minute_set=03
#second_set=00
#weekday_set=1  #monday=1
#rtc_ds3231.set_time(year_set, month_set, day_set, hour_set, minute_set, second_set, weekday_set, 00)

sleep_ms(2000)
for i in range(0,1):
    t = rtc_ds3231.get_time()
    time_record = str(t[0])+str(t[1])+str(t[2])+str(t[3])+str(t[4])+str(t[5])
    temperature_record = str
    temp_now = aht21.temperature
    humd_now = aht21.relative_humidity
    aht20_record ="T" + str(round(temp_now,1)) + "H" + str(round(humd_now,1))
    data_record = "A"+bit_address+"M"+bit_mode+"D"+time_record+aht20_record
    print(data_record)

 

■動作結果

MPY: soft reboot
A0101M111D20241112113424T24.6H51.5

 

1行目はThonnyからPICOに接続してコード起動リセットした際のメッセージ。

2行目が今回のコードのprint文の標準出力。

A0101:デバイスアドレス(DIP-SWが1010、負論理)

M111:動作モード(DIP-SWすべてoff、負論理)

D20241112113424:YYYYMMDDhhmmss

T24.6:温度

H51.5:湿度

 

以後、mqtt動作確認分を追記して別記事化の予定