目录
OLED屏
本次所用的0.9寸OLED屏仅含I2C接口,首先要找到该显示屏的驱动程序,从GitHub上的microPython库,driver文件夹中能找到该文件ssd1306.py
https://github.com/micropython/micropython/tree/master/drivers/display
将该驱动文件拷贝到项目工程文件中调用即可,如下案例
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
scl = Pin(12, Pin.OUT) #OLED屏的SCL管脚接GPIO12管脚
sda = Pin(14, Pin.OUT) #OLED屏的SCL管脚接GPIO14管脚
i2c = I2C(scl=scl, sda=sda)
oled = SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("Hello", 0 , 0)
oled.show()
DHT11温湿度传感器
说明:micropython固件已自带这个库,直接导入即可,如下案例
import dht
import machine
import time
d = dht.DHT11(machine.Pin(4))
for i in range(10):
d.measure()
print("温度和湿度为:", d.temperature(), d.humidity())
time.sleep_ms(2000)
光敏传感器
示例代码:
from machine import Pin
import time
p2 = Pin(2, Pin.OUT) #ESP8266上的led灯
p5 = Pin(5, Pin.IN, Pin.PULL_UP) #光敏传感器的DO管脚接入GPIO05
while True:
if p5.value() == 1:
p2.off()
if p5.value() == 0:
p2.on()
print(p5.value())
time.sleep_ms(1000)
超声波测距传感器HC-SR04
HC-SR04超声波模块测距原理
给模块Trig管脚1个最少10us的高电平,模块接受到高电平后开始发射8个40KHz的声波,Echo脚会由0变为1,MCU开始计时,当超声波模块接收到返回的声波时,Echo由1变为0,MCU停止计时,这时间差就是测距总时间,在乘声音的传播速度340米/秒,除2就是距离。
如下面的案例:
import time
from machine import Pin
#下面用于超声波测距
Trig = Pin(4, Pin.OUT) #传感器Trig管脚接入GPIO04
Echo = Pin(5, Pin.IN) #传感器Echo管脚接入GPIO05
Trig.off()
Echo.off()
#获取超声波测量的距离
def checkDist():
#对传感器Trig管脚产生一个10us的脉冲
Trig.on()
time.sleep_us(10)
Trig.off()
#获取开始测量的时间,Echo值由0变为1
while(Echo.value()==0):
pass
t1 = time.ticks_us()
#获取测量结束时间,Echo值由1变为0
while (Echo.value()==1):
pass
t2 = time.ticks_us()
#获取时间差,除以1000变为ms
t3 = time.ticks_diff(t2, t1)/1000
#返回测量值,开始测距的时间减测距完成的时间*声音的速度/2(来回)
return t3*340/2
数据滤波处理,去除最大和最小值,之后取平均值
#数据滤波处理
def forAverage(data_list):
if len(data_list)==0:
return 0
if len(data_list)>2:
data_list.remove(min(data_list))
data_list.remove(max(data_list))
average_date = float((sum(data_list))/len(data_list))
return average_date
elif len(data_list)<=2:
average_date = float((sum(data_list)) / len(data_list))
return average_date
之后再进行调用
def main():
try:
while True:
dataList = []
for i in range(10):
dataList.append(checkDist())
print(str(forAverage(dataList)))
time.sleep_ms(100)
except KeyboardInterrupt:
pass
上述程序测试成功后,将其封装为hcsr04.py驱动程序,如下
import time
class HCSR04:
def __init__(self, trig, echo, aveNum=10):
self.trig = trig
self.echo = echo
self.aveNum = aveNum
trig.init(trig.OUT, value =0)
echo.init(echo.IN, value =0)
# 获取超声波测量的距离(单次)
def getDistOnce(self):
# 对传感器Trig管脚产生一个10us的脉冲
self.trig.on()
time.sleep_us(10)
self.trig.off()
# 获取开始测量的时间,Echo值由0变为1
while (self.echo.value() == 0):
pass
t1 = time.ticks_us()
# 获取测量结束时间,Echo值由1变为0
while (self.echo.value() == 1):
pass
t2 = time.ticks_us()
# 获取时间差,除以1000变为ms
t3 = time.ticks_diff(t2, t1) / 1000
# 返回测量值,开始测距的时间减测距完成的时间*声音的速度/2(来回)
return t3 * 340 / 2
#滤波处理,去掉最大最小值,然后取平均值
def forAverage(self, data_list):
if len(data_list) == 0:
return 0
if len(data_list) > 2:
data_list.remove(min(data_list))
data_list.remove(max(data_list))
average_date = float((sum(data_list)) / len(data_list))
return average_date
elif len(data_list) <= 2:
average_date = float((sum(data_list)) / len(data_list))
return average_date
#最终输出结果值
def aveValue(self):
dataList = []
for i in range(self.aveNum):
dataList.append(self.getDistOnce())
#print(dataList)
return self.forAverage(dataList)
调用方式如下
#超声波传感器测距
from machine import Pin
import hcsr04
Trig = Pin(4) #传感器Trig管脚接入GPIO04
Echo = Pin(5) #传感器Echo管脚接入GPIO05
hcs1 = hcsr04.HCSR04(trig= Trig, echo= Echo, aveNum=5)
value = hcs1.aveValue() #结果值