Помогите с программой для светодиода и кнопки
-
Всем привет! Подскажите чайнику, перерыл все, не могу найти пример программы, чтобы зажигать светодиод от нажатия кнопки, но чтобы он не тух когда кнопку отпускаешь, а тух уже при следующем нажатии. И так далее бесконечно раз…
К примеру данный школьный пример:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(3, GPIO.IN)
while True:
____if GPIO.input(3) == False:
________GPIO.output(7, 1)
____else:
________GPIO.output(7, 0)
Включает светодиод только при нажатой кнопки.
Попробовал вот такой способ:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(3, GPIO.IN)
while True:
____if GPIO.input(3) == False:
________GPIO.output(7, 1)
____if GPIO.input(3) == False:
________GPIO.output(7, 0)
Работает жуть как коряво. Сам понимаю что это неправильно, но моих нулевых знаний в программировании хватило только на это.
Помогите пожалуйста, знающие люди)
За ранее спасибо! -
Не знаю язык на котором это написано, по этому уж сами переведите в нужные команды…
Суть такая:
Нужна переменная в которой по умолчанию значение 0.
Если кнопка нажата, если значение в той переменной 0, то зажигаем светодиод и устанавливаем переменную в 1, если в переменной 1, то гасим светодиод, а в переменую пишем 0.На языке с подобным синтаксисом perl или c, это выглядело бы так:
$peremennaya_svetodioda = 0;
while(true){
if (состояние_кнопки(номер_кнопки) == 1){
if ($peremennaya_svetodioda ==0){
зажечь_светодиод();
$peremennaya_svetodioda = 1;
}else{
погасить_светодиод();
$peremennaya_svetodioda = 0;
}
}
}Но это пораждает проблему вида «светодиод мигает (возможно очень быстро) если держать кнопку нажатой», что бы избавиться от этого, потребуется ещё одна переменная, которая будет содержать информацию о том кнопка только что нажата или её держат, таким образом суть сводится к такому:
Нужна переменная_статуса_светодиода в которой по умолчанию значение 0.
Нужна переменная_статуса_кнопки в которой по умолчанию значение 0.
Если кнопка нажата, если значение переменная_статуса_кнопки равно 0, то изменим его на 1 и проверим переменная_статуса_светодиода, если она равна 0, то зажгем светодиод, в переменная_статуса_светодиода запишем 1, если переменная_статуса_светодиода уже равна 1 то погасим светодиод и в переменная_статуса_светодиода запишем 0.
Если кнопка отпущена то запишем 0 в переменная_статуса_кнопки.$peremennaya_svetodioda = 0;
$peremennaya_knopki = 0;
while(true){
if (состояние_кнопки(номер_кнопки) == 1){
if ($peremennaya_knopki == 0){
$peremennaya_knopki = 1;
if ($peremennaya_svetodioda ==0){
зажечь_светодиод();
$peremennaya_svetodioda = 1;
}else{
погасить_светодиод();
$peremennaya_svetodioda = 0;
}
}
}else{
$peremennaya_knopki = 0;
}
}И это ещё не всё, кнопки устройства механические и имеют «дребезг», это когда кнопка в момент размыкания или замыкания (когда контакты её близко) может многократно быть разомкнута или замкнута за счёт дребезжания (вибрации) её контактов, или по причине разрушения плёнок оксилов на её контактах.
Для того, что бы игнорировать дребезг, алгоритм должен не мгновенно реагировать на размыкание (или замыкание) кнопки а с некоторой задержкой, что бы дребезг успокоился (на практике хватает 0.1 секунды, человек эту задержку не ощущает и так быстро кнопку он нажимать не может).
Тогда алгоритм приходит к виду:$peremennaya_svetodioda = 0;
$peremennaya_knopki = 0;
while(true){
if (состояние_кнопки(номер_кнопки) == 1){
if ($peremennaya_knopki == 0){
$peremennaya_knopki = 100; // здесь мы задёем задержку в числе циклом перед тем как при отпускании кнопки переменная обнулиться
if ($peremennaya_svetodioda ==0){
зажечь_светодиод();
$peremennaya_svetodioda = 1;
}else{
погасить_светодиод();
$peremennaya_svetodioda = 0;
}
}
}else{
if ($peremennaya_knopki > 0){$peremennaya_knopki = $peremennaya_knopki — 1;} // уменьшаем пока не станет равно 0, то есть осуществляем задержку антидребезга
}
}Дребезг — являние свойственное механическим выключателям, если управление производится сигналами формируемыми микросхемами, то дребезга быть не должно, хотя на деле он может быть, просто не большой, но тогда это называется уже «звон» явление связано с тем, что провода являются индуктивностью, а ещё они имеют ёмкость по отношению к окружающим предметам и другим проводам и всё в сумме это колебательный контур, а в колебательных контурах возникают колебания при изменении тока через их индуктивность или напряжения на их ёмкости.