Считывание со входа

morgusha
Offline
Зарегистрирован: 15.09.2017

Подскажите пожалуйста, что ни так ! 

Соединил 13 выход  с аналоговым входом А3 пеермычкой, ну и написал такое вот чудо...и не работает и не могу понять что ни так то сделал ? 

int ledPin = 13;
int readPin = A3;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
}

void loop() {
 int k = 50;
  for (int i = 0; i < k ; i++){
    if(readPin == LOW){
        digitalWrite(ledPin,HIGH);
        delay(500);
      }
      else{
        digitalWrite(ledPin,LOW);
          delay(500);
        }

    }
    

}

 

morgusha
Offline
Зарегистрирован: 15.09.2017

немного поправил :

int ledPin = 13;
int readPin = A3;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
}

void loop() {
 int k = 50;
 int а = analogRead(readPin);
  for (int i = 0; i < k ; i++){
    if(a == LOW){
        digitalWrite(ledPin,HIGH);
        delay(500);
      }
      else{
        digitalWrite(ledPin,LOW);
          delay(500);
        }

    }
    

}

 

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

Почему не работает? Работает - светодиод не горит никогда (ну, может иногда вдруг разок-другой вспыхивает). Так и должно быть.

А Вы чего ожидали? Как по Вашему оно должно "работать"?

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

опиши словами алгоритм работы своего устройства

morgusha
Offline
Зарегистрирован: 15.09.2017

вобще я хотел просто попробывать считать сигнал с 13 выхода на аналоговом А3 входе и относительно того высокий он или низкий менять его значение в цикле на обратное ! ну короче типа мигание диода, но в моей интерпритации ) 

morgusha
Offline
Зарегистрирован: 15.09.2017

по моему должно 50 раз сменить значение с задержкой в 1 сек примерно

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

int a внутрь for()

morgusha
Offline
Зарегистрирован: 15.09.2017

ой ! спасибо большое ) работает ) 

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

Но вообще, надёжно всё равно работать не будет. Не сравнивайте нагло с LOW, а сделайте хотя бы там < 50 что-ли. Там по идее, конечно, 0, но на апрактике может оказаться и 1 или 2.

b707
Offline
Зарегистрирован: 26.05.2017

morgusha пишет:

по моему должно 50 раз сменить значение с задержкой в 1 сек примерно

вы читаете значение с пина только один раз - до входа в цикл, поэтому внутри цикла у вас исполняется только ветка if и никогда else

morgusha
Offline
Зарегистрирован: 15.09.2017

))) видел, что сигнал на аналоговом входе раскладывается АЦП по напряжению на уровни. но не подумл , спс !  

morgusha
Offline
Зарегистрирован: 15.09.2017

сделал небольшую правку, что бы отследить скок раз цикл выполняется. так вот он выполняется всего 5 раз вместо 10 почему то ? 

int ledPin = 13;
int readPin = A3;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
}

void loop() {

 int k = 10;
  for (int i = 0; i < k ; i++){
     int m = analogRead(readPin);
    if(m <50 ){                       
        digitalWrite(ledPin,HIGH);
        delay(500);
      }
      else{
        digitalWrite(ledPin,LOW);
          delay(500);
        }

    }

    delay(5000); 
}

 

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

morgusha пишет:

сделал небольшую правку, что бы отследить скок раз цикл выполняется. так вот он выполняется всего 5 раз вместо 10 почему то ? 

5 раз загорелся светодиод + 5 раз погас светодиод = 10 раз всего

morgusha
Offline
Зарегистрирован: 15.09.2017

ООО ну я ТУП ) спс 

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

morgusha пишет:

ООО ну я ТУП

Это название предприятия? Типа Общесто с ограниченной ответственностью? :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

я боюсь разрушить хрупкую модель мира у ТС, но если 12 строку заменить на:

 int m = digitalRead(ledPin);

то ВООБЩЕ НИЧЕГО НЕ ИЗМЕНИТСЯ.

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

wdrakula пишет:

то ВООБЩЕ НИЧЕГО НЕ ИЗМЕНИТСЯ.

Ну как же, ничего?!? Придётся возвращаться к сравнению с LOW, а то для "<50" глубоко фиолетово (я бы даже сказал "ультрафиолетово") LOW там или HIGH.

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

