Помогите с задержками)

dos_master
Offline
Зарегистрирован: 20.12.2019

Доброго времени суток, я новичок в программировании и очень прошу помочь,

поставили задачу сделать подобие СПУ на советский печатный станок, надо считывать количество напечатаных страниц (геркон плюс магнит на вал, один оборот вала одна напечатанная страница) и сделать пару кнопок чтоб можно было задать количество страниц которые надо напечатать, и после всего этого останавливать печать, суть проблемы:
как сделать так чтоб при нажатии кнопки либо срабатывании датчика счетчик плюсовал только один раз пока кнопку не отпустить, либо пока датчик не передаст 0

#include <LCD_1602_RUS.h>

LCD_1602_RUS lcd(0x27, 16, 2);
const int rele = 7;
int count1 = 10;
int count = 0;
int val = 0;
void setup()
{
  pinMode(12, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();

}

void loop()
{


  {
    if ( digitalRead(12) == HIGH ) ;
    else if (count = count + 1);

  }


  {
    if  ( digitalRead(3) == LOW ) ;
    else if  (count1 = count1 + 10);

  }
  {
    if  ( digitalRead(4) == LOW ) ;
    else if  (count1 = count1 + 100);

  }




  if (count == count1) {digitalWrite(rele, HIGH);}

  lcd.setCursor(0, 0);
  lcd.print("Напечатано:" );
  lcd.setCursor(0, 1);
  lcd.print("Напечатать:" );


  lcd.setCursor(11, 0);
  lcd.print(count );
  lcd.setCursor(11, 1);
  lcd.print(count1);

}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Почитайте про кнопки для начала

А потом - вы ставите флаг нажатия кнопки и выполняете действие. И пока она нажата при флаге=1 ничего не делаете. Как только кнопка отпускается флаг=0 и ждем нажатия кнопки.

dos_master
Offline
Зарегистрирован: 20.12.2019

Большое спасибо пойду пробовать.

 

upd сделал вот так 

if ( digitalRead(12) == HIGH&&flag==0 ) ;
    { (count = count + 1);
    flag=1;
 
    }
 
и теперь счетчик плюсует все время независимо от показания датчика ((
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Да, и флагом, обычно, назначают логические переменные. В теории - занимают меньше места. :)

И не забудьте инициировать флаг=0 в сетапе.

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

dos_master пишет:

как сделать так чтоб при нажатии кнопки либо срабатывании датчика счетчик плюсовал только один раз пока кнопку не отпустить, либо пока датчик не передаст 0

очень просто - надо отслеживать не текущее состояние кнопки "нажато", а смену состояний "отпущено -> нажато". Для этого надо хранить в отдельной переменной прежнее состояние кнопки и реагировать только тогда, когда нынешнее состояние "нажато", а предыдущее было "отпущено"

dos_master
Offline
Зарегистрирован: 20.12.2019

А не подскажете мне как это сделать? достаточно просто ссылки на урок или статью, спасибо заранее =)

dos_master
Offline
Зарегистрирован: 20.12.2019

Задал не помогло, все равно счетчик просто постоянно считает +1  не зависимо от показаний датчика

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

dos_master пишет:

Задал не помогло, все равно счетчик просто постоянно считает +1  не зависимо от показаний датчика

Программу в студию!

dos_master
Offline
Зарегистрирован: 20.12.2019
#include <LCD_1602_RUS.h>

LCD_1602_RUS lcd(0x27, 16, 2);
const int rele = 7;
int count1 = 10;
int count = 0;
int val = 0;
int flag = 0;
void setup()
{
  pinMode(12, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  flag = 0;
}

void loop() //процедура loop
{


  
    {if ( digitalRead(12) == HIGH&&flag==0) ;
    else if (count = count + 1);
    flag=1;

    }

  {
    if  ( digitalRead(3) == LOW ) ;
    else if  (count1 = count1 + 10);

  }
  {
    if  ( digitalRead(4) == LOW ) ;
    else if  (count1 = count1 + 100);

  }




  if (count == count1) {digitalWrite(rele, HIGH);}

  lcd.setCursor(0, 0);
  lcd.print("Напечатано:" );
  lcd.setCursor(0, 1);
  lcd.print("Напечатать:" );


  lcd.setCursor(11, 0);
  lcd.print(count );
  lcd.setCursor(11, 1);
  lcd.print(count1);

}

 

dos_master
Offline
Зарегистрирован: 20.12.2019

сейчас пробую еще так, но ардуина никак не реагирует на датчик теперь 
 

 int gerkon = digitalRead(12);
    
        
      {
         if (!gerkon) {
         return;
        }
        (count = count + 1);
      }  

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018


Пример

#define button 2
int n;
byte b;
boolean flag;
void setup() {
pinMode(button,INPUT);
flag=0;
n=0;

}

void loop() {
  
  b=digitalRead(button);
  if (b==0)flag=0;
  if ((b==1)&&(flag==0)){
    flag=1;
    n++;
  }
}

 

Клапауций 003
Offline
Зарегистрирован: 20.07.2019
dos_master
Offline
Зарегистрирован: 20.12.2019

Огромное спасибо вам мил человек

 

 

в таком виде все заработало. 
 

#include <LCD_1602_RUS.h>

LCD_1602_RUS lcd(0x27, 16, 2);
const int rele = 7;
 
#define gerkon 12
#define b10 4
#define b100 3
//-----------------------------------
int g;
byte b;
boolean flag0;
//-----------------------------------


//-----------------------------------
int but;
byte m;
boolean flag1;
byte d;
boolean flag2;
//-----------------------------------


void setup()
{
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
pinMode(gerkon,INPUT);  
pinMode(b10,INPUT);
pinMode(b100,INPUT);
flag0=0;
flag1=0;
flag2=0;
g=0;
m=0;
d=0;
but = 10;
}

void loop() //процедура loop
{

//геркон 
  
  b=digitalRead(gerkon);
  if (b==0)flag0=0;
  if ((b==1)&&(flag0==0)){
    flag0=1;
    g++;
  }
//геркон 
   
d=digitalRead(b10);
  if (d==0)flag1=0;
  if ((d==1)&&(flag1==0)){
    flag1=1;
    but = but + 100;
  }
  
  m=digitalRead(b100);
  if (m==0)flag2=0;
  if ((m==1)&&(flag2==0)){
    flag2=1;
    but = but +10;
  }

  if (but == g) {digitalWrite(rele, HIGH);}

  lcd.setCursor(0, 0);
  lcd.print("Напечатано:" );
  lcd.setCursor(0, 1);
  lcd.print("Напечатать:" );


  lcd.setCursor(11, 0);
  lcd.print(g );
  lcd.setCursor(11, 1);
  lcd.print(but);

}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

dos_master пишет:

в таком виде все заработало. 

Успехов!