TonyChyi

我在那一角落患过抽风

用 Arduino 的蜂鸣器发出非方波声音
2018年03月14日 文章
在网上看了很多有关 Arduino 使用蜂鸣器来播放声音的例子,然而在我们西图社区昨天的讨论中,有人提出一个问题: 对了我突然在想Arduino套件送的那个buzzer能不能用来唱歌 能不能发出除了方波以外的其他波形 我个人认为,理论上,应该是可以的,为了验证自己的想法,就写了下面这个程序 // 使用 Arduino 的第 11 个引脚,可以支持模拟输出 #define SOURCE 11 #define LED 13 // 半周期时长 #define PERIOD(x) (1000/x)/2 void setup() { // put your setup code here, to run once: pinMode(SOURCE, OUTPUT); pinMode(LED, OUTPUT); square(440, 2); delay(500); saw(440, 2); delay(500); trangle(440, 2); delay(500); sine(440, 2); delay(500); analogWrite(SOURCE, 0); } // 执行完成后闪灯提示 void loop() { // put your main code here, to run repeatedly: for(int i = 0; i < 3; i++){ digitalWrite(LED, HIGH); delay(500); digitalWrite(LED, LOW); delay(500); } delay(1500); } // 传统的方波 -_-_-_ void square(double _tone, int len_second) { double p = PERIOD(_tone); for(int j = 0; j < len_second; j++){ for(int i = 0; i < _tone; i++){ digitalWrite(SOURCE, HIGH); delay((int)p); digitalWrite(SOURCE, LOW); delay((int)p); } } } // 锯齿波 /|/|/| void saw(int _tone, int len_second){ double p = PERIOD(_tone) * 1000; for(int j = 0; j < len_second; j++){ for(int i = 0; i < 256; i++){ analogWrite(SOURCE, i); delayMicroseconds( (int)p * 2 ); } } } // 三角波 \/\/\/\/ void trangle(int _tone, int len_second){ double p = PERIOD(_tone) * 1000; for(int j = 0; j < len_second; j++){ for(int i = 0; i < 256; i++) { analogWrite(SOURCE, i); delayMicroseconds( (int)p ); } for(int i = 255; i >= 0; i--){ analogWrite(SOURCE, i); delayMicroseconds( (int)p ); } } } // 正弦波 ^v^v^v^v void sine(int _tone, int len_second) { double p = PERIOD(_tone); for(int j = 0; j < len_second; j++){ for(int i = 0; i < 360; i++) { double x = sin(i) * 127.
Tags: #瞎折腾 · #Arduino

 

TonyChyi © 2018 GPLv2