wdrakula пишет:

я боюсь разрушить хрупкую модель мира у ТС, но если 12 строку заменить на:

 int m = digitalRead(ledPin);

то ВООБЩЕ НИЧЕГО НЕ ИЗМЕНИТСЯ.

если ВСЁ заметить на digitalWrite(13, (millis() / 500) & 1);, то ВСЁ УЛУЧШИТСЯ.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ну... если уж так гулять, то 500 это почти 512. И тогда:

digitalWrite(ledPin, millis() & 0x0200);

 

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

wdrakula пишет:

ну... если уж так гулять, то 500 это почти 512. И тогда:

digitalWrite(ledPin, millis() & 0x0200);

digitalWrite(13, (millis() >>  9) & 1);

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

Так, завязываем флуд пока не набежали Свидетели Святого Переполнения и привлекли вас за оскорбление чувств верующих!

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

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

Так, завязываем флуд пока не набежали Свидетели Святого Переполнения и привлекли вас за оскорбление чувств верующих!

набегут - сбросим еретиков в пропасть на съедение дикими жывотными.

morgusha
Offline
Зарегистрирован: 15.09.2017

А почему ? Это ведь аналоговый вход по умолчанию, даже на плате написано ! 

morgusha
Offline
Зарегистрирован: 15.09.2017

Да и это предприятие я ношу на плечах ежедневно...вот сейчас запускаю на этом предприятии цех по работе с arduino ))) а название такое, что бы пон7имали куда обращаются и знали чего ожидать )))

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

morgusha пишет:

А почему ? Это ведь аналоговый вход по умолчанию, даже на плате написано ! 

нарисую на заборе х..

morgusha
Offline
Зарегистрирован: 15.09.2017

ну я ток начинаю изучать только первый день...как бы по описанию это аналоговый вход и для него есть функкции analogRead и analogWrite тоесть что бы считывать покахзания с датчиков ! Или при считывании показаний с датчиков тоже можно будет писать analogRead или digitalRead ? 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

morgusha пишет:

А почему ? Это ведь аналоговый вход по умолчанию, даже на плате написано ! 

Вах! Дарагой! Зачем тебе АНАЛоговый вход? Ти цифровой вход пишешь, да? Ти его и читай, да?! Куда пишешь, там и читаешь...

А то анал-шманал.... нехорошо... нэ эстетично, да? Хотя эсть отдельные лубитэли... Но это нэ наш мэтод!

morgusha
Offline
Зарегистрирован: 15.09.2017

не понял. 

Вообще у меня была идея считать значение цифрового выхода 13 к которому подключен диод...но так разве можно ? если можно то как ? то есть можно считывать тот уровень сигнала на выходе который к нему подан не использую ещё один вход ? 

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

morgusha пишет:

ну я ток начинаю изучать 

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

morgusha
Offline
Зарегистрирован: 15.09.2017

и как же аналоговый вход переопределить в цифровой выход ? и зачем это ? если например я могу тогда уж сигнал с цифрового выхода 13 считывать просто скажем на 11 пине , верно ? 

или это просто будет правильнее что бы уровни LOW и HIGH были более верными ? 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

morgusha пишет:

не понял. 

Вообще у меня была идея считать значение цифрового выхода 13 к которому подключен диод...но так разве можно ? если можно то как ? то есть можно считывать тот уровень сигнала на выходе который к нему подан не использую ещё один вход ? 

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

morgusha
Offline
Зарегистрирован: 15.09.2017

ну подскажи пожалуйста как ? 

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

morgusha пишет:

и как же аналоговый вход переопределить в цифровой выход ? и зачем это ? если например я могу тогда уж сигнал с цифрового выхода 13 считывать просто скажем на 11 пине , верно ? 

или это просто будет правильнее что бы уровни LOW и HIGH были более верными ? 

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

оптимально было бы считывать значение с 13-го пина и... всё

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

morgusha пишет:

и как же аналоговый вход переопределить в цифровой выход ? и зачем это ? если например я могу тогда уж сигнал с цифрового выхода 13 считывать просто скажем на 11 пине , верно ? 

или это просто будет правильнее что бы уровни LOW и HIGH были более верными ? 

