Падает напряжение на входе

Iluxa
Offline
Зарегистрирован: 16.10.2021

Доброго дня!

Использую UNO R3. К пину номер 4 подключена тактовая кнопка на землю. Установлен внутренний Pullup.

const char rst_pin = 4;

void setup()
{
  pinMode (rst_pin, INPUT);
  pinMode (rst_pin, INPUT_PULLUP);

}

пин постоянно мониторится digitalRead(switch_pin);

И далее логика для обнаружения нажатия кнопки.

Кнопка имеет 4 физических пина внутренне закороченных попарно, то есть фактически 2. Один присоединен к пину 4 чипа другой к земле. Всё собрано и спаяно на макетной плате.

Происходит следующее. При включении всё работает нормально. Потом со временем (10-15 минут состояния включённого девайса) напряжение на 4 пине снижается до 0.6-0.9 V

Уважаемые гуру. Есть ли у кого какие-нибудь предположения? Благодарю заранее.

SAB
Offline
Зарегистрирован: 27.12.2016

Подтяни внешним резистором 1кОм к +5В свой 4 пин

пин постоянно мониторится digitalRead(switch_pin);

может надо мониторить digitalRead(rst_pin);

SLKH
Offline
Зарегистрирован: 17.08.2015

Iluxa пишет:

Доброго дня!

Использую UNO R3. К пину номер 4 подключена тактовая кнопка на землю. Установлен внутренний Pullup.

const char rst_pin = 4;

void setup()
{
  pinMode (rst_pin, INPUT);
  pinMode (rst_pin, INPUT_PULLUP);

}

пин постоянно мониторится digitalRead(switch_pin);

И далее логика для обнаружения нажатия кнопки.

Кнопка имеет 4 физических пина внутренне закороченных попарно, то есть фактически 2. Один присоединен к пину 4 чипа другой к земле. Всё собрано и спаяно на макетной плате.

Происходит следующее. При включении всё работает нормально. Потом со временем (10-15 минут состояния включённого девайса) напряжение на 4 пине снижается до 0.6-0.9 V

Уважаемые гуру. Есть ли у кого какие-нибудь предположения? Благодарю заранее.

1. Схема?

2. Скетч?

Iluxa
Offline
Зарегистрирован: 16.10.2021

Благодарю за совет. Пока пробовал подтянуть только не 1к а 5.1к,  не помогло

Конечно мониторится rst_pin сорри за описку.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Выложите скетч и схему.

Схему картинкой, а скетч как положено.

Iluxa
Offline
Зарегистрирован: 16.10.2021
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <EEPROMex.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const char password_value = 37;
const char switch_pin = 7; 
const char rst_pin = 4;
const char address = 0;
const unsigned long debounce_delay = 100;
const unsigned long long_press_duration = 10000;
const unsigned long master_mode_timeout = 2000;
unsigned long events_count = 0;
bool last_switch_state = LOW; 
bool switch_state;
bool last_rst_state = LOW; 
bool last_master_state = LOW; 

void setup()
{
  Serial.begin(9600);
  pinMode (switch_pin, INPUT);
  pinMode (switch_pin, INPUT_PULLUP);
  pinMode (rst_pin, INPUT);
  pinMode (rst_pin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);

  lcd.begin();
  lcd.backlight();
  user_mode();
}


void loop()
{     
  event_listener();
  rst_btn_listener();
}



void event_listener(){
  
  bool switch_reading = digitalRead(switch_pin);
  unsigned long last_debounce_time = 0;

  if(switch_reading != last_switch_state)
    last_debounce_time = millis();

  if ((millis() - last_debounce_time) > debounce_delay) {
    if(switch_reading != switch_state){
      switch_state = switch_reading;
      if(switch_state == LOW){
        increment(address);
        user_mode();
        digitalWrite(LED_BUILTIN,HIGH);
      }
      else
        digitalWrite(LED_BUILTIN,LOW);
    }
  }
  last_switch_state = switch_reading;
}


void rst_btn_listener(){
  bool rst_state = digitalRead(rst_pin);
  if(rst_state != last_rst_state){
    Serial.println(rst_state);
    unsigned long press_btn_started = millis();
    while(digitalRead(rst_pin) == LOW){
      if((millis() - press_btn_started) > long_press_duration){
        master_mode();
        break;
      }
    }
  }
  delay(debounce_delay);
  last_rst_state = rst_state;
}


