Вышел из строя цифровой пин

Beijo2908
Beijo2908 аватар
Offline
Зарегистрирован: 07.02.2019

Всем доброго времени суток!

Собираю я небольшой проектик с кнопкой и решил пин 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();
    }
}

 

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

Не хочу вас расстраивать, но если на тестовом коде все работает, а на вашем - "начинается котовасия" - то с вероятностью 99% дело не в кнопке и не в пине. Тем более что код написан так, как будто это не программа в сотню строчек, а шифровка "Юстас - Алексу"

у вас кнопка с фиксацией? - потому что иначе, судя по коду. что-либо будет работать, только если надавить и держать кнопку 30 минут

sadman41
Offline
Зарегистрирован: 19.10.2016

Обычно котовасия бывает на тестовом. Один мой товарищ ставил кое-что сетевое на прогон, уходил на работу и, возвратившись видел, что всё зависло. Выел мне все мозги. После долгих разборок выяснилось, что когда он не присматривал за своим бредбордом с пучком проводов, из укрытия вылезал кот, запрыгивал на стол и с интересом трогал лапой проводки, в которых перемигивались светодиоды. В результате чего и происходила вышеупомянутая котовасия.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

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

У мня так, даже когда я присматриваю. 

Beijo2908
Beijo2908 аватар
Offline
Зарегистрирован: 07.02.2019

b707 пишет:
у вас кнопка с фиксацией? - потому что иначе, судя по коду. что-либо будет работать, только если надавить и держать кнопку 30 минут

Нет, кнопка без фиксации. А тот код что выложил - моему глазу привычней.

Основной принцип работы не сложный. Подключаем Arduino к сети, ждём сигналы с кнопки. Нажали кнопку и держим 4 секунды. По истечению 4-ёх секунд запускается процесс длинною в 30 минут. Далее, через 30 минут процесс приостанавливается на 5 минут, после снова запускается на 5 минут и так далее... В общем работа обычного таймера 30/5/5/5/5..., где первый пуск длительный, остальные короткие.

Если нам не нужен длительный процесс работы в 30 минут при первом включении, нажимаем кнопку и режим работы переходит 5/5.

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

sadman41 пишет:

У меня макетная плата, припаяно хорошо))

В общем, скорее всего дело в пине, что-то с ним не то.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Beijo2908 пишет:
В общем, скорее всего дело в пине, что-то с ним не то.

Попробуйте заменить задание номеров пинов через #define на задание через присвоение значения переменной. На форуме встречались жалобы на всякие "ньюансы".

Beijo2908
Beijo2908 аватар
Offline
Зарегистрирован: 07.02.2019

Duino A.R. пишет:

Попробуйте заменить задание номеров пинов через #define на задание через присвоение значения переменной. На форуме встречались жалобы на всякие "ньюансы".


В будущем это учту.