Странный глюк ардуино

next-999
Offline
Зарегистрирован: 30.09.2013

int ledPin1 = 2;
int ledPin2 = 3;


void setup() {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);

}

void loop() {

}

При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите

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

точно уверен, что у тебя светодиоды не к 5V вторым концом подключены?

next-999
Offline
Зарегистрирован: 30.09.2013

 

 

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

точно уверен, что у тебя светодиоды не к 5V вторым концом подключены?

1000000%

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

next-999 пишет:
1000000%

ок. и, какое напряжение на пинах 2 и 3, если светодиоды светятся?

next-999
Offline
Зарегистрирован: 30.09.2013

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

next-999 пишет:
1000000%

ок. и, какое напряжение на пинах 2 и 3, если светодиоды светятся?

4,61в

но у меня тестер не оч точный

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

сделайте и посмотрите будет ли светиться диод на 13 пине

pinMode(13, OUTPUT);

 

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

next-999 пишет:
4,61в но у меня тестер не оч точный

и, светодиоды не подрублены на 5V - ок. продолжим сеанс вызывания духа светодиода.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

и, светодиоды не подрублены на 5V - ок. продолжим сеанс вызывания духа светодиода.

чай будешь? с баранками.

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

Puhlyaviy пишет:

чай будешь? с баранками.

тебе комиссия по утилизации прописала дубовые опилки пропитанные формалином.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

тебе комиссия по утилизации прописала дубовые опилки пропитанные формалином.

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

Joiner
Offline
Зарегистрирован: 04.09.2014

next-999 пишет:

При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите

На этом форуме кто-то выкладывал скетч для теста ардуинки. Ссылку на тему не нашел, поищи сам. А на всякий случай сам скетч

#define FIRST_PIN 0 // первый вывод
#define LAST_PIN 19 // последний вывод

void Test1(byte pin)
{
  if(pin < 10) Serial.print(" PIN:  ");
  else Serial.print(" PIN: ");
  Serial.print(pin);
  pinMode(pin, OUTPUT);
  digitalWrite(pin, 0);
  Serial.print("    LOW: ");
  if(!digitalRead(pin)) Serial.print("OK  ");
  else Serial.print("FAIL");
  digitalWrite(pin, 1);
  Serial.print("  HIGH: ");
  if(digitalRead(pin)) Serial.print("OK  "); 
  else Serial.print("FAIL");
  pinMode(pin, INPUT);
  Serial.print("  PULL UP: ");
  if(digitalRead(pin)) Serial.print("OK  ");
  else Serial.print("FAIL");
  digitalWrite(pin, 0);
}

void Test2(byte pin)
{
  Serial.print("     ");
  pinMode(pin, OUTPUT);
  digitalWrite(pin, 1);
  delay(5);
  if(!digitalRead(pin))Serial.println("SHORT");
  else Serial.println("OK");
  pinMode(pin, INPUT); 
  digitalWrite(pin, 0);

}

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

  Serial.println("Test of short circuit on GND or VCC and between pins:");
  Serial.println();
  for(byte i = FIRST_PIN; i <= LAST_PIN; i++) 
  {
    for(byte j = FIRST_PIN; j <= LAST_PIN; j++) 
    {
      pinMode(j, INPUT);
      digitalWrite(j, 0);
    }
    Test1(i);

    for(byte j = FIRST_PIN; j <= LAST_PIN; j++) 
    {
      pinMode(j, OUTPUT);
      digitalWrite(j, 0);
    }
    Test2(i);
  }

  for(byte j = FIRST_PIN; j <= LAST_PIN; j++) 
  {
    pinMode(j, INPUT);
    digitalWrite(j, 0);
  }
}

void loop() {}

Загружай и смотри в сериал монитор.

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

да шо там проверять? - достаточно записать в пин 0 или 1.

pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, 0);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, 0);
 
посмотреть на результат, затем
 
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, 1);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, 1);
 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

next-999 пишет:


int ledPin1 = 2;
int ledPin2 = 3;


void setup() {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);

}

void loop() {

}

При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите

А с чего Вы вдруг решили, что "не должно"?

