Ви не увійшли.
Коллеги
начинаю делать свои первые шаги.
Простая схема (см. приложение)
есть код
#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
}
}
}
При нажати лед должне включиться при последующием выключиться
В виртуальной модели (в протеусе) работает, а в физической, лед просто быстро мерцает. Реакция на кнопку- замирает не надолго или вообще никак. На вид все логично, но..., Помогите разобраться где косяк?
Остання редакція MadHorse (2016-12-25 12:46:07)
Неактивний
Первые шаги в чем?
Если в Ардуино, то к чему физика? Она ж, как раз, от физики и отвязывает. Вы же пишете на чистом Си.
Но, если определили RegC0, то какого бэна Вы к нему затем напрямую обращаетесь?
Кнопку Вы жмёте сколько по времени? А цикл за сколько у Вас проскакивает?
Включайте голову в первую очередь.
Неактивний
Первые шаги в чем?
Если в Ардуино, то к чему физика? Она ж, как раз, от физики и отвязывает. Вы же пишете на чистом Си.
Но, если определили RegC0, то какого бэна Вы к нему затем напрямую обращаетесь?
Кнопку Вы жмёте сколько по времени? А цикл за сколько у Вас проскакивает?
Включайте голову в первую очередь.
Вы заголовок читали?
Ардуино Нано это не Ардуино?
по сути как разница как определил я переменную или обращаюсь к пину на прямую, это что влияет на функционал?
Написали глупости и по сути ничего не сказав
Остання редакція MadHorse (2017-02-24 22:07:56)
Неактивний
У вас не хватает <детектора фронтов>, вкратце нужно запоминать предыдущее состояние и не реагировать если оно не изменилось.
тут есть правильный код, посмотрите https://www.arduino.cc/en/Tutorial/Debounce
Неактивний
MadHorse, реальность очень сильно отличается от идеала: в протеусе нет дребезга контактов, нет наводок от соседних проводников, нет паразитных индуктивностей и емкостей, нет нестабильностей питания и т. д. Это конечно все можно добавить для приближения к реальности, но в вашем случае модель идеальна, а реальность - нет.
По сути. Есть такое понятие как "дребезг контактов", подробно описано везде: дядя гугл дает полный комплект информации по данной теме. Пока не освоите данный вопрос - дальнейшая работа с кнопками у вас будет вызывать тяжело вылавливаемые глюки. Именно освоите, а не возьмете первый попавшийся рабочий пример.
Неактивний
Здравствуйте. Не могу добавить к этому коду эффект: при нажатии кнопки на д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();
}
Нашла сама ответ. Здесь уже играет роль пин, к которому припаяна кнопка. нужно перепаять на д2 и д3 и будет работать ) ... вроде бы как )