Включить LED на одну секунду

gal
Offline
Зарегистрирован: 08.06.2018
Здравствуйте.
В этой программе время начинает отсчитываться с момента нажатия кнопки, 
как изменить это, чтобы отчет начинался с момента освобождения кнопки?
 
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);
}
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

А если подумать? Что такое "отпускание кнопки" - как не ситуация, когда состояние кнопки меняется с HIGH на LOW ?

Из этого вытекает очень простой алгоритм - на каждом шаге проверяем состояние кнопки и запоминаем его. Если в какой-то момент нынешнее состояние будет LOW, а прошлое - HIGH, значит это и есть "оно", "отпусканиние"

gal
Offline
Зарегистрирован: 08.06.2018

Так что ли ?

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);
}
  
}

 

 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Например, так:

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

 

gal
Offline
Зарегистрирован: 08.06.2018

Исправил последнюю строчку ) на }, но та PB1 ничего нет 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

"Ничего нет" - это, наверное, следует понимать как "все время низкий уровень"? А на PA7 что?  Тоже все время низкий уровень?

Вы какую Ардуину используете?

gal
Offline
Зарегистрирован: 08.06.2018

Ошибка , на PB1 ничего нет 

PA 7 - 2.6В , пока больше нет, СТМ 32 Ф 103 , допустимый уровень 3.3В .
больше 2.6В = половины .
 
Пробовал 3.3В, тоже не работает.
gal
Offline
Зарегистрирован: 08.06.2018

PA7 - Из генератора 2.6В или в ручную 3.3V

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как то так

Kakmyc
Offline
Зарегистрирован: 15.01.2018
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;
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc - - браво, коротко и по делу.

А то выше нагородили кучу флагов и миллисов :)))

gal
Offline
Зарегистрирован: 08.06.2018
Убрал последний лишний "}" , программа не реагирует на нажатие/освобождение кнопки.
PB1 все время LOW
b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

Убрал последний лишний "}" , программа не реагирует на нажатие/освобождение кнопки.
PB1 все время LOW

последний "}" совсем не лишний.  Наоборот, на строке 11 не хватает "{", поэтому и не работает.

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

 

gal
Offline
Зарегистрирован: 08.06.2018

вот error с этой скобкой

mpuls_r2:16: error: expected declaration before '}' token
 
 }
 
 ^
 
exit status 1
expected declaration before '}' token
 
ven-til
Offline
Зарегистрирован: 13.02.2018

gal пишет:

вот error с этой скобкой

А вот ответ про скобку:

b707 пишет:

последний "}" совсем не лишний.  Наоборот, на строке 11 не хватает "{", поэтому и не работает.

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

b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

вот error с этой скобкой

вы читаете, что вам пишут? 
 
Не надо вслепую добавлять и убирать скобки - это глупо. Сначала разберитесь, что эта скобка значит - а потом уже исправляйте ошибку.
triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Подредактировал по мелочи и залил в Ардуино Про Мини. Работает.

#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
} // loop

 

gal
Offline
Зарегистрирован: 08.06.2018
Вот сделал так:
 на кнопку реагирует но странно, надо несколько рас нажимать или подаждать несколько секунд.
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);
}
else
{
  digitalWrite(PB1, LOW);
  flag=0;
}
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

Вот сделал так:
 на кнопку реагирует но странно, надо несколько рас нажимать или подаждать несколько секунд.

 

потому что вы даже готовый код не в состоянии использовать. Посмотрите, что было у Кактуса в сообщении #9 и что написали вы? Вы выдумали какую-то ветку else. а она лишняя - из-за нее и глючит.

Что, неужели так трудно разобраться в полутора десятках строчек????

 

gal
Offline
Зарегистрирован: 08.06.2018
triac
На кнопку реагирует, но не видно есть ли там 6ms импульсы, подключил 75 Гц импульсы на PA7, тогда на PB1 постоянно 3.3В - импульсов на осциллографе не видно
Амплитуда импульсов 2.5В , может это мешатет , увеличить амплитуду пока не могу.  
b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

triac
На кнопку реагирует, но не видно есть ли там 6ms импульсы

что за импульсы вдруг появились? В исходном задании только кнопка была...

Если вам вместо кнопки надо импульсы ловить - так и пишите сразу. Это совсем не так делается.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

gal пишет:

triac
На кнопку реагирует, но не видно есть ли там 6ms импульсы, подключил 75 Гц импульсы на PA7, тогда на PB1 постоянно 3.3В - импульсов на осциллографе не видно
Амплитуда импульсов 2.5В , может это мешатет , увеличить амплитуду пока не могу.  

В моем скетче нет никаких 6ms импульсов. Он при нажатии/отпускании кнопки гасит/зажигает светодиод.

Kakmyc
Offline
Зарегистрирован: 15.01.2018
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;
}
}

Прозевал скобку. Так правильно.

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Прозевал скобку. Так правильно.

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

 

gal
Offline
Зарегистрирован: 08.06.2018
А строчка 21 не связанa ли с длительностью зажигания диода ?
а где одна секунда - первое собщение строчка 12 - диод включается на одну секунду.
 
b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

а где одна секунда - первое собщение строчка 12 - диод включается на одну секунду.
 