Вы переводите пин в режим логического выхода. С этого момента он переходит из высокоимпедансного состояния (в каковом пребывает в режиме чтения) в активное состояние. А активных всего два варианта "0" и "1".

Контроллер работает именно так, как должен (хотя, возможно, и не так, как Вам бы хотелось - ну тек для этого его нужно ПРАВИЛЬНО запрограммировать).

next-999
Offline
Зарегистрирован: 30.09.2013

andriano пишет:

next-999 пишет:


int ledPin1 = 2;
int ledPin2 = 3;


void setup() {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);

}

void loop() {

}

При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите

А с чего Вы вдруг решили, что "не должно"?

Вы переводите пин в режим логического выхода. С этого момента он переходит из высокоимпедансного состояния (в каковом пребывает в режиме чтения) в активное состояние. А активных всего два варианта "0" и "1".

Контроллер работает именно так, как должен (хотя, возможно, и не так, как Вам бы хотелось - ну тек для этого его нужно ПРАВИЛЬНО запрограммировать).

 

подскажите пожалуйста как правильно написать код сначала чтобы был 0

код 

int val=0; 
int flag=0;

 void setup()     
 { 
          
      pinMode(2, OUTPUT);          
          pinMode(3, OUTPUT);
          pinMode(4, OUTPUT);
          pinMode(5, OUTPUT);
         
 } 

 void loop() 

 {  
   
   
      if
     
     
      (digitalRead(5)==HIGH)//если кнопка нажата ... 

      { 
        val++;// прибавляем к переменной 1 при каждой смене цикла. 
          
      delay(500);//небольшая защита от "дребезга" контактов кнопки 

      } 
      
      else        
      { 
        val=0; 
      }    
 
 { 
      if(digitalRead(4)==HIGH)//если кнопка нажата ... 
      { 

        
      digitalWrite(3, !digitalRead(3));
      
      ;//инвертируем состояние пина 

      delay(500);//небольшая защита от "дребезга" контактов кнопки 
      }     
 } 
 
      if(val>=5) 
      {   
 digitalWrite(2, !digitalRead(2));
          
        val=0; 
      } 
      
  
          
 }

 

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

andriano пишет:

А с чего Вы вдруг решили, что "не должно"?

 А активных всего два варианта "0" и "1".

 

 

Вощето для контроллера как раз ситуация без вариантов. Регистры PORTx инициализируется 0 после ресета и при переключении на out соответственно выводится 0. Возмущение ТС в общем понятно. Может таки софт ардуиновский чудит, хотя я такого эффекта не замечал.
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

"подскажите пожалуйста как правильно написать код сначала чтобы был 0"

int ledPin1 = 2;
int ledPin2 = 3;


void setup()    
 {
           
      pinMode(2, OUTPUT);         
          pinMode(3, OUTPUT);
          pinMode(4, OUTPUT);
          pinMode(5, OUTPUT);
        digitalWrite(ledPin1, LOW); 
	digitalWrite(ledPin2, LOW);         
 }
void loop()
{

}

 

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

#11 так или эдак

next-999
Offline
Зарегистрирован: 30.09.2013

vosara пишет:

"подскажите пожалуйста как правильно написать код сначала чтобы был 0"

int ledPin1 = 2;
int ledPin2 = 3;


void setup()    
 {
           
      pinMode(2, OUTPUT);         
          pinMode(3, OUTPUT);
          pinMode(4, OUTPUT);
          pinMode(5, OUTPUT);
        digitalWrite(ledPin1, LOW); 
	digitalWrite(ledPin2, LOW);         
 }
void loop()
{

}

 

 

