sht20测温web结合呼吸灯
0 票
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">°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)