Немного, обманул вас с предупреждением о том что не смогу быстро написать следующий урок, появилось немного времени и решил опубликовать еще один урок-
Управление яркостью свечения светодиода фоторезистором
Друг дал фоторезистор и я практически сразу же приступил к осваиванию. Что нам нужно для этого урока: ARDUINO, макетная плата (можно обойтись без нее но будет неудобно), провода, фоторезистор, светодиод, 2 сопротивления по 1 кОм. Собираем схему. Заливаем в ARDUINO такой скетч:
/* Фоторезистор и светодиод www.samosdel.ru 14.05.2015 */ void setup(){ // назначаем выводы, 10- выход pinMode(10, OUTPUT); } void loop() { //записываем в 10 пин то что прочитали на аналоговом входе А0 analogWrite(10, analogRead(0)); delay(100); }
Объяснений по программе практически не нужно- за исключением строки
analogWrite(10, analogRead(0));
По смыслу программы все понятно- записываем аналоговый сигнал (10 пин- ШИМ выход и он может принимать значение не как цифровой 1 или 0, а как бы равномерно распределяет 5В на 256 ступеней от 0 (0В) до 255 (5В)) взятый с АНАЛОГОВОГО входа А0. Почему подключаем фоторезистор к Аналоговому входу а не к цифровому? Фоторезистор- аналоговый датчик и меняет сопротивление в зависимости от освещения. Т.е. он не принимает значения жестко 0(0В) или жестко 1(5В), а плавает где то между ними. В принципе все датчики изначально аналоговые, потом их преобразуют в цифру различными АЦП (аналогово- цифровыми преобразователями) .
Запускаем и… Что то не так. Вроде работает но… как только яркость свечения светодиода опускается до минимума опять резко вспыхивает и потихоньку затухает, так же и когда светодиод горит ярко, хлоп и начинает загораться потихоньку. ARDUINO работает но как то не так как надо. Что ж, приступаем к отладке. Дописываем строку Serial.begin(9600); в void setup() и Serial.println(analogRead(0)); в void loop(). Скетч должен иметь такой вид:
/* Фоторезистор и светодиод www.samosdel.ru 14.05.2015 */ void setup() { // назначаем выводы, 10- выход pinMode(10, OUTPUT); Serial.begin(9600); } void loop() { //записываем в 10 пин то что прочитали на аналоговом входе А0 analogWrite(10, analogRead(0)); Serial.println(analogRead(0)); delay(100); }
Что мы этим сделали: Serial.begin(9600);— подключает порт ARDUINO на обмен данными с компьютером со скоростью 9600 бод, Serial.println(analogRead(0));— передает данные полученные с аналогового порта 0. Заливаем скетч в ARDUINO, теперь плата начала еще бодренько подмигивать зеленым светодиодом- значит передача пошла! Теперь в оболочке ARDUINO жмем кнопку
справа вверху и видим что высвечиваются данные с порта А0. Что мы видим?
При затемнении фоторезистора цифры уменьшаются при увеличении освещения- соответственно увеличиваются. Мы знаем что 10 пин ШИМ и не может принимать значения выше 255 и ниже 0, таким образом при пересечении этих пределов он вычитает 256 из поступающих данных и передает остаток в порт. Т.е. если значение, например, 381- то получается что в порт передается 381-256= 125. Так же и со слишком высокими значениями, например 825, в порт придет 825-256-256-256=57. Так будет обрабатываться любое число. Откуда же такое значение пришло? Аналоговый порт А0 работает в 10 битовом режиме и может работать в пределах от 0 до 1023, т.е. поступающий сигнал он раскладывает от 0 (0В) до 1024 (5В). Таким образом мы пытаемся впихнуть 10 битный сигнал в 8 битный порт! Естественно у нас происходит переполнение и контроллер вынужден обработать данные, т.е. подогнать под свой формат так как он умеет. Что же тогда делать? Да все просто- нужно просто поделить поступающий данные на 4! Таким образом нужно изменить строку analogWrite(10, analogRead(0)); на analogWrite(10, analogRead(0)/4); Теперь все будет работать правильно, контроллер сам приведет десятичные числа в целые. Что еще можно сделать с помощью монитора порта? Если вы отлаживаете что то серьезное то можно передавать значения в ARDUINO и следить за выполнением команды. Вещь очень нужная и позволяет отслеживать практически любой шаг программы.
Теперь можем немного модернизировать программу. Допустим вы сделали какое то готовое устройство, установили его и вдруг оно перестало работать… Обидно, надо снимать его и разбираться уже дома. Давайте попробуем смоделировать какую нибудь неисправность. Например оборвался фоторезистор или повредились провода идущие от ARDUINO к датчику. Включаем монитор порта, выдергиваем прямо в работающем блоке фоторезистор… Монитор бодренько кажет ноли. В настоящих условиях значение никогда не будет равно 0, т.к. даже самое большое сопротивление фоторезистора дает какую то величину смещения напряжения на входе А0. Значит по этому условию мы можем сделать аварийную сигнализацию! Устанавливаем обратно фоторезистор, дописываем код из первого урока, получаем следующее:
/* Фоторезистор и светодиод www.samosdel.ru 14.05.2015 */ void setup() { // назначаем выводы, 10- выход pinMode(10, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { //вводим условие на получение данных if (analogRead(0)==0) { digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } digitalWrite(13, LOW); analogWrite(10, analogRead(0)/4); Serial.println(analogRead(0)); delay(100); }
Как видим это практически вся программа blink, вот вам и реальный пример ее использования! В условии проверяем значение порта А0 и если оно равно 0- мигаем светодиодом на плате. Если не равно 0 то гасим светодиод и работаем в нормальном режиме! Кстати можно сделать обратную зависимость от освещения фоторезистора, чем ниже освещение- тем ярче будет гореть светодиод, для этого надо изменить строку analogWrite(10, analogRead(0)/4); на analogWrite(10, 255-analogRead(0)/4);. Это может пригодится в автомате освещения, т.е. днем свет не горит а ночью горит на полную мощность. Прямое включение можно применить в подсветке электронных устройств, например часов, днем подсветка будет ярче нежели чем ночью. Спасибо за внимание и удачи в освоении ARDUINO!