Пробное задание:
Oписание для кода “Meloodiate mängimine” (игра мелодий):
Этот код отвечает за воспроизведение мелодии через зуммер с использованием функции tone()
в Arduino. Код играет последовательность нот с заданной продолжительностью, соответствующей ритму и темпу.
1. Основные элементы кода:
- Мелодия:
- Мелодия задается строкой
notes[]
, где каждый символ — это нота (например, ‘c’, ’d’, ‘e’) или пробел (пауза). - В строке присутствует 18 символов, что соответствует длине мелодии (
songLength = 18
).
- Мелодия задается строкой
- Ритм:
- Массив
beats[]
определяет длительность каждой ноты. Значения в массиве (1, 2, 4) указывают, сколько времени (в миллисекундах) должна длиться каждая нота.
- Массив
- Темп:
- Переменная
tempo
определяет скорость мелодии. Чем меньше значениеtempo
, тем быстрее играет мелодия.
- Переменная
2. Логика работы:
- В цикл
loop()
запускается воспроизведение мелодии. Для каждой ноты из массиваnotes[]
вычисляется её длительность, исходя из соответствующего значения в массивеbeats[]
и текущего темпа. - Если символ в строке
notes[]
— это пробел, то делается пауза на указанное время. - Если это нота (например, ‘c’, ’d’, и т.д.), то на пин
buzzerPin
выводится соответствующий сигнал с частотой, вычисляемой в функцииfrequency()
. Функцияtone()
генерирует звуковой сигнал с этой частотой.
3. Функция frequency()
:
- Функция преобразует символ ноты (например, ‘c’, ’d’, ‘e’) в соответствующую частоту (например, 262 Гц для ‘c’).
- Для этого создается массив с нотами и их частотами. При нахождении совпадения символа с нотой возвращается её частота.
4. Детали:
- В конце программы бесконечный цикл
while(true){}
блокирует выполнение дальнейшего кода, поскольку мелодия уже закончена, и программа больше не должна ничего выполнять.
5. Примечания:
- Зуммер подключен к пину
9
на Arduino, который управляет воспроизведением звука. - В данном примере использована простая мелодия, но можно расширить ее, добавив больше нот и изменив ритм.
Этот код служит хорошим примером того, как можно использовать функцию tone()
для создания музыкальных эффектов на платформе Arduino и управления звуковыми сигналами с помощью зуммера.
Схема в Tinkercad:

Программа:
// Meloodiate mängimine.
// Käsk Arduino tone() - noote tihedus.
// Noodid:
// note frequency
// c 262 Hz
// d 294 Hz
// e 330 Hz
// f 349 Hz
// g 392 Hz
// a 440 Hz
// b 494 Hz
// C 523 Hz
const int buzzerPin = 9;
// pikkus on nootide ja pausite koguste summa
const int songLength = 18;
char notes[] = "cdfda ag cdfdg gf "; // tähed on noodid ja tühik on paus
// Rütmi seadistamine.
int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2};
// "tempo" meloodia kiirus. Kui väiksem tempo_ siis suurem kiirus.
int tempo = 150;
void setup()
{
pinMode(buzzerPin, OUTPUT);
}
void loop()
{
int i, duration;
for (i = 0; i < songLength; i++)
{
duration = beats[i] * tempo;
if (notes[i] == ' ') // kui noot puudub
{
delay(duration);
}
else
{
tone(buzzerPin, frequency(notes[i]), duration);
delay(duration);
}
delay(tempo/10); // väike paus nootide vahel
}
while(true){}
}
int frequency(char note)
{
int i;
const int numNotes = 8; // nootide kogus
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523};
// kui noot on olemas, siis tagastame selle tiheduse
for (i = 0; i < numNotes; i++)
{
if (names[i] == note)
{
return(frequencies[i]);
}
}
return(0);
}
Схема в Tinkercad

