打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
干货 | DIY 一个 micropython 的多功能无线电子钟
EEWORLD电子资讯 犀利解读
技术干货 每日更新
 一直想用micropython做点好玩的东西,但是因为时间问题,一直没有开始做。前一段时间用ESP8266做了一个多功能的电子钟,它具有时间显示、温湿度采集、气压采集、网络校时、网络查看等多种功能。数据记录在ESP8266内部的flash中,定时采集并保存,即使断电也可以通过锂电池继续采集数据。
使用到的元件有:
DHT11温湿度传感器,约3元
DS1307时钟 + EEPROM模块,约3元
BMP280气压传感器,6元
水银开关,0.1元
ESP8266开发板,15元
TM1637数码管模块,20元,
TP4056锂电池充电,0.5元
5x7cm万用板,1元
CH2插座、导线、排针、排母若干,1元
BMP280可以换成的BMP180(BMP180已经停产),因为可能大家还有以前剩下的BMP180模块,接口都是I2C,换个库就可以。数码管使用了大号数码管模块,上面有4个1.8寸的数码管,这样远处也可以看的比较清晰。数码管需要4.5V以上才能点亮。
水银开关是用来作为数码管方向检测,可以自动识别正反,如果不需要这个功能就可以不用。
总成本约50元。大家可以根据自己的需要,增加其它传感器和功能,比如声音(噪声)、光线、太阳能供电等。
元件一览
因为元件不多,所以没有单独做板,所有元件都焊接到一个万用板上,传感器使用排母连接,可以随时取下。焊接好的效果图如下:
全部传感器插上后的效果:
连接数码管模块、电池后的效果
运行效果
电源
系统通过ESP8266模块的USB供电,它也是编程调试接口,系统可以使用手机的USB充电器供电。
工作原理
连接USB后,还可以给锂电池充电。USB断电后,由锂电池继续供电。但是锂电池电压较低,不足以点亮数码管,因此关闭数码管显示,但是可以继续采集传感器数据。
通过ADC采集系统电压,当USB输入是5V,锂电池供电最高4.2V,通过电压就可以判断是USB供电还是锂电池供电。需要注意ESP8266的ADC最高输入电压是1V,因此需要进行合适的分压。ESP8266模块上已经有两个100K和220K电阻进行了分压,可以满足最高3V输入电压,考虑到USB是5V电压,还需要外加一个电阻。
在USB供电时,可以通过Wifi连接到网络,并通过网络进行校准时间。ESP8266还可以作为主机,通过计算机、手机浏览器打开就可以查看当前传感器参数。更进一步,还可以通过浏览器设置系统参数,比如设置传感器采集时间间隔、控制传感器的开关、设置传感器校准参数等。
GPIO分配
ESP8266的GPIO比较少,需要合理分配:
ADC
电池电压采集
GPIO14
DHT11
GPIO2
LED
GPIO5
SDA
GPIO4
SCL
GPIO12
CLK/TM1637
GPIO13
DIO/TM1637
GPIO12
水银开关检测
此外,为了让ESP8266可以通过RTC唤醒,GPIO16需要连接到RST上。
简单的测试程序
网络部分还没有加上
from machine import Pin, I2C, RTC, ADC
led = Pin(2, Pin.OUT, value=1)
import machine
import time
import bmp280
import dht
import TM1637
import DS1307
i2c=I2C(sda=Pin(5), scl=Pin(4))
ds=DS1307.DS1307(i2c)
adc = ADC(0)
rtc = RTC()
b = bmp280.BMP280(i2c)
dht11 = dht.DHT11(Pin(14))
dir_pin=Pin(4, Pin.IN, Pin.PULL_UP)
def getDir():
dir_pin=Pin(4, Pin.IN, Pin.PULL_UP)
dir = dir_pin()
return dir
tm=TM1637.TM1637(dio=Pin(13), clk=Pin(12))
def init():
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
t = (adc.read() + adc.read()) // 2
if t > 450:
for i in range(4):
tm.showDP(i)
time.sleep_ms(500)
tm.showDP(i, 0)
init()
old = 99
while 1:
sec=ds.Second()
t = (adc.read() + adc.read()) // 2
if t < 450:
rtc.alarm(rtc.ALARM0, 2000)
machine.deepsleep()
else:
if sec!=old:
old=sec
min=ds.Minute()
hour=ds.Hour()
if (sec%10) > 3:   # Time
tm.shownum(hour*100+min)
tm.showDP(1,sec%2)
tm.showDP(2,sec%2)
elif (sec%10) > 1: # Temperature
t = round(b.getTemp())
tm.clear()
if t < 0:
tm._dat(0, 0x40)
t = -t
if t > 85:
t = 85
tm.showbit(t//10, 1)
tm.showbit(t%10, 2)
tm._dat(3, 0x39)
else:              # Humidity
try:
dht11.measure()
time.sleep_ms(100)
h = dht11.humidity()
if h > 100:
h = 100
tm.clear()
if h==100:
tm.showbit(1, 0)
tm.showbit(h//10, 1)
tm.showbit(h%10, 2)
tm._dat(3, 0x76)
except:
pass
time.sleep_ms(50)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MicroPython快速参考ESP8266
ESP32引脚参考:您应该使用哪个GPIO引脚?
ESP32芯片IO解读
ESP32快速入门指南
高通7X27平台培训总结
ESP32应用指南
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服