Вышел из строя цифровой пин
- Войдите на сайт для отправки комментариев
Всем доброго времени суток!
Собираю я небольшой проектик с кнопкой и решил пин 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 на задание через присвоение значения переменной. На форуме встречались жалобы на всякие "ньюансы".
В будущем это учту.