sht20测温web结合呼吸灯

boot.py

from machine import Pin, Timer, PWM, I2C
import utime
import network, gc, socket
from sht2x import SHT2x

gc.collect()
s =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)
sensor = SHT2x(I2C(scl=Pin(5), sda=Pin(4)))
led = Pin(2, Pin.OUT)
utime.sleep(10)
led.value(1)
LED = PWM(Pin(15))
p = 0
dp = 4

def LED_set(t):
    global p, dp
    LED.duty(p)
    p += dp
    if p == 0 or p > 1023 - dp:
        dp = -dp

def getTH():
    th = []
    th.append(str(sensor.getTemperature())[0:4])
    th.append(str(sensor.getHumidity())[0:4])
    return th

def web_page(th):
    html = """<!DOCTYPE HTML><html><head><link rel="icon" href="data:;base64,=">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
    <title>SHT20 Senor</title>
    <script> function countDown(){ var time = document.getElementById("Time"); if(time.innerHTML == 0){ window.location.href="http://192.168.4.1"; }
    else{ time.innerHTML = time.innerHTML-1; } } window.setInterval("countDown()",1000); </script>
    <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; }
    h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } 
    .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } #Time,#p{	font-size: 1.0rem; text-align: center; }
    </style></head><body><h2>SHT20 Senor</h2>
    <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span id="temperature">""" + th[0] + """</span>
    <sup class="units">&deg;C</sup></p>
    <p><i class="fa fa-tint" style="color:#059e8a;"></i> 
    <span id="humidity">""" + th[1] + """</span>
    <sup class="units">%</sup></p>
    <font color="yellow"><p id="Time" >30</p></font>
    </body></html>"""
    return html

def ap(ESSID):
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ap.config(essid=ESSID, authmode=0)


if __name__ == "__main__":
    tm = Timer(2)
    tm.init(period=10, mode=Timer.PERIODIC, callback=LED_set)
    ap("SHT20_T&H")
    while True:
        th = getTH()
        try:
            if gc.mem_free() < 102000:
                gc.collect()
            conn, addr = s.accept()
            conn.settimeout(5.0)
            request = conn.recv(1024)
            conn.settimeout(None)
            request = str(request)
            response = web_page(th)
            conn.send('HTTP/1.1 200 OK\n')
            conn.send('Content-Type: text/html\n')
            conn.send('Connection: close\n\n')
            conn.sendall(response)
            conn.close()
        except OSError as e:
            conn.close()

sht2x.py

# This program is distributed under Apache License Version 2.0
#
# © Albertas Mickenas, 2016
# [email protected]
# [email protected]
#

import time

class SHT2x:
	i2c = []
	ADDR = 64

	POLYNOMIAL = 0x131                  # POLYNOMIAL x8 + x5 + x4 +1.

	CMD_READ_TEMPERATURE_hold = 0xE3
	CMD_READ_HUMIDITY_hold    = 0xE5

	CMD_READ_TEMPERATURE = 0xF3
	CMD_READ_HUMIDITY    = 0xF5
	CMD_READ_REGISTER    = 0xE7
	CMD_WRITE_REGISTER   = 0xE6
	CMD_RESET 			 = 0xFE

	def __init__(self, _i2c):
		self.i2c = _i2c

	def CheckCRC(self, buf):
		POLYNOMIAL = 0x131  # POLYNOMIAL x8 + x5 + x4 +1.
		crc = 0
		for i in range(2):
			crc ^= buf[i]
			for bit in range(8):
				if (crc & 0x80):
					crc = (crc << 1) ^ POLYNOMIAL
				else:
					crc = (crc << 1)
		return  crc

	def toTemperature(self, buf):
		if buf == False:
			print("CRC Error...\r\n")
			return False
		else:
			return -46.85 + 175.72 * ((buf[0] << 8) + buf[1]) /2**16

	def toHumidity(self, buf):
		if buf == False:
			print("CRC Error...\r\n")
			return False
		else:
			return -6 + 125.0 * ((buf[0] << 8) + buf[1]) / 2**16

	def decodeUserReg(self, buf):
		reg = buf[0]
		ret = []
		if(0b10000001 & reg == 0b10000001):
			ret.append("11bits")
		elif(0b10000001 & reg == 0b10000000):
			ret.append("RH 10bit T 13bit")
		elif(0b10000001 & reg == 0b00000001):
			ret.append("RH 8bit T 12bit")
		elif(0b10000001 & reg == 0b00000000):
			ret.append("RH 12bit T 14bit")
		
		if(0b01000000 & reg == 0b01000000):
			ret.append("VDD < 2.5")
		else:
			ret.append("VDD > 2.5")

		if(0b00000100 & reg == 0b00000100):
			ret.append("heater ON")
		else:
			ret.append("heater OFF")

		if(0b00000010 & reg == 0b00000010):
			ret.append("OTP reload disabled")
		else:
			ret.append("OTP reload enabled")

		return ret

	def runI2CCommand(self, command, bytesToRead):
		b = bytearray(1)
		b[0] = command

		self.i2c.writeto(self.ADDR, b)

		if(bytesToRead > 0):
			recv = bytearray(bytesToRead)
			retryCounter = 0
			done = False
			while retryCounter < 15 and not done:
				try:
					self.i2c.readfrom_into(self.ADDR, recv)
					done = True
					retryCounter = retryCounter + 1				
				except:
					time.sleep(0.01)
			if (self.CheckCRC(recv) == recv[2]):
				pass
			else:
				return False
			return recv

	def getTemperature(self):
		return self.toTemperature(self.runI2CCommand(self.CMD_READ_TEMPERATURE, 3))

	def getHumidity(self):
		return self.toHumidity(self.runI2CCommand(self.CMD_READ_HUMIDITY, 3))
	
	def getUserRegister(self):
		return self.decodeUserReg(self.runI2CCommand(self.CMD_READ_REGISTER, 1))

	def setUserRegister(self, register):
		b = bytearray(2)
		b[0] = self.CMD_WRITE_REGISTER
		b[1] = register & 0b11000111
		self.i2c.writeto(self.ADDR, b)

	def reset(self):
		self.runI2CCommand(self.CMD_RESET, 0)