Странный глюк ардуино
- Войдите на сайт для отправки комментариев
Вс, 02/08/2015 - 01:56
int ledPin1 = 2;
int ledPin2 = 3;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
}
При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите
точно уверен, что у тебя светодиоды не к 5V вторым концом подключены?
точно уверен, что у тебя светодиоды не к 5V вторым концом подключены?
1000000%
ок. и, какое напряжение на пинах 2 и 3, если светодиоды светятся?
ок. и, какое напряжение на пинах 2 и 3, если светодиоды светятся?
4,61в
но у меня тестер не оч точный
сделайте и посмотрите будет ли светиться диод на 13 пине
pinMode(13, OUTPUT);
и, светодиоды не подрублены на 5V - ок. продолжим сеанс вызывания духа светодиода.
и, светодиоды не подрублены на 5V - ок. продолжим сеанс вызывания духа светодиода.
чай будешь? с баранками.
чай будешь? с баранками.
тебе комиссия по утилизации прописала дубовые опилки пропитанные формалином.
тебе комиссия по утилизации прописала дубовые опилки пропитанные формалином.
в той комисии два с половиной барана, причем обделенные в плане головного мозга... так что начхать чего они там прописали и кому..
При включении ардуино выходы 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() {}Загружай и смотри в сериал монитор.
да шо там проверять? - достаточно записать в пин 0 или 1.
int ledPin1 = 2; int ledPin2 = 3; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { }При включении ардуино выходы 2 и 3 становятся рабочими (всмысле, то что из них выходит 5в), хотя не должно т.к нет дальнейшей команды, в чем проблема подскажите
Вы переводите пин в режим логического выхода. С этого момента он переходит из высокоимпедансного состояния (в каковом пребывает в режиме чтения) в активное состояние. А активных всего два варианта "0" и "1".
Контроллер работает именно так, как должен (хотя, возможно, и не так, как Вам бы хотелось - ну тек для этого его нужно ПРАВИЛЬНО запрограммировать).
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; } }А с чего Вы вдруг решили, что "не должно"?
А активных всего два варианта "0" и "1".
"подскажите пожалуйста как правильно написать код сначала чтобы был 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() { }#11 так или эдак
"подскажите пожалуйста как правильно написать код сначала чтобы был 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 выходит изначально(
всеравно 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(){}всеравно 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(){}так тоже пробовал еще вчера - тоже безполезно!!
бесполезно что? ты можешь записать в пин 0 или 1 - на этом твои варианты полезности катастрофически заканчиваются.
если ты спалил свою дуино или просто тупишь, то что ты желаешь получить от форумчан?
пиши 0 или 1 и не парь людям мосг.
бесполезно что? ты можешь записать в пин 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; } }Во первых, для включения нагрузки кнопкой не нужно ни ардуино ни реле. Достаточно обычного выключателя.
Во вторых, подобная проблема недавно тут обсуждалась.
В третьих, как написано выше, если спалил. То спалил.
В четвертых, есть подозрение что ты жмешь на кнопку компиляции а не прошивки.
В пятых, можно подождать когда я буду пить кофе и на гуще погадаем что, куда и как подключено.
при загрузке ардуино оба реле включается сразу, все вышеперечисленные коды перепробовал, пробовал разные ардуино и комбинацию всех кодов которые выше писали в разных вариантах нечего не помогло
А ты читал коментарий #10? Там вот к ардуине ни чего подключать не надо. Просто подключаешь ардуину к компу, грузишь скетч, который там записан, включаешь сериал монитор и смотришь, что написано про все твои входы и выходы. Если с ардуиной все нормально, то разбирайся со своей схемотехникой, какие реле, какие кнопки, как подключаешь.
"Вощето" варианты есть. И устраняются они только "после ресета". Сам "ресет" может быть либо произведен вручную - кнопкой, либо специальной цепью при включении питания. Есть ли последняя в Ардуино (по идее, должна быть) и исправно ли работает в конкретном образце у ТС, не знаю.
Но, вообще-то, есть определенные примемы программирования, которые позволяют обезопасить себя от всяческих нежелательных сюрпризов. Например, нужно всегда инициализировать переменные. Не вижу, чем вывод порта должен в этом отношении кардинально отличаться от переменной. Собираешься использовать - инициализируй нужным значением, а не надейся, что оно само собой установится.
Ставлю на "в пятых" из сообщения #22, реле можно (но не нужно) подключить напрямую к пину, второй конец на землю или на +5В, а потому попкорн и кофе уместны в больших количествах.
Самое простое - взять тестер и измерить напряжение на пине, тогда и кофе не понадобится.
при загрузке ардуино оба реле включается сразу, все вышеперечисленные коды перепробовал, пробовал разные ардуино и комбинацию всех кодов которые выше писали в разных вариантах нечего не помогло
Взял Ваш код, загрузил в Протеус, Все нормально запустилось , ничего при запуске не включено, кнопки диоды отработали нормально
Ищите проблему в подключении или железе
кстати, в контексте защиты от дребезга, а какова физическая продолжительность процесса дребезга? - потому, как народ ставит время от балды, без лабораторного обоснования или, вообще, несёт ересь.
delay(500);//небольшая защита от "дребезга" контактов кнопкиДумаю врядли появится лабораторное обоснование так как каждый элемент дребезжит по своему и чем он старше тем длинне дребезг. Самый лутший антидребезг это функция или библиотека которая выдает единицу только тогда когда нет смены состояния 5_15мс.
Самый лутший антидребезг это функция или библиотека которая выдает единицу только тогда когда нет смены состояния 5_15мс.
при 1000 мс антидребезг хутше? :D
Да нет, просто достаточно и этого а так можно ставить 1ч
кстати, в контексте защиты от дребезга, а какова физическая продолжительность процесса дребезга? - потому, как народ ставит время от балды, без лабораторного обоснования или, вообще, несёт ересь.
delay(500);//небольшая защита от "дребезга" контактов кнопкиДа и разброс от случая к случаю достигает минимум порядка. Я как-то экспериментировал с кнопкой, время дребезга находилось в диапазоне 2-50 мс. Это для одной и той же кнопки. У разных кнопок из одной серии, естественно, будет разный диапазон, а у кнопок различной конструкции - и подавно.
Да и разброс от случая к случаю достигает минимум порядка. Я как-то экспериментировал с кнопкой, время дребезга находилось в диапазоне 2-50 мс. Это для одной и той же кнопки. У разных кнопок из одной серии, естественно, будет разный диапазон, а у кнопок различной конструкции - и подавно.
блин! набежали Капитаны Очевидность - в пень вашу теорию, умозрительные выводы.
*хоть бы кому пришла в голову идея программного определения максимальной длины процесса дребезга и её оптимальной коррекции в процессе работы девайса.
**то, что длина дребезга может варьироваться от 0 до определённого значения - выписываю рептилоиду шнобелевку за открытие неоткрытого.
Обратите внимание на библиотеку Bounce
Обратите внимание на библиотеку Bounce
спасибо, но это для использования готовых значений дребезга, а я озадачился написать нечто для экспериментального замера длины дребезга.
Понял! Тогда попробуйте вот такой код
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); // Отправляем в Функцию дребезга } }Вчера некогда было проверить, сейчас исправил и проверил в протеусе. Попробуйте, удачи.
блин! набежали Капитаны Очевидность - в пень вашу теорию, умозрительные выводы.
*хоть бы кому пришла в голову идея программного определения максимальной длины процесса дребезга и её оптимальной коррекции в процессе работы девайса.
Эта идея неконструктивна по указанной ниже причине.
**то, что длина дребезга может варьироваться от 0 до определённого значения - выписываю рептилоиду шнобелевку за открытие неоткрытого.
Эта идея неконструктивна по указанной ниже причине.
Если для Вас это очевидно, мне Вас жаль - Вы ошибаетесь: нет такого значения. Контакт может "дребезжать" месяцами - вплоть до полного выгорания.
рептилоид, ты слабо понимаешь человеческий язык - медитируй дальше над моими ответами, подразумевается постоянная юстировка длины фильтрации дребезга.