from machine import I2C, Pin, PWM, ADC
import time
import utime
import math
TEMP_THRESHOLD_COLD = 37
ntc_adc = ADC(Pin(26))
buzzer = PWM(Pin(16))
buzzer.freq(300)
ADC_MAX = 65535
REFERENCE_VOLTAGE = 3.3
BETA = 3950
ROOM_TEMP = 298.15
REFERENCE_TEMP = 298.15
def read_temperature():
adc_value = ntc_adc.read_u16()
voltage = adc_value * REFERENCE_VOLTAGE / ADC_MAX
resistance = (REFERENCE_VOLTAGE / voltage) - 1
resistance = 10000 / resistance
temperature_kelvin = 1 / (1 / ROOM_TEMP + (1 / BETA) * (math.log(resistance / 10000)))
temperature_celsius = temperature_kelvin - 273.15
return temperature_celsius
class MPU6050:
def __init__(self, i2c, address=0x68):
self.i2c = i2c
self.address = address
self.init()
def init(self):
self.i2c.writeto_mem(self.address, 0x6B, b'\x00')
def read_raw_data(self, reg):
high = self.i2c.readfrom_mem(self.address, reg, 1)
low = self.i2c.readfrom_mem(self.address, reg + 1, 1)
value = (high[0] << 8) + low[0]
if value > 32767:
value -= 65536
return value
def get_accel_data(self):
ax = self.read_raw_data(0x3B)
ay = self.read_raw_data(0x3D)
az = self.read_raw_data(0x3F)
return ax, ay, az
def get_gyro_data(self):
gx = self.read_raw_data(0x43)
gy = self.read_raw_data(0x45)
gz = self.read_raw_data(0x47)
return gx, gy, gz
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
mpu = MPU6050(i2c)
while True:
temp_value = read_temperature()
ax, ay, az = mpu.get_accel_data()
gx, gy, gz = mpu.get_gyro_data()
if az < -5000 and temp_value < TEMP_THRESHOLD_COLD:
buzzer.duty_u16(60000)
else:
buzzer.duty_u16(0)
print('Accelerometer:', ax, ay, az)
print('Gyroscope:', gx, gy, gz)
time.sleep(0.3)