Проблемы с аналоговыми входами на Arduino Uno
- Войдите на сайт для отправки комментариев
Здравствуйте!
Делаем умную книжную полку. Смысл её состоит в том, что с фоторезистора идёт сигнал на аналоговый вход Arduino Uno. Если этот сигнал превышает какое-то пороговое значение (т.е. фоторезистор достаточно освещён), то с помощью Music Shield начинает воспроизводиться определённый трек.
Схема должна работать с пятью фоторезисторами. Т.е. должно быть задействовано 5 аналоговых входов. Но проблема в том, что корректро программа работает толко со входами А4 и А5. Написал программу для проверки (код см. ниже)
Как видите, в данном коде считываю сигнал со входа А4. Происходят два глюка.
Первая проблема - как только раскомменчиваю строки myplayer.attachAnalogOperation(A2,adjustVolume); или myplayer.attachAnalogOperation(A3,adjustVolume); работоспособность программы сразу же теряется
Вторая проблема - когда в коде делаю в строке vol_1 = analogRead(A4); считывание с A0 или A1 (соответственно, перетыкаю контакт на них) программа, кажется, работает, но судя про громкости звучания сигнал из этих входах идёт намного ниже.
В инете нашёл про порты А4 и А5 только такую отличительную особенность: I2C: 4 (SDA) и 5 (SCL)
Подскажите плз, как тут быть
#include <Fat16.h>
#include <Fat16Util.h>
#include <NewSPI.h>
#include <arduino.h>
#include "pins_config.h"
#include "vs10xx.h"
#include "newSDLib.h"
#include "MusicPlayer.h"
MusicPlayer myplayer; //вводим переменную нашего myplayer плеера, которая имеет тип MusicPlayer. все функции для этого типа описаны в библиотеке MusicPlayer.h
int track_1=0; //флаги воспроизведения треков №1 и №2. если соответствующий флаг равен 0, то данный трек в этоть момент не воспроизводится
int no_volume=0; //флаг тишины в эфире. если равен 0, то в данный момент ничего не играет. если равен 1, то что-то в данный момент воспроизводится
int koef=3; //коэффициент освещённости. вводится в следствие различой освещённости в местах испытания
//если оч светло, то сделать около 1.5, если темнее (тусклый комнатный свет), то сделать 4-5
void setup() //функция setup является обязательной и выполняется только один раз при запуске устройства (а значит и самой программы)
{
Serial.begin(9600); //начинаем вести журнал контроллера, чтоб если что посмотреть события на нём (Меню Сервис - Монитор порта)
myplayer.keyDisable(); //отключаем управление кнопками на Music Shield
myplayer.analogControlEnable(); //разрешаем Music Shield отслеживать сигнал на аналоговых портах A4 и A5
myplayer.begin(); //инициализируем начало работы на Music Sield
myplayer.attachAnalogOperation(A0,adjustVolume);
myplayer.attachAnalogOperation(A1,adjustVolume);
//myplayer.attachAnalogOperation(A2,adjustVolume);
//myplayer.attachAnalogOperation(A3,adjustVolume);
myplayer.attachAnalogOperation(A5,adjustVolume); //разрешаем нашей функции adjustVilume, которую мы опишем дальше,
myplayer.attachAnalogOperation(A4,adjustVolume); //использовать значения сигналов с аналоговых входов A4 и A5
myplayer.setVolume(200); //устанавливаем начальную громкость Music Shield равную 200.
//для справки, диапазон громкости Music Shield меняется от 0 до 255. чем меньше значение громкости, тем звучание громче.
//диапазон громкости, слышимый человеком примерно равен 0-155 (0 - самая большая громкость)
}
void loop() //функция loop - обязательная функция, которая выполняется постоянно раз за разом постоянно
{
myplayer.setPlayMode(MODE_REPEAT_ONE); //ставим плеер в режим повторения одного трека
myplayer.playSong("02.mp3"); //запускаем плеер (пока с помощью трека 02.mp3)
if (track_1 == 1) //если флаг трэка №1 стал равен 1, то:
{
myplayer.playSong("01.mp3"); //запускаем его на воспроизведение
no_volume=1; //флаг тишины делаем равным 1
track_1++; //увеличиваем флаг трека №1, т.к. он уже запущен
}
}
void adjustVolume() //описываем нашу функцию, которая запускается каждый момент, как только меняется значение на входах A4 или A5,
{ //а значит и освещённость какого-либо из фоторезистров
unsigned int vol_1 = analogRead(A4); //вводим вспомогательныепеременные vol_1 и vol_2, из которых будет рассчитываться громкость звука (сами они не равны громкости)
//в vol_1 считываем значение со входа A4
vol_1=vol_1*koef; //масштабируем это значение в соответствии с нашей общей освещённостью, используя коэффициент, заданный выше (обычно koef=2-3)
if (vol_1 >= 80) //экспериментально установлено, что освещённость фоторезисторов меняется примерно от 2 до 80
vol_1=79; //ограничим на всякий случай параметр vol_1 значением 79. итого 0 < vol_1 < 80.
//79 - значение максимально освещённого первого фоторезистора. при нём громкость равна 1 (самое громкое значение)
if ((track_1==0) && (vol_1 > 10) ) //если в данный момент трек №1 не воспроизводится, но значение освещённсти первого фоторезистора
{ //превысило 10 (заданный на основе экспериментовнами порог), то пора запускать трек 01.mp3. для этого:
myplayer.opStop(); //останавливаем всё, что воспроизводится на данный момент
track_1=1; //ставим значение флага трека №1 в значение, равное 1. т.е. как только цикл loop увидит, что мы поменяли здесь
//значение track_1 на 1 вместо 0, то он запускает трек 01.mp3 (см. выше по тексту кода)
}
if ((vol_1 <= 10) && (no_volume != 0)) //как только значения освещённостей обоих фоторезисторов стали ниже порогового, но флаг тишины no_volume
{ //всё ещё равен 1, то пора глушить музыку. для этого:
myplayer.opStop(); //останавливаем воспроизведение на Music Shield
track_1=0; //ставим флаги обоих треков в значение, равное 0
no_volume=0; //ставим флаг тишины в эфире в значение, равное 0
}
unsigned char volume=230; //вводим переменную, которая равна громкости звука на Music Shield. Пока она равна 230 (т.е. тишина)
if (vol_1 > 10) //если освещённость первого фоторезистора выше порогового значения, т.е. играет первый трек,
volume = (80-vol_1); //то и общую громкость рассчитываем из значения vol_1 для первого фоторезистора
myplayer.setVolume(volume); //устанавливаем громкость для нашего плеера
}
Так, я понял. Сам дурак)
Music Shield использует аналоговые входы А0-А3. Поэтому А4 и А5 как раз остаются свободными
Вопрос - можно ли как-либо освободить А0-А3 для собственного использования?
А у меня другая проблема, не работает комманда opStop.
Выдает ошибку:
#include <TimerOne.h> #include <QuadDisplay.h> #define DISPLAY_PIN 4 float Tm = 59.59; int chel; //Для работы с Мюзик шилдом #include <Fat16.h> #include <Fat16Util.h> #include <NewSPI.h> #include <arduino.h> #include "pins_config.h" #include "vs10xx.h" #include "newSDLib.h" #include "MusicPlayer.h" MusicPlayer myplayer; void setup() { Timer1.initialize(); // 1 секунда по умолчанию - то, что надо Timer1.attachInterrupt(Timer1_action); Serial.begin(9600); myplayer.begin(); myplayer.keyDisable(); //отключаем встроенное управление воспроизведением myplayer.analogControlEnable(); //включаем возможность слушать аналоговые входы myplayer.digitalControlEnable(); //включаем возможность слушать цифровые входы myplayer.setVolume(1); } void Timer1_action() { if (Tm == 0.00) { Tm = 00.00; displayDigits(DISPLAY_PIN, QD_0, QD_0, QD_0, QD_0); //delay(100); // displayClear(DISPLAY_PIN); } else { //Здесь проверяем и получаем дробную часть int drob = (Tm - (int)Tm) * 100; chel = (int)Tm; // Serial.println(chel); if (drob > 60) { drob = 60; Tm = chel + 0.60; } Tm = Tm - 00.01; // LED секунду горит, секунду - нет displayFloat(DISPLAY_PIN, Tm, 2); } } void loop() { //myplayer.setPlayMode(MODE_SHUFFLE); //SHUFFLE // myplayer.creatPlaylist(); // myplayer.opRepeatList(); // myplayer.setPlayMode(MODE_REPEAT_ONE); //Для теста while(Tm <= 59 ){ myplayer.playSong("7.mp3"); delay(1000); myplayer.opStop(); } //Звучат треки каждые 8 мин while (Tm <= 57 ) { myplayer.playSong("4.mp3"); } while (Tm <= 56 ) { myplayer.playSong("3.mp3"); } while (Tm <= 35 ) { //myplayer.playSong("Skrillex.mp3"); } while (Tm <= 27 ) { //myplayer.playSong("Skrillex.mp3"); } while (Tm <= 19 ) { //myplayer.playSong("Skrillex.mp3"); } while (Tm <= 11 ) { //myplayer.playSong("Skrillex.mp3"); } while (Tm <= 5 ) { myplayer.playSong("Skrillex.mp3"); } while (Tm <= 0.01 ) { } if (Tm == 0.00) { } }