Помогите понять что не так с моим кодом 3-х режимного фонарика!

Всем доброго времени суток!
Помогите пожалуйста начинающему в теме Arduino!
С помощью добрых людей создали каркас кода для 3-режимного фонарика. Но работает код как-то по рогульному как по мне :slight_smile:

Описание работы кода:

  1. первое нажатие засвечивает лед на 100% яркость
  2. второе нажатие засвечивает лед на 50% яркость
  3. третье нажатие переводит лед в режим мигания SOS
  4. четвертое нажатие отключает лед
  5. хотелось бы зациклить выполнение нажатий по кругу

Какие проблемы у меня возникли на Arduino UNO:

  1. нажимать кнопку нужно специфически немного удерживая чтобы все работало правильно. это ужасно бесит(( немного не так нажмешь и перепрыгивает сработка на второе или третье нажатие кнопки. добавил задержку но все равно это особо не помогает.
    в китайском фонарике при кратком нажатии все срабатывает четко. хотелось бы повторить такую логику.
    Я так понимаю нужно устранить дребезг кнопки но как прикрутить это все к этому коду пока не пойму)) Строго не судите я этой темой занялся может недели 2 назад.
  2. И самое что мне не понятно. Для того чтобы выключить лед при четвертом нажатии иногда нужно нажимать кнопку несколько раз или вовсе ее удерживать. Всегда срабатывает по разному. очень редко отключается лед и при одном нажатии.

Вместо режима SOS пока поставил вечный цикл мигания лед пока не разберусь с остальной частью кода.

Помогите пожалуйста доработать код правильно. Это мне поможет двигаться далее.
Буду очень благодарен за вашу помощь! Пока не критикуйте я еще очень слаб в коде :slight_smile:
Если есть кто из вас кому не лень отвечать на мои вопросы желательно в телеграм то я буду очень вам признателен.
Также установил и Proteus 8 Pro если нужно могу там создать этот фонарик.
Также буду очень благодарен если подскажите на каком ресурсе бесплатном можно править код вдвоем онлайн?

Вот собственно сам код:

int ledPin = 11; 
int buttonPin = 8; 
int brightness = 255;
int mode = 0;

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

void loop() {
  if (digitalRead(buttonPin) == HIGH) {
    delay(150); 
      mode = (mode + 1) % 4;

      switch (mode) { 
        case 0:
          analogWrite(ledPin, brightness);
          break;
          case 1:
          analogWrite(ledPin, brightness / 2); 
          delay(150); 
          break;
        case 2:
          blinkSOS(); 
          break;
        case 3:
          analogWrite(ledPin, 0); 
          break;
      }
      }
}

void blinkSOS() {
   delay(50);
  // for (int i = 0; i <= 99999999; i++) { 
    while (1) { // --- создаем вечно замкнутый цикл
    delay(50);
          
    if (digitalRead(buttonPin) == HIGH) {
      goto bailout;
      // analogWrite(ledPin, 0); 
    }
    else
    analogWrite(ledPin, brightness); 
    delay(300); 
    analogWrite(ledPin, 255 /3); 
    delay(300);
    analogWrite(ledPin, 0); 
    delay(300);
  }
  bailout:
  analogWrite(ledPin, 0); 
   delay(1000);
}

Здесь всё есть
https://forum.arduino.ru/t/podklyuchenie-knopki-i-schityvanie-nazhatiya-knopki/9413

https://forum.arduino.ru/t/primer-blink-migaem-svetodiodom/9361

2 лайка

Избавься от delay() и устрани дребезг, но SOS тебе пока не по зубам, я думаю, пока обойдись простой мигалкой.

2 лайка
1 лайк

Обе проблемы имеют одну причину - дребезг контактов. На тему устранения дребезга в интернете имеются тонны материалов. Самый простой способ - использовать какую-нибудь библиотеку для работы с кнопками

2 лайка

Или RC-цепь…
Или и то и другое (бывает и такое :smiley: )…

1 лайк

И в том, и в другом случае проблема решается задержкой реакции на изменение состояния кнопки ))

3 лайка

Очень бестолковое решение. Когда нибудь mode переполнится и станет отрицательным, и тогда кнопка “перестанет работать” до передергивания батарейки. Зацикливание режима делается так:

mode++;
if (mode >= 4)
  {
    mode = 0;
  }
2 лайка

Что-то “ты гонишь” ))))
Я тоже так делаю - ни разу ничего не переполнялось. Да и как? Через что оно переполнится?

2 лайка

))) Прямо и ужасов на новичка нагнать нельзя )))

3 лайка

Сейчас не переполнится, а потом код дополняется, где-то эта переменная начинает использоваться…и падают космические корабли в итоге)

2 лайка

Нужно просто применять МК, в которых нет ОЗУ. Тогда и проблем переполнения не будет :rofl:

3 лайка

тини15?

1 лайк

11/12/15/28

1 лайк

Мир несовершенен. Бывает, что и пепельницы переполняются :frowning:

2 лайка

И из за этого опять мурзика менять на новый приходится :sleepy:

1 лайк

ногу кнопки кидал на землю через резистор 10 кОм и кондер 0.1 мкФ, ничего не помогает :slight_smile:

классный ресурс, огромное вам спасибо !!! :slight_smile:

спасибо вам , попробую и отпишусь :slight_smile:

можно какую-то ссылку на ознакомление работы с библиотеками для кнопок?