美文网首页
第六章 别具一格的生日礼物:音乐贺卡+跳动的心(8*8点阵+蜂鸣

第六章 别具一格的生日礼物:音乐贺卡+跳动的心(8*8点阵+蜂鸣

作者: 创客创未来 | 来源:发表于2018-06-07 08:22 被阅读486次

本系列文章为作者原创,未经作者书面同意,不得转载!

儿子的生日快到了,准备一份什么样的生日礼物呢?
翻了翻装电子元器件的箱子,找到了几样东西,有了,就做一个音乐贺卡吧!
您肯定会好奇,我到底找到了哪几样东西?这个音乐贺卡到底长什么样?那接着往下看吧!


今天我们的项目就是做一个电子音乐贺卡。
大家肯定见过商店里的电子音乐贺卡,没准您就收到过这样的贺卡:


贺卡01.png

打开贺卡就会有电子音乐响起,是不是很神奇?
其实它的秘密就是这个:


贺卡02-1.png

这个小小的带一个折叠开关电子音乐播放装置往往藏在贺卡里面,就像下面这张贺卡,它就藏在钢琴里面,是不是很有趣?


贺卡03.png

我们马上要做的这个贺卡肯定跟咱们在商店买的电子贺卡不太一样,要更加有趣,关键是这个贺卡是我们自己动手做的,感情更真!

如果您是一位家长,您也可以做一个送给您的孩子,关键是还能带着孩子一起来完成,既给孩子准备了一份特别的礼物,又带着孩子一起学习了很多知识,特别的礼物+亲子+学习,是不是听着就很期待?

如果您是一个孩子,您也可以给您的父母准备这样一份礼物哦,亲手制作的礼物,心意更浓!

说得有点多,我们开始吧!

1 本章您将学到

在这个项目中,您将学到的:

  • 学习使用光敏电阻
  • 学习使用无源蜂鸣器
  • 学习使用8*8 LED点阵

2 工具和组件

2.1 工具列表

本项目不需要额外的工具。

2.2 元器件列表

元器件 型号 数量 备注
主控板 arduino nano 1
光敏电阻 1
8*8点阵 1 带7219驱动模块
电阻 1K欧姆 1
无源蜂鸣器 1
杜邦线 若个
电源模块 1
9V电池 1
9V电池连接线 1

2.3 工具和元器件介绍

2.3 工具和元器件介绍

2.3.1 本项目所需工具

  1. 小胶枪


    tool1.png
  2. 壁纸刀


    tool2.png

2.3.2 NANO主控板

这个项目我们采用NANO主控板,没有采用UNO的原因在于UNO太大,放在一个礼物盒里面有些占地方,NANO的体积很小,非常适合做实际的项目。
我们先来一睹NANO芳容吧:


nano-01.png

这么看您是不是对它的大小还是没有感觉,那再看这张图片:


nano-02.jpg

很直观了吧!它很小!所以选它!

别看它小,麻雀虽小五脏俱全哦!那我们还是来了解一下这块电路板吧!

2.3.2.1 NANO简介

Nano是一款小型的Arduino电路板,它没有电源插座,同时USB接口是Mini-B型。Arduino Nano是尺寸非常小的而且可以直接插在面包板上使用。其处理器核心是ATmega168(Nano2.x)和ATmega328(Nano3.0),同时具有14路数字输入/输出口(其中6路可作为PWM输出),8路模拟输入,一个16MHz晶体振荡器,一个mini-B USB口,一个ICSP header和一个复位按钮。

Nano体积小巧,功能全面,非常适合做项目开发,甚至基于Nano可以进行产品的开发量产(价格稍微高了一点,计算了一下,大概高出3块多人民币,如果是对成本敏感的产品,还是建议基于Nano重新设计电路板,其实主要还是省去了USB转串口部分电路,注意,这个价格不是按照Nano官方版本价格计算的,In China,you know!)。

2.3.2.2 技术参数

类型 参数
微处理器型号 ATmega328P
工作电压 5V
输入电压(推荐) 7~12V
输入电压(范围) 6~20V
数字I/O引脚 14(其中6个提供PWM输出功能)
模拟输入引脚 8
I/O引脚最大电流 40毫安
Flash 32KB
SRAM 2KB
EEPROM 1KB
时钟频率 16MHz

2.3.2.3 电源

Arduino Nano有两种供电方式:

  • mini-USB接口供电
  • VIN 引脚接外部直流5V电源

2.3.2.4 输入输出

  1. 14路数字输入输出口:工作电压为5V,每一路能输出和接入最大电流为40mA。每一路配置了20-50K欧姆内部上拉电阻(默认不连接)。
  2. 串口信号RX(0号)、TX(1号): 提供TTL电压水平的串口接收信号,与FT232Rl的相应引脚相连。
  3. 外部中断(2号和3号):触发中断引脚,可设成上升沿、下降沿或同时触发。
  4. 脉冲宽度调制PWM(3、5、6、9、10 、11):提供6路8位PWM输出。
  5. SPI(10(SS),11(MOSI),12(MISO),13(SCK)):SPI通信接口。
  6. LED(13号):Arduino专门用于测试LED的保留接口,输出为高时点亮LED,反之输出为低时LED熄灭。
  7. 8路模拟输入A0到A7:每一路具有10位的分辨率(即输入有1024个不同值,0-1023),默认输入信号范围为0到5V,可以通过AREF调整输入上限。
  8. TWI接口(SDA A4和SCL A5):支持通信接口(兼容I2C总线)。
  9. AREF:模拟输入信号的参考电压。
  10. Reset:信号为低时复位单片机芯片。

2.3.3 光敏电阻

光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ。光敏电阻的特殊性能,随着科技的发展得到了极其广泛应用。

光敏001.png

2.3.3.1 工作原理

百度百科:光敏电阻的工作原理是基于内光电效应。在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。用于制造光敏电阻的材料主要是金属的硫化物、硒化物和碲化物等半导体。通常采用涂敷、喷涂、烧结等方法在绝缘衬底上制作很薄的光敏电阻体及梳状欧姆电极,接出引线,封装在具有透光镜的密封壳体内,以免受潮影响其灵敏度。入射光消失后,由光子激发产生的电子—空穴对将复合,光敏电阻的阻值也就恢复原值。在光敏电阻两端的金属电极加上电压,其中便有电流通过,受到一定波长的光线照射时,电流就会随光强的增大而变大,从而实现光电转换。光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也加交流电压。半导体的导电能力取决于半导体导带内载流子数目的多少。

光敏002.png

2.3.3.2 应用

光敏电阻属半导体光敏器件,除具灵敏度高,反应速度快,光谱特性及r值一致性好等特点外,在高温,多湿的恶劣环境下,还能保持高度的稳定性和可靠性,可广泛应用于照相机,太阳能庭院灯,石英钟,音乐杯,礼品盒,迷你小夜灯,光声控开关,路灯自动开关以及各种光控玩具,光控灯饰,灯具等光自动开关控制领域。

光敏电阻在实际项目中主要用来感知环境光照强度,将光照强度转变为一个模拟输入量,然后根据这个变量,我们可以在程序中进行相关的控制,在后面的程序设计一节中,您会学习到怎么利用光敏电阻来控制音乐的播放和点阵的显示。

2.3.4 无源蜂鸣器

无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。

正面图: 无源02.jpg
底部图: 无源01.jpg

2.3.4.1 无源蜂鸣器与有源蜂鸣器的区别

有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路,只需接入额定电压的直流电即可发出指定频率的声音,频率由内部振荡电路决定,无法改变,因而有源蜂鸣器只能发出固定的声音。

有源蜂鸣器和无源蜂鸣器的区分一般是看底部,无源蜂鸣器能看到电路板,如上面的图,而有源蜂鸣器一般用黑胶封住了,如下面的图:

有源蜂鸣器的底部: 有源01.jpg

2.3.4.2 无源蜂鸣器的优缺点

无源蜂鸣器的优点是:

  • 制作成本低
  • 声音频率范围宽,可高分贝的发出某些频率的超声波以及可以做出“多来米发索拉西”的效果,因此可以用来播放简单的音乐,而有源蜂鸣器则只能发出固定的音。

无源蜂鸣器的缺点是:
有源蜂鸣器只要有供电,就能一直响,无源蜂鸣器则需要一定频率的脉冲驱动才能响。

2.3.5 8*8点阵(带7219驱动模块)

8*8点阵其实就是一个小的单色LED屏,分辨率为8*8,你可以把它看成显示器的一个缩影。我们可以想象一下,如果我们一排放100个8*8点阵,共放80排,然后把点阵的LED灯换成RGB三色LED灯,这其实就是一个分辨率为800*640的彩色液晶显示器了。

所以我们学习使用点阵对于我们理解字符和图像在显示器上的显示原理是非常有帮助的。下面我们就简单介绍一下点阵:

管脚的定义:
有的点阵后面标有第一脚,但是有的没有标,现在大家默认跟IC的管脚顺序一样,读法是第1脚一般在侧面有字的那一面,字是正向时左边第一脚为1,然后按逆时针排序至16脚,如图示:

点阵.jpg

行列定义

行列定义.png

点阵内部结构

8*8点阵有共阴和共阳之说法,其实准确的说法是行共阴或者行共阳,请看下面两张图:

行共阴: 行共阴.png
行共阳: 行共阳.png

从上面两张图片可以看出,LED的连接方向是不一样的,行共阴的点阵LED的电流方向是从列到行,每行接在一个引脚上,这就是“行共阴”,反之就是“行共阳”。本项目中所使用的是行共阴的点阵。

8*8点阵引脚有些多,共16个引脚,连线很麻烦,关键是你几乎要用掉Arduino NANO所有的数字口,这个有点难以接受,所以我们增加一个模块来控制点阵,这个模块就是MAX7219驱动模块,建议您购买点阵时一同购买。见下面两张图:


点阵01.jpg 点阵02.jpg

第一张图就是带MAX7219驱动模块的8*8点阵,第二张图是拆开后的样子,驱动模块上的芯片就是MAX7219驱动芯片。

注意两点:

  • 点阵和驱动模块不能插反,否则显示不正常,所以在使用时,如果显示有问题,可以试着换个方向插上后再试试。
  • 7219驱动模块的两排引脚分别是输入(IN)和输出(OUT),跟Arduino主控板连接的是输入端,也就是标有“IN”的一端。

下面还是简单介绍一下7219驱动模块和它跟8*8点阵的连接:

2.3.5.1 MAX7219芯片介绍

MAX7219 是美国MAXIM 公司推出的多位LED 显示驱动器,采用3 线串行接口传送数据,可直接与单片机接口,用户能方便修改其内部参数,以实现多位LED 显示。它内含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。此外,其内部还含有8X8 位静态RAM,用于存放8 个数字的显示数据。显然,它可直接驱动64 段LED点阵显示器。当多片MAX7219 级联时,可控制更多的LED 点阵显示器。

上面这段话是MAX7219的介绍,您可能没太看明白,没关系,刚开始我们只需要明白这个芯片可以用来驱动多位LED显示器,如8位LED数字显示器、8*8点阵等,下面是这个芯片的引脚图:

7219.png

由于7219点阵驱动模块已经将引脚跟点阵连接好,所以我们只需要清楚7219模块跟Arduino NANO的连接即可。

2.3.5.2 MAX7219模块跟NANO的连接

我们看一下这个模块的背面,有两排引脚,右侧是IN,左侧是OUT,我们用IN的引脚连接NANO,OUT引脚是用作级联的,这里暂且不表,本章我们主要是学习7219驱动模块怎么跟NANO连接。

7219 pin.jpg
2.3.5.2.1 引脚说明
  • VCC:供电 5V DC
  • GND:接地,电源负极
  • DIN :串行数据输入端口,在时钟上升沿时数据被载入内部的16位寄存器
  • CS:片选端,该端为低电平时串行数据被载入移位寄存器
  • CLK:时钟序列输入端
2.3.5.2.2 引脚跟NANO的连接
NANO MAX7219
5V <---> VCC
GND <---> GND
D10 <---> DIN
D11 <---> CS
D11 <---> CLK

3 电路设计

3.1 电路图

根据我们的项目需求,设计电路图如下:


电路图.png

图中省略了7219驱动模块跟点阵的连线,在实际项目中,您也不需这么做,直接将点阵插入驱动模块即可。

3.2 电路原理

这里介绍一下7219模块跟NANO的连接和光敏电阻的连接。

4 程序设计

4.1 类库介绍

4.1.1 LedControl.h库的安装

LedControl.h库需要手动安装,可以在Arduino IDE中, 项目->加载库->管理库中搜索LedControl.h,然后点击安装即可。

4.1.2 LedControl.h库的介绍

我们看看这个库的头文件:

/*
 *    LedControl.h - A library for controling Leds with a MAX7219/MAX7221
 *    Copyright (c) 2007 Eberhard Fahle
 * 
 *    Permission is hereby granted, free of charge, to any person
 *    obtaining a copy of this software and associated documentation
 *    files (the "Software"), to deal in the Software without
 *    restriction, including without limitation the rights to use,
 *    copy, modify, merge, publish, distribute, sublicense, and/or sell
 *    copies of the Software, and to permit persons to whom the
 *    Software is furnished to do so, subject to the following
 *    conditions:
 * 
 *    This permission notice shall be included in all copies or 
 *    substantial portions of the Software.
 * 
 *    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *    OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef LedControl_h
#define LedControl_h

#include <avr/pgmspace.h>

#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

/*
 * Segments to be switched on for characters and digits on
 * 7-Segment Displays
 */
const static byte charTable [] PROGMEM  = {
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
    B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B10000000,B00000001,B10000000,B00000000,
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
    B01111111,B01111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
    B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00000000,B00000000,
    B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,
    B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
    B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00010101,B00011101,
    B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
};

class LedControl {
    private :
        /* The array for shifting the data to the devices */
        byte spidata[16];
        /* Send out a single command to the device */
        void spiTransfer(int addr, byte opcode, byte data);

        /* We keep track of the led-status for all 8 devices in this array */
        byte status[64];
        /* Data is shifted out of this pin*/
        int SPI_MOSI;
        /* The clock is signaled on this pin */
        int SPI_CLK;
        /* This one is driven LOW for chip selectzion */
        int SPI_CS;
        /* The maximum number of devices we use */
        int maxDevices;

    public:
        /* 
         * Create a new controler 
         * Params :
         * dataPin      pin on the Arduino where data gets shifted out
         * clockPin     pin for the clock
         * csPin        pin for selecting the device 
         * numDevices   maximum number of devices that can be controled
         */
        LedControl(int dataPin, int clkPin, int csPin, int numDevices=1);

        /*
         * Gets the number of devices attached to this LedControl.
         * Returns :
         * int  the number of devices on this LedControl
         */
        int getDeviceCount();

        /* 
         * Set the shutdown (power saving) mode for the device
         * Params :
         * addr The address of the display to control
         * status   If true the device goes into power-down mode. Set to false
         *      for normal operation.
         */
        void shutdown(int addr, bool status);

        /* 
         * Set the number of digits (or rows) to be displayed.
         * See datasheet for sideeffects of the scanlimit on the brightness
         * of the display.
         * Params :
         * addr address of the display to control
         * limit    number of digits to be displayed (1..8)
         */
        void setScanLimit(int addr, int limit);

        /* 
         * Set the brightness of the display.
         * Params:
         * addr     the address of the display to control
         * intensity    the brightness of the display. (0..15)
         */
        void setIntensity(int addr, int intensity);

        /* 
         * Switch all Leds on the display off. 
         * Params:
         * addr address of the display to control
         */
        void clearDisplay(int addr);

        /* 
         * Set the status of a single Led.
         * Params :
         * addr address of the display 
         * row  the row of the Led (0..7)
         * col  the column of the Led (0..7)
         * state    If true the led is switched on, 
         *      if false it is switched off
         */
        void setLed(int addr, int row, int col, boolean state);

        /* 
         * Set all 8 Led's in a row to a new state
         * Params:
         * addr address of the display
         * row  row which is to be set (0..7)
         * value    each bit set to 1 will light up the
         *      corresponding Led.
         */
        void setRow(int addr, int row, byte value);

        /* 
         * Set all 8 Led's in a column to a new state
         * Params:
         * addr address of the display
         * col  column which is to be set (0..7)
         * value    each bit set to 1 will light up the
         *      corresponding Led.
         */
        void setColumn(int addr, int col, byte value);

        /* 
         * Display a hexadecimal digit on a 7-Segment Display
         * Params:
         * addr address of the display
         * digit    the position of the digit on the display (0..7)
         * value    the value to be displayed. (0x00..0x0F)
         * dp   sets the decimal point.
         */
        void setDigit(int addr, int digit, byte value, boolean dp);

        /* 
         * Display a character on a 7-Segment display.
         * There are only a few characters that make sense here :
         *  '0','1','2','3','4','5','6','7','8','9','0',
         *  'A','b','c','d','E','F','H','L','P',
         *  '.','-','_',' ' 
         * Params:
         * addr address of the display
         * digit    the position of the character on the display (0..7)
         * value    the character to be displayed. 
         * dp   sets the decimal point.
         */
        void setChar(int addr, int digit, char value, boolean dp);
};

#endif  //LedControl.h

我们把主程序中需要用到的几个方法介绍一下:

4.1.2.1 LedControl(int dataPin, int clkPin, int csPin, int numDevices)

用途:初始化设备,设置DIN(dataPin)、CLK、CS的IO口及连接设备数量(既有多少块屏)并定义一个对象。
参数 :

  • dataPin:设置DIN口对应的Arduino上的IO口
  • clockPin:设置CLK口对应的Arduino上的IO口
  • csPin:设置CS口对应的Arduino上的IO口
  • numDevices:设置最大设备连接数(也就是8*8LED屏的个数),只能设置1-8,如果需要连接超过8个设备,则需要定义另一个对象并使用另外的IO口。

4.1.2.2 shutdown(0,true)

开启对象lc第一个设备的节电模式。
0 表示一个lc对象设备。

4.1.2.3 setIntensity()

用途:设置亮度。
参数:

  • addr:设备号
  • intensity:亮度值0-15

4.1.2.4 clearDisplay()

用途:清屏。
参数:

  • addr:设备号

例:lc.clearDisplay(0);
第一个lc对象设备清屏。

4.1.2.5 setRow()

用途:设置一行8个LED的开关状态
参数:

  • Addr:设备号
  • row:行号,可设置0-7
  • value:LED亮灭数据,1为亮,0为灭,可只输入一个或多个数字(小于等于8个),LED按顺序亮灭,未输入部份默认为灭。

4.3 主程序设计

/*
 *名称:生日礼物
 *功能:
 *作者:YXK
 *时间:2018.6.6 
 */
 #include <LedControl.h>

//定义音调的频率
#define Do 262  
#define Re 294  
#define Mi 330  
#define Fa 349  
#define Sol 392  
#define La 440  
#define Si 494  
#define Do_h 523  
#define Re_h 587  
#define Mi_h 659  
#define Fa_h 698  
#define Sol_h 784  
#define La_h 880  
#define Si_h 988

int DIN = 10;
int CS =  11;
int CLK = 12;

const int photoPin = A7;   //光敏电阻输入端
const int tonePin = 2;   //无源蜂鸣器引脚

byte zhu[8] = {0x5E,0xF2,0x52,0x7E,0xEC,0x4C,0x55,0x67};  //祝
byte le[8] = {0x02,0x7C,0x68,0x48,0x7F,0x2C,0x4A,0xB9};  //乐
byte sheng[8] = {0x28,0x28,0x7F,0x88,0x7E,0x08,0x08,0xFF};   //生
byte ri[8] = {0x7E,0x42,0x42,0x7E,0x42,0x42,0x42,0x7E};   //日
byte kuai[8] = {0x44,0x44,0xFF,0xE5,0xFF,0x44,0x4A,0x51};   //快

byte smile[8] = {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};  //笑脸
byte neutral[8] = {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};  //标准脸

byte littleHeart[8] = {0x00,0x24,0x7E,0x7E,0x7E,0x3C,0x18,0x00};  //小的心
byte bigHeart[8] = {0x42,0xF7,0xFF,0xFF,0xFF,0x7E,0x3C,0x18};  //大的心

int musicLength;

int scale[]={                  //《祝你生日快乐》曲谱
  Sol,Sol,La,Sol,Do_h,Si,
  Sol,Sol,La,Sol,Re_h,Do_h,
  Sol,Sol,Sol_h,Mi_h,Do_h,Si,La,
  Fa_h,Fa_h,Mi_h,Do_h,Re_h,Do_h
  };

float durt[]={              //《祝你生日快乐》节拍
  0.5,0.5,1,1,1,1+1,
  0.5,0.5,1,1,1,1+1,
  0.5,0.5,1,1,1,1,1,
  0.5,0.5,1,1,1,1+1,
  };

LedControl lc=LedControl(DIN,CLK,CS,4);

int photoValue = 0; //定义光敏电阻的值

void setup(){
  Serial.begin(9600);
  lc.shutdown(0,false);       //启动时,MAX72XX处于省电模式
  lc.setIntensity(0,8);       //将亮度设置为最大值
  lc.clearDisplay(0);         //清除显示

  pinMode(tonePin,OUTPUT);
  musicLength=sizeof(scale)/sizeof(scale[0]);   //计算长度
}

void loop(){
  photoValue = analogRead(photoPin);
  Serial.println(photoValue);       //把光敏电阻的值打印出来
  if(photoValue > 650){
    lc.clearDisplay(0);         //清除显示
    printByte(smile);
    delay(2000);
    printByte(zhu);
    delay(1000);//延时1秒
    printByte(le);
    delay(1000);//延时1秒
    lc.clearDisplay(0); 
    delay(200);
    printByte(le);
    delay(1000);
    printByte(sheng);
    delay(1000);
    printByte(ri);
    delay(1000);
    printByte(kuai);
    delay(1000);
    printByte(le);
    delay(1000);
    for(int i=0;i<musicLength;i++){
      tone(tonePin,scale[i]);
      printByte(littleHeart);
      delay(500*durt[i]);       //这里用来根据节拍调节延时,500这个指数可以自己调整
      printByte(bigHeart);
      delay(100*durt[i]);
      noTone(tonePin);
    }
    lc.clearDisplay(0);         //清除显示
    lc.shutdown(0,false);       //MAX72XX进入省电模式
  }
  delay(1000);
}

//点阵显示函数
void printByte(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(0,i,character[i]);
  }
}

4 安装调试

4.1 原型设计调试

我们先用面包板搭建一个原型,先测试电路和程序,如果没有问题,我们再进行后面的真正的产品的制作。
下面我们根据电路图将两个模块跟NANO连接上:


project-02.jpg

上电:


project-03.jpg

经过我们的测试,这个原型功能都很正常。当环境没有光照时,它会停止工作,有光照时,点阵上开始显示祝福生日快乐的文字,然后开始唱生日快乐歌,点阵上的💗会随着音乐闪动。

下一步我们开始产品的制作。

4.2 产品制作

4.2.1 我准备了一个盒子

盒子03.jpg
盒子02.jpg
盒子01.jpg

4.2.2 改造一下盒子

p01.jpg
p02.jpg

4.2.3 开始外部安装

p03.jpg p04.jpg

4.2.4 准备电源部分

9V电池.jpg 电池接线头.jpg 电源模块.jpg 将电源部分组装好: 组装01.jpg

4.2.5 开始内部安装

组装02.jpg 组装03.jpg 组装04.jpg 组装05.jpg 组装06.jpg

4.2.6 大功告成

组装07.jpg

4.2.7 视频链接

视频链接

4.2.8 几点说明

  • 组装时为了方便接线,调整了点阵接线;
  • 跟光敏电阻串接的电阻为650欧姆左右,这个电阻可以选择几个不同阻值的多试几次,找到最合适的;
  • 其实NANO的VIN引脚可以直接接9V电源,但考虑到其它模块的电压范围,采用了一个小的电源模块降压。

5 总结扩展

这个项目是我给儿子做的一件礼物,当他知道我在给他做这个礼物的时候,他非常的高兴,在项目的后期也积极的参与到制作的过程中,并给我了建议,在这过程中,他也学到了很多东西,平时看上去冷冰冰的电子器件在我们的手中像被赋予了生命一样突然变得生动起来,它们能够感知这个世界,能够表达情感,能够给你带来快乐,也许这个才是我们真正所追求的!

这个项目我们不仅仅搭建了一个原型,同时制作了一个小小的产品,其实我希望大家都多动动手,不仅仅只是把一个东西原型实现了就OK,而应更多的把你的想法实现并应用到你的生活中,这也是你创造力的源泉!

另外,这个礼盒您也可以做一些修改,不仅仅只能用来做生日礼物,母亲节、父亲节,您只需稍作修改就能做一个不同节日的礼物,试一试吧!

如果您喜欢本文,您可以点击一下下面的喜欢按钮,您也可以关注我,谢谢您的支持!

相关文章

网友评论

      本文标题:第六章 别具一格的生日礼物:音乐贺卡+跳动的心(8*8点阵+蜂鸣

      本文链接:https://www.haomeiwen.com/subject/mrewsftx.html