单片机课程设计报告 多功能电子台灯 小组成员 : 瞿崇兵王泽睿王斌斌 山东大学物理学院 2015 年 6 月

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "单片机课程设计报告 多功能电子台灯 小组成员 : 瞿崇兵王泽睿王斌斌 山东大学物理学院 2015 年 6 月"

Transcription

1 单片机课程设计报告 多功能电子台灯 小组成员 : 瞿崇兵王泽睿王斌斌 山东大学物理学院 2015 年 6 月

2 目录 contents 一. 摘要目的关键词功能二. 系统硬件设计系统模块 1.1DS1302 实时时钟模块 1.2 有源蜂鸣器模块 1.3 继电器模块 1.4 热敏传感器模块 1.5LCD1602 模块 + 液晶屏转接板 1.6HC-SR505 模块 1.7 光敏电阻传感器模块 三. 系统软件设计 1. 台灯模块算法设计 2. 显示模块算法设计 3. 软件设计程序 4. 系统调试 四. 附录

3 一. 摘要 : 现代科技不断进步, 家用电器越来越偏向于智能化 个性化, 台灯几乎是每个家庭的必需品, 我们基于 arduino mega 2560 自己设计制作了一款个性的智能台灯 此款台灯集成多个 arduino 模块, 具体实现了时钟显示 温度显示 闹钟定时 人体探测智能开关 光控声控等多种功能 With the development of modern techniques, household appliances have been more and more intelligent and individulized. Virtually, desk lamp is a necessity to every family. Therefore, our design is an intelligent lamp, which is based on Arduino Mega16 microchip. The system integerates many modules, such as clock, timing device, teperature-display and it has the function of sound-control, light-control and human-existence detection. 目的 : 设计一款基于 arduion 的多功能电子台灯, 并在 arduino 上集成多个模块, 体现个性化和智能化 关键词 : 多功能 Arduino 电子台灯功能 : 时钟显示闹钟温度显示人体感应 二. 系统硬件设计 硬件设计思想 : 系统模块 :

4 1.1DS1302 实时时钟模块 DS1302 是 DALLAS 公司推出的涓流充电时钟芯片, 内含有一个实时时钟 / 日历和 31 字节静态 RAM, 通过简单的串行接口与单片机进行通信 实时时钟 / 日历电路提供秒 分 时 日 周 月 年的信息, 每月的天数和闰年的天数可自动调整 时钟操作可通过 AM/PM 指示决定采用 24 或 12 小时格式 DS1302 与单片机之间能简单地采用同步串行的方式进行通信, 仅需用到三个口线 :(1)RST 复位 (2)I/O 数据线 (3)SCLK 串行时钟 时钟 /RAM 的读 / 写数据以一个字节或多达 31 个字节的字符组方式通信 DS1302 工作时功耗很低保持数据和时钟信息时功率小于 1mW DS1302 主要性能指标 : (1) 实时时钟具有能计算 2100 年之前的秒 分 时 日 星期 月 年的能力, 还有闰年调整的能力 (2)31 8 位暂存数据存储 RAM (3) 串行 I/O 口方式使得管脚数量最少 (4) 宽范围工作电压 V (5) 工作电流 2.0V 时, 小于 300nA (6) 读 / 写时钟或 RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 (7)8 脚 DIP 封装或可选的 8 脚 SOIC 封装根据表面装配 (8) 简单 3 线接口 (9) 与 TTL 兼容 Vcc=5V (10) 可选工业级温度范围 (11) 双电源管用于主电源和备份电源供应 DS1302 实时时钟模块参数如下 : (1)PCB 为单面板, 尺寸 :44mm*23mm*1.6mm (2) 带 4 个定位孔, 直径 3.1mm (3) 备用电池为正品天球 CR2032, 电压 3V, 电流 260mAh, 非可充电电池 理论数据保持时间大于 10 年 (4) 晶振 KHz, 日本原装进口晶振, 匹配电容为 6pF, 尺寸 2*6mm (5)DS1302 为 8 脚直插国产大芯片, 芯片下面有 IC 座, 方便更换及插拔芯片 (6) 模块工作电压兼容 3.3V/5V, 可与 5V 及 3.3V 单片机连接 (7) 工作温度 :