void user_mode(){
  events_count = read(address);
  lcd.clear();
  lcd.println("EVENTS COUNTER: ");
  lcd.setCursor(0, 1);
  lcd.print(events_count);
}

void rst_mode(byte btn_pressed_counter){
  lcd.clear();
  lcd.println("MASTER MODE:    ");
  lcd.setCursor(0, 1);
  lcd.print(btn_pressed_counter);
  
}


void master_mode(){
  byte btn_pressed_counter = 0;
  unsigned long last_btn_pressed_time = millis();
  rst_mode(btn_pressed_counter);

  while(btn_pressed_counter != password_value){
    if((millis() - last_btn_pressed_time) > master_mode_timeout)
    break;
    if(rst_btn_toggled()){
      last_btn_pressed_time = millis();
      btn_pressed_counter++;
      rst_mode(btn_pressed_counter);
    }
  }

  if(btn_pressed_counter == password_value){
      lcd.clear();
      lcd.println("MEMORY RESET    ");
      lcd.setCursor(0, 1);
      lcd.print(btn_pressed_counter);
      delay(master_mode_timeout);
      clear(address);
    
  }
    
  delay(master_mode_timeout);
  user_mode();
}


bool rst_btn_toggled(){
  bool toggled = false;
  bool rst_state = digitalRead(rst_pin);
  if(rst_state != last_master_state){
    unsigned long press_btn_started = millis();
    if(rst_state == LOW)
        toggled = true;
  }
  delay(debounce_delay);
  last_master_state = rst_state;
  return toggled;
}


void increment(int addr){
  events_count = read(addr);
  events_count = events_count + 1;
  write(addr,events_count);
}

void write(int addr, long data){
  EEPROM.writeLong(addr,data);
}

long read(int addr){
  return EEPROM.readLong(addr);
}

void clear(int addr){
  EEPROM.writeLong(addr,0);
  user_mode();
}

 

Iluxa
Offline
Зарегистрирован: 16.10.2021

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

Iluxa, вы скетч не перепутали? Вроде речь шла о чтении одного пина, а в итоге вы вываливаете 150 строк кода с ОЛЕД дисплеем, какими-то паролями и прочей требухой. Сократите свой код до 10 строк, где останется только работа с кнопкой. Если проблема не исчезнет - выложите код сюда.

Если. что вероятно, на простом коде проблем не будет - начинайте постепенно добавлять свои экраны и пароли обратно, каждый раз проверяя работу кнопки. Так вы найдете ту часть кода, которая мешает работе

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

23 и 25 строка к чему?

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

ua6em пишет:

23 и 25 строка к чему?

не влияет

Iluxa
Offline
Зарегистрирован: 16.10.2021

Порт объявлен как входной и мониторится на наличие 0 или 1.
Каким образом остальной код может влиять на некорректную работу внутреннего пулл апа? Меряю вольтметром

SAB
Offline
Зарегистрирован: 27.12.2016

Внутренний пулап это 100 кОм. А с какого перепугу, ты объявляешь ногу чаром (const char rst_pin = 4;) она должна быть int. И вообще можешь просто поставить pinMode (4, INPUT_PULLUP); а 23 и 25 строчки вообще не нужны.

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

SAB пишет:

А с какого перепугу, ты объявляешь ногу чаром (const char rst_pin = 4;) она должна быть int.

Это почему?

Iluxa
Offline
Зарегистрирован: 16.10.2021

Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int. 23 и 25 не нужны, согласен,  но это не может быть причиной низкого напряжения на входе.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Iluxa пишет:

Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int. 

Объявляйте byte или uint8_t. Так будет меньше путаницы, char таки обычно ассоциируется с символами

Green
Offline
Зарегистрирован: 01.10.2015

Iluxa пишет:

Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int.


"Экономика должна быть экономной." Бросайте вы эту дурную привычку.) Советую проверить на практике ваше утверждение.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Iluxa пишет:
Каким образом остальной код может влиять на некорректную работу внутреннего пулл апа?

Если бы Вы это знали, не было бы этого поста.

А пока делайте, как Вам посоветовал b707. Любой профессионал, у которого бы возникла такая беда, начал бы именно с этого (а не с поста на форум).

Делайте и всё получится.

Iluxa
Offline
Зарегистрирован: 16.10.2021

Нашёл проблему, кнопка плохая оказалась. Поменял кнопку и всё работает. Спасибо за помощь всем!