Вышел из строя цифровой пин
- Войдите на сайт для отправки комментариев
Всем доброго времени суток!
Собираю я небольшой проектик с кнопкой и решил пин D2 использовать как
pinMode(D2, INPUT);
через внешний подтягивающий резистор 10К на GND. Внутренние не использую вообще (был опыт опыт их ненадёжности) На всякий случай подтянул к этому INPUT пину керамический конденсатор "104", так как вблизи коммутируется цепь 230В до 10А.
Цифровой пин D2 обрабатывает сигналы с кнопки, которая соеденена через +5В. Нажали кнопку - есть сигнал, выполнили то-то и т.д.
Но случилась такая беда... После запуска установки и прохождении какого-то времени на цифровом пине D2 появляется напряжение от 1-3В. Соответственно появляются ложные срабатывания. Проверил схему, кнопку, конденсатор, ну не откуда взяться лишним +3В. Тогда вердикт один - ПИН сдох.
Переключился на другой пин
pinMode(D4, INPUT);
Всё встало на свои места.
Самое интересное, написал небольшой скетч для проверки D2
#define pin 2 bool sig = 0; void setup() { Serial.begin(9600); pinMode(pin, INPUT); } void loop() { sig = digitalRead(pin); Serial.println(sig); }
Пин D2 отрабатывает четко, без каких либо проблем.
Как только заливаю скетч посложнее, начинается котовасия
#include <avr/wdt.h> #define but 2 #define led_r 5 #define led_b 6 #define optron 3 #define andr 200 //Время антидребезга #define time_1 4000 //Выдержка времени после нажатия кнопки на пуск #define time_2 2000 //Время выдержки выключеного сигнального светодиода #define time_3 20 //Время выдержки свечения сигнального светодиода #define time_4 300000 //Выдержка времени на 5 минут #define time_5 1800000 //Выдержка времени на 30 минут #define time_6 5000 //Выдержка времени перед переходом с 30 мин на 5 мин #define pwm 10 //ШИМ 0 из 255 bool sig = 0; bool flag_1 = 0; bool flag_2 = 0; bool flag_3 = 0; bool flag_4 = 0; bool flag_5 = 0; bool flag_6 = 0; int flag_7 = 0; int i = 0; //int ir = 0; unsigned long time_andr = 0; unsigned long time_t1 = 0; unsigned long time_t2 = 0; unsigned long time_t3 = 0; unsigned long time_t4 = 0; unsigned long time_t5 = 0; unsigned long time_t6 = 0; void setup() { wdt_enable (WDTO_4S); //Serial.begin(9600); pinMode(but, INPUT); pinMode(led_r, OUTPUT); pinMode(led_b, OUTPUT); pinMode(optron, OUTPUT); while(i < 10){ flag_6 = !flag_6; digitalWrite(led_b, flag_6); i++; delay(250); } //Serial.println("Готов"); } void loop() { sig = digitalRead(but); start_(); pusk(); rabota_30_min(); rabota_5_min(); ostanovka(); wdt_reset(); } void start_(){ if(sig == 1 && flag_1 == 0 && flag_3 == 0 && millis() - time_andr > andr){ //Serial.println("Ожидаю"); flag_1 = 1; time_andr = millis(); time_t1 = millis(); } else if (sig == 1 && flag_1 == 1 && millis() - time_t1 > time_1){ flag_3 = 1; time_t1 = millis(); } else if (sig == 0){ flag_1 = 0; time_t1 = millis(); } } void pusk(){ if(flag_3 == 1 && flag_4 == 0 && millis() - time_t2 > time_2){ analogWrite(led_b, pwm); //ir++; //Serial.println(ir); flag_4 = 1; time_t3 = millis(); } else if (flag_4 == 1 && millis() - time_t3 > time_3){ digitalWrite(led_b, LOW); flag_4 = 0; time_t2 = millis(); } } void ostanovka(){ if(sig == 1 && flag_3 == 1 && millis() - time_t1 > time_1){ //Serial.println("Стоп"); flag_1 = 0; flag_2 = 0; flag_3 = 0; flag_7 = 0; digitalWrite(led_r, LOW); digitalWrite(led_b, LOW); digitalWrite(optron, LOW); time_andr = millis(); } } void rabota_30_min(){ if(flag_3 == 1 && flag_7 == 0){ flag_7 = 1; flag_2 = 1; analogWrite(led_r, pwm); digitalWrite(optron, HIGH); //Serial.println("Работа 30 минут ВКЛ"); time_t5 = millis(); time_t6 = millis(); } else if (flag_7 == 1 && millis() - time_t5 > time_5){ flag_7 = 2; flag_2 = 0; digitalWrite(led_r, LOW); digitalWrite(optron, LOW); //Serial.println("Работа 30 минут ВЫКЛ"); time_t4 = millis(); } } void rabota_5_min(){ if(sig == 1 && flag_2 == 1 && millis() - time_t6 > time_6){ flag_5 = 1; digitalWrite(led_b, HIGH); delay(3000); time_t1 = millis(); } if(flag_5 == 1 || flag_7 == 2 && millis() - time_t4 > time_4){ flag_2 = 0; flag_5 = 0; flag_7 = 3; analogWrite(led_r, pwm); digitalWrite(optron, HIGH); //Serial.println("Работа 5 минут ВКЛ"); time_t4 = millis(); } else if (flag_7 == 3 && millis() - time_t4 > time_4){ flag_7 = 2; digitalWrite(led_r, LOW); digitalWrite(optron, LOW); //Serial.println("Работа 5 минут ВЫКЛ"); time_t4 = millis(); } }
Не хочу вас расстраивать, но если на тестовом коде все работает, а на вашем - "начинается котовасия" - то с вероятностью 99% дело не в кнопке и не в пине. Тем более что код написан так, как будто это не программа в сотню строчек, а шифровка "Юстас - Алексу"
у вас кнопка с фиксацией? - потому что иначе, судя по коду. что-либо будет работать, только если надавить и держать кнопку 30 минут
Обычно котовасия бывает на тестовом. Один мой товарищ ставил кое-что сетевое на прогон, уходил на работу и, возвратившись видел, что всё зависло. Выел мне все мозги. После долгих разборок выяснилось, что когда он не присматривал за своим бредбордом с пучком проводов, из укрытия вылезал кот, запрыгивал на стол и с интересом трогал лапой проводки, в которых перемигивались светодиоды. В результате чего и происходила вышеупомянутая котовасия.
когда он не присматривал за своим бредбордом с пучком проводов, из укрытия вылезал кот, запрыгивал на стол и с интересом трогал лапой проводки, в которых перемигивались светодиоды.
У мня так, даже когда я присматриваю.
Нет, кнопка без фиксации. А тот код что выложил - моему глазу привычней.
Основной принцип работы не сложный. Подключаем Arduino к сети, ждём сигналы с кнопки. Нажали кнопку и держим 4 секунды. По истечению 4-ёх секунд запускается процесс длинною в 30 минут. Далее, через 30 минут процесс приостанавливается на 5 минут, после снова запускается на 5 минут и так далее... В общем работа обычного таймера 30/5/5/5/5..., где первый пуск длительный, остальные короткие.
Если нам не нужен длительный процесс работы в 30 минут при первом включении, нажимаем кнопку и режим работы переходит 5/5.
Чтобы приостановить процесс - нажимаем и держим кнопку 4 секунды.
У меня макетная плата, припаяно хорошо))
В общем, скорее всего дело в пине, что-то с ним не то.
Попробуйте заменить задание номеров пинов через #define на задание через присвоение значения переменной. На форуме встречались жалобы на всякие "ньюансы".
Попробуйте заменить задание номеров пинов через #define на задание через присвоение значения переменной. На форуме встречались жалобы на всякие "ньюансы".
В будущем это учту.