物联网  >   智能工业  >  正文

49.6元DIY 一个 micropython 的多功能无线电子钟

        看大神如何自己动手做无线电子钟!

  一直想用micropython做点好玩的东西,但是因为时间问题,一直没有开始做。前一段时间用ESP8266做了一个多功能的电子钟,它具有时间显示、温湿度采集、气压采集、网络校时、网络查看等多种功能。数据记录在ESP8266内部的flash中,定时采集并保存,即使断电也可以通过锂电池继续采集数据。

  使用到的元件有:DHT11温湿度传感器,约3元

  DS1307时钟 + EEPROM模块,约3元

  BMP280气压传感器,6元

  水银开关,0.1元

  ESP8266开发板,15元

  TM1637数码管模块,20元,

  TP4056锂电池充电,0.5元

  5x7cm万用板,1元

  CH2插座、导线、排针、排母若干,1元,共计49.6

  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上。

  简单的测试程序

  网络部分还没有加上

 

  1. from machine import Pin, I2C, RTC, ADC

  2. led = Pin(2, Pin.OUT, value=1)

  3. import machine

  4. import time

  5.  

  6. import bmp280

  7. import dht

  8. import TM1637

  9. import DS1307

  10.  

  11. i2c=I2C(sda=Pin(5), scl=Pin(4))

  12. ds=DS1307.DS1307(i2c)

  13. adc = ADC(0)

  14. rtc = RTC()

  15. b = bmp280.BMP280(i2c)

  16. dht11 = dht.DHT11(Pin(14))

  17.  

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

  19.  

  20. def getDir():

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

  22.     dir = dir_pin()

  23.     

  24.     return dir

  25.  

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

  27.  

  28. def init():

  29.     rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)

  30.     t = (adc.read() + adc.read()) // 2

  31.     if t > 450:

  32.         for i in range(4):

  33.             tm.showDP(i)

  34.             time.sleep_ms(500)

  35.             tm.showDP(i, 0)

  36.  

  37.  

  38. init()

  39.  

  40. old = 99

  41. while 1:

  42.     sec=ds.Second()

  43.     t = (adc.read() + adc.read()) // 2

  44.     if t < 450:

  45.         rtc.alarm(rtc.ALARM0, 2000)

  46.         machine.deepsleep()

  47.     else:

  48.         if sec!=old:

  49.             old=sec

  50.             min=ds.Minute()

  51.             hour=ds.Hour()

  52.             if (sec%10) > 3:   # Time

  53.                 tm.shownum(hour*100+min)

  54.                 tm.showDP(1,sec%2)

  55.                 tm.showDP(2,sec%2)

  56.             elif (sec%10) > 1: # Temperature

  57.                 t = round(b.getTemp())

  58.                 tm.clear()

  59.                 if t < 0:

  60.                     tm._dat(0, 0x40)

  61.                     t = -t

  62.                 if t > 85:

  63.                     t = 85

  64.                 tm.showbit(t//10, 1)

  65.                 tm.showbit(t%10, 2)

  66.                 tm._dat(3, 0x39)

  67.             else:              # Humidity

  68.                 try:

  69.                     dht11.measure()

  70.                     time.sleep_ms(100)

  71.                     h = dht11.humidity()

  72.                     if h > 100:

  73.                         h = 100

  74.                     tm.clear()

  75.                     if h==100:

  76.                         tm.showbit(1, 0)

  77.                     tm.showbit(h//10, 1)

  78.                     tm.showbit(h%10, 2)

  79.                     tm._dat(3, 0x76)

  80.                 except:

  81.                     pass

  82.                 

  83.     time.sleep_ms(50)

 

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

上一篇:“土味话新机”——新一代网红工控机跨界“撩人”

下一篇:【玩转Micro:bit】自制超声波避障小车