5 1.2 有源蜂鸣器模块模块描述 (1) 模块采用 S8550 三极管驱动 (2) 工作电压 3.3V-5V (3) 设有固定螺栓孔, 方便安装 (4) 小板 PCB 尺寸 :3.2cm * 1.3cm (5) 当 I/O 口输入低电平时, 蜂鸣器发声模块接口说明 (3 线制 ) 1 VCC 外接 3.3V-5V 电压 ( 可以直接与 5v 单片机和 3.3v 单片机相连 ) 2 GND 外接 GND 3 I/O 外接单片机 IO 口 1.3 继电器模块模块说明 : (1) 模块采用正品优质继电器, 常开接口最大负载 : 交流 250V/10A, 直流 30V/10A;

6 (2) 采用贴片光耦隔离, 驱动能力强, 性能稳定 ; 触发电流 5mA; (3) 模块工作电压有 5V 9 12V 24V 可供选择 ( 请注意链接是否为所需电压 ); (4) 模块可以通过跳线设置高电平或低电平触发 ; (5) 容错设计, 即使控制线断, 继电器也不会动作 ; (6) 电源指示灯 ( 绿色 ), 继电器状态指示灯 ( 红色 ) (7) 接口设计人性化, 所有接口均可通过接线端子直接连线引出, 非常方便 (8) 模块尺寸 :50mm * 26mm* 18.5mm( 长 * 宽 * 高 ) (9) 设有 4 个固定螺栓孔, 孔 3.1mm, 间距 44.5mm*20.5mm 模块接口 : (1)DC+: 接电源正极 ( 电压按继电器要求, 有 5V.9V.12V 和 24V 选择 ) (2)DC-: 接电源负极 (3)IN: 可以高或低电平控制继电器吸合继电器输出端 : (1)NO: 继电器常开接口, 继电器吸合前悬空, 吸合后与 COM 短接 (2)COM: 继电器公用接口 (3)NC: 继电器常闭接口, 继电器吸合前与 COM 短接, 吸合后悬空高低电平触发选择端 (1) 跳线与 LOW 短接时为低电平触发 ; (2) 跳线与 high 短接时为高电平触发 1.4 热敏传感器模块模块特点 : (1) 采用 NTC 热敏电阻传感器, 灵敏度好 (2) 比较器输出, 信号干净, 波形好, 驱动能力强, 超过 15mA (3) 配电位器调节温度检测阀值 (4) 工作电压 3.3V-5V (5) 输出形式 : 数字开关量输出 (0 和 1) (6) 设有固定螺栓孔, 方便安装 (7) 小板 PCB 尺寸 :3.2cm x 1.4cm (8) 使用宽电压 LM393 比较器模块使用说明 (1) 热敏电阻模块对环境温度很敏感, 一般用来检测周围环境的温度 ; (2) 通过对电位器的调节, 可以改变温度检测的阀值 ( 即控制温度值 ), 如需要控制环境温度为 50 度时, 模块则在相应环境温度调到其绿灯亮,DO 则输出低电平, 低于此设定温度值时, 输出高电平, 绿灯不亮 ; (3)DO 输出端可以与单片机直接相连, 通过单片机来检测高低电平, 由此来检测环境的温度改变 ; (4)DO 输出端可以直接驱动本店继电器模块, 由此可以组成一个温控开关, 控制相关设备的工作温度, 也可以接风扇用来散热等 ; (5) 本模块的温度检测范围为 摄氏度 ; (6) 本模块也可以换成带有线的温度传感器, 用于水温, 水箱等的控制

7 1.5LCD1602 模块 + 液晶屏转接板模块参数 : (1) 尺寸 :41.5mm( 长 )*19mm( 宽 )*15.3mm( 高 ) (2) 重量 :5g (3)PCB 颜色 : 黑色 (4) 供电电压 :2.5-6V (5) 支持 I2C 协议 (6) 带背光电源控制, 可以通过跳线帽设置是否连接背光电源 插上跳线帽为连接背光电源, 拔掉跳线帽为断开背光电源 (7) 对比度可调节, 旋转蓝色电位器, 顺时针增强, 逆时针减弱 电位器设计在正面, 方便客户随时随地自由调节 (8) 模块可级联, 最多可级联 8 个 通过短路 A0/A1/A2 修改设备地址 默认地址为 0x27