Конспект по заданию “Väike Alarm Süsteem””
Функции:
- LiquidCrystal библиотека:
- Используется для работы с LCD экраном. Это позволяет выводить текстовые сообщения и собственные символы (например, для отображения температуры, уровня освещенности и т.д.).
- tone():
- Функция для генерации звуковых сигналов через пин зуммера. Используется для создания различных звуковых эффектов и сигналов тревоги.
- analogRead():
- Чтение аналоговых значений с пинов микроконтроллера, используется для получения показаний с датчиков (температуры и освещенности).
- map() и constrain():
- Используются для преобразования значений с датчиков (например, уровня освещенности) в диапазон, пригодный для отображения и анализа.
Описание работы системы:
Процесс работы системы включает несколько этапов:
- Инициализация:
- При запуске система выполняет начальную настройку — подключение датчиков, создание пользовательских символов для LCD экрана, а также настройку зуммера.
- Считывание данных с датчиков:
- Считывание температуры через аналоговый вход и вычисление значения в градусах Цельсия.
- Считывание уровня освещенности с помощью фотосопротивления (LDR).
- Обработка показаний:
- В зависимости от значений температуры и освещенности система принимает решение о том, стоит ли запускать тревогу. Например, если температура превышает 25°C, то включается зуммер и отображается тревожное сообщение на экране.
- Отображение информации на экране:
- На экране отображаются текущие значения температуры и уровня освещенности, а также соответствующие текстовые сообщения (“Sunny”, “Cloudy”, “Rainy” для освещенности и различные сообщения для температуры).
- Аудиосигналы:
- Если температура слишком высокая или другие опасные условия, система проигрывает сигнал тревоги с помощью зуммера, а музыка, которая играет в нормальных условиях, приостанавливается.
- Включение/выключение системы:
- Система может быть включена или выключена с помощью переключателя или потенциометра.
Используемые компоненты:
- Arduino (или совместимый микроконтроллер) — основной элемент управления системой.
- LCD экран (16×2) — для отображения информации о температуре и освещенности.
- Зуммер (buzzer) — для звуковых сигналов тревоги.
- Потенциометр — для регулировки яркости экрана или громкости звука (опционально).
- Фотосопротивление (LDR) — для измерения уровня освещенности.
- Температурный датчик (например, TMP36 или DHT11) — для измерения температуры.
- Переключатель — для включения/выключения системы.
Схема подключения:
Для создания схемы подключения используйте Tinkercad, который позволяет моделировать схему и тестировать работу системы в виртуальной среде. Вот основные элементы подключения:
- LCD экран подключается через пины 12, 11, 5, 4, 3 и 2 на Arduino.
- Зуммер подключается к пину 9.
- Датчик температуры подключается к аналоговому пину A1.
- Датчик освещенности подключается к аналоговому пину A0.
- Потенциометр или переключатель подключаются для управления состоянием системы.
Схема в Tinkercad:
Программа на Arduino включает:
- Инициализацию библиотеки LiquidCrystal для работы с экраном.
- Чтение значений с датчиков (температуры и освещенности).
- Реакцию на изменения (например, сигнал тревоги при повышении температуры).
- Отображение информации на экране и вывод символов, таких как градус или погодные иконки (солнце, дождь и т.д.).
- Генерацию звуковых сигналов с помощью зуммера, включая мелодии и сигналы тревоги.
Программа:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int temperaturePin = A1;
const int lightPin = A0;
const int buzzerPin = 9;
float voltage, degreesC;
char* tempText[] = {
"Cold weather!", // < 15
"Nice weather!", // 15–25
"Heat rising!", // 25–30
"Hot! Drink water!" // >30
};
char* lightText[] = {
"Sunny", // < 85
"Cloudy", // 85–170
"Rainy" // >170
};
byte smile[8] = {
0b00000, 0b01010, 0b01010, 0b00000,
0b10001, 0b01110, 0b00000, 0b00000
};
byte rain[8] = {
0b00100, 0b00100, 0b01010, 0b01010,
0b10001, 0b10001, 0b10001, 0b01110
};
byte degrees[8] = {
0b01110, 0b01010, 0b01110, 0b00000,
0b00000, 0b00000, 0b00000, 0b00000
};
byte sun[8] = {
0b00100, 0b01010, 0b11111, 0b11111,
0b00100, 0b00100, 0b00000, 0b00000
};
byte sad[8] = {
0b00000, 0b01010, 0b01010, 0b00000,
0b01110, 0b10001, 0b00000, 0b00000
};
const int songLength = 18;
char notes[] = "cdfda ag cdfdg gf ";
int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2};
int tempo = 150;
void setup() {
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
lcd.begin(16, 2);
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, sun);
lcd.createChar(5, sad);
lcd.setCursor(0, 0);
lcd.print("Weather Station");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(1000);
}
void loop() {
// Считываем температуру (предполагаем LM35 или аналогичный)
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
// Считываем освещенность
int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
Serial.print("Temp: ");
Serial.print(degreesC);
Serial.print(" C | Light: ");
Serial.println(lightLevel);
// Проверка тревоги: температура > 25 °C
if (degreesC > 20) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!!! ALARM !!!");
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(degreesC, 1);
lcd.write(byte(1)); // значок градуса
lcd.print("C");
tone(buzzerPin, 1000); // Постоянный тон
delay(500);
noTone(buzzerPin);
delay(200);
} else {
noTone(buzzerPin);
displayData(degreesC, lightLevel);
playMelody();
}
}
void displayData(float temp, int light) {
char* tempTextToDisplay;
if (temp < 15) tempTextToDisplay = tempText[0];
else if (temp < 20) tempTextToDisplay = tempText[1];
else if (temp < 30) tempTextToDisplay = tempText[2];
else tempTextToDisplay = tempText[3];
char* lightTextToDisplay;
byte lightIcon;
if (light > 170) {
lightTextToDisplay = lightText[2];
lightIcon = 3;
} else if (light > 85) {
lightTextToDisplay = lightText[1];
lightIcon = 4;
} else {
lightTextToDisplay = lightText[0];
lightIcon = 2;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTextToDisplay);
lcd.setCursor(14, 0);
lcd.write(byte(1)); // значок градуса
lcd.setCursor(0, 1);
lcd.print(lightTextToDisplay);
lcd.setCursor(strlen(lightTextToDisplay) + 1, 1);
lcd.write(lightIcon);
delay(2000);
}
void playMelody() {
for (int i = 0; i < songLength; i++) {
int duration = beats[i] * tempo;
if (notes[i] == ' ') {
delay(duration);
} else {
tone(buzzerPin, frequency(notes[i]), duration);
delay(duration);
}
delay(tempo / 10);
}
}
int frequency(char note) {
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int freqs[] = {262, 294, 330, 349, 392, 440, 494, 523};
for (int i = 0; i < 8; i++) {
if (names[i] == note) return freqs[i];
}
return 0;
}
Видео:
https://drive.google.com/file/d/1t0HpYJNPslLmeal_KvS9vPszs7v2LJgl/view?usp=drive_link
Применение в обычной жизни:
- Умный дом: Система может быть использована в умных домах для мониторинга температуры и освещенности в разных помещениях. Тревога будет подаваться при высоких температурах, что может быть полезно для предотвращения перегрева в помещениях.
- Охрана и безопасность: Система может использоваться для обнаружения аномальных условий в помещениях или на территории (например, высокая температура может сигнализировать о пожаре).
- Мониторинг окружающей среды: Система может отслеживать погодные условия, такие как температура и уровень освещенности, в различных помещениях или на улице.
Этот проект демонстрирует основы работы с Arduino, датчиками, LCD экранами и зуммерами, и может быть адаптирован для различных практических задач, таких как безопасность, мониторинг и управление комфортом в помещениях.