Помогите с задержками)
- Войдите на сайт для отправки комментариев
Пт, 20/12/2019 - 17:58
Доброго времени суток, я новичок в программировании и очень прошу помочь,
поставили задачу сделать подобие СПУ на советский печатный станок, надо считывать количество напечатаных страниц (геркон плюс магнит на вал, один оборот вала одна напечатанная страница) и сделать пару кнопок чтоб можно было задать количество страниц которые надо напечатать, и после всего этого останавливать печать, суть проблемы:
как сделать так чтоб при нажатии кнопки либо срабатывании датчика счетчик плюсовал только один раз пока кнопку не отпустить, либо пока датчик не передаст 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);
}
Почитайте про кнопки для начала
А потом - вы ставите флаг нажатия кнопки и выполняете действие. И пока она нажата при флаге=1 ничего не делаете. Как только кнопка отпускается флаг=0 и ждем нажатия кнопки.
Большое спасибо пойду пробовать.
upd сделал вот так
Да, и флагом, обычно, назначают логические переменные. В теории - занимают меньше места. :)
И не забудьте инициировать флаг=0 в сетапе.
как сделать так чтоб при нажатии кнопки либо срабатывании датчика счетчик плюсовал только один раз пока кнопку не отпустить, либо пока датчик не передаст 0
очень просто - надо отслеживать не текущее состояние кнопки "нажато", а смену состояний "отпущено -> нажато". Для этого надо хранить в отдельной переменной прежнее состояние кнопки и реагировать только тогда, когда нынешнее состояние "нажато", а предыдущее было "отпущено"
А не подскажете мне как это сделать? достаточно просто ссылки на урок или статью, спасибо заранее =)
Задал не помогло, все равно счетчик просто постоянно считает +1 не зависимо от показаний датчика
Задал не помогло, все равно счетчик просто постоянно считает +1 не зависимо от показаний датчика
Программу в студию!
#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); }сейчас пробую еще так, но ардуина никак не реагирует на датчик теперь
int gerkon = digitalRead(12); { if (!gerkon) { return; } (count = count + 1); }Пример
#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++; } }http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-delay-bez-delay
Огромное спасибо вам мил человек
в таком виде все заработало.
#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); }в таком виде все заработало.
Успехов!