Включить LED на одну секунду
- Войдите на сайт для отправки комментариев
Пнд, 18/06/2018 - 02:38
Здравствуйте.
В этой программе время начинает отсчитываться с момента нажатия кнопки,
как изменить это, чтобы отчет начинался с момента освобождения кнопки?
const int buttonPin = PA7;
void setup() {
pinMode(PB1, OUTPUT);
pinMode(buttonPin, INPUT_PULLDOWN);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
if (digitalRead(buttonPin) == HIGH)
{
digitalWrite(PB1, HIGH);
delay(1000);
}
else
{
digitalWrite(PB1, LOW);
}
}
А если подумать? Что такое "отпускание кнопки" - как не ситуация, когда состояние кнопки меняется с HIGH на LOW ?
Из этого вытекает очень простой алгоритм - на каждом шаге проверяем состояние кнопки и запоминаем его. Если в какой-то момент нынешнее состояние будет LOW, а прошлое - HIGH, значит это и есть "оно", "отпусканиние"
Так что ли ?
const int buttonPin = PA7; int buttonStateRising = 1; int lastButtonStateRising = 1; int buttonStateFalling = 1; int lastButtonStateFalling = 1; unsigned long millisPrevious; byte debounceInterval = 50; // milliseconds void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); } void loop() { buttonStateFalling = digitalRead(PA7); if ((buttonStateFalling == LOW) && (lastButtonStateFalling == HIGH)) { if (millis() - millisPrevious >= debounceInterval) { Serial.println("There was a falling edge on pin PA7"); } millisPrevious = millis(); } lastButtonStateFalling = buttonStateFalling; if (digitalRead(buttonPin) == HIGH) { digitalWrite(PB1, HIGH); delay(1000); } else { digitalWrite(PB1, LOW); } }Например, так:
const int buttonPin = PA7; unsigned char shift_reg; unsigned char button_state; unsigned char count_ms; unsigned char stored_ms; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); } void loop() { if (stored_ms != (unsigned char)millis()) // every ms { stored_ms = (unsigned char)millis(); if (++count_ms > 6) // every 6 ms { count_ms = 0; // debonce interval 6ms*8bit = 48ms shift_reg = shift_reg << 1; shift_reg = (digitalRead(buttonPin) == HIGH)? (shift_reg | 1) : shift_reg; if (shift_reg == 0xFF) // if all "1" { if (button_state == 0) { digitalWrite(PB1, HIGH); Serial.println("Rising edge"); } button_state = 1; } else if (shift_reg == 0) // if all "0" { if (button_state) { digitalWrite(PB1, LOW); Serial.println("Falling edge"); } button_state = 0; } } // every 6 ms } // every ms } // loopИсправил последнюю строчку ) на }, но та PB1 ничего нет
"Ничего нет" - это, наверное, следует понимать как "все время низкий уровень"? А на PA7 что? Тоже все время низкий уровень?
Вы какую Ардуину используете?
Ошибка , на PB1 ничего нет
PA7 - Из генератора 2.6В или в ручную 3.3V
Как то так
const int buttonPin = PA7; boolean flag=0; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); } void loop() { if (digitalRead(buttonPin) == HIGH&&flag==0) {flag=1;} if(digitalRead(buttonPin)==LOW&&flag==1) digitalWrite(PB1, HIGH); delay(1000); digitalWrite(PB1, LOW); flag=0; } }Kakmyc - - браво, коротко и по делу.
А то выше нагородили кучу флагов и миллисов :)))
последний "}" совсем не лишний. Наоборот, на строке 11 не хватает "{", поэтому и не работает.
Вместо того чтоб тупо удалять-добавлять скобки, попытайтесь понять логику программы, она несложная.
вот error с этой скобкой
вот error с этой скобкой
А вот ответ про скобку:
последний "}" совсем не лишний. Наоборот, на строке 11 не хватает "{", поэтому и не работает.
Вместо того чтоб тупо удалять-добавлять скобки, попытайтесь понять логику программы, она несложная.
вот error с этой скобкой
Подредактировал по мелочи и залил в Ардуино Про Мини. Работает.
#define buttonPin 9 #define LED 13 unsigned char shift_reg; unsigned char button_state; unsigned char count_ms; unsigned char stored_ms; void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (stored_ms != (unsigned char)millis()) // every ms { stored_ms = (unsigned char)millis(); if (++count_ms > 6) // every 6 ms { count_ms = 0; // debonce interval 6ms*8bit = 48ms shift_reg = shift_reg << 1; shift_reg = (digitalRead(buttonPin) == HIGH)? (shift_reg | 1) : shift_reg; if (shift_reg == 0xFF) // if all "1" { if (button_state == 0) { digitalWrite(LED, HIGH); Serial.println("Rising edge"); } button_state = 1; } else if (shift_reg == 0) // if all "0" { if (button_state) { digitalWrite(LED, LOW); Serial.println("Falling edge"); } button_state = 0; } } // every 6 ms } // every ms } // loopconst int buttonPin = PA7; boolean flag=0; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); } void loop() { if (digitalRead(buttonPin) == HIGH&&flag==0) {flag=1;} if(digitalRead(buttonPin)==LOW&&flag==1) { digitalWrite(PB1, HIGH); delay(1000); } else { digitalWrite(PB1, LOW); flag=0; } }потому что вы даже готовый код не в состоянии использовать. Посмотрите, что было у Кактуса в сообщении #9 и что написали вы? Вы выдумали какую-то ветку else. а она лишняя - из-за нее и глючит.
Что, неужели так трудно разобраться в полутора десятках строчек????
что за импульсы вдруг появились? В исходном задании только кнопка была...
Если вам вместо кнопки надо импульсы ловить - так и пишите сразу. Это совсем не так делается.
В моем скетче нет никаких 6ms импульсов. Он при нажатии/отпускании кнопки гасит/зажигает светодиод.
const int buttonPin = PA7; boolean flag=0; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); } void loop() { if (digitalRead(buttonPin) == HIGH&&flag==0) {flag=1;} if(digitalRead(buttonPin)==LOW&&flag==1){ digitalWrite(PB1, HIGH); delay(1000); digitalWrite(PB1, LOW); flag=0; } }Прозевал скобку. Так правильно.
да я ему уже 3 раза написал, даже с прямым указанием, куда скобку вставить - не доходит. Видимо, совсем студент тугой, книжки читать некогда. зачет пилить надо...
он еще и претензии высказывает :))))
Всем спасибо
Всем спасибо
const int buttonPin = PA7; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == HIGH) { while (digitalRead(buttonPin) == HIGH) {;} digitalWrite(PB1, HIGH); delay(1000); } else { digitalWrite(PB1, LOW); } }это без флагов...
Всем спасибо
const int buttonPin = PA7; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == HIGH) { while (digitalRead(buttonPin) == HIGH) {;} digitalWrite(PB1, HIGH); delay(1000); } else { digitalWrite(PB1, LOW); } }это без флагов...
Это "без флагов" больше делать ничего не будет, пока кнопка нажата.
И else кривой в хламину.
Зачем он вообще нужен , если в любом случае через секунду выключаем ?
renoshnik
Отключил строчку #5 и работает.
без else диод не выключается.
Что бы он выключался без else, его выключать надо сразу после delay(), а не выносить в отдельное условие.
сделал так и error.
сделал так и error.
Вы что, каждую строчку будете в форуме выпрашивать??? Может все-таки почитать документацию? Самому-то не стыдно выглядеть таким неучем?
ИМХО, если вы не сдадите диплом и вас отчислят - это будет лучше и для вас, и для общества
Этот ответ в ничем не помог, пока изучаю это.
https://www.arduino.cc/reference/en/language/functions/time/micros/
пока изучаю это.
https://www.arduino.cc/reference/en/language/functions/time/micros/
у же лучше
Этот ответ ничем не помог,
Я прям сейчас с горя повешусь :))) Я не смог ему помочь.... что же делать-то???
Не надо рассчитывать, что коль вы сами нифига не хотите делать - все прям так и бросятся вам помогать.
И изучайте не только "это" - одну крошечную статью, а весь раздел https://www.arduino.cc/reference/en/ от начала и до конца. Пока не изучите - новых вопросов задавать не нужно.
новых вопросов задавать не нужно.
Должен просить Вашего разрешения ?
b707
Теперь я вас понимаю.
gal
Возьми почитай раздел программирование на сайте, может вопросы отпадут.
Неа, Ефим не столь давно плевался в семьсотседьмого на предмет, нельзя же так с неофитами, прозревает помаленьку.
HardwareTimer pwmtimer3(3); const int buttonPin = PA7; boolean flag = 0; void setup() { pinMode(PB1, OUTPUT); pinMode(buttonPin, INPUT_PULLDOWN); pinMode(PB1,PWM); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(100); // Timer input clock Prescaler pwmtimer3.setOverflow(80 - 1); // PWM Period width pwmtimer3.setCompare(TIMER_CH4, 40); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); } void loop() { if (digitalRead(buttonPin) == HIGH && flag == 0) { flag = 1; } if (digitalRead(buttonPin) == LOW && flag == 1) { digitalWrite(PB1, HIGH); delay(1000); digitalWrite(PB1, LOW); flag = 0; } }Что значит "второй канал "?
Видя, как вы "плаваете" в самых элементарных вещах, очень сомневаюсь, что вы хотя бы в общих чертах представляете, как это сделать.