Три фотодиода

jpg10
Offline
Зарегистрирован: 07.10.2015

Приветствую всех, требуестся использовать 3 фотодиода для управления тремя реле. С скетчем который ниже при подаче сигнала на любой из 3х портов "А" включаются все реле. Подскажите что не так


int pinA1 = 1;
int ledPin1 = 11;
int pinA2 = 2;
int ledPin2 = 12;
int pinA3 = 3;
int ledPin3 = 13;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  analogReference(DEFAULT);
}
void loop()
{
  int val1 = analogRead(pinA1);
  val1 = constrain(val1, 100, 200);
  int ledLevel1 = map(val1, 100, 200, 0, 255);
  digitalWrite(ledPin1, ledLevel1);
  int val2 = analogRead(pinA2);
  val2 = constrain(val2, 100, 200);
  int ledLevel2 = map(val2, 100, 200, 0, 255);
  digitalWrite(ledPin2, ledLevel2);
  int val3 = analogRead(pinA3);
  val3 = constrain(val3, 100, 200);
  int ledLevel3 = map(val3, 100, 200, 0, 255);
  digitalWrite(ledPin3, ledLevel3);
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Второй параметр digitalWrite какой должен быть? А Вы что туда пихнули?

Araris
Offline
Зарегистрирован: 09.11.2012

Функция digitalWrite работает с HIGH и LOW в качестве второго аргумента, поэтому constrain() и map() тут излишни.

Напишите проще:

digitalWrite(ledPin1,(analogRead(pinA1) > 512)); // 512 - пороговое значение, любое, какое устроит.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не понял для чего такой огород с map и constrain ради digitalWrite(), которой нужно всего-то 0 или 1.

Что же до Вашего вопроса - выведите в Serial свои val и ledLevel - узнаете много интересного.

И вообще, прежде чем писать на форум всегда выведите переменные, посмотрите на них, подумайте. Глядишь, и писать не придётся.

jpg10
Offline
Зарегистрирован: 07.10.2015

Ничего не изменилось

int pinA1 = 1;
int ledPin1 = 11;
int pinA2 = 2;
int ledPin2 = 12;
int pinA3 = 3;
int ledPin3 = 13;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  analogReference(DEFAULT);
    Serial.begin(9600);
}
void loop()
{
  digitalWrite(ledPin1,(analogRead(pinA1) > 512));
  digitalWrite(ledPin2,(analogRead(pinA2) > 512));
  digitalWrite(ledPin3,(analogRead(pinA3) > 512));
}

 

jpg10
Offline
Зарегистрирован: 07.10.2015

Все ответы равны "БЛА БЛА БЛА", скетч который выложен в посте переписанный под один канал работает и с map и с полигон, но если увеличить число каналов таким способом как это сделал я то мы получим все три аналоговых входа как единое целое, и выходы станут такими же! Про serial тоже бомба блеснул так блеснул! Вопрос в другом, как сделать это иначе?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы Выводили в Serial то, что возвращают analogRead, как я Вам советовал? Нет? Хотите работать вслепую, с завязанными глазами? Ну, удачи :)

Araris
Offline
Зарегистрирован: 09.11.2012

jpg10 пишет:

Все ответы равны "БЛА БЛА БЛА"

Успехов Вам.

jpg10
Offline
Зарегистрирован: 07.10.2015

val=0 и с сигналом =1024

ledLevel=100 c сигналом=200

 

 

 

vk007
Offline
Зарегистрирован: 16.06.2015

Схему проверьте. В скетче нет ничего такого, что заставляло бы срабатывать все три реле от одного фотодиода.

И замечания дельные были. Хоть скетчи оба будут работать, но второй хоть логически правильный.

jpg10
Offline
Зарегистрирован: 07.10.2015

В схеме то и проверять не чего, ардуина, блок реле, фотодиод + 10k на vcc

 

jpg10
Offline
Зарегистрирован: 07.10.2015

а по первому скетчу так это остатки попыток заменить фотодиоды переменниками

 

bwn
Offline
Зарегистрирован: 25.08.2014

jpg10, вы так хорошо здесь всех по местам расставили, даже непонятно зачем с такой гениальностью вопросы задавать. Вам ЕвгенийП не зря про Serial писал. С чего вы уверены, что  АЦП успевает отрабатывать с трех источников?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

jpg10 пишет:

val=0 и с сигналом =1024

ledLevel=100 c сигналом=200

))) если так зачем тут analogread. сигнал то цифровой получается на входе

да и что за analogread на пине без ацп?))) чудеса да и только. ТС тупит не по детски

vk007
Offline
Зарегистрирован: 16.06.2015

jeka_tm пишет:

да и что за analogread на пине без ацп?)))

Почему на пине без АЦП?

Syntax analogRead(pin)

Parameters pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

Вопрос только, к каким пина ТС подключал фотодиоды - к аналоговым или цифровым?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

#define pinA1 A1   //  и так далее

или в лупе  сразу и прямо писать:  analogRead (A1)

vk007
Offline
Зарегистрирован: 16.06.2015

trembo пишет:

#define pinA1 A1   //  и так далее

Не обязательно. В недрах ардуины есть такие записи:

#define analogInputToDigitalPin(p)  ((p < 6) ? (p) + 14 : -1)

и например static const uint8_t A1 = 15;

т.е. получается в analogRead можно писать и A1 и 1

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ок. раз так и ты так хорошо знаешь как объяснишь это:

  int val1 = analogRead(pinA1);
  val1 = constrain(val1, 100, 200);
  int ledLevel1 = map(val1, 100, 200, 0, 255);
  digitalWrite(ledPin1, ledLevel1);

 

vk007
Offline
Зарегистрирован: 16.06.2015

jeka_tm пишет:

ок. раз так и ты так хорошо знаешь как объяснишь это:

почему бы и нет, попробую

  int val1 = analogRead(pinA1);   // читаем состояние аналового пина
  val1 = constrain(val1, 100, 200);   // нормализируем значение чтобы оно было не меньше 100 и не больше 200
  int ledLevel1 = map(val1, 100, 200, 0, 255);   // переводим то что получилось в диапазон от 0 до 255
  digitalWrite(ledPin1, ledLevel1); // отправляем результат на пин ledPin1
// итого, все, что получено на аналоговом пине <=100 будет восприниматься как 0, выше - 1

но повторюсь, хоть оно и рабочее но какое-то извращенное

или ты просил объяснить поведение автора, когда он придумал этот код? тут я пас )))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем диапазон 0-255 если используешь digiralWrite у которого только 2 возможных варианта 0 или 1 . что теперь скажешь? фактически 2 и 3 строка бесполезны. просто условие поставить выше порога то 1 на выходе, иначе 0

блин а тс то другой)))

maksim
Offline
Зарегистрирован: 12.02.2012

Сие творение называется индусским кодом.

 

jpg10 пишет:

Подскажите что не так

(по вашему требованию: "Все ответы равны "БЛА БЛА БЛА"")
Руки БЛА из ж...ы растут и ума БЛА не хватает, а в остальном все БЛА так.

 

jpg10
Offline
Зарегистрирован: 07.10.2015

Столько гениального сблёва, что глаза на лоб лезут!!! Всего лиш vk007 дал точный ответ что код работать будет и ошибка в железе, а все остальные БЛА БЛА БЛА!!!!! Проблема былы в ардуине, на другой плате все пошло и с кривым и с косым. Господа ПРОГРАММНЫЙ МУСОР оставьте свою изжогу для ЖЕНЫ!!!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

какой нервный. написал странный код и еще удивляется критике