hockel 发表于 2021-6-22 10:42:03

【童心向党】党史学习机

## 前言

历史是镜子,它可以折射过去,可以昭示未来。历史也是一部教科书,让我们在过去中得到经验和教育,为未来的发展做出准备。学习史党,让我们时刻不忘老一辈革命先烈的牺牲和奉献,也让我们更清楚地意识到自己身上的使命和任务。
作为祖国的下一代,要坚定信念、发奋学习、立志报国,从小事做起,从了解一个党史故事开始,从制作一个有关党史的科创项目开始,用党的精神鞭策自己,使自己不断进步,时刻做好接班人的准备!
![](https://img-blog.csdnimg.cn/img_convert/c7320584a9c5556c40afbd02b2f85930.png)

## 视频演示

https://www.bilibili.com/video/bv1mB4y1M7Ei

## 硬件清单

| 序号 | 硬件名称       | 数量 |
| ---- | -------------- | ---- |
| 1    | 掌控板+掌控宝| 1    |
| 2    | MP3模块      | 1    |
| 3    | 声音传感器   | 1    |
| 4    | 激光切割亚克力 | 若干 |

## 电路连接

![](https://img-blog.csdnimg.cn/img_convert/5c619daff5e529ddb1e05428872790c0.png)

## 制作步骤

①用lasermaker设计该项目的模型
![](https://img-blog.csdnimg.cn/img_convert/422c09b8deea5bb15fadaf56f15019cc.png)
②:设计好的模型,进行激光切割
![](https://gitee.com/hockel/picture/raw/master/2021-6-21/1624272106454-1.jpg)
③:开始对切割好的模型进行组装
![](data/attachment/album/202106/22/105011p22oqkqq21fqohop.jpg)
![](https://gitee.com/hockel/picture/raw/master/2021-6-21/1624272106450-2.jpg)
![](https://gitee.com/hockel/picture/raw/master/2021-6-21/1624272106449-3.jpg)
![](https://gitee.com/hockel/picture/raw/master/2021-6-21/1624272106447-4.jpg)


![](https://gitee.com/hockel/picture/raw/master/2021-6-21/1624272106444-5.jpg)

## blynk APP界面设计

![](https://img-blog.csdnimg.cn/20210621170028320.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70#pic_center)

## 程序编写

**初始化操作:**

1、设置wifi名称和密码,

2、设置blynk的授权码

3、定义RGB灯引脚

4、初始化MP3引脚

5、logo显示
![](https://img-blog.csdnimg.cn/20210621165605323.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70#pic_center)
**对blynk的音乐组件进行程序设计:**
![](https://img-blog.csdnimg.cn/20210621165631448.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70#pic_center)
**对灯带相关组件进行程序编写:**
![](https://img-blog.csdnimg.cn/20210621165819993.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70#pic_center)
**对党史文本框音乐选择进行程序编写**
![](https://img-blog.csdnimg.cn/2021062116585915.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RvbnljYXJzb24=,size_16,color_FFFFFF,t_70#pic_center)

```python
from mpython import *

import network

my_wifi = wifi()

my_wifi.connectWiFi('Erised', 'yiruosi88')

import ntptime

import blynklib

blynk = blynklib.Blynk('GJZQIuafyg4uL20GCZHcbWochaz8chqE', server='39.98.114.122', port=8080)

@blynk.handle_event("connect")
def connect_handler():
    print('Blynk connected')

@blynk.handle_event("disconnect")
def connect_handler():
    print('Blynk disconnected')

import neopixel

my_rgb = neopixel.NeoPixel(Pin(Pin.P13), n=15, bpp=3, timing=1)

from bluebit import *

import _thread

import framebuf

import font.digiface_44

@blynk.handle_event('write V0')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    print(_value)
    if _value == 'play':
      mp3.play()
    elif _value == 'stop':
      mp3.pause()
    elif _value == 'prev':
      year = year + -1
      mp3.playPrev()
      oled.fill(0)
      display_font(font.digiface_44, (str(year)), 8, 8, False, 2)
      oled.show()
    else:
      mp3.playNext()
      year = year + 1
      oled.fill(0)
      display_font(font.digiface_44, (str(year)), 8, 8, False, 2)
      oled.show()

@blynk.handle_event('write V1')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    my_rgb.brightness(_value / 100)
    my_rgb.write()

@blynk.handle_event('write V2')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    print(_value)
    print(_value)
    for j in range(15):
      my_rgb = (_value, _value, _value)
    my_rgb.write()

@blynk.handle_event('write V3')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    if _value == 1:
      for i in range(15):
            my_rgb = (255, 0, 0)
      my_rgb.write()
    else:
      my_rgb.fill( (0, 0, 0) )
      my_rgb.write()
      my_rgb.write()

p0 = MPythonPin(0, PinMode.ANALOG)

def make_rainbow(_neopixel, _num, _bright, _offset):
    _rgb = ((255,0,0), (255,127,0), (255,255,0), (0,255,0), (0,255,255), (0,0,255), (136,0,255), (255,0,0))
    for i in range(_num):
      t = 7 * i / _num
      t0 = int(t)
      r = round((_rgb + (t-t0)*(_rgb-_rgb))*_bright)>>8
      g = round((_rgb + (t-t0)*(_rgb-_rgb))*_bright)>>8
      b = round((_rgb + (t-t0)*(_rgb-_rgb))*_bright)>>8
      _neopixel[(i + _offset) % _num] = (r, g, b)

@blynk.handle_event('write V4')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    print(_value)
    mp3.volume = _value

@blynk.handle_event('write V5')
def write_virtual_pin_handler(pin, _value):
    global year, state, j, i
    for i in range(0, len(_value)):
      try: _value = eval(_value)
      except: pass
    if len(_value) == 1: _value = _value
    print(_value)
    year = _value
    mp3.play_song((_value - 1919))
    oled.fill(0)
    display_font(font.digiface_44, (str(_value)), 8, 8, False, 2)
    oled.show()

mp3 = MP3(Pin.P16)

image_picture = Image()

def display_font(_font, _str, _x, _y, _wrap, _z=0):
    _start = _x
    for _c in _str:
      _d = _font.get_ch(_c)
      if _wrap and _x > 128 - _d: _x = _start; _y += _d
      if _c == '1' and _z > 0: oled.fill_rect(_x, _y, _d, _d, 0)
      oled.blit(framebuf.FrameBuffer(bytearray(_d), _d, _d,
      framebuf.MONO_HLSB), (_x+int(_d/_z)) if _c=='1' and _z>0 else _x, _y)
      _x += _d

def thread_1():
    global year, state, j, i
    while True:
      if state == 1:
            make_rainbow(my_rgb, 15, ((p0.read_analog() + 1) / 40.96), 1)
            my_rgb.write()
      else:
            pass
ntptime.settime(8, "time.windows.com")
my_rgb.brightness(50 / 100)
my_rgb.write()
mp3.volume = 15
oled.fill(0)
oled.blit(image_picture.load('one.bmp', 0), (-5), 0)
oled.show()
state = 0
year = 0
_thread.start_new_thread(thread_1, ())
while True:
    blynk.run()
```

##总结

这样子,我们的党史学习机就做好了!在制作过程中遇到了一些问题:

**Q**:在下载党史音乐的时候,如果批量下载网页中的音频文件?

**A**:我们利用python的知识进行了网页批量的下载,具体教程详情:(https://mp.weixin.qq.com/s?__biz=MzkwNzIwMDk2OA==&mid=2247483913&idx=1&sn=e18cd05f015c70d298457ba5ff961ad5&chksm=c0dd92aef7aa1bb8841018521279e43ccb763803275e130fac749247d2a57980007c30af3bd4&token=540008911&lang=zh_CN#rd)

**Q**在设计进行党史音乐选取的时候:导入SD卡文件不能安照文件命名顺序播放?

**A**我们需要先在电脑端进行排序,然后全选复制到SD卡内。问题就解决啦!

更多项目教程欢迎订阅个人博客:**www.hockel.club**

微信公众号:**跟着hockel玩科创**
![](https://img-blog.csdnimg.cn/20210621170301426.jpg#pic_center)

安卓机器人 发表于 2021-6-25 19:44:53

豪华版啊

hockel 发表于 2021-6-26 15:16:05

安卓机器人 发表于 2021-6-25 19:44
豪华版啊

见笑了{:5_125:}

李兴宇 发表于 2021-6-26 21:07:43

不不不不不不

hmilycheng 发表于 2021-6-29 19:40:40

太漂亮了!

蒋桐 发表于 2021-6-29 19:55:15

红心向党

shangwe4416 发表于 2021-7-1 08:24:19

多大功率的光雕

Jack5 发表于 2021-7-22 17:52:35

你好,请问一下,你的这个外观有源文件吗?我做了类似的,想用下你的外观修改一下

宣坝 发表于 2021-9-7 19:44:57

我是一名小学信息技术教师,想多跟你交流,timber_123这是我的微信,可否加一下。
页: [1]
查看完整版本: 【童心向党】党史学习机