он еще и претензии высказывает :))))

gal
Offline
Зарегистрирован: 08.06.2018
Kakmyc
 
Спасибо
 работает
gal
Offline
Зарегистрирован: 08.06.2018
А вопросительный знак не видно ? = Сообщение 25
" Видимо, совсем студент тугой "
gal
Offline
Зарегистрирован: 08.06.2018

Всем спасибо

renoshnik
Offline
Зарегистрирован: 11.04.2013

gal пишет:

Всем спасибо

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);
}
}

это без флагов...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

renoshnik пишет:

gal пишет:

Всем спасибо

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 кривой в хламину.
Зачем он вообще нужен , если в любом случае через секунду выключаем ?

gal
Offline
Зарегистрирован: 08.06.2018

renoshnik

Отключил строчку #5 и работает.

Спасибо.
gal
Offline
Зарегистрирован: 08.06.2018

без else диод не выключается.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Что бы он выключался без else, его выключать надо сразу после delay(), а не выносить в отдельное условие.

gal
Offline
Зарегистрирован: 08.06.2018
# 33 работает .
А как изменить миллисекунды в микросекунды ?
 delay = micros(); ?
gal
Offline
Зарегистрирован: 08.06.2018

сделал так и error.

 delay = micros(1000);  
mpuls_r3__renoshnik:13: error: too many arguments to function 'uint32 micros()'
 
    delay = micros(1000);  
 
 
static inline uint32 micros(void) {
 
                      ^
 
impuls_r3__renoshnik:13: error: assignment of function 'void delay(long unsigned int)'
 
    delay = micros(1000);  
 
          ^
 
impuls_r3__renoshnik:13: error: cannot convert 'uint32 {aka long unsigned int}' to 'void(long unsigned int)' in assignment
 
 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

сделал так и error.

 delay = micros(1000);  

 

Вы что, каждую строчку будете в форуме выпрашивать??? Может все-таки почитать документацию? Самому-то не стыдно выглядеть таким неучем?

ИМХО, если вы не сдадите диплом и вас отчислят - это будет лучше и для вас, и для общества

 

gal
Offline
Зарегистрирован: 08.06.2018

Этот ответ в ничем не помог, пока изучаю это.

https://www.arduino.cc/reference/en/language/functions/time/micros/

b707
Offline
Зарегистрирован: 26.05.2017

gal пишет:

пока изучаю это.

https://www.arduino.cc/reference/en/language/functions/time/micros/

у же лучше

gal пишет:

Этот ответ ничем не помог,

Я прям сейчас с горя повешусь :))) Я не смог ему помочь.... что же делать-то???

Не надо рассчитывать, что коль вы сами нифига не хотите делать - все прям так и бросятся вам помогать.

 

b707
Offline
Зарегистрирован: 26.05.2017

И изучайте не только "это" - одну крошечную статью, а весь раздел https://www.arduino.cc/reference/en/ от начала и до конца. Пока не изучите - новых вопросов задавать не нужно.

gal
Offline
Зарегистрирован: 08.06.2018
Точно
 Вас спрашивать не буду, так что не заходите  сюда. 
 
gal
Offline
Зарегистрирован: 08.06.2018

b707 пишет:

 новых вопросов задавать не нужно.

Должен просить Вашего разрешения ?

 

gal
Offline
Зарегистрирован: 08.06.2018
Сам разобрался
delayMicroseconds(50);

 

 

Efim
Offline
Зарегистрирован: 04.05.2018

b707

Теперь я вас понимаю.

gal

Возьми почитай раздел программирование на сайте, может вопросы отпадут.

gal
Offline
Зарегистрирован: 08.06.2018
Efim
Посоветуй это остальным и форум исчезнет, все задают вопросы когда только начинают говорить  = с детства.
А вот сдесь и получился очень простой  ждущий генератор =  Генератор одиночных импульсов .....
Efim и b707 никогда вопросов не задают.
bwn
Offline
Зарегистрирован: 25.08.2014

gal пишет:

Efim
Посоветуй это остальным и форум исчезнет, все задают вопросы когда только начинают говорить  = с детства.
А вот сдесь и получился очень простой  ждущий генератор =  Генератор одиночных импульсов .....
Efim и b707 никогда вопросов не задают.

Неа, Ефим не столь давно плевался в семьсотседьмого на предмет, нельзя же так с неофитами, прозревает помаленьку.

gal
Offline
Зарегистрирован: 08.06.2018
Kakmyc
А как добавить второй независимый канал используя второй тимер ?
gal
Offline
Зарегистрирован: 08.06.2018
Вот сделал это так для первого каналья,  думаю что строчки # 12 - 17 надо изменить/исправить.
Второй канал могу здесь сам добавить.
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;
  }
}

 

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Что значит "второй канал "?

gal
Offline
Зарегистрирован: 08.06.2018
Как и в двухканальном осциллографе, генераторе....
Второй таймер, работа которого не зависит от первого.
triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

gal пишет:

Как и в двухканальном осциллографе, генераторе....
Второй таймер, работа которого не зависит от первого.

Видя, как вы "плаваете" в самых элементарных вещах, очень сомневаюсь, что вы хотя бы в общих чертах представляете, как это сделать.