社区导航

 
查看: 4734|回复: 8

[原创] DIY一个micropython的多功能无线电子钟

[复制链接]

7182

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-5-31 01:05:26 | 显示全部楼层 |阅读模式
本帖最后由 dcexpert 于 2018-5-31 01:15 编辑

一直想用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元。大家可以根据自己的需要,增加其它传感器和功能,比如声音(噪声)、光线、太阳能供电等。


元件一览

01.jpg

02.jpg


因为元件不多,所以没有单独做板,所有元件都焊接到一个万用板上,传感器使用排母连接,可以随时取下。焊接好的效果图如下:

07.jpg

04.jpg


全部传感器插上后的效果:

03.jpg



连接数码管模块、电池后的效果

06.jpg


运行效果

05.jpg


电源

系统通过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电池电压采集
GPIO14DHT11
GPIO2LED
GPIO5SDA
GPIO4 SCL
GPIO12 CLK/TM1637
GPIO13 DIO/TM1637
GPIO12 水银开关检测


此外,为了让ESP8266可以通过RTC唤醒,GPIO16需要连接到RST上。


原理图

(原理图还没有时间整理出来,等后面补上)


PCB

待定




简单的测试程序

网络部分还没有加上

  1. from machine import Pin, I2C, RTC, ADC
  2. led = Pin(2, Pin.OUT, value=1)
  3. import machine
  4. import time

  5. import bmp280
  6. import dht
  7. import TM1637
  8. import DS1307

  9. i2c=I2C(sda=Pin(5), scl=Pin(4))
  10. ds=DS1307.DS1307(i2c)
  11. adc = ADC(0)
  12. rtc = RTC()
  13. b = bmp280.BMP280(i2c)
  14. dht11 = dht.DHT11(Pin(14))

  15. dir_pin=Pin(4, Pin.IN, Pin.PULL_UP)

  16. def getDir():
  17.     dir_pin=Pin(4, Pin.IN, Pin.PULL_UP)
  18.     dir = dir_pin()
  19.    
  20.     return dir

  21. tm=TM1637.TM1637(dio=Pin(13), clk=Pin(12))

  22. def init():
  23.     rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
  24.     t = (adc.read() + adc.read()) // 2
  25.     if t > 450:
  26.         for i in range(4):
  27.             tm.showDP(i)
  28.             time.sleep_ms(500)
  29.             tm.showDP(i, 0)


  30. init()

  31. old = 99
  32. while 1:
  33.     sec=ds.Second()
  34.     t = (adc.read() + adc.read()) // 2
  35.     if t < 450:
  36.         rtc.alarm(rtc.ALARM0, 2000)
  37.         machine.deepsleep()
  38.     else:
  39.         if sec!=old:
  40.             old=sec
  41.             min=ds.Minute()
  42.             hour=ds.Hour()
  43.             if (sec%10) > 3:   # Time
  44.                 tm.shownum(hour*100+min)
  45.                 tm.showDP(1,sec%2)
  46.                 tm.showDP(2,sec%2)
  47.             elif (sec%10) > 1: # Temperature
  48.                 t = round(b.getTemp())
  49.                 tm.clear()
  50.                 if t < 0:
  51.                     tm._dat(0, 0x40)
  52.                     t = -t
  53.                 if t > 85:
  54.                     t = 85
  55.                 tm.showbit(t//10, 1)
  56.                 tm.showbit(t%10, 2)
  57.                 tm._dat(3, 0x39)
  58.             else:              # Humidity
  59.                 try:
  60.                     dht11.measure()
  61.                     time.sleep_ms(100)
  62.                     h = dht11.humidity()
  63.                     if h > 100:
  64.                         h = 100
  65.                     tm.clear()
  66.                     if h==100:
  67.                         tm.showbit(1, 0)
  68.                     tm.showbit(h//10, 1)
  69.                     tm.showbit(h%10, 2)
  70.                     tm._dat(3, 0x76)
  71.                 except:
  72.                     pass
  73.                
  74.     time.sleep_ms(50)

复制代码


DIY还没有完成,程序还需要进一步改进,加上网络功能、server功能、数据保存等。等最后完成后,会逐步整理出来,在github上和大家分享。如果有网友需要PCB可以留言,超过5个网友就会去做板,可以免费提供空的PCB。

此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处。欢迎大家大家一起研究,但是严禁XXX公司(暂时不点名了)抄袭。






评分

1

查看全部评分



回复

使用道具 举报

977

TA的帖子

26

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-31 06:09:46 来自手机 | 显示全部楼层
做的不错,家里又多了一个电子钟


回复

使用道具 举报

1623

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-31 08:48:00 | 显示全部楼层
好东西啊


回复

使用道具 举报

30

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-31 10:46:33 来自手机 | 显示全部楼层
这些元器件的库哪里可以下载啊?


回复

使用道具 举报

7182

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2018-5-31 14:36:57 | 显示全部楼层
grey27 发表于 2018-5-31 10:46
这些元器件的库哪里可以下载啊?

忘记写了,在github上的mpy-lib中。

https://github.com/shaoziyang/mpy-lib


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-6-8 15:58:04 | 显示全部楼层
只有仰视的份,我现在51都玩不好,羡慕ing...


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-6-25 01:30:32 | 显示全部楼层
本帖最后由 tksfbz2 于 2018-6-25 01:52 编辑

我要PCB。谢谢!

TM1637数码管模块,20元
这个淘宝上没有卖的。


请问哪个店里能把这些配齐啊?
最好你们弄个散件包什么的,我们去买也行。

点评

PCB还没有做。  详情 回复 发表于 2018-6-25 13:24


回复

使用道具 举报

7182

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2018-6-25 13:24:40 | 显示全部楼层
tksfbz2 发表于 2018-6-25 01:30
我要PCB。谢谢!

TM1637数码管模块,20元
这个淘宝上没有卖的。


请问哪个店里能把这些配齐啊?
...

PCB还没有做。


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 4 天前 | 显示全部楼层
很棒哦,帖子写的不错,加油加油,以后可以多发这种帖子,对自己也很有帮助,不光能加深自己对知识的理解,还能提高自己的表达能力
好好学习,天天向上


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-14 00:46 , Processed in 0.259892 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表