。。们帮我看看呗,这个程序为啥不运行。
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
//iic驱动方式
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
DHT dht(DHTPIN, DHTTYPE);
int pinInterrupt = 5; //接中断信号的脚
#define NOTE_C0 -1
#define NOTE_CL1 131
#define NOTE_CL2 147
#define NOTE_CL3 165
#define NOTE_CL4 175
#define NOTE_CL5 196
#define NOTE_CL6 221
#define NOTE_CL7 248
#define NOTE_C1 262
#define NOTE_C2 294
#define NOTE_C3 330
#define NOTE_C4 350
#define NOTE_C5 393
#define NOTE_C6 441
#define NOTE_C7 495
#define NOTE_CH1 525
#define NOTE_CH2 589
#define NOTE_CH3 661
#define NOTE_CH4 700
#define NOTE_CH5 786
#define NOTE_CH6 882
#define NOTE_CH7 990
//该部分是定义是把每个音符和频率值对应起来,全部都打上了,后面可以随意编写,直接调用(也可以用到哪个定义哪个)
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//该部分是对应了节拍
int tune[] =
{
NOTE_C0,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_C1,NOTE_C1,
NOTE_C2,NOTE_C3,
NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C1,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_C4,NOTE_C3,NOTE_C2,NOTE_C1,NOTE_C7,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_C2,NOTE_C2,NOTE_C3,NOTE_C2,
NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C3,
NOTE_C3,NOTE_C5,NOTE_CH2,NOTE_CH2,NOTE_CH1,NOTE_C7,
NOTE_C7,NOTE_CH6,NOTE_C0,NOTE_C0,NOTE_C1,NOTE_CL7,
NOTE_CL6,NOTE_CL7,NOTE_C1,NOTE_CL7,NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C2,
NOTE_C1,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_C7,NOTE_C6,NOTE_C5,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C3,NOTE_C3,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_C1,NOTE_C7,NOTE_CH1,NOTE_CH3,NOTE_CH1,NOTE_CH2,NOTE_CH3,
NOTE_CH3,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C3,NOTE_C2,NOTE_C2,NOTE_C1,
NOTE_CL7,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_CH2,NOTE_CH1,NOTE_C7,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C0,NOTE_C0,NOTE_C1,NOTE_C2,NOTE_C3,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C1,NOTE_C6,
NOTE_C6,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_CH2,NOTE_CH1,NOTE_CH2,NOTE_CH3,
NOTE_CH3,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C1,NOTE_C2,NOTE_C3,NOTE_C4,
NOTE_C4,NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C1,NOTE_C2,
NOTE_C2,NOTE_C3,NOTE_C2,NOTE_C1,NOTE_C1,NOTE_C1,NOTE_C0,NOTE_C0,
NOTE_C0,NOTE_C0,NOTE_C0,NOTE_C5,NOTE_C6,NOTE_C7,
NOTE_CH1,NOTE_C7,NOTE_CH1,NOTE_C7,NOTE_C6,NOTE_C5,NOTE_C4,
NOTE_C4,NOTE_C5,NOTE_C5,NOTE_C0,NOTE_C0,
};
float duration[]=
{
1,1,1,0.5+0.5,//听见
1,0.5+0.5,1,0.5+0.5,//冬天的离
0.5+0.5,1,1,0.5+0.5,//开 我在
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//某年某月醒过来
1,1,1,0.5+0.5,//我想
1,0.5+0.5,1,0.5+0.5,//我等我期
0.5+0.5,1,1,0.5+0.5,//待未来
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//却不能理智安
1,1,0.5+0.5,0.5+0.5,//排
0.5+0.5,0.5+0.5,1,0.5+0.5,//阴天
1,0.5+0.5,1,0.5+0.5,//傍晚车窗
0.5+0.5,1,1,0.5+0.5,//外 未来
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//有一个人在等
1,1,1,0.5+0.5,//待 向左
1,0.5+0.5,1,0.5+0.5,//向右向前
0.5+0.5,1,1,0.5+0.5,//看 爱要
0.5+0.5,0.5+0.5,0.5+0.5,0.5+0.5,//拐几个弯才
1,1,0.5+0.5,0.5+0.5,//来 我遇见
1,0.5+0.5,0.5+0.5,0.5+0.5,//谁会有怎样的对
0.5+0.5,1,0.5+0.5,0.5+0.5,//白 我等的
1,0.5+0.5,0.5+0.5,0.5+0.5,//人他在多远的未
0.5+0.5,1,0.5+0.5,0.5+0.5,//来 我听见
1,0.5+0.5,0.5+0.5,0.5+0.5,//风来自地铁和人
0.5+0.5,1,0.5+0.5,0.5+0.5,//海 我排着
1,0.5+0.5,0.5+0.5,0.5+0.5,//队 拿着爱的号
0.5+0.5,1,0.5+0.5,0.5+0.5,//码牌 我往前
1,0.5+0.5,0.5+0.5,0.5+0.5,//飞 飞过一片时间
0.5+0.5,1,0.5+0.5,0.5+0.5,//海 我们也
1,0.5+0.5,0.5+0.5,0.5+0.5,//曾在爱情里受伤
0.5+0.5,1,0.5+0.5,0.5+0.5,//害 我看着
1,0.5+0.5,0.5+0.5,0.5+0.5,//路 梦的路口 有点
0.5+0.5,1,0.5+0.5,0.5+0.5,//窄 我遇见
1,0.5+0.5,0.5+0.5,1,//你 是最美丽的
0.25+0.25+0.25+0.25,0.5+0.5,1,1,//意外
1,1,0.5+0.5,0.5+0.5,//终有一
1,0.5+0.5,0.5+0.5,0.5+0.5,//天我的谜底会揭
0.5+0.5,1,1,1,//开
};
//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)
int length;//这里定义一个变量,后面用来表示共有多少个音符
int tonePin=8;//蜂鸣器的端口,数字模拟都可以
void music()
{
for(int x=0;x<length;x++)//循环音符的次数
{
tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个 音符
delay(400*duration[x]);//每个音符持续的时间,即节拍duration,是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
noTone(tonePin);//停止当前音符,进入下一音符
}
delay(1000);//等待1秒后,循环重新开始
}
void onChange()
{
if ( digitalRead(pinInterrupt) == HIGH )
{
music();
}
if ( digitalRead(pinInterrupt) == LOW )
{
return;
}
}
void setup()
{
u8g2.begin();
dht.begin();
pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式
length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符
Serial.begin(9600); //打开串口
pinMode( pinInterrupt, INPUT);//设置管脚为输入
//Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化
attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, CHANGE);
}
char h_str[3];
char t_str[3];
float h;
float t;
void loop()
{
h = dht.readHumidity();//读湿度
t = dht.readTemperature();//读温度(摄氏度)
strcpy(h_str, u8x8_u8toa(h, 2)); /* convert m to a string with two digits */
strcpy(t_str, u8x8_u8toa(t, 2)); /* convert m to a string with two digits */
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_fur20_tf);
u8g2.drawStr(0, 23, "T");
u8g2.drawStr(20, 23, ":");
u8g2.drawStr(40, 23, t_str);
u8g2.drawStr(90, 23, "C");
u8g2.drawStr(0, 63, "H");
u8g2.drawStr(20, 63, ":");
u8g2.drawStr(40, 63, h_str);
u8g2.drawStr(90, 63, "%");
} while ( u8g2.nextPage() );
delay(1000);
}
引用ChatGPT部分内容参考回答:
根据提供的代码,你使用了中断来触发播放音乐的函数。但是,没有在代码中设置中断的触发方式。可以在 setup() 函数中添加以下代码来设置中断触发方式:
attachInterrupt(digitalPinToInterrupt(pinInterrupt), onChange, RISING);
以上代码假设你使用的是上升沿触发中断。
如果你使用的是下降沿触发中断,将 RISING 改为 FALLING。
另外,你在 onChange() 函数中使用了 digitalRead() 函数来读取中断引脚的状态,但是没有在 setup() 函数中设置中断引脚的模式。可以在 setup() 函数中添加以下代码来设置中断引脚的模式:
pinMode(pinInterrupt, INPUT_PULLUP);
以上代码假设你使用的是上拉电阻。
如果你使用的是下拉电阻,可以将 INPUT_PULLUP 改为 INPUT_PULLDOWN
在使用arduino连接传感器和舵机实现项目的过程中, 一上电舵机就抽风了 抽风了 抽了 一直抽来回动 我的天 弄得我好几天都没有睡好 到底是什么原因 什么原因 我又没让你动 就写了个代码 你他妈的疯了
好了 不说了
原因如下
我们在用的时候 是直接导入了一个 舵机库文件 然后声明对象 进行控制
但是不行 舵机库和传感器比如温湿度传感器啥的 有冲突 导致的
怎么解决呢
原理就是舵机用的PWM信号 我们直接写个循环 进行输出信号不用他的舵机库了 就没有问题了
int servoPin = 7;
void setup() //初始化内容
{
Serial.begin(9600);
pinMode(servoPin, OUTPUT); //设定舵机接口为输出接口
}
void loop() //主循环
{
servo(50); //调用函数传值直接动
}
void servo(int angle) { //定义一个脉冲函数
//发送50个脉冲
for(int i=0;i<50;i++){
int pulsewidth = (angle * 11) + 500; //将角度转化为500-2480的脉宽值
digitalWrite(servoPin, HIGH); //将舵机接口电平至高
delayMicroseconds(pulsewidth); //延时脉宽值的微秒数
digitalWrite(servoPin, LOW); //将舵机接口电平至低
delayMicroseconds(20000 - pulsewidth);
}
delay(100);
}