##環境
・ IoTデバイス : ESP-WROOM-32
・ ファームウエア : MicroPython1.13
・ 温度センサー : ADT7410
・ サーバー : Ubuntu 20.04 LTS
##ソースコード(ESP32)
・ ADT7410用ライブラリ
ADTLib.py
from machine import I2C, Pin
p21 = Pin(26, Pin.IN, Pin.PULL_UP)
p22 = Pin(27, Pin.IN, Pin.PULL_UP)
class ADT7410:
def __init__(self):
self.i2c = I2C(scl = Pin(27), sda = Pin(26), freq = 10000)
def getTemperature(self):
data = self.i2c.readfrom_mem(0x48, 0x00, 2)
temp = (data[0] << 8 | data[1]) >> 3
if(temp >= 4096):
temp -= 8192
value = temp * 0.0625
return value
def temperature(self):
temp = self.getValue()
return temp
・ ADT7410からデータを取得しサーバーに送信するプログラム
send.py
from machine import Pin, RTC
import network, urequests, utime
import ujson
import ADTLib
import usocket
#日付取得
def get_jst():
rtc = RTC()
url_jst = "http://worldtimeapi.org/api/timezone/Asia/Tokyo" # see http://worldtimeapi.org/timezones
retry_delay = 5000 # interval time of retry after a failed Web query
response = urequests.get(url_jst)
# parse JSON
parsed = response.json()
#parsed=ujson.loads(res) # in case string
datetime_str = str(parsed["datetime"])
year = int(datetime_str[0:4])
month = int(datetime_str[5:7])
day = int(datetime_str[8:10])
hour = int(datetime_str[11:13])
minute = int(datetime_str[14:16])
second = int(datetime_str[17:19])
subsecond = int(round(int(datetime_str[20:26]) / 10000))
# update internal RTC
rtc.datetime((year, month, day, 0, hour, minute, second, subsecond))
# setup day of the week
daysOfTheWeek = "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
tm = utime.localtime(utime.mktime(utime.localtime()))
# generate formated date/time strings from internal RTC
date_str = "{0:4d}/{1:02d}/{2:02d}".format(*rtc.datetime())
time_str = "{4:02d}:{5:02d}:{6:02d}".format(*rtc.datetime())
date_ok = date_str + " " + time_str
return date_ok
HOST = 'IPアドレス'
PORT = 8080
date = get_jst()
#温度データ取得
adt = ADTLib.ADT7410()
temp = adt.getTemperature()
data = {"temp" : temp, "date" : date}
#ソケットの作成
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
saddr = usocket.getaddrinfo(HOST, PORT)[0][-1]
#サーバーに接続
sock.connect(saddr)
#データ送信
sock.sendall(bytes(ujson.dumps(data), "utf-8"))
#終了
sock.close()
##ソースコード(サーバー)
・ データを受け取るプログラム
server.py
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
if __name__ == "__main__":
HOST, PORT = "IPアドレス", 8080
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
server.serve_forever()
##実行結果
・ESP32側
{"date": "2021/07/15 23:27:37", "temp": 28.25}'
・ サーバー側
b'{"date": "2021/07/15 23:27:37", "temp": 28.25}'
##参考文献
[1]MicroPythonのTCP通信をパケットキャプチャする