Помогите иправить скетч.

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

Здравствуйте уважаемые форумчане!

Помогите пожалуйста исправить (дописать) скетч.
Идея такая: при нажатии и удержании кнопки, светодиод горит с минимальной яркостью. Отпускаем кнопку- светодиод тухнет, нажимаем (и удерживаем) снова- светодиод горит ярче и т.д по кругу.
Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.
Вот сам скетч:
 
int switchPin = 10;
int ledPin = 11;
boolean lastButton = LOW;
int ledLevel = 0; //
boolean currentButton = LOW;
int stepp = 51;
void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}
 
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}
 
void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
}
lastButton = currentButton;
 
if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
// и вместо нуля включаем мин яркость
 
if (currentButton==HIGH) analogWrite(ledPin, ledLevel);
// эта строчка будет зажигать светодиод с нужной яркостью
//но только если кнопка нажата
else analogWrite(ledPin, 0);
// а иначе выключаем все
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну?

Этот скетч как-то не так работает? Или выглядит криво? Или некошерный?

Вы забыли описать свою  проблему. Проблема-то Ваша в чём?

Или ни в чём и Вы просто этот скетч выложили как урок для начинающих?

Да, кстати, перевыловжите по правилам - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.

int switchPin = 10;
 int ledPin = 11;
 boolean lastButton = LOW;
 int ledLevel = 0; //
 boolean currentButton = LOW;
 int stepp = 51;
 void setup()
 {
 pinMode(switchPin, INPUT);
 pinMode(ledPin, OUTPUT);
 }
  
 boolean debounce(boolean last)
 {
 boolean current = digitalRead(switchPin);
 if (last != current)
 {
 delay(5);
 current = digitalRead(switchPin);
 }
 return current;
 }
  
 void loop()
 {
 currentButton = debounce(lastButton);
 if (lastButton == LOW && currentButton == HIGH)
 {
 ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
 }
 lastButton = currentButton;
  
 if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
 // и вместо нуля включаем мин яркость
  
 if (currentButton==HIGH) analogWrite(ledPin, ledLevel);
 // эта строчка будет зажигать светодиод с нужной яркостью
 //но только если кнопка нажата
 else analogWrite(ledPin, 0);
 // а иначе выключаем все
 }

 

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

В строке 33 Вы не ограничиваете занчением 255, а начинаете с начала (с 51).

А по поводу секунды. ну, при каждом нажатии кнопки запоминайте текущее значение millis(), а при каждом входе в loop сравнивайте текущиё millis с запомненным при последнем нажатии. И если разница больше секунды, сьрасывайте ledLevel в 0

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

Я примерно себе это так и представляю... но как это всё правильно должно выглядеть, и где должно находиться не знаю. Я в програмировании почти полный ноль, поэтому и прошу помощи

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

Ну, не знаю, Вы где меняеете яркость? В строке 29! Вот и присобачьте рядом с ней (поеред или после) запоминание времени, когда в последний раз меняли:

lastButtonPressedTime = millis();

Саму переменную lastButtonPressedTime опишите в самом начале функции loop() примерно так

static long unsigned lastButtonPressedTime = 0;

И сразу после её описания поставьте проверку о которой я говорил

if (millis() - lastButtonPressedTime > 1000) ledLevel = 0;

Кажется, всё. Должно как-то работать.

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

Ура! Всё получилось!!! ОГРОМНОЕ ВАМ СПАСИБО!!!

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

Незачто

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

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

Поправьте пожалуйста...

int switchPin = 10;
int ledPin = 11;
boolean lastButton = LOW; 
int ledLevel = 0; //
boolean currentButton = LOW; 
int stepp = 85;

void setup() 
{
 pinMode(switchPin, INPUT); 
 pinMode(ledPin, OUTPUT); 
}

boolean debounce(boolean last) 
{
 boolean current = digitalRead(switchPin);
 if (last != current)
 {
 delay(5);
 current = digitalRead(switchPin);
 }
 return current;
}

void loop()
{
 static long unsigned lastButtonPressedTime = 0;
 if (millis() - lastButtonPressedTime > 1000) ledLevel = 0;
 currentButton = debounce(lastButton); 
 if (lastButton == LOW && currentButton == HIGH) 
 {
 lastButtonPressedTime = millis();
 ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp
 }
 lastButton = currentButton; 

 if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255
 // и вместо нуля включаем первую скорость
 
 if (currentButton==HIGH) analogWrite(ledPin, ledLevel); 
 // эта строчка будет зажигать светодиод с нужной яркостью
 //но только если кнопка нажата
else analogWrite(ledPin, 0); 
// а иначе выключаем все
}

 

 

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

Тогда Вам нужно кроме факта нажатия, ловить ещё и факт отпускания. И время считать не от последнего нажатия, а от последнего отпускания, а впромежутке между нажатием и отпусканием яркость вообще не менять. Раньше Вы про это вроде не говорили. Ну, в общем, модификация-то несложная. Только Вы продумайте всё в комплексе, а то опять потом что-то вылезет.

Alex-26rus
Offline
Зарегистрирован: 20.04.2016

Всё. проблемма решилась. Всем спасибо!!! Тему можно закрывать))

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

C Победой!