всеравно 1 выходит изначально(

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

next-999 пишет:

всеравно 1 выходит изначально(

да шо ж за тупняк такой?


void setup() {

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(2, 0); // НОЛЬ ты сюда пишешь! видишь "0" - этот ноль сюда пишется.
digitalWrite(3, 0); // не 5, не 10 - ноль, плять!
digitalWrite(4, 0);
digitalWrite(5, 0);

}


void loop(){}

 

next-999
Offline
Зарегистрирован: 30.09.2013

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

next-999 пишет:

всеравно 1 выходит изначально(

да шо ж за тупняк такой?


void setup() {

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(2, 0); // НОЛЬ ты сюда пишешь! видишь "0" - этот ноль сюда пишется.
digitalWrite(3, 0); // не 5, не 10 - ноль, плять!
digitalWrite(4, 0);
digitalWrite(5, 0);

}


void loop(){}

 

 

 

так тоже пробовал еще вчера - тоже безполезно!!

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

next-999 пишет:
так тоже пробовал еще вчера - тоже безполезно!!

бесполезно что? ты можешь записать в пин 0 или 1 - на этом твои варианты полезности катастрофически заканчиваются.

если ты спалил свою дуино или просто тупишь, то что ты желаешь получить от форумчан?

пиши 0 или 1 и не парь людям мосг.

next-999
Offline
Зарегистрирован: 30.09.2013

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

next-999 пишет:
так тоже пробовал еще вчера - тоже безполезно!!

бесполезно что? ты можешь записать в пин 0 или 1 - на этом твои варианты полезности катастрофически заканчиваются.

если ты спалил свою дуино или просто тупишь, то что ты желаешь получить от форумчан?

пиши 0 или 1 и не парь людям мосг.

пишу 0, к 2-3 пину подключено реле, и после загрузки оно включается хотя не должно

 

Стоит цель, елси зажата кнопка входа 5  включить реле подключенное ко входу 2, если зажата еще раз, выключить

 

Стоит цель, елси нажата кнопка входа 4  включить реле подключенное ко входу 3, если нажата еще раз, выключить

 

 

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

 

мой код

 

int val=0; 
int flag=0;

 void setup()     
 { 
          
      pinMode(2, OUTPUT);          
          pinMode(3, OUTPUT);
          pinMode(4, OUTPUT);
          pinMode(5, OUTPUT);
          digitalWrite(2, 0);
          digitalWrite(3, 0);
          digitalWrite(4, 0);
          digitalWrite(5, 0);
   
 } 

 void loop() 

 {  
 
      if
     
     
      (digitalRead(5)==HIGH)//если кнопка нажата ... 

      { 
        val++;// прибавляем к переменной 1 при каждой смене цикла. 
          
      delay(500);//небольшая защита от "дребезга" контактов кнопки 

      } 
      
      else        
      { 
        val=0; 
      }    
 
 { 
      if(digitalRead(4)==HIGH)//если кнопка нажата ... 
      { 

        
      digitalWrite(3, !digitalRead(3));
      
      ;//инвертируем состояние пина 

      delay(500);//небольшая защита от "дребезга" контактов кнопки 
      }     
 } 
 
      if(val>=5) 
      {   
 digitalWrite(2, !digitalRead(2));
          
        val=0; 
      } 
      
  
          
 }

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

Joiner
Offline
Зарегистрирован: 04.09.2014

next-999 пишет:

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

А ты читал коментарий #10? Там вот к ардуине ни чего подключать не надо. Просто подключаешь ардуину к компу, грузишь скетч, который там записан, включаешь сериал монитор и смотришь, что написано про все твои входы и выходы. Если с ардуиной все нормально, то разбирайся со своей схемотехникой, какие реле, какие кнопки, как подключаешь. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

Вощето для контроллера как раз ситуация без вариантов. Регистры PORTx инициализируется 0 после ресета и при переключении на out соответственно выводится 0. Возмущение ТС в общем понятно. Может таки софт ардуиновский чудит, хотя я такого эффекта не замечал.

"Вощето" варианты есть. И устраняются они только "после ресета". Сам "ресет" может быть либо произведен вручную - кнопкой, либо специальной цепью при включении питания. Есть ли последняя в Ардуино (по идее, должна быть) и исправно ли работает в конкретном образце у ТС, не знаю.

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ставлю на "в пятых" из сообщения #22, реле можно (но не нужно) подключить напрямую к пину, второй конец на землю или на +5В, а потому попкорн и кофе уместны в больших количествах.

Самое простое - взять тестер и измерить напряжение на пине, тогда и кофе не понадобится.

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

next-999 пишет:

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

а раньше не мог сказать? У тебя инвертированное реле, которое включается при 0, а не при 1.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

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

Ищите проблему в подключении или железе

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

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

      delay(500);//небольшая защита от "дребезга" контактов кнопки

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Думаю врядли появится лабораторное обоснование так как каждый элемент дребезжит по своему и чем он старше тем длинне дребезг. Самый лутший антидребезг это функция или библиотека которая выдает единицу только тогда когда нет смены состояния 5_15мс.

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

vosara пишет:

Самый лутший антидребезг это функция или библиотека которая выдает единицу только тогда когда нет смены состояния 5_15мс.

при 1000 мс антидребезг хутше? :D

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Да нет, просто достаточно и этого а так можно ставить 1ч

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

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

      delay(500);//небольшая защита от "дребезга" контактов кнопки

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

Да и разброс от случая к случаю достигает минимум порядка. Я как-то экспериментировал с кнопкой, время дребезга находилось в диапазоне 2-50 мс. Это для одной и той же кнопки. У разных кнопок из одной серии, естественно, будет разный диапазон, а у кнопок различной конструкции - и подавно.

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

andriano пишет:

Да и разброс от случая к случаю достигает минимум порядка. Я как-то экспериментировал с кнопкой, время дребезга находилось в диапазоне 2-50 мс. Это для одной и той же кнопки. У разных кнопок из одной серии, естественно, будет разный диапазон, а у кнопок различной конструкции - и подавно.

блин! набежали Капитаны Очевидность - в пень вашу теорию, умозрительные выводы.

*хоть бы кому пришла в голову идея программного определения максимальной длины процесса дребезга и её оптимальной коррекции в процессе работы девайса.

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

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Обратите внимание на библиотеку Bounce

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

vosara пишет:

Обратите внимание на библиотеку Bounce

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

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Понял! Тогда попробуйте вот такой код


bool fl_drebezg = 0;//Флаг - Дребезга
bool fl_start = 0;
bool kn_start = 0;
int rezultat = 0;
int t1=15;
bool fl_1 = 0;

unsigned long currentTime; //Переменная для дребезга
unsigned long currentTime2; //Переменная для pause
int buttonPin1 = 4;

void setup() {
  pinMode(buttonPin1, INPUT_PULLUP); //  пин, как вход + подтягивающий резистор
  currentTime = millis();
  currentTime2 = millis();
Serial.begin(9600);
}

//Функция дребезга
int drebezg(int y)
{
  bool x = 0;
  if (fl_drebezg == 0)currentTime = millis(), fl_drebezg = 1;
  if (millis() - currentTime >= y) x = 1, fl_drebezg = 0;
  return x;
}

void loop()
{
  //Serial.println(kn_start); //Выводим на монитор 
  
  if (digitalRead(buttonPin1) == 0 && kn_start == 0)
  {
  	if (fl_1 == 0 && kn_start == 0)currentTime2 = millis(), fl_1 = 1;
    if (fl_start == 0) fl_drebezg = 0, fl_start = 1;
    if (kn_start == 0) kn_start = drebezg (t1); // Отправляем в Функцию дребезга
	
	 if (kn_start==1)
	 {
	 rezultat = millis()-currentTime2;
	 fl_1=0;
	 Serial.println(rezultat-t1); //Выводим на монитор 
	 } 
   }

  if (digitalRead(buttonPin1) == 1)
  {
    if (fl_start == 1) fl_drebezg = 0, fl_start = 0;
    if (kn_start == 1) kn_start = !drebezg (t1); // Отправляем в Функцию дребезга
  }
}

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вчера некогда было проверить, сейчас исправил и проверил в протеусе. Попробуйте, удачи.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

блин! набежали Капитаны Очевидность - в пень вашу теорию, умозрительные выводы.

*хоть бы кому пришла в голову идея программного определения максимальной длины процесса дребезга и её оптимальной коррекции в процессе работы девайса.

Эта идея неконструктивна по указанной ниже причине.

Цитата:

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

Если для Вас это очевидно, мне Вас жаль - Вы ошибаетесь: нет такого значения. Контакт может "дребезжать" месяцами - вплоть до полного выгорания.

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

andriano пишет:

Эта идея неконструктивна по указанной ниже причине.

Если для Вас это очевидно, мне Вас жаль - Вы ошибаетесь: нет такого значения. Контакт может "дребезжать" месяцами - вплоть до полного выгорания.

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