← Светильник с управляемой яркостью | Оглавление | Ночной светильник →
В этом эксперименте мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания бесконтактным путем, больше или меньше закрывая от света фоторезистор.
Оригинальный инструмент был изобретён ещё в 1920 году, Львом Сергеевичем Терменом, человеком с непростой и насыщенной судьбой. А сейчас мы имеем возможность воспроизвести изобретение с помощью нехитрой электроники.
tone мешает использованию ШИМ на 3-м и 11-м портах. Зато можно подключить ее к одному из них// даём имена для пинов с пьезопищалкой (англ. buzzer) и фото- // резистором (англ. Light Dependent Resistor или просто LDR) #define BUZZER_PIN 3 #define LDR_PIN A0 void setup() { // пин с пьезопищалкой — выход... pinMode(BUZZER_PIN, OUTPUT); // ...а все остальные пины являются входами изначально, // всякий раз при подаче питания или сбросе микроконтроллера. // Поэтому, на самом деле, нам совершенно необязательно // настраивать LDR_PIN в режим входа: он и так им является } void loop() { int val, frequency; // считываем уровень освещённости так же, как для // потенциометра: в виде значения от 0 до 1023. val = analogRead(LDR_PIN); // рассчитываем частоту звучания пищалки в герцах (ноту), // используя функцию проекции (англ. map). Она отображает // значение из одного диапазона на другой, строя пропорцию. // В нашем случае [0; 1023] -> [3500; 4500]. Так мы получим // частоту от 3,5 до 4,5 кГц. frequency = map(val, 0, 1023, 3500, 4500); // заставляем пин с пищалкой «вибрировать», т.е. звучать // (англ. tone) на заданной частоте 20 миллисекунд. При // cледующих проходах loop, tone будет вызван снова и снова, // и на деле мы услышим непрерывный звук тональностью, которая // зависит от количества света, попадающего на фоторезистор tone(BUZZER_PIN, frequency, 20); }
map(value, fromLow, fromHigh, toLow, toHigh) возвращает целочисленное значение из интервала [toLow, toHigh], которое является пропорциональным отображением содержимого value из интервала [fromLow, fromHigh]map не обязательно должны быть больше нижних и могут быть отрицательными. К примеру, значение из интервала [1, 10] можно отобразить в интервал [10,-5]map образуется дробное значение, оно будет отброшено, а не округленоmapне будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует их по заданному правилу.constrain(value, from, to), которая вернет:value, если это значение попадает в диапазон [from, to]from, если value меньше негоto, если value больше негоtone(pin, frequency, duration) заставляет пьезопищалку, подключенную к порту pin, издавать звук высотой frequency герц на протяжении duration миллисекундduration не является обязательным. Если его не передать, звук включится навсегда. Чтобы его выключить, вам понадобится функция noTone(pin). Ей нужно передать номер порта с пищалкой, которую нужно выключитьtone для другого порта, ничего не произойдет.tone для уже звучащего порта обновит частоту и длительность звучанияmap(30,0,90,90,-90)? tone без указания длительности звучания?tone?← Светильник с управляемой яркостью | Оглавление | Ночной светильник →