Veronika Portfoolio

Katse (Buzzer)

Пробное задание:

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():
    • Используются для преобразования значений с датчиков (например, уровня освещенности) в диапазон, пригодный для отображения и анализа.

Описание работы системы:

Процесс работы системы включает несколько этапов:

  1. Инициализация:
    • При запуске система выполняет начальную настройку — подключение датчиков, создание пользовательских символов для LCD экрана, а также настройку зуммера.
  2. Считывание данных с датчиков:
    • Считывание температуры через аналоговый вход и вычисление значения в градусах Цельсия.
    • Считывание уровня освещенности с помощью фотосопротивления (LDR).
  3. Обработка показаний:
    • В зависимости от значений температуры и освещенности система принимает решение о том, стоит ли запускать тревогу. Например, если температура превышает 25°C, то включается зуммер и отображается тревожное сообщение на экране.
  4. Отображение информации на экране:
    • На экране отображаются текущие значения температуры и уровня освещенности, а также соответствующие текстовые сообщения (“Sunny”, “Cloudy”, “Rainy” для освещенности и различные сообщения для температуры).
  5. Аудиосигналы:
    • Если температура слишком высокая или другие опасные условия, система проигрывает сигнал тревоги с помощью зуммера, а музыка, которая играет в нормальных условиях, приостанавливается.
  6. Включение/выключение системы:
    • Система может быть включена или выключена с помощью переключателя или потенциометра.

Используемые компоненты:

  • 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 экранами и зуммерами, и может быть адаптирован для различных практических задач, таких как безопасность, мониторинг и управление комфортом в помещениях.