Аналоговый вход как цыфровой.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Понимаю что тупой вопрос, но элементарно на пльцах: читать A0 как High или low, понимаю что нужно понимать что подразумевается 0 или 1 и то что скорость считывания меньше чем на цифровом . В схеме подтягивающий резистор  на землю на 10кОм есть (возможно его мало?). ардуино читает всегда high. (по крайней мере в протеусе ибо только начиню ваять )  Что не находил в инете - нету вообще и слова об этом. Значит вопрос реально тупой..((

 

 

 - перебросил на цифровые, так будет проще но все же для понимая-

[code]
int vklLamp1 = A0; // включение лампы 1

int zakr1 = A6; // рефлектор закрыт на 1 лампе
int otkr1 = A5; // рефлектор открыт на 1 лампе

int konveerGO = A15; // конвеер работает
int obruvPered = 53; //обрыв лениты впереди
int obruvZad = 53; //обрыв лениты сзади
int GOlamp1 = 43; //запуск лампы 1

long previousMillis = 0; // время последнего задействования
long intervaLampGO = 1000; // интервал для ВКЛЮЧЕНИЯ ЛАМПЫ





void setup() {
  pinMode(vklLamp1, INPUT);
  pinMode(zakr1, INPUT);
  pinMode(otkr1, INPUT);
  pinMode(konveerGO, INPUT);
  pinMode(obruvPered, INPUT);
  pinMode(obruvZad, INPUT); 
  pinMode(obruvZad, INPUT);
  pinMode(GOlamp1, OUTPUT);
pinMode(Alarmlamp1, OUTPUT);


  
}

void loop() 
{
  if (digitalRead(vklLamp1) == HIGH && zakr1 == HIGH); //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ЗАКРЫТ
   {
    unsigned long currentMillis = millis(); //запускаю отсчет
    if(currentMillis - previousMillis > intervaLampGO)// отсчитываю время ДЛЯ ВКЛЮЧЕНИЯ ЛАМПЫ
      {
       digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 
      }
    
    
    }


  

}
[/code]

КАК?!

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

digitalRead()

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

maxvalin пишет:

скорость считывания меньше чем на цифровом . 

Ни в какой мере - точно такая же скорость.

maxvalin пишет:

КАК?!

Правильно написать код. Если бы Вы в строке 36 сравнивали бы с HIGH не номер пина, как Вы это делаете, а значение на нём, а заодно убрали бы из конца всё той же строки точку с запятой, то всё было бы нормально с божьей помощью.

// У Вас
if (digitalRead(vklLamp1) == HIGH && zakr1 == HIGH);

// Надо
if (digitalRead(vklLamp1) == HIGH && digitalRead(zakr1) == HIGH)
 

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Именно так уже и сделал, не увидел сначала ошибки))

И с аналога читает HIGH без проблем, а проблема вот в протеусе оказалась. Эмуляция в нем никудышняя. После исправления запустиось как надо, но не всегда . Тупо старт стоп в эмулторе клацаю- срабатывает раз через четыре примерно. Код прошивки при этом не меняю! . Плюнул на протеус- начал набирать потихоньку так. Пока придут блоки реле и пока залужу плату с оптронами для входов (жаль что на том же алиекспресе еще модули входов не придумали продавать) Попутно вопрос :

застрял в последних строчках:

