• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Подключение двух кнопок на esp01

SugreonLeks

New member
Здравствуйте. Нужна помощь.
Есть esp01.

По фотографии есть два GPIO. Хочу использовать их в качестве сигнальных выводов используя физическую кнопку, подав на них через резистор 10к 3,3в для получения HIGH сигнала на пинах.
Нажал, есть HIGH, отпустил LOW. Но столкнулся с такой проблемой. Я их объявляю и присваиваю им LOW, а они все равно в HIGT находятся. Подскажите что я делаю не правильно и как их перевести в LOW.
Вот скетч:

void setup()
{
Serial.begin(115200);



pinMode(0, INPUT);
pinMode(2, INPUT);

digitalWrite (0, LOW);
digitalWrite (2, LOW);

}

void loop()
{
if (digitalRead(0) == HIGH)
{

Serial.println("HIGH");
delay(1000);
}

if (digitalRead(2) == HIGH)
{
Serial.println("HIGH");
delay(1000);
}
}
 

SugreonLeks

New member
У вас нет проверки на LOW. Нужно добавить else Serial.println("LOW");
Так мне не надо отслеживать LOW. Код программы срабатывает когда появляется HIGH, а проблема в том что на этих пинах 0 и 2 постоянно HIGH, нажата кнопка или нет. Я этой команндой делаю их LOW ( digitalWrite (0, LOW); digitalWrite (2, LOW); ) , а они всё равно в HIGH состоянии.
 

Ildarmustafin86

Active member
Подождите, на пинах 0 и 2 подключена кнопка?или вы используете их как вывод
 

SugreonLeks

New member
Подождите, на пинах 0 и 2 подключена кнопка?или вы используете их как вывод
На пинах 0 и 2 подключены физические кнопки. Пины ждут сигнала, поэтому и IMPUT. Как только я нажму на кнопку, то на эти пины поступит 3,3 вольта и это будет высокий уровень, то бишь HIGH. Но проблема в том что эти пины у меня постоянно в HIGH и я не могу их перевести в LOW.
 

enjoynering

Well-known member
Пока loop() не нагружен кодом, данный метод будет отзывчиво работать на нажатие клавиш. Как только вы туда добавите дровишек, кнопки придется нажимать по 3-5 раз, чтоб сработало. Выход есть - повесить кнопку на внешнее прерывание или тикер с периудом 10..15 ms

Код:
attachInterrupt()
Код:
encoderRotary.attach_ms(10, encoderISR); //call encoderISR() every 10 milliseconds/0.010 seconds

примеры из либы RotaryEncoder.
 

Ildarmustafin86

Active member
Они же у вас подтянуты на 3.3v через резистор 10К. Поэтому постоянно high. Если нажмёте кнопку, то должно прийти low
 

Ildarmustafin86

Active member
На пинах 0 и 2 подключены физические кнопки. Пины ждут сигнала, поэтому и IMPUT. Как только я нажму на кнопку, то на эти пины поступит 3,3 вольта и это будет высокий уровень, то бишь HIGH. Но проблема в том что эти пины у меня постоянно в HIGH и я не могу их перевести в LOW.
Чтобы было изначально LOW, нужно подтягивать на землю. А если gpio2 подтянута на землю при загрузке, то будет BOOT failure
 

SugreonLeks

New member
Они же у вас подтянуты на 3.3v через резистор 10К. Поэтому постоянно high. Если нажмёте кнопку, то должно прийти low
Чтобы было изначально LOW, нужно подтягивать на землю. А если gpio2 подтянута на землю при загрузке, то будет BOOT failure
Они подключены через кнопку, пока не нажмёшь на кнопку то 3,3 вольна на пины 0 и 2 не поступят.
Для упрощённого понимания. Убираем кнопки, оставляем чистый ESP01 без чего либо подключённым на пины 0 и 2. При подачи питания на ESP01 на этих пинах HIGH, а должен быть LOW.
Я не могу задать этим пинам LOW. digitalWrite (0, LOW); и digitalWrite (2, LOW); не делает этого почемуто.
 

SugreonLeks

New member
Чтобы было изначально LOW, нужно подтягивать на землю. А если gpio2 подтянута на землю при загрузке, то будет BOOT failure
Если я подтяну gpio0 и gpio2 на землю, и после этого подам на него через резистор 10к 3,3 вольта через кнопку при нажатии, разве не будет замыкания?
 

CodeNameHawk

Moderator
Команда форума
Убираем кнопки, оставляем чистый ESP01 без чего либо подключённым на пины 0 и 2. При подачи питания на ESP01 на этих пинах HIGH, а должен быть LOW.
Не должен,будет ловить мусор.
Нужна подтяжка к земле, через резистор.
 

SugreonLeks

New member
Одновременно читать и писать нельзя.
pinMode(0, INPUT);
pinMode(2, INPUT);
Это объявление пина и присвоение ему положения INPUT, то бишь работать на приём. После я говорю что эти пины должны быть изначально LOW.
digitalWrite (0, LOW);
digitalWrite (2, LOW);
Насколько я знаю, это так делается.
 

Ildarmustafin86

Active member
Нет. Это отключит внутренний резистор. И нога будет болтаться в воздухе и ловить наводки.
Мне кажется он хотел выставить INPUT_PULLUP, но только на GND. Если бы он написал digitalWrite(0,HIGH), то это проканало бы. Раньше pullup так ведь подтягивали, только на vcc? На gnd внутренней подтяжки нет
 

SugreonLeks

New member
кнопка.jpg
Вот схема, всё физическое.
Пока не нажмёщь кнопку то на пины ничего не приходит, и пины должны быть в LOW, а они в HIGH находятся, хотя я им говорю программно, что они должны быть в LOW
 
Сверху Снизу