long savedCode = 0; // Переменная для хранения кода
#define buttonNextPin 2
#define buttonPrevPin 3
#define ledPin 13
#define startBtnPin 4
#define buzzerPin 9
#define potenc1Pin A0
#define potenc2Pin A1
#define potenc3Pin A2
#include <LedControl.h>
// Переменные для отслеживания состояния кнопок
bool lastButtonNextState = HIGH;
bool lastButtonPrevState = HIGH;
// Текущий номер урока
int currentLesson = 0;
// Прототипы функций для уроков
void setup0(), loop0();
void setup1(), loop1();
void setup2(), loop2();
void setup3(), loop3();
void setup4(), loop4();
void setup5(), loop5();
void setup6(), loop6();
typedef void (*TProc)(void);
struct Lesson {
TProc setup;
TProc loop;
};
#define maxLessons 8
// Определяем массив всех уроков
Lesson all_lessons[maxLessons] = {
{setup0, loop0}, // Урок 0
{setup1, loop1}, // Урок 1
{setup2, loop2}, // Урок 2
{setup3, loop3}, // Урок 3
{setup4, loop4}, // Урок 4
{setup5, loop5}, // Урок 5
{setup6, loop6}, // Урок 6
};
// Переключение на новый урок
void switchLesson() {
Serial.print("set lesson ");
Serial.println(currentLesson);
// Вызываем новую функцию setup для выбранного урока
all_lessons[currentLesson].setup();
}
void doLoop() {
all_lessons[currentLesson].loop();
}
void setup() {
Serial.begin(9600);
// Настраиваем кнопки
pinMode(buttonNextPin, INPUT_PULLUP);
pinMode(buttonPrevPin, INPUT_PULLUP);
switchLesson();
}
void loop() {
// Читаем состояние кнопок
bool currentButtonNextState = digitalRead(buttonNextPin);
bool currentButtonPrevState = digitalRead(buttonPrevPin);
// Обрабатываем нажатие кнопки Next
if (currentButtonNextState == LOW && lastButtonNextState == HIGH) {
currentLesson = (currentLesson + 1) % (maxLessons);
switchLesson();
delay(200); // Антидребезг
}
// Обрабатываем нажатие кнопки Prev
if (currentButtonPrevState == LOW && lastButtonPrevState == HIGH) {
currentLesson = (currentLesson - 1 + maxLessons) % (maxLessons);
switchLesson();
delay(200); // Антидребезг
}
lastButtonNextState = currentButtonNextState;
lastButtonPrevState = currentButtonPrevState;
// Вызываем текущую функцию loop
doLoop();
}
/*
Урок 0: Моргание светодиода
Цель урока: Изучить, как можно запрограммировать Arduino для управления светодиодом и заставить его моргать.
Компоненты:
Arduino Uno
1 светодиод
1 резистор (220 Ом)
Соединительные провода
Схема подключения:
Подключаем светодиод к выводу 13 на Arduino (через резистор).
*/
// Примеры уроков
void setup0() {
}
void loop0() {
}
/*
Урок 1: Включение и выключение светодиода
Цель урока: Изучить, как можно запрограммировать Arduino для управления светодиодом и менять состояние кнопкой.
Компоненты:
Arduino Uno
1 светодиод
1 резистор (220 Ом)
Соединительные провода
Схема подключения:
Подключаем светодиод к выводу 13 на Arduino (через резистор).
*/
bool ledState = false; // Текущее состояние светодиода (вкл/выкл)
bool lastButtonState = HIGH; // Предыдущее состояние кнопки (для отслеживания нажатий)
// Примеры уроков
void setup1() {
}
void loop1() {
}
/*
Урок 2: Моргание светодиода с изменением интервала через потенциометр
Цель урока: Научиться использовать потенциометр для управления скоростью моргания светодиода.
Компоненты:
Arduino Uno
1 светодиод
1 резистор (220 Ом)
1 потенциометр
Соединительные провода
Схема подключения:
Подключаем светодиод к выводу 13 через резистор.
Подключаем потенциометр к аналоговому входу A0.
*/
void setup2() {
}
void loop2() {
}
/*
Урок 3: Простое управление звуком с пьезоизлучателем
Цель урока: Изучить основы работы с пьезоизлучателем и генерировать звуковые сигналы.
Компоненты:
Arduino Uno
1 пьезоизлучатель
1 резистор (1 кОм)
Соединительные провода
Схема подключения:
Подключаем пьезоизлучатель к пину 9.
*/
void setup3() {
}
void loop3() {
}
/*
Урок 4: Управление частотой звука с помощью потенциометра
Цель урока: Использовать потенциометр для изменения частоты звука.
Компоненты:
Arduino Uno
1 пьезоизлучатель
1 резистор (1 кОм)
1 потенциометр
Соединительные провода
Схема подключения:
Подключаем пьезоизлучатель к пину 9.
Подключаем потенциометр к аналоговому входу A0.
*/
void setup4() {
pinMode(buzzerPin, OUTPUT); // Настраиваем пин 9 как выход
pinMode(startBtnPin, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для кнопки
}
void loop4() {
bool currentButtonState = digitalRead(startBtnPin);
// Проверяем, было ли нажатие кнопки (переход из HIGH в LOW)
if (currentButtonState == LOW) {
int sensorValue = analogRead(potenc1Pin); // Читаем значение с потенциометра
int frequency = map(sensorValue, 0, 1023, 100, 1000); // Преобразуем его в частоту от 100 до 1000 Гц
tone(buzzerPin, frequency); // Генерируем тон с изменяемой частотой
delay(100); // Задержка для плавного изменения
noTone(buzzerPin);
}
}
/*
Урок 5: Генерация сложных сигналов (сирена)
Цель урока: Создание сложных звуковых эффектов, таких как сирена, путём изменения частоты звука в цикле.
Компоненты:
Arduino Uno
1 пьезоизлучатель
1 резистор (1 кОм)
Соединительные провода
Схема подключения:
Подключаем пьезоизлучатель к пину 9.
*/
void setup5() {
pinMode(buzzerPin, OUTPUT); // Настраиваем пин 9 как выход
pinMode(startBtnPin, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для кнопки
}
void loop5() {
// Читаем текущее состояние startBtnPin
bool currentButtonState = digitalRead(startBtnPin);
// Проверяем, было ли нажатие кнопки (переход из HIGH в LOW)
if (currentButtonState == LOW && lastButtonState == HIGH) {
for (int i = 100; i < 1000; i += 10) { // Повышаем частоту
tone(buzzerPin, i);
delay(20);
}
for (int i = 1000; i > 100; i -= 10) { // Понижаем частоту
tone(buzzerPin, i);
delay(20);
}
noTone(buzzerPin);
}
// Сохраняем текущее состояние кнопки для отслеживания следующего нажатия
lastButtonState = currentButtonState;
}
/*
Урок 6: Управление частотой, скважностью и длительностью звука с помощью потенциометров
Цель урока: Создать более сложный проект с тремя потенциометрами для изменения параметров звукового сигнала.
Компоненты:
Arduino Uno
1 пьезоизлучатель
3 потенциометра
Соединительные провода
Схема подключения:
Пьезоизлучатель подключаем к пину 9.
Три потенциометра подключаем к аналоговым входам A0, A1 и A2.
*/
void setup6() {
pinMode(buzzerPin, OUTPUT); // Настраиваем пин 9 как выход
}
void loop6() {
// Читаем текущее состояние startBtnPin
bool currentButtonState = digitalRead(startBtnPin);
// Проверяем, было ли нажатие кнопки (переход из HIGH в LOW)
if (currentButtonState == LOW) {
int freqValue = analogRead(potenc1Pin); // Читаем значение с первого потенциометра для частоты
int dutyValue = analogRead(potenc2Pin); // Читаем значение со второго потенциометра для скважности
int durationValue = analogRead(potenc3Pin); // Читаем значение с третьего потенциометра для длительности
int frequency = map(freqValue, 0, 1023, 100, 2000); // Преобразуем в частоту от 100 до 2000 Гц
int dutyCycle = map(dutyValue, 0, 1023, 10, 90); // Преобразуем в скважность от 10% до 90%
int duration = map(durationValue, 0, 1023, 100, 1000); // Преобразуем в длительность от 100 до 1000 мс
tone(buzzerPin, frequency, duration); // Генерируем звук
delay(duration * dutyCycle / 100); // Устанавливаем длительность и скважность
noTone(buzzerPin); // Останавливаем генерацию звука
delay(duration * (100 - dutyCycle) / 100); // Пауза для полного цикла
}
}
/*
Урок 7: Использование ИК-приёмника и пульта
Цель урока: Изучить, как можно использовать ИК-пульт для управления Arduino.
Компоненты:
Arduino Uno
1 ИК-приёмник (например, TSOP1738)
2 светодиода (красный и зелёный)
Резисторы для светодиодов
ИК-пульт
Соединительные провода
Схема подключения:
Подключаем ИК-приёмник: вывод сигнала к пину 11, питание и землю соответственно.
Светодиоды подключаем к пинам 12 и 13 через резисторы
*/
/*
void setup7() {
pinMode(ledPin, OUTPUT);
irrecv.enableIRIn(); // Включаем ИК-приёмник
}
void loop7() {
// Читаем текущее состояние startBtnPin
bool currentButtonState = digitalRead(startBtnPin);
// Проверяем, было ли нажатие кнопки (переход из HIGH в LOW)
if (currentButtonState == LOW) {
// Сохраняем код с ИК-пульта
if (irrecv.decode(&results)) {
savedCode = results.value; // Сохраняем сигнал
irrecv.resume(); // Ожидаем следующий сигнал
}
}
if (irrecv.decode(&results)) {
long receivedCode = results.value;
if (savedCode && receivedCode == savedCode) { // Код кнопки для включения красного светодиода
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
irrecv.resume();
}
}
*/