8 1.6HC-SR505 模块模块概述 : HC-SR505 小型人体感应模块是基于红外线技术的自动控制模块, 灵敏度高, 可靠性强, 超小体积, 超低电压工作模式 广泛应用于各类自动感应电器设备, 尤其是干电池供电的自动控制模块 模块特点 : (1) 全自动感应 : 人进入其感应范围则输出高电平, 人离开感应范围则自动延时关闭高电平, 输出低电平 (2) 可重复触发方式 : 即感应输出高电平后, 在延时时间段内, 如果有人体在其感应范围活动, 其输出将一直保持高电平, 直到人离开后才延时将高电平变为低电平 ( 感应模块检测到人体的每一次活动后会自动顺延一个延时时间段, 并且以最后一次活动的时间为延时时间的起始点 ) (3) 工作电压范围宽 : 默认工作电压 DC4.5V-20V (4) 微功耗 : 静态电流 <50 微安, 特别适合干电池供电的自动控制模块 (5) 输出高电平信号 : 可方便与各类电路实现对接

9 1.7 光敏电阻传感器模块模块特色 : (1) 采用灵敏型光敏电阻传感器 (2) 比较器输出, 信号干净, 波形好, 驱动能力强, 超过 15mA (3) 配可调电位器可调节检测光线亮度 (4) 工作电压 3.3V-5V (5) 输出形式 :DO 数字开关量输出 (0 和 1) 和 AO 模拟电压输出 (6) 设有固定螺栓孔, 方便安装 (7) 小板 PCB 尺寸 :3.2cm x 1.4cm (8) 使用宽电压 LM393 比较器模块使用说明 (1) 光敏电阻模块对环境光线最敏感, 一般用来检测周围环境的光线的亮度, 触发单片机或继电器模块等 ; (2) 模块在环境光线亮度达不到设定阈值时,DO 端输出高电平, 当外界环境光线亮度超过设定阈值时,DO 端输出低电平 ; (3)DO 输出端可以与单片机直接相连, 通过单片机来检测高低电平, 由此来检测环境的光线亮度改变 ; (4)DO 输出端可以直接驱动本店继电器模块, 由此可以组成一个光控开关 ; (5) 小板模拟量输出 AO 可以和 AD 模块相连, 通过 AD 转换, 可以获得环境光强更精准的数值

10 三. 系统软件设计 1. 台灯模块算法设计 2. 显示模块算法设计

11 3. 软件设计程序 #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <stdio.h> #include <string.h> #include <DS1302.h> LiquidCrystal_I2C lcd(0x27,16,2); DS1302 rtc(5, 6, 7); Time t = rtc.time(); int yr=t.yr; int mon=t.mon; int date=t.date; int day=t.day; int hr=t.hr; int min=t.min; int sec=t.sec; int iclock=0; int clockaudiopin=12; int clockledpin=13; int cl_min=t.min; int cl_hr=t.hr; void setup()

12 Serial.begin(9600); rtc.write_protect(false); rtc.halt(false); lcd.init(); lcd.backlight(); lcd.print("welcome to use!"); delay(3000); lcd.clear(); pinmode(clockaudiopin,output); pinmode(clockledpin,output); digitalwrite(clockledpin,high); digitalwrite(clockaudiopin,low); pinmode(3,output); pinmode(2,input); for(int i=14;i<20;i++) pinmode(i,input); void loop() deng(); clock(); switch(btn()) case 0: time(); break; case 1: lcd.clear(); wendu(); lcd.clear(); break; case 2: clock_up(); break; case 3: lcd.clear(); lcd.setcursor(0,0); lcd.print("clock");

13 c_clock(); lcd.clear(); break; int clock() int r=0; Time t = rtc.time(); if(digitalread(16)==high) delay(50); if(digitalread(16)==high) iclock++; if(iclock>1) iclock=0; Serial.println(iclock); if(iclock==1); if((cl_hr==t.hr)&&(cl_min== t.min)) r=1; digitalwrite(clockledpin,low); digitalwrite(clockaudiopin,high); Serial.println(digitalRead(clockledPin)); Serial.println(digitalRead(clockaudioPin)); delay(10); else digitalwrite(clockledpin,high); digitalwrite(clockaudiopin,low); Serial.println(digitalRead(clockledPin)); Serial.println(digitalRead(clockaudioPin)); return r; int btn()

14 for(int i=14;i<18;i++) if(digitalread(i)==high) delay(50); if(digitalread(i)==high) return (i-14); return 0; void time() Time t = rtc.time(); char date[15]; char time[15]; snprintf(date, sizeof(date), "%04d-%02d-%02d ",t.yr,t.mon, t.date); snprintf(time, sizeof(time), "%02d:%02d:%02d",t.hr, t.min, t.sec); Serial.println(date); Serial.println(time); delay(1000); lcd.setcursor(2,0); lcd.print(date); lcd.setcursor(3,1); lcd.print(time); void wendu() int n = analogread(a0); // 读取 A0 口的电压值 float vol = n * (5.0 / *100); // 使用浮点数存储温度数据, 温度数据由电压值换算得到 float temp=(vol-32)*5/9; Serial.println(temp); // 串口输出温度数据 delay(500); lcd.setcursor(0,0); // 设置液晶开始显示的指针位置 lcd.print("temp: "); lcd.setcursor(5,1); lcd.print((int)temp/10); // 液晶显示温度整数值 lcd.print("."); // 液晶显示小数点 lcd.print((int)temp%10); // 液晶显示温度小数值 lcd.print((char)223); // 液晶显示

15 lcd.print("c "); // 液晶显示 C delay(3000); void clock_up() if(iclock==1) lcd.clear(); lcd.setcursor(0,0); lcd.print("clock is up"); delay(1000); lcd.clear(); else lcd.clear(); lcd.setcursor(0,0); lcd.print("clock is down"); delay(1000); lcd.clear(); void c_clock() int c=0; Time t = rtc.time(); while(btn()==3) char te[15]; snprintf(te, sizeof(te), "%02d:%02d:%02d",t.hr, t.min, t.sec); Serial.println(te); lcd.setcursor(5,0); lcd.print(te); up_hr(); up_min(); c_min(); c_hr(); delay(500); int c_hr() char chr[5]; snprintf(chr, sizeof(chr), "%02d",cl_hr);

16 Serial.println(chr); lcd.setcursor(5,1); lcd.print(chr); return(cl_hr); int c_min() char cmin[5]; snprintf(cmin, sizeof(cmin), "%02d",cl_min); Serial.println(cmin); lcd.setcursor(8,1); lcd.print(cmin); return(cl_min); int up_min() if(digitalread(18)==high) delay(20); if(digitalread(18)==high) cl_min++; if(cl_min>59) cl_min=0; Serial.println(cl_min); return cl_min; int up_hr() if(digitalread(19)==high) delay(20); if(digitalread(19)==high) cl_hr++; if(cl_hr>23) cl_hr=0; Serial.println(cl_hr); return cl_hr;

17 void deng() int b; b=digitalread(2); Serial.println(b); float a=analogread(7); Serial.println(a); if(b) if(a<250) digitalwrite(3,high); else digitalwrite(3,low); else digitalwrite(3,high); 4. 系统调试 时间显示 台灯控制

18 传感器

19 台灯模块, 只有人靠近台灯, 台灯的人体感应模块探测到有人且光敏传感器探测到环境光强较弱时, 台灯才会保持亮起, 设计基本达到要求 显示模块, 通电系统启动后,LCD 显示屏会自动显示当前时间, 包括年月日小时分钟秒显示, 按下开关一,LCD 显示屏会显示当前温度, 但并不是很准确 ; 按下开关二, 会显示是否设置闹钟 ; 按下开关三, 可以设置闹钟 ; 按下开关四, 可以对小时进行调节 ; 按下开关五, 可以对分钟进行调节 设计基本达到要求 四. 附录 参考资料 : Arduino 电子积木基础套装中文教程 交互式系统原理与设计 爱上 Arduino Arduino 编程从零开始 网络搜索 : Arduino 中文社区