Падает напряжение на входе
- Войдите на сайт для отправки комментариев
Доброго дня!
Использую 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кОм к +5В свой 4 пин
пин постоянно мониторится digitalRead(switch_pin);
может надо мониторить digitalRead(rst_pin);
Доброго дня!
Использую 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. Скетч?
Благодарю за совет. Пока пробовал подтянуть только не 1к а 5.1к, не помогло
Конечно мониторится rst_pin сорри за описку.
Выложите скетч и схему.
Схему картинкой, а скетч как положено.
#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, вы скетч не перепутали? Вроде речь шла о чтении одного пина, а в итоге вы вываливаете 150 строк кода с ОЛЕД дисплеем, какими-то паролями и прочей требухой. Сократите свой код до 10 строк, где останется только работа с кнопкой. Если проблема не исчезнет - выложите код сюда.
Если. что вероятно, на простом коде проблем не будет - начинайте постепенно добавлять свои экраны и пароли обратно, каждый раз проверяя работу кнопки. Так вы найдете ту часть кода, которая мешает работе
23 и 25 строка к чему?
23 и 25 строка к чему?
не влияет
Порт объявлен как входной и мониторится на наличие 0 или 1.
Каким образом остальной код может влиять на некорректную работу внутреннего пулл апа? Меряю вольтметром
Внутренний пулап это 100 кОм. А с какого перепугу, ты объявляешь ногу чаром (
constcharrst_pin = 4;) она должна быть int. И вообще можешь просто поставитьpinMode (4, INPUT_PULLUP); а 23 и 25 строчки вообще не нужны.А с какого перепугу, ты объявляешь ногу чаром (
constcharrst_pin = 4;) она должна быть int.Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int. 23 и 25 не нужны, согласен, но это не может быть причиной низкого напряжения на входе.
Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int.
Объявляйте byte или uint8_t. Так будет меньше путаницы, char таки обычно ассоциируется с символами
Объявляю ногу char для экономии памяти, так как под char выделяется меньше памяти чем под int.
"Экономика должна быть экономной." Бросайте вы эту дурную привычку.) Советую проверить на практике ваше утверждение.
Если бы Вы это знали, не было бы этого поста.
А пока делайте, как Вам посоветовал b707. Любой профессионал, у которого бы возникла такая беда, начал бы именно с этого (а не с поста на форум).
Делайте и всё получится.
Нашёл проблему, кнопка плохая оказалась. Поменял кнопку и всё работает. Спасибо за помощь всем!