родное сердце! Ну зачем тебе читать то, что сам написал, с другой ноги? Неужели ты думаешь, что нельзя прочесть то, что сам написал, там же? Как бы такое могло вообще существовать???

morgusha
Offline
Зарегистрирован: 15.09.2017

потмоу что я пробывал изначльно считать, но потом мне сказали, что так нельзя...вот и стал делать иначе ! 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

morgusha пишет:

потмоу что я пробывал изначльно считать, но потом мне сказали, что так нельзя...вот и стал делать иначе ! 

поймай того, кто тебе это сказал и дай ему пиздюлей!

morgusha
Offline
Зарегистрирован: 15.09.2017

тоже не спец в этом деле человек...просто подал идею, что можно считать с иного входа сигнал. так я и начал делать по такому принципу. 

а можно наверно тупо так что ли ?

int ledPin = 13;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
}

void loop() {

  int k = 10;
  for (int i = 0; i < k ; i++) {
    int m = digitalRead(ledPin);
    if ( m < 50 ) {                    //так как вы входе может быть не совсем 0 а АЦП раскладвает сигнал на входе по напряжению на уровни.
      digitalWrite(ledPin, HIGH);
      delay(500);
    }
    else {
      digitalWrite(ledPin, LOW);
      delay(500);
    }

  }

  delay(5000);
}

так что ли ? или наврено есть какой то оператор инвертирования сигнала и будет ещё короче код ?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

как можно читать аналоговый сигнал с цифрового пина?

morgusha
Offline
Зарегистрирован: 15.09.2017

поправил колд...сорри ) 

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

я же тебе дал рабочий код - заверни его в цикл, если тебе хочется, что бы он сработал 10 раз

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

вот же у тебя есть блинк прямо на том сайте.

morgusha
Offline
Зарегистрирован: 15.09.2017

я это делал ! но я хочу сделать по своему ! 

скажите как считать сигнал с того же выхода куда он и подан )

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

morgusha пишет:

я это делал ! но я хочу сделать по своему ! 

ок. иди найух и делай там по своему.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

и да, инвертирование есть, но ты до него еще долго не дойдешь.

избранное из даташита. ;) нужное я выделил:

I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data
Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only,
while the Data Register and the Data Direction Register are read/write. However, writing '1' to a bit in the
PINx Register will result in a toggle in the corresponding bit in the Data Register.

morgusha
Offline
Зарегистрирован: 15.09.2017

какой ты нервный  )

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

digitalWrite(13, (millis() / 500) & 1);

а дальше тебе начали отвечать ещё более умные )

 

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

morgusha пишет:

я твой код вообще не понимаю...

бита и наручники стоят 100$

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вот. Что еще тебе не понятно.?

int ledPin = 13;
void setup() {
 pinMode(ledPin, OUTPUT);
}

void loop() {
  int k = 10;
  for (int i = 0; i < k ; i++) {
    int m = digitalRead(ledPin);
    if ( m == LOW ) {         
      digitalWrite(ledPin, HIGH);
      delay(500);
    }
    else {
      digitalWrite(ledPin, LOW);
      delay(500);
    }

  }

  delay(5000);
}

 

morgusha
Offline
Зарегистрирован: 15.09.2017

спасибо ! выкладываю свой самый первый код проги ! где была такая же идея считать сигнал на выходе ! 

int ledPin = 13; 

void setup() { 
// put your setup code here, to run once: 
pinMode(ledPin, OUTPUT); 
} 

void loop() { 
// put your main code here, to run repeatedly: 
// digitalWrite(ledPin, HIGH); 
// delay(1000); 
// digitalWrite(ledPin, LOW); 
// delay(1000); 

digitalWrite (ledPin, LOW); 
int pinValue = digitalRead(ledPin); 
delay(1); 
if (pinValue == LOW){ 
digitalWrite(ledPin, HIGH); 
} 
else{ 
digitalWrite(ledPin, LOW); 
} 
}

так что не обзывайтесь ) 

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

morgusha пишет:

так что не обзывайтесь ) 

А собственно, почему? Пятница, настроение хорошее!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Пятница, настроение хорошее!

Я, хоть и "выкрест", но, не побоюсь этого слова: "Шабат шалом!"