模块:mCookie-Core+/zh、mCookie-CoreUSBttl/zh、mCookie-Hub/zh
传感器:建议 光线传感器(A0)、声音传感器(A2)、LED灯(PIN6)、蜂鸣器(Hub4/5) 实现
直接看代码:
#include <stdio.h>
#include <stdbool.h>
#include <wiringPi.h>
// 定义引脚号
#define LIGHT_SENSOR_PIN 0
#define SOUND_SENSOR_PIN 2
#define LED_PIN 6
#define BUZZER_PIN 4
// 定义颜色常量
#define RED 1
#define GREEN 2
#define BLUE 3
// 定义音乐常量
#define SLEEP_MUSIC "世上只有妈妈好"
#define WAKEUP_MUSIC "澎湖湾"
// 光照传感器是否检测到光照
bool isLightDetected = false;
// 声音传感器是否检测到声音
bool isSoundDetected = false;
// 播放音乐
void playMusic(const char *musicName) {
printf("Playing music: %s\n", musicName);
// 在此处添加播放音乐的代码
}
// 控制LED灯的颜色
void setLEDColor(int color) {
printf("Setting LED color: %d\n", color);
// 在此处添加控制LED灯颜色的代码
}
// 控制蜂鸣器的状态
void setBuzzer(bool isOn) {
printf("Setting Buzzer: %s\n", isOn ? "ON" : "OFF");
// 在此处添加控制蜂鸣器的代码
}
// 光照传感器回调函数
void lightSensorCallback() {
// 获取光照传感器的数值
int lightValue = analogRead(LIGHT_SENSOR_PIN);
if (lightValue > 0) {
// 有光照,LED一直亮红色,声音无变化
isLightDetected = true;
setLEDColor(RED);
setBuzzer(false);
} else {
// 没有光照,LED逐渐熄灭,蜂鸣器播放入眠曲
isLightDetected = false;
setLEDColor(GREEN);
playMusic(SLEEP_MUSIC);
}
}
// 声音传感器回调函数
void soundSensorCallback() {
// 获取声音传感器的数值
int soundValue = analogRead(SOUND_SENSOR_PIN);
if (!isLightDetected && soundValue > 0) {
// 在黑暗条件下有声音,LED亮8秒,颜色彩色变化,蜂鸣器同步播放音乐
setLEDColor(BLUE);
setBuzzer(true);
playMusic(WAKEUP_MUSIC);
delay(8000); // 延迟8秒
setLEDColor(RED);
setBuzzer(false);
}
}
int main() {
// 初始化WiringPi库
wiringPiSetup();
// 设置引脚模式
pinMode(LIGHT_SENSOR_PIN, INPUT);
pinMode(SOUND_SENSOR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// 注册光照传感器回调函数
wiringPiISR(LIGHT_SENSOR_PIN, INT_EDGE_BOTH, lightSensorCallback);
// 注册声音传感器回调函数
wiringPiISR(SOUND_SENSOR_PIN, INT_EDGE_RISING, soundSensorCallback);
// 主循环
while (true) {
// 检测光照传感器
lightSensorCallback();
// 检测声音传感器
soundSensorCallback();
}
return 0;
}
请注意,上述代码仅为示例,具体的硬件控制和音乐播放部分需要根据实际的硬件和库函数进行相应的调整和实现。同时,还需要确保在编译和运行代码之前,已经正确地配置了相关的硬件和依赖库。
此外,为了实现效果2和效果4,在主循环中不断检测传感器状态是一种简单的实现方式。但在实际情况中,您可能需要根据传感器的采样率和精度,以及代码的性能要求进行适当的优化。
最佳方案——
由于该问题需要编写较为复杂的代码,无法在一个回答中完整地呈现。以下是一个可供参考的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include "mcookie_core.h"
#include "mcookie_coreusbttl.h"
#include "mcookie_hub.h"
#define LIGHT_SENSOR A0
#define SOUND_SENSOR A2
#define LED_PIN 6
#define BUZZER_PIN Hub4
#define MAX_BRIGHTNESS 255
#define MIN_BRIGHTNESS 10
#define COLOR_CHANGE_DELAY 100
#define TURN_OFF_DELAY 8000
int calculateBrightness(int lightValue) {
// Map lightValue to brightness level
int brightness = map(lightValue, 0, 1023, MIN_BRIGHTNESS, MAX_BRIGHTNESS);
// Ensure brightness is within valid range
if (brightness < MIN_BRIGHTNESS) {
brightness = MIN_BRIGHTNESS;
} else if (brightness > MAX_BRIGHTNESS) {
brightness = MAX_BRIGHTNESS;
}
return brightness;
}
void setColor(int red, int green, int blue) {
analogWrite(LED_PIN, red);
analogWrite(LED_PIN + 1, green);
analogWrite(LED_PIN + 2, blue);
}
void playMelody(int note, int duration) {
tone(BUZZER_PIN, note, duration);
delay(duration + 20);
noTone(BUZZER_PIN);
}
void sleepMelody() {
// Play lullaby melody
int notes[] = { NOTE_C4, NOTE_G3, NOTE_A3, NOTE_F3, NOTE_G3, NOTE_E3, NOTE_F3, NOTE_D3 };
int durations[] = { 4, 4, 4, 4, 4, 4, 4, 2 };
int numNotes = sizeof(notes) / sizeof(notes[0]);
for (int i = 0; i < numNotes; i++) {
playMelody(notes[i], durations[i] * 250);
}
}
void colorChange(int startRed, int startGreen, int startBlue, int endRed, int endGreen, int endBlue) {
int numSteps = ceil((double) COLOR_CHANGE_DELAY / 10);
for (int i = 0; i < numSteps; i++) {
int red = map(i, 0, numSteps - 1, startRed, endRed);
int green = map(i, 0, numSteps - 1, startGreen, endGreen);
int blue = map(i, 0, numSteps - 1, startBlue, endBlue);
setColor(red, green, blue);
delay(10);
}
}
void turnOff() {
setColor(0, 0, 0);
}
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN + 1, OUTPUT);
pinMode(LED_PIN + 2, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// Read light and sound sensor values
int lightValue = analogRead(LIGHT_SENSOR);
int soundValue = analogRead(SOUND_SENSOR);
// Calculate brightness level based on light sensor value
int brightness = calculateBrightness(lightValue);
if (lightValue > 100) {
// Case 1: There is light, LED is red and no sound
setColor(brightness, 0, 0);
noTone(BUZZER_PIN);
} else {
// Case 2: It is dark, LED is gradually turned off and lullaby is played
for (int i = brightness; i >= MIN_BRIGHTNESS; i--) {
setColor(i, 0, 0);
delay(10);
}
sleepMelody();
if (soundValue > 100) {
// Case 3: It is dark and there is sound, LED changes color and sound is played
colorChange(0, 0, 0, 0, brightness, 0); // Green
playMelody(NOTE_C4, 200);
setColor(brightness, 0, brightness);
delay(TURN_OFF_DELAY);
} else {
// Case 4: It is dark and there is no sound, LED is turned off
turnOff();
}
}
}
在上面的代码示例中,我们首先定义了使用的传感器和输出设备的引脚。然后,我们定义了一些常量,例如最大和最小亮度值、颜色变化延迟等。
接下来,我们编写了一些辅助函数,例如 calculateBrightness 用于根据光线传感器的值计算亮度级别,setColor 用于设置LED灯的颜色,playMelody 用于播放单个音符,sleepMelody 用于播放入眠曲,colorChange 用于平滑地改变LED灯的颜色,turnOff 用于关闭LED灯。
在 setup 函数中,我们初始化引脚的输入输出模式。在 loop 函数中,我们读取光线传感器和声音传感器的值,并根据不同的情况执行对应的动作。具体来说:
如果 lightValue 大于 100,代表有光照,LED灯一直保持红色,不播放音乐。
如果 lightValue 小于等于 100,代表黑暗条件下,LED灯逐渐变暗,并播放入眠曲音乐1。如果此时 soundValue 大于 100,代表有声音,LED灯变为绿色并播放音乐2,持续8秒,之后LED灯恢复红色。否则,LED灯关闭。
需要注意的是,这只是一个示例代码,可能需要根据具体的传感器硬件和需求进行修改和优化。同时,为了代码的可读性和易于维护,我们在代码中添加了注释,希望可以帮助您理解代码的逻辑和实现。