Терменвокс

В общем случае для сборки Терменвокса нужен бесконтактный сенсор, показания которого используются для изменения частоты звучания динамика. Оригинальный инструмент, построенный Львом Сергеевичем Терменом, использовал в качестве сенсора колебательный контур с емкостью, величина которой изменялась, если поднести к
нему руку. В нашем эксперименте, вместо колебательного контура, в качестве сенсора будет использован фоторезистор. Поднося руку ближе или убирая ее дальше от фоторезистора, можно регулировать колличество падающего на него света. В свою очередь, изменение степени освещенности фоторезистора приведет к изменению сопротивления, которое будет зафиксировано АЦП. Данные полученные с АЦП используются для управления частотой звучания буззера.
Для того, чтобы все работало как задумано, необходимо будет откалибровать фоторезистор, замерив значение измеренное АЦП в момент, когда рука находится в ближней и дальней точке.
Соберем макет согласно рисунку и напишем программу для калибровки освещенности фоторезистора. Программа будет выводить данные, полученные от АЦП в терминал.

#define PROTORESISTOR_PIN A3
//Переменная для хранения значения АЦП
int value = 0;
void setup() {
  pinMode(PROTORESISTOR_PIN, INPUT);
  //Открытие соединения на скорости 9600
  Serial.begin(9600);
}

void loop() {
  //Читаем результат полученный от АЦП
  value = analogRead(PROTORESISTOR_PIN);
  //Отправляем данные в терминал.
  Serial.println(value);
  delay(200);
}

Загрузите программу в контроллер и, открыв терминал, проведите калибровку, заслоняя фоторезистор рукой от источника света. Наблюдая за результатами измерений можно заметить, что значение получаемое от АЦП максимально в нижней точке (у нас получилось примерно 890). По мере увеличения расстояния между фоторезистором и рукой, значение АЦП уменьшается, пока рука не перестанет влиять на освещенность фоторезистора. Очевидно, что минимальное значение АЦП так же зависит от уровня освещенности помещения и распределения источников света. В нашем случае минимальное значение АЦП получилось равным 400.
Теперь зная диапазон изменения данных от фоторезистора, напишем программу так, чтобы частота звучания буззера изменялась от 3000Гц до 7000Гц. Изменение частоты должно быть пропорционально значению АЦП, характеризующему сопротивление фоторезистора.

#define PROTORESISTOR_PIN A3
#define BUZZER_PIN 9
#define
#define
#define
#define
VALUE_MIN 400
VALUE_MAX 890
FREQ_MIN 3000
FREQ_MAX 7000
int value = 0;
//Частота звука от 3000 до 7000
int frequency = 3000;
void setup() {
  pinMode(PROTORESISTOR_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
  //Читаем результат измерения. АЦП
  value = analogRead(PROTORESISTOR_PIN);
  frequency = map(
                value,
                VALUE_MIN, VALUE_MAX,
                FREQ_MIN, FREQ_MAX
              );
  //Меняем частоту звучания буззера
  tone(BUZZER_PIN, frequency);
  delay(50);
}