if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ
    {
       unsigned long currentMillis = millis(); //запускаю отсчет
       if(currentMillis - previousMillis > PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА
       if (digitalRead(vklLamp1) == HIGH  //(понимаю что два if постановлен не совсем верно, вот как раз мозгую над этим
      // но надо чтоб после запуска конвеера , после определенного времени был сделан опрос датчика, если LOW то соответственный сигнал на выход.
      }

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Клапауций 232 пишет:

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

digitalRead()

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

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

maxvalin пишет:

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

Правильнее писать A0. 

А так, технически это без разницы. В одном из включаемых файлов у Вас есть такая строчка

#define A0 14

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

maxvalin пишет:

Клапауций 232 пишет:

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

digitalRead()

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

не писали - рисовали.

распечатай себе картинко на память - твой случай: нижний левый угол платы - пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким - цифровые номера пинов

http://volthauslab.com/wp-content/uploads/wppa-source/album-1/uno.jpg

uno.jpg

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

maxvalin пишет:

застрял в последних строчках:

if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ
    {
       unsigned long currentMillis = millis(); //запускаю отсчет
       if(currentMillis - previousMillis > PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА
       if (digitalRead(vklLamp1) == HIGH  //(понимаю что два if постановлен не совсем верно, вот как раз мозгую над этим
      // но надо чтоб после запуска конвеера , после определенного времени был сделан опрос датчика, если LOW то соответственный сигнал на выход.
      }

Нужен совет, давайет скетч целиком. Я не понимаю откуда эти строчки и в каком мест Вашего изначального скетча они стоят, а потому ничего не могу сказать.

maxvalin
Offline
Зарегистрирован: 22.02.2016
[code]
int vklLamp1 = 37; // включение лампы 1
int vklLamp2 = 36; // включение лампы 2
int vklLamp3 = 35; // включение лампы 3
int vklLamp4 = 34; // включение лампы 4
int vklLamp5 = 33; // включение лампы 5
int zakr1 = 32; // рефлектор закрыт на 1 лампе
int otkr1 = 31; // рефлектор открыт на 1 лампе
int zakr2 = 30; // рефлектор закрыт на 2 лампе
int otkr2 = 29; // рефлектор открыт на 2 лампе
int zakr3 = 28; // рефлектор закрыт на 3 лампе
int otkr3 = 27; // рефлектор открыт на 3 лампе
int zakr4 = 26; // рефлектор закрыт на 4 лампе
int otkr4 = 25; // рефлектор открыт на 4 лампе
int zakr5 = 24; // рефлектор закрыт на 5 лампе
int otkr5 = 23; // рефлектор открыт на 5 лампе
int konveerGO = 22; // конвеер работает
int obruvPered = 53; //обрыв лениты впереди
int obruvZad = 53; //обрыв лениты сзади
int GOlamp1 = 43; //запуск лампы 1
int GOlamp2 = 44; //запуск лампы 2
int GOlamp3 = 45; //запуск лампы 3
int GOlamp4 = 46; //запуск лампы 4
int GOlamp5 = 47; //запуск лампы 5
int Alarmlamp1 = 38; //авария лампы 1
int Alarmlamp2 = 39; //авария лампы 2
int Alarmlamp3 = 40; //авария лампы 3
int Alarmlamp4 = 41; //авария лампы 4
int Alarmlamp5 = 42; //авария лампы 5
long previousMillis = 0; // время последнего задействования
long intervaLampGO = 1000; // интервал для ВКЛЮЧЕНИЯ ЛАМПЫ
long PauseOpenReflektor = 5000; // интервал для ВКЛЮЧЕНИЯ АВАРИИ




void setup() {
  pinMode(vklLamp1, INPUT);
  pinMode(vklLamp2, INPUT);
  pinMode(vklLamp3, INPUT);
  pinMode(vklLamp4, INPUT);
  pinMode(vklLamp5, INPUT);
  pinMode(zakr1, INPUT);
  pinMode(otkr1, INPUT);
  pinMode(zakr2, INPUT);
  pinMode(otkr2, INPUT);
  pinMode(zakr3, INPUT);
  pinMode(otkr3, INPUT);
  pinMode(zakr4, INPUT);
  pinMode(otkr4, INPUT);
  pinMode(zakr5, INPUT);
  pinMode(otkr5, INPUT);
  pinMode(konveerGO, INPUT);
  pinMode(obruvPered, INPUT);
  pinMode(obruvZad, INPUT); 
  pinMode(obruvZad, INPUT);
  pinMode(GOlamp1, OUTPUT);
  pinMode(GOlamp2, OUTPUT);
  pinMode(GOlamp3, OUTPUT);
  pinMode(GOlamp4, OUTPUT);
  pinMode(GOlamp5, OUTPUT);
  pinMode(Alarmlamp1, OUTPUT);
  pinMode(Alarmlamp2, OUTPUT);
  pinMode(Alarmlamp3, OUTPUT);
  pinMode(Alarmlamp4, OUTPUT);
  pinMode(Alarmlamp5, OUTPUT);

  
}

void loop() 
{
  if (digitalRead(vklLamp1) == HIGH && digitalRead(zakr1) == HIGH) //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ЗАКРЫТ
   {
     unsigned long currentMillis = millis(); //запускаю отсчет
     if(currentMillis - previousMillis > intervaLampGO)// ОТСЧИТЫВАЮ ВРЕМЯ НА ЗАПУСК ЛАМПЫ
      {
        digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 
      }
        previousMillis = currentMillis; //сохраняю сразу время последнего включения
   }
  if (digitalRead(vklLamp1) == LOW)// ЕСЛИ КНОПКА ПУСКА ПЕРВОЙ ЛАМПЫ ВЫКЛЮЧЕНА
    {
      digitalWrite(GOlamp1,LOW); // ВЫКЛЮЧАЮ ЛАМПУ
    }
  if (digitalRead(vklLamp1) == HIGH && digitalRead(otkr1) == HIGH && digitalRead(konveerGO) == HIGH) //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ОТКРЫТ И ТРАНСПОРТЕР КРУТИТСЯ
  {
    digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 ПРИ РАБОТАЮЩЕМ ТРАНСПОРТЕРЕ 
  }
  if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ
    {
       unsigned long currentMillis = millis(); //запускаю отсчет
       if(currentMillis - previousMillis > PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА
        {
         previousMillis = currentMillis; 
        }
         if (digitalRead(otkr1) == LOW)
         {
          digitalWrite(Alarmlamp1,HIGH); // Включаю сигнализацию первой лампы
          }

        
      }
     

}
[/code]
сделал так, может и прокатит)
Вот опять таки: как добавить чтоб при появлении сигнала digitalRead(otkr1)отключить аварию.
в этом же if надо вкладывать или выносить на наружу. Это самая сильная проблема для меня при написании(
Мечтаю знать наизусть порядок установки условий! Принцип как идет цикл и вообще как читается программа процессором понимаю но эти 
правила....

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Клапауций 232]</p> <p>[quote=maxvalin]</p> <p>[quote=Клапауций 232 пишет:

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

digitalRead()

 

распечатай себе картинко на память - твой случай: нижний левый угол платы - пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким - цифровые номера пинов

http://volthauslab.com/wp-content/uploads/wppa-source/album-1/uno.jpg

 

скачал с того же пигиса на свою мегу, и раньше смотрел на эту картинку но чето недогнал что при написании кода смотреть на сопоставимость входов/выходов. Думал другие правила нужны(

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

Строки 75 - 80.

При каждом попадании сюда Вы выполняете операцию previousMillis = currentMillis;.Это значит, что если условие в строке 73 будет выполняться часто, строка 78 не выполнится никогда, т.к. Вы каждый раз начинаете отсчёт времени заново. Думаю, что Вы хотели поставить строку 80 перед строкой 79, а не после.

Строки 92-100

Это вообще странная конструкция. Непонятно зачем считаетеся интервал в строке 93? Чтобы сбросить его в строке 95 и больше ничего не сделать? Строки 97-100 исполняются при каждом проходе, независимо от интервала. Опять же, думаю, что Вы хотели поместить строки 97-100 перед строкой 96

 

MacSim
Offline
Зарегистрирован: 28.11.2012

... и добавление про аналоговые как цифровые:

не на всех мк можно использовать аналоговые как цифровые. к примеру сравните распиновки 328р в дип и чип корпусах. adc6&adc7

ps в дипе даже не ищите их, а в чипе как цифровые нельзя. незнаю для какого чипа прога из стартового поста, но пина А15 не встречал. может надо написать д15 (А1)

maxvalin
Offline
Зарегистрирован: 22.02.2016

ЕвгенийП пишет:

Строки 75 - 80.

При каждом попадании сюда Вы выполняете операцию previousMillis = currentMillis;.Это значит, что если условие в строке 73 будет выполняться часто, строка 78 не выполнится никогда, т.к. Вы каждый раз начинаете отсчёт времени заново. Думаю, что Вы хотели поставить строку 80 перед строкой 79, а не после.

Строки 92-100

Это вообще странная конструкция. Непонятно зачем считаетеся интервал в строке 93? Чтобы сбросить его в строке 95 и больше ничего не сделать? Строки 97-100 исполняются при каждом проходе, независимо от интервала. Опять же, думаю, что Вы хотели поместить строки 97-100 перед строкой 96

 

Совершенно так!,и стояла она сначала в начале, но когда начал в протеусе эксперементировать то поменял местами дабы он хоть как то начал работать. Не сомневаюсь что в железе все будет правильно и по правилам. По этому строку вернул на место (перед 79)

 Строки 92-100 А вот здесь как раз таки не странная конструкция а то что назвается незнанием! Затык собственно произошел из-за того что начал городить условие: " если транспортер запущен то осчитываю интервал и если после этого интервала сигнал LOW на входе то выход на аварию пока не появится HIGHyf этом входе.

как это правильно сложить ума не хватает. Вот.  Да и на пальцах бы кто написал что и как работает этот previousMillis = currentMillis   В. Я так понимаю. previos это предыдущее значение милисекунд , оно обычно в глобальных переменных задается или остается от предыдущей операции. current это текущее значение ибо по формуле понятно что надо отнять новое от старого и сравнить с заданым. Странно что на форуме еще нет темы именно по разжовыванию функций, так как новичку допустим не в зуб ногой!, разбираться как работает функция , то что в ссылке "программирование" это скудные лоскутки по ним впервые не поймешь, Я себя допустим не отношу к совсем тугоразвитым, учусь быстро и разбираюсь так как по сути инженер. НО! то как описаны функции ... печаль да и только. 

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

MacSim пишет:

... и добавление про аналоговые как цифровые:

не на всех мк можно использовать аналоговые как цифровые. к примеру сравните распиновки 328р в дип и чип корпусах. adc6&adc7

ps в дипе даже не ищите их, а в чипе как цифровые нельзя. незнаю для какого чипа прога из стартового поста, но пина А15 не встречал. может надо написать д15 (А1)

да здесь хотя бы в "трех соснах" разобраться - нано уно и мега чипы вроди как одинаковые пока ставят, хотя и уно уже китайци бесстыдно  в чип-корпусах продают.

 Работаю только с мегой(чтоб не заморачиваться) A15 в меге присутствует - это 69. теперь могу с увереностью сказать)))

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

maxvalin пишет:

да здесь хотя бы в "трех соснах" разобраться - нано уно и мега чипы вроди как одинаковые пока ставят, хотя и уно уже китайци бесстыдно  в чип-корпусах продают.

Да нечего там особо разбираться. У миксросхемы atmega328 в мелкотравчатом корпусе есть два дополнительных ADC входа A6 и A7, которых нет в DIP корпусе. Так вот у этих входов нет цифрового буфера, т.е. их можно использовать только как аналоговые. Вот и вся премудрость.

Все остальные аналоговые входы (A0-A5) можно использовать как цифровые и они ничуть не хуже родных цифровых. Правда там есть нюансы. Их два. (1) Если Вы используете часть пинов одного порта как аналоговые, а часть как цифровые, то лучше бы, чтобы во время считывания аналогового значения цифровые на том же порте не менялись, а то ADC нервничает и привирать начинает немного. И (2) - если эти пины не нужны как цифровые, а нужны только как аналоговые, то можно выключить их "цифровость" программно - это обеспечит небольшую экономию электроэнергии.

MacSim
Offline
Зарегистрирован: 28.11.2012

maxvalin пишет:

 нано уно и мега чипы вроди как одинаковые пока ставят

 Работаю только с мегой

A15 в меге присутствует - это 69

чипы разные на нано могут стоять 168 или 328, на уно 328 в дип и чип корпусах. у некоторых уно в чипе которые даже а6 и 7 выведены, меги сейчас идут 2560 раньше встречались 1280.

ну и преобразователи уарт-юсб разные ставят.

распиновку меги посмотрел. действительно вы правы. АDC15 - порт АК7 на ноге 82 ATmega2560

 

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

" если транспортер запущен то осчитываю интервал и если после этого интервала сигнал LOW на входе то выход на аварию пока не появится HIGHyf этом входе.

как же сдесь разобраться? (

MacSim
Offline
Зарегистрирован: 28.11.2012

maxvalin пишет:
" если транспортер запущен то осчитываю интервал и если после этого интервала сигнал LOW на входе то выход на аварию пока не появится HIGHyf этом входе. как же сдесь разобраться? (

выходить на аварию должен быть при аварии коей должно быть не время, а к примеру: отситствие движения ленты, слетание ленты(обрыв), большой ток двигателя и т.д. и что тут таймерами считать. вешайте соответствующую обвязку-датчики на мк.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ну почему программу не раскидать на потоки .Да  принцип разделяй и властвуй в программировании тоже действует. Да и простыня программы становится понятнее.

//#1
//#2
//#3

void setup() {
  //#1
  //#2
  //#3

}

void loop() {
  //#1
  //#2
  //#3

}

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

MacSim пишет:

maxvalin пишет:
" если транспортер запущен то осчитываю интервал и если после этого интервала сигнал LOW на входе то выход на аварию пока не появится HIGHyf этом входе. как же сдесь разобраться? (

выходить на аварию должен быть при аварии коей должно быть не время, а к примеру: отситствие движения ленты, слетание ленты(обрыв), большой ток двигателя и т.д. и что тут таймерами считать. вешайте соответствующую обвязку-датчики на мк.

 

ну в даном случае нужен именно отчет 3 секунд(примерно)

(((

P.S спасибо за расклад , больше бы таких разжовываний!

uragan
Offline
Зарегистрирован: 23.02.2015

ЕвгенийП пишет:

maxvalin пишет:

да здесь хотя бы в "трех соснах" разобраться - нано уно и мега чипы вроди как одинаковые пока ставят, хотя и уно уже китайци бесстыдно  в чип-корпусах продают.

 

Да нечего там особо разбираться. У миксросхемы atmega328 в мелкотравчатом корпусе есть два дополнительных ADC входа A6 и A7, которых нет в DIP корпусе. Так вот у этих входов нет цифрового буфера, т.е. их можно использовать только как аналоговые. Вот и вся премудрость.

Все остальные аналоговые входы (A0-A5) можно использовать как цифровые и они ничуть не хуже родных цифровых. Правда там есть нюансы. Их два. (1) Если Вы используете часть пинов одного порта как аналоговые, а часть как цифровые, то лучше бы, чтобы во время считывания аналогового значения цифровые на том же порте не менялись, а то ADC нервничает и привирать начинает немного. И (2) - если эти пины не нужны как цифровые, а нужны только как аналоговые, то можно выключить их "цифровость" программно - это обеспечит небольшую экономию электроэнергии.

Спасибо за замечания. Столкнулся с тем, что на одном пине в аналоговом порту, после считывания 1, АЦП вообще какую-то фигню показывает. Попробовать считать аналогом?