TA的每日心情 开心 2019-11-29 08:08
签到天数: 4 天
[LV.2]偶尔看看I
本帖最后由 诚哥崽 于 2017-8-26 15:01 编辑
----经过2个月的学习,初步掌握了arduino各个传感器和效应器的使用方法,制作了一个红外遥控计时程序,现在和大家分享一下 。
视频
先给大家看一下完成后的效果。
准备
如果感兴趣可以继续跟着我动手做哦!
Arduino uno *1
OLED 0.92寸*1
红外接收器*1
遥控器*1
蜂鸣器*1
杜邦线*N
Arduino IDE软件 uno扩展板*1(可选)
接线
OLED 0.92寸⇲
D0=13 D1=11 RES=5V DC=9 CS=10(SPI接口)
红外接收器 ⇲
IO 3
蜂鸣器 ⇲
IO 5
程序
程序一共143行,占uno存储空间90%(OLED的程序很大)
[kenrobot_code]#include"IRremote.h" //预加载红外遥控库
#include "U8glib.h" //预加载OLED显示屏控制库
U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); //D0=13 D1=11 RES=5V DC=9 CS=10
int RECV_PIN = 3; //红外接收器所在引脚为3
int speakerPin = 5; //蜂鸣器连接5号管脚
IRrecv irrecv(RECV_PIN);
decode_results results; //储存编码结果
int Internaltime;
long IR;
//音乐程序⇩
int length = 15; // the number of notes
char notes[] = "ccggaagffeeddc "; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;
void playTone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void playNote(char note, int duration) {
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
for (int i = 0; i < 8; i++) {
if (names == note) {
playTone(tones, duration);
}
}
}
//音乐程序⇧
void setup() {
pinMode(speakerPin, OUTPUT);
irrecv.enableIRIn(); //初始化红外解码
u8g.firstPage();
do
{
start(); //运行start函数
} while (u8g.nextPage());
delay(500);
}
void start() {
u8g.setFont(u8g_font_gdr11r); // 设定字体
u8g.drawStr(30, 30, "Welcome"); //定位、输入
u8g.setFont(u8g_font_tpss); //设定字体
u8g.drawStr(20, 50, "Timingprogram V1.2");
}
void work() {
u8g.setFont(u8g_font_profont22);
u8g.drawStr(0, 30, "Set the time");
u8g.setFont(u8g_font_tpssb);
u8g.setPrintPos(40, 55);
u8g.print(Internaltime);
u8g.drawStr(50, 55, "min");
}
void work2() {
u8g.setFont(u8g_font_fur11);
u8g.drawStr(20, 30, "Set the time");
u8g.setFont(u8g_font_tpssb);
u8g.setPrintPos(40, 55);
u8g.print(Internaltime);
u8g.drawStr(90, 55, "S");
}
void song() {
for (int i = 0; i < length; i++) {
if (notes == ' ') {
delay(beats * tempo); // rest
} else {
playNote(notes, beats * tempo);
}
}
}
void loop() {
if (irrecv.decode(&results)) { //如果接收到红外信号
IR = results.value;
if (IR == 16761405) { //如果接收到确定指令
Internaltime = Internaltime * 60; //把分钟单位换成秒
for (; Internaltime > 0; Internaltime--) {
u8g.firstPage();
do
{
work2(); //运行work2函数
} while (u8g.nextPage());
delay(1000);
}
irrecv.resume(); //接收下一个红外指令
for(int i=2;i>0;i--){ //重复提醒音乐2次
song();
}
}
else {
IR = results.value;
switch (IR) {
case 16724175: //接收到1
Internaltime = Internaltime + 1; //内部时间,分钟为单位
break;
case 16718055: //接受到2,下面以此类推
Internaltime = Internaltime + 2;
break;
case 16743045:
Internaltime = Internaltime + 3;
break;
case 16716015:
Internaltime = Internaltime + 4;
break;
case 16726215:
Internaltime = Internaltime + 5;
break;
case 16734885:
Internaltime = Internaltime + 6;
break;
case 16728765:
Internaltime = Internaltime + 7;
break;
case 16730805:
Internaltime = Internaltime + 8;
break;
case 16732845:
Internaltime = Internaltime + 9;
break;
case 16748655:
Internaltime = 0;
break;
}
u8g.firstPage();
do
{
work(); //运行work函数
} while (u8g.nextPage());
irrecv.resume();
}
}
}
[/kenrobot_code]
注意
红外遥控器的型号不一致会导致程序无法正常运行,可以通过预先记录各个按键所对于的信号,再进行编程。
示例程序
[kenrobot_code]#include"IRremote.h"
int RECV_PIN=3;
long a;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if(irrecv.decode(&results))
{
a=results.value;
Serial.println(a);
irrecv.resume();
}
}[/kenrobot_code]
我使用的OLED是SPI接口,如果你是用的是IIC接口,可以通过更改程序第四行使得程序正常运行。
示例:U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED)
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,我使用的是无源5V蜂鸣器,如使用有源蜂鸣器,请更改音乐程序
字体
可以通过更改u8g.setFont()以到达更改字体的目的
u8g函数库包含有多种字体,可以到 https://github.com/olikraus/u8glib/wiki/fontsize 进行查看
示例:把红色方框内的代码输入到u8g.setFont()的括号内即可修改字体
完成