Следить за 6 аналоговыми пинами одновременно

flighttothemoon
Offline
Зарегистрирован: 07.11.2011

Такая задача - следить за 6 аналоговыми входами и при появлении какой-либо активности на одном из них посылать по serial информацию: номер пина + значение. Далее, на другой стороне serial другая программа будет принимать решение на основе номера пина.

step962
Offline
Зарегистрирован: 23.05.2011

flighttothemoon пишет:

 и при появлении какой-либо активности 

А что такое "активность на одном из аналоговых пинов"?

flighttothemoon
Offline
Зарегистрирован: 07.11.2011

Например, что-то подано на вход, напряжение

step962
Offline
Зарегистрирован: 23.05.2011

 Оно всегда подано на вход - напряжение. Иногда оно, конечно, может быть равно и нулю, но на аналоговом входе это случается гораздо реже, чем на цифровом (там все, что ниже примерно половины напряжения питания - ноль) 

flighttothemoon
Offline
Зарегистрирован: 07.11.2011

Ясно. Спасибо. Ну, как думаете, можно решить мою задачу?  Смотреть за всеми 6 входами и просто отсылать в serial значения вместе с номером пина - что-то вроде пакета, который будет слушать другая программа на другой стороне?

flighttothemoon
Offline
Зарегистрирован: 07.11.2011
int voltageValuePin0 = 0;
int voltageValuePin1 = 0;
int voltageValuePin2 = 0;
int voltageValuePin3 = 0;
int voltageValuePin4 = 0;
int voltageValuePin5 = 0;

void setup()
{
Serial.begin(9600);
}


void loop()
{


int voltageValuePin0 = analogRead(0);
int voltageValuePin1 = analogRead(1);
int voltageValuePin2 = analogRead(2);
int voltageValuePin3 = analogRead(3);
int voltageValuePin4 = analogRead(4);
int voltageValuePin5 = analogRead(5);

//Serial.println(voltageValuePin0);
//Serial.println(voltageValuePin1);
//Serial.println(voltageValuePin2);
//Serial.println(voltageValuePin3);
Serial.println(voltageValuePin4);
//Serial.println(voltageValuePin5);

}

Потенциометр подключен к пину 0. Читаю пин 4 например (видно в коде) и видно, что там напряжение также изменяется при настройке потенциометра. Почему?

step962
Offline
Зарегистрирован: 23.05.2011

flighttothemoon пишет:

Ясно. Спасибо. Ну, как думаете, можно решить мою задачу?  Смотреть за всеми 6 входами и просто отсылать в serial значения вместе с номером пина - что-то вроде пакета, который будет слушать другая программа на другой стороне?

Конечно можно.

Самое простое решение. Определите, с какой частотой должна происходить отправка каждого очередного пакета и, проверяя значение millis(), в нужные моменты считывайте текущие значения на аналоговых входах, формируйте пакет данных, отправляйте.

Ну или считывайте значения в несколько раз чаще, сравнивайте их со значениями из предыдущего отправленного пакета и, когда значение по одному из каналов отклонится от предыдущего на заданную величину - формируйте пакет и вместе с меткой времени отправляйте. Вполне возможно, будет немного экономичнее в плане трафика.

step962
Offline
Зарегистрирован: 23.05.2011

flighttothemoon пишет:

Потенциометр подключен к пину 0. Читаю пин 4 например (видно в коде) и видно, что там напряжение также изменяется при настройке потенциометра. Почему?

Остальные пины (кроме 0) в воздухе висят? Ну идет какая-нибудь наводка через внутренние pullup-резисторы.

flighttothemoon
Offline
Зарегистрирован: 07.11.2011

ну, а смысле тогда иметь 6 разных входов, если напряжение гуляет по всем?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>ну, а смысле тогда иметь 6 разных входов, если напряжение гуляет по всем?<<
 

Изучите подтягивающие резисторы.  Если пин никуда не подключен на нем будет все что угодно.

Выходы:

Либо подключите внутренний подтягивающий резистор pulldown.

Либо внешний , 10 -20 кОм.

Тогда , в отсутствии сигнала , на порту будет 0 .

step962
Offline
Зарегистрирован: 23.05.2011

nestandart пишет:

Тогда , в отсутствии сигнала , на порту будет 0 .

Либо Vпит - в зависимости от того подключен резистор по схеме pulldown (ваш вариант) или pullup.

flighttothemoon
Offline
Зарегистрирован: 07.11.2011

Моя задача читать аналоговые входы на присутствие напряжения на них и отправлять пакет "номер пина + напряжение на пине" по serial на другую программу, которая будет обрабатывать эти данные. Не хотелось бы засорять serial бесполезными данными, а оптправлять инфу только о том пине, где есть имеющее смысл напряжение. Задача - выбрать пин, где есть важное напряжение и отправлять пакет только с этим пином, а не 6 пакетов с 6 пинами.

step962
Offline
Зарегистрирован: 23.05.2011

 Ну так выбирайте "пин с важным напряжением" и отправляйте пакет "номер пина"-"напряжение".

Задачу "выбрать пин, где есть важное напряжение" никто, кроме вас, не решит - ведь никто, кроме вас, не знает, какое напряжение является важным.

whoim
Offline
Зарегистрирован: 03.11.2011

 в первую очередь подтяните внутренние резисторы

digitalWrite(A0, LOW);