Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Лена
2024-11-09 23:24:16

Нашла сама ответ. Здесь уже играет роль пин, к которому припаяна кнопка. нужно перепаять на д2 и д3 и будет работать ) ... вроде бы как )

Лена
2024-11-09 21:13:56

Здравствуйте. Не могу добавить к этому коду эффект: при нажатии кнопки на д10 должны выключиться все светодиоды, если запущен эффект. Помогите, пожалуйста, как это сделать (((( #include <Adafruit_NeoPixel.h>

#define LED_PIN 6       
#define NUM_LEDS 11     
#define TOUCH_PIN 7      // Первая кнопка на D7
#define BUTTON_PIN 10    // Вторая кнопка на D10

Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

bool effectActive = false;  // флаг для отслеживания, активны ли эффекты
unsigned long lastButtonPress = 0;
unsigned long debounceDelay = 200; // Увеличена чувствительность, длительная задержка
unsigned long lastButtonPressD10 = 0;  // Для кнопки D10
unsigned long lastButtonPressD10Second = 0;  // Для второго нажатия кнопки D10
unsigned long debounceDelayD10 = 300;  // Задержка для дебаунса кнопки D10
unsigned long doubleClickTime = 500;  // Максимальное время между двумя нажатиями для детекции двойного нажатия (в миллисекундах)

int brightnessLevel = 0; // 0 - выключено, 1 - 1/3 яркости, 2 - 2/3 яркости, 3 - полная яркость
bool effectInProgress = false; // флаг для того, чтобы не прерывать эффекты

void setup() {
  pinMode(TOUCH_PIN, INPUT);
  pinMode(BUTTON_PIN, INPUT);
  strip.begin();
  strip.show();
}

void loop() {
  // Чтение кнопки D10 (выключить все эффекты и сбросить)
  int buttonStateD10 = digitalRead(BUTTON_PIN);

  // Если кнопка D10 нажата, проверяем дебаунс и сбрасываем систему при двойном нажатии
  if (buttonStateD10 == HIGH && (millis() - lastButtonPressD10 > debounceDelayD10)) {
    lastButtonPressD10 = millis();

    if (lastButtonPressD10Second != 0 && (millis() - lastButtonPressD10Second <= doubleClickTime)) {
      resetSystem();  // Двойное нажатие, сбрасываем систему
      lastButtonPressD10Second = 0;  // Сброс времени второго нажатия после выполнения действия
    } else {
      lastButtonPressD10Second = millis();  // Зафиксировали первое нажатие
    }
  }

  // Обработка нажатия на первую кнопку для запуска или остановки эффекта
  if (digitalRead(TOUCH_PIN) == HIGH && (millis() - lastButtonPress > debounceDelay)) {
    lastButtonPress = millis();
   
    if (!effectActive && !effectInProgress) {  // Только если эффекты не активны
      effectActive = true;
      effectInProgress = true;
      gradualSequentialOn();
      randomColorTransition(10000);
      gradualOff();
    } else if (effectActive) {  // Если эффекты активны, то выключаем их
      effectInProgress = false;
      effectActive = false;
      strip.clear(); // Очищаем все светодиоды
      strip.show();
    }
  }

  // Короткое нажатие для переключения яркости
  int buttonStateShort = digitalRead(BUTTON_PIN);
  if (buttonStateShort == HIGH) {
    brightnessLevel++;
    if (brightnessLevel > 3) {
      brightnessLevel = 0; // Сброс яркости после 4-го нажатия (выключение)
    }
    updateBrightness(); // Применяем новый уровень яркости
    delay(500);  // Добавлена задержка для предотвращения повторного срабатывания
  }
}

// Функция для изменения яркости
void updateBrightness() {
  int brightness;
  if (brightnessLevel == 0) {
    brightness = 0; // Выключаем все светодиоды
  } else if (brightnessLevel == 1) {
    brightness = 85; // 1/3 яркости
  } else if (brightnessLevel == 2) {
    brightness = 170; // 2/3 яркости
  } else {
    brightness = 255; // Полная яркость
  }

  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, strip.Color(brightness, brightness, brightness));
  }
  strip.show();
}

// Функция для установки яркости сразу
void setBrightness(int brightness) {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, strip.Color(brightness, brightness, brightness));
  }
  strip.show();
}

// Функция для плавного включения светодиодов поочередно
void gradualSequentialOn() {
  for (int i = 0; i < NUM_LEDS; i++) {
    for (int brightness = 0; brightness <= 255; brightness += 5) {
      strip.setPixelColor(i, strip.Color(brightness, brightness, brightness));
      if (i > 1) {
        int prevIndex = i - 2;
        int prevBrightness = map(brightness, 0, 255, 255, 0);
        strip.setPixelColor(prevIndex, strip.Color(prevBrightness, prevBrightness, prevBrightness));
      }
      strip.show();
      delay(5);
    }
  }

  // Полностью отключаем все светодиоды перед началом мигания последнего
  strip.clear();

}

// Функция для случайного изменения цвета светодиодов в течение заданного времени
void randomColorTransition(unsigned long duration) {
  int lastLed = NUM_LEDS - 1;
  unsigned long startTime = millis();
  while (millis() - startTime < duration) {
    strip.setPixelColor(lastLed, strip.Color(random(0, 100), random(0, 100), random(0, 100)));
    strip.show();
    delay(1000);
  }
}

// Функция для плавного отключения светодиодов
void gradualOff() {
  for (int brightness = 255; brightness >= 0; brightness -= 3) {
    for (int i = 0; i < NUM_LEDS; i++) {
      strip.setPixelColor(i, strip.Color(brightness, brightness, brightness));
    }
    strip.show();
    delay(5);
  }

  // Дополнительное отключение всех светодиодов в конце для гарантии
  strip.clear();
  strip.show();
}

// Функция сброса системы
void resetSystem() {
  // Сброс всех эффектов, яркости и состояния
  effectActive = false;
  effectInProgress = false;
  brightnessLevel = 0;
 
  // Выключаем все светодиоды
  strip.clear();
  strip.show();
}

alex_dol
2017-02-28 10:25:04

MadHorse, реальность очень сильно отличается от идеала: в протеусе нет дребезга контактов, нет наводок от соседних проводников, нет паразитных индуктивностей и емкостей, нет нестабильностей питания и т. д. Это конечно все можно добавить для приближения к реальности, но в вашем случае модель идеальна, а реальность - нет.

По сути. Есть такое понятие как "дребезг контактов", подробно описано везде: дядя гугл дает полный комплект информации по данной теме. Пока не освоите данный вопрос - дальнейшая работа с кнопками у вас будет вызывать тяжело вылавливаемые глюки. Именно освоите, а не возьмете первый попавшийся рабочий пример.

Волшебник
2017-02-28 08:18:07

У вас не хватает <детектора фронтов>, вкратце нужно запоминать предыдущее состояние и не реагировать если оно не изменилось.
тут есть правильный код, посмотрите  https://www.arduino.cc/en/Tutorial/Debounce

MadHorse
2017-02-24 21:36:49
Green пише:

Первые шаги в чем?
Если в Ардуино, то к чему физика? Она ж, как раз, от физики и отвязывает. Вы же пишете на чистом Си.
Но, если определили RegC0, то какого бэна Вы к нему затем напрямую обращаетесь? 
Кнопку Вы жмёте сколько по времени? А цикл за сколько у Вас проскакивает?
Включайте голову в первую очередь.

Вы заголовок читали?
Ардуино Нано это не Ардуино?
по сути как разница как определил я переменную или обращаюсь  к пину на прямую, это что влияет на функционал? smile
Написали глупости и по сути ничего не сказав smile

Green
2016-12-26 11:08:47

Первые шаги в чем?
Если в Ардуино, то к чему физика? Она ж, как раз, от физики и отвязывает. Вы же пишете на чистом Си.
Но, если определили RegC0, то какого бэна Вы к нему затем напрямую обращаетесь? 
Кнопку Вы жмёте сколько по времени? А цикл за сколько у Вас проскакивает?
Включайте голову в первую очередь.

MadHorse
2016-12-25 12:43:14

Коллеги
начинаю делать свои первые шаги.
Простая схема (см. приложение)
JC354ygnvWuAECK28
есть код

#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>

#define Port_c PORTC
#define RegC0  PC0

int main(void)
{
    //initial setting port D (connect button)
    DDRD = ~(1 << PD0); //enable input
    PORTD  |= _BV(PD0);
    //initial setting port C (connect led)
    DDRC |= _BV(PC0); //on eixt
    Port_c &= ~ _BV(PC0);  
    while(1)
    {          
        if((PIND & _BV(PD0)) == 1)
        {
            _delay_ms(25); //leveling press button
            Port_c ^= (1<<PC0); //led on/off
        }              
    }
}

При нажати лед должне включиться при последующием выключиться
В виртуальной модели (в протеусе) работает, а в физической, лед просто быстро мерцает. Реакция на кнопку- замирает не надолго или вообще никак. На вид все логично, но..., Помогите разобраться где косяк?

